pybaseutils 2.1.3__tar.gz → 2.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/PKG-INFO +1 -1
  2. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/video_utils.py +1 -1
  4. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/data_resample.py +74 -11
  5. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_image_folder.py +11 -21
  6. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_image_text.py +47 -35
  7. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/file_utils.py +1 -1
  8. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/image_utils.py +11 -11
  9. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/plot_utils.py +50 -5
  10. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/PKG-INFO +1 -1
  11. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/SOURCES.txt +4 -0
  12. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo1.py +5 -1
  13. pybaseutils-2.1.4/test_py/demo_video.py +28 -0
  14. pybaseutils-2.1.4/test_py/single_class/GRU.py +36 -0
  15. pybaseutils-2.1.4/test_py/single_class/TCN.py +91 -0
  16. pybaseutils-2.1.4/test_py/single_class/__init__.py +7 -0
  17. pybaseutils-2.1.4/test_py/single_class/demo.py +216 -0
  18. pybaseutils-2.1.3/test_py/demo_video.py +0 -28
  19. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/LICENCE +0 -0
  20. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/README.md +0 -0
  21. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/__init__.py +0 -0
  22. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/audio_utils.py +0 -0
  23. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/pyaudio_utils.py +0 -0
  24. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/vad_utils.py +0 -0
  25. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/base64_utils.py +0 -0
  26. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/batch_utils.py +0 -0
  27. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/build_utils/__init__.py +0 -0
  28. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/build_utils/cython_utils.py +0 -0
  29. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  30. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/__init__.py +0 -0
  31. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/kmean.py +0 -0
  32. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/maxmin_distance.py +0 -0
  33. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/similarity.py +0 -0
  34. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/color_utils.py +0 -0
  35. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/config_utils.py +0 -0
  36. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/__init__.py +0 -0
  37. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_coco.py +0 -0
  38. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_cvat.py +0 -0
  39. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_labelme.py +0 -0
  40. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_voc.py +0 -0
  41. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/concat_coco.py +0 -0
  42. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  43. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_coco2voc.py +0 -0
  44. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  45. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  46. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  47. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  48. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  49. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2coco.py +0 -0
  50. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  51. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2voc.py +0 -0
  52. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  53. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  54. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/coords_utils.py +0 -0
  55. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/__init__.py +0 -0
  56. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/corner_utils.py +0 -0
  57. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/monitor.py +0 -0
  58. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/mouse_utils.py +0 -0
  59. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/__init__.py +0 -0
  60. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/balanced_classes.py +0 -0
  61. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/base_coco.py +0 -0
  62. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/base_dataset.py +0 -0
  63. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  64. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  65. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  66. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_labelme.py +0 -0
  67. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_voc.py +0 -0
  68. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_yolo.py +0 -0
  69. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  70. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/QueueTable.py +0 -0
  71. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/__init__.py +0 -0
  72. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/demo.py +0 -0
  73. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/kalman_filter.py +0 -0
  74. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/mean_filter.py +0 -0
  75. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/motion_filter.py +0 -0
  76. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/pose_filter.py +0 -0
  77. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/font_style/__init__.py +0 -0
  78. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/font_utils.py +0 -0
  79. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/geometry_tools.py +0 -0
  80. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/heatmap_utils.py +0 -0
  81. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/json_utils.py +0 -0
  82. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/log.py +0 -0
  83. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/logger.py +0 -0
  84. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/__init__.py +0 -0
  85. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/accuracy.py +0 -0
  86. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/average_meter.py +0 -0
  87. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/class_report.py +0 -0
  88. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/plot_pr.py +0 -0
  89. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/plot_roc.py +0 -0
  90. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/numpy_utils.py +0 -0
  91. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pandas_utils.py +0 -0
  92. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/__init__.py +0 -0
  93. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/bones_utils.py +0 -0
  94. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/human_pose.py +0 -0
  95. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/pose_utils.py +0 -0
  96. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pycpp/__init__.py +0 -0
  97. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pycpp/demo.py +0 -0
  98. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pycpp/main.py +0 -0
  99. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/server/__init__.py +0 -0
  100. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/server/apm_server.py +0 -0
  101. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/setup_config.py +0 -0
  102. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/singleton_utils.py +0 -0
  103. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/text_utils.py +0 -0
  104. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/thread_utils.py +0 -0
  105. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/time_utils.py +0 -0
  106. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracemalloc_utils.py +0 -0
  107. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracemalloc_utils2.py +0 -0
  108. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/QueueTable.py +0 -0
  109. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/__init__.py +0 -0
  110. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/demo.py +0 -0
  111. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/kalman_filter.py +0 -0
  112. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/mean_filter.py +0 -0
  113. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/motion_filter.py +0 -0
  114. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/pose_filter.py +0 -0
  115. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/__init__.py +0 -0
  116. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/affine_transform.py +0 -0
  117. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/augment_utils.py +0 -0
  118. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/face_alignment.py +0 -0
  119. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/transform_utils.py +0 -0
  120. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/word_utils.py +0 -0
  121. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/worker.py +0 -0
  122. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/yaml_utils.py +0 -0
  123. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/dependency_links.txt +0 -0
  124. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/not-zip-safe +0 -0
  125. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/top_level.txt +0 -0
  126. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/setup.cfg +0 -0
  127. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/setup.py +0 -0
  128. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/WebCrawler/__init__.py +0 -0
  129. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/WebCrawler/search_image.py +0 -0
  130. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
  131. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/__init__.py +0 -0
  132. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/__init__.py +0 -0
  133. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/action_dataset.py +0 -0
  134. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/build_cython.py +0 -0
  135. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/build_pyarmor.py +0 -0
  136. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/build_service.py +0 -0
  137. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/convert_cvat2labelme.py +0 -0
  138. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/convert_labelme2coco.py +0 -0
  139. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/convert_labelme2voc.py +0 -0
  140. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/copy_move.py +0 -0
  141. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_labelme_crop.py +0 -0
  142. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_video_aije.py +0 -0
  143. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_voc_crop.py +0 -0
  144. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_voc_vis.py +0 -0
  145. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/video_convertor.py +0 -0
  146. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/__init__.py +0 -0
  147. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/demo.py +0 -0
  148. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/main.py +0 -0
  149. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/main_read.py +0 -0
  150. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/segment.py +0 -0
  151. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  152. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/speechbrain_demo.py +0 -0
  153. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/captcha/__init__.py +0 -0
  154. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/captcha/demo.py +0 -0
  155. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/class_attribute.py +0 -0
  156. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/class_names.py +0 -0
  157. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/AffectNet.py +0 -0
  158. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/AsianMovie.py +0 -0
  159. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/BITVehicle2voc.py +0 -0
  160. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/BSTLD2voc.py +0 -0
  161. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/CCPD.py +0 -0
  162. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/CCPD2voc.py +0 -0
  163. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/FL3D_dataset.py +0 -0
  164. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/FreiHAND2coco.py +0 -0
  165. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/MTFL2voc.py +0 -0
  166. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/TT100K.py +0 -0
  167. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/WaterMeters1.py +0 -0
  168. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/WaterMeters2.py +0 -0
  169. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/__init__.py +0 -0
  170. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/concat_coco.py +0 -0
  171. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_coco2voc.py +0 -0
  172. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_cvat2labelme.py +0 -0
  173. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_gesture2hand.py +0 -0
  174. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_labelme2coco.py +0 -0
  175. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_labelme2cvat.py +0 -0
  176. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_labelme2voc.py +0 -0
  177. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_voc2labelme.py +0 -0
  178. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/fatigue_driving.py +0 -0
  179. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/fdd_dataset.py +0 -0
  180. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/get_pair_data.py +0 -0
  181. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/handpose2coco.py +0 -0
  182. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/insects_for_aichallenger.py +0 -0
  183. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/tt100k_utils.py +0 -0
  184. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/ua_detrac2voc.py +0 -0
  185. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/ucf101_dataset.py +0 -0
  186. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/voc_sbd2labelme.py +0 -0
  187. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/__init__.py +0 -0
  188. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/build_cython.py +0 -0
  189. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/build_pyarmor.py +0 -0
  190. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/cryptography_demo.py +0 -0
  191. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/fun_sum.py +0 -0
  192. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/main.py +0 -0
  193. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/model_des_enctypt.py +0 -0
  194. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/model_enctypt.py +0 -0
  195. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo2.py +0 -0
  196. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo3.py +0 -0
  197. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_async_await1.py +0 -0
  198. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_async_await2.py +0 -0
  199. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_coco_vis.py +0 -0
  200. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_copy_files.py +0 -0
  201. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_copy_files_for_voc.py +0 -0
  202. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_ffmpy.py +0 -0
  203. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_for_pair_file.py +0 -0
  204. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_for_polygon.py +0 -0
  205. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_for_trt.py +0 -0
  206. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_get_file_list.py +0 -0
  207. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_gif.py +0 -0
  208. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_gif_video.py +0 -0
  209. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_image_crop.py +0 -0
  210. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_kpts.py +0 -0
  211. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_labelme.py +0 -0
  212. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_labelme_crop.py +0 -0
  213. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_lableme_vis.py +0 -0
  214. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_metrics.py +0 -0
  215. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_mouse.py +0 -0
  216. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_nii.py +0 -0
  217. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_pandas.py +0 -0
  218. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_plot.py +0 -0
  219. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_rename.py +0 -0
  220. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_standard_image .py +0 -0
  221. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_standard_video .py +0 -0
  222. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_taichi.py +0 -0
  223. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_voc_crop.py +0 -0
  224. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_voc_vis.py +0 -0
  225. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_word_similar.py +0 -0
  226. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_worker1.py +0 -0
  227. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_worker2.py +0 -0
  228. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/__init__.py +0 -0
  229. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/demo.py +0 -0
  230. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/detect_face_person.py +0 -0
  231. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/predet_labelme.py +0 -0
  232. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/edit_distance/__init__.py +0 -0
  233. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/edit_distance/demo.py +0 -0
  234. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/edit_distance/text_matching.py +0 -0
  235. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/flask_demo/__init__.py +0 -0
  236. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/flask_demo/func.py +0 -0
  237. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/flask_demo/server.py +0 -0
  238. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/get_file_list.py +0 -0
  239. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/__init__.py +0 -0
  240. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/demo_correction_v1.py +0 -0
  241. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/demo_correction_v2.py +0 -0
  242. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/demo_correction_v3.py +0 -0
  243. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/kafka_worker.py +0 -0
  244. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/men_tracemalloc.py +0 -0
  245. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/performance.py +0 -0
  246. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/pose/__init__.py +0 -0
  247. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/pose/human_pose.py +0 -0
  248. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/__init__.py +0 -0
  249. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/base.py +0 -0
  250. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/component.py +0 -0
  251. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/main.py +0 -0
  252. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/register.py +0 -0
  253. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/test_fr/__init__.py +0 -0
  254. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/test_fr/demo11.py +0 -0
  255. {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/test_fr/idcardocr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pybaseutils
3
- Version: 2.1.3
3
+ Version: 2.1.4
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -5,4 +5,4 @@
5
5
  @Date : 2019-05-07 17:40:27
6
6
  """
7
7
 
8
- __version__ = '2.1.3'
8
+ __version__ = '2.1.4'
@@ -13,7 +13,7 @@ from tqdm import tqdm
13
13
  from pybaseutils import image_utils, file_utils
14
14
  from pybaseutils.cvutils import monitor
15
15
 
16
- VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov']
16
+ VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov', "*.flv"]
17
17
 
18
18
  get_video_capture = image_utils.get_video_capture
19
19
  get_video_info = image_utils.get_video_info
@@ -12,7 +12,7 @@ import math
12
12
  class ResampleExample(object):
13
13
  """样本均衡,重采样DataResampler的使用方法"""
14
14
 
15
- def __init__(self, item_list, label_index=1, shuffle=True, disp=False):
15
+ def __init__(self, item_list, label_index, shuffle=True, disp=False):
16
16
  """
17
17
  :param item_list: item_list=[item_0,item_1,...,item_n],
18
18
  item_n= [path/to/image,label]
@@ -28,14 +28,14 @@ class ResampleExample(object):
28
28
  disp=self.disp)
29
29
 
30
30
  def __len__(self):
31
+ print("start resampler, data will shuffle and update")
31
32
  # 更新resampler,实现每个epoch重新采样,避免样本数比较多的类别,没有加入训练
32
33
  self.item_list = self.resampler.update(self.shuffle)
33
34
  return len(self.item_list)
34
35
 
35
- def __getitem__(self, idx):
36
- image_path = self.item_list[idx][0]
37
- label_id = self.item_list[idx][1]
38
- return image_path, label_id
36
+ def __getitem__(self, index):
37
+ data_info = self.item_list[index]
38
+ return data_info
39
39
 
40
40
 
41
41
  class DataResample(object):
@@ -195,9 +195,71 @@ class DataResample(object):
195
195
  return class_weight
196
196
 
197
197
 
198
+ class DataLabelResample(object):
199
+ """样本均衡,重采样的方法"""
200
+
201
+ def __init__(self, data, label, balance="mean", shuffle=True, disp=False):
202
+ """
203
+ Usage:
204
+ 参考:ResampleExample例子的使用方法
205
+ :param item_list:
206
+ :param label_index:
207
+ :param balance:实现样本均衡策略,均衡力度:mean > log > sqrt > y
208
+ "y": 每个label样本数跟原来一样
209
+ "sqrt": 每个label样本取sqrt数,实现样本均衡
210
+ "log": 每个label样本取log数,实现样本均衡
211
+ "mean": 每个label样本取样本平均数,每个label的个数一样
212
+ """
213
+ self.shuffle = shuffle
214
+ self.item_list = list(zip(data, label))
215
+ self.resample = DataResample(item_list=self.item_list, label_index=1, balance=balance,
216
+ shuffle=shuffle, disp=disp)
217
+
218
+ def __len__(self):
219
+ data, label = self.update(shuffle=self.shuffle)
220
+ return len(data)
221
+
222
+ def update(self, shuffle=False):
223
+ item_list = self.resample.update(shuffle=shuffle)
224
+ data = [item[0] for item in item_list]
225
+ label = [item[1] for item in item_list]
226
+ return data, label
227
+
228
+
229
+ def get_class_count(item_list, label_index):
230
+ """
231
+ 统计每个类别的个数
232
+ :param item_list: List[list,list]
233
+ :param label_index: label在item中的序号
234
+ :return:
235
+ """
236
+ count_info = {}
237
+ for item in item_list:
238
+ label = item[label_index]
239
+ try:
240
+ # if label in class_count: # 比较慢,相当于需要查询label是否存在
241
+ count_info[label] += 1
242
+ except Exception as e:
243
+ count_info[label] = 1
244
+ return count_info
245
+
246
+
247
+ def get_label_count(label):
248
+ """
249
+ 统计每个类别的个数
250
+ :param label: [int,int,...]
251
+ :return:
252
+ """
253
+ count = np.bincount(label).tolist()
254
+ label = list(range(max(count)))
255
+ count_info = {l: c for l, c in zip(label, count) if c > 0}
256
+ return count_info
257
+
258
+
198
259
  if __name__ == "__main__":
260
+ from tqdm import tqdm
199
261
  from torch.utils.data import Dataset, DataLoader, Sampler
200
- from utils import torch_tools
262
+ from basetrainer.utils import torch_tools
201
263
 
202
264
  torch_tools.set_env_random_seed()
203
265
  label0 = [["0.1.jpg", 0], ["0.2.jpg", 0], ["0.3.jpg", 0]]
@@ -206,15 +268,16 @@ if __name__ == "__main__":
206
268
  ["2.5.jpg", 2], ["2.6.jpg", 2], ["2.7.jpg", 2], ["2.8.jpg", 2]]
207
269
  label3 = [["3.1.jpg", 3], ["3.2.jpg", 3], ["3.3.jpg", 3]]
208
270
  item_list = label0 + label1 + label2 + label3
209
- item_list = item_list * 1000000
271
+ item_list = item_list * 1
272
+ item_list = [{"file": item[0], "label": item[1]} for item in item_list]
210
273
  print("have item_list:{}".format(len(item_list)))
211
- dataset_train = ResampleExample(item_list=item_list, label_index=1, shuffle=True, disp=True)
274
+ dataset_train = ResampleExample(item_list=item_list, label_index="label", shuffle=True, disp=True)
212
275
  # dataset_train = ResampleExample(item_list=item_list, label_index=1, disp=False)
213
276
  # dataset_train = ResampleExample(item_list=item_list, label_index=1, disp=False)
214
- batch_size = 4
277
+ batch_size = 20
215
278
  dataloader = DataLoader(dataset_train, batch_size, num_workers=0)
216
279
  epochs = 2
217
280
  for epoch in range(epochs):
218
281
  print("{}===".format(epoch) * 10)
219
- for batch_image, batch_label in iter(dataloader):
220
- print(batch_image, batch_label)
282
+ for step, data in enumerate(tqdm(dataloader)):
283
+ print(step, data)
@@ -19,13 +19,14 @@ class FolderDataset(parser_image_text.TextDataset):
19
19
  def __init__(self, image_dir, class_name=None, transform=None, use_rgb=False, shuffle=False,
20
20
  phase="test", disp=False, check=False, **kwargs):
21
21
  """
22
+ 文件夹数据集,要求相同类别的数据放在同一个文件夹,文件名为类别名称
22
23
  :param image_dir: [image_dir]->list or `path/to/image_dir`->str
23
- :param class_name:
24
+ :param class_name: 类别文件/列表/字典
24
25
  :param transform: torch transform
25
26
  :param shuffle:
26
27
  :param disp:
27
28
  """
28
- super(FolderDataset, self).__init__(filename=image_dir,
29
+ super(FolderDataset, self).__init__(data_file=image_dir,
29
30
  data_root=None,
30
31
  class_name=class_name,
31
32
  transform=transform,
@@ -41,35 +42,24 @@ class FolderDataset(parser_image_text.TextDataset):
41
42
  :param index:
42
43
  :return: {"image": image, "label": label}
43
44
  """
44
- item = self.item_list[index]
45
- bbox = item[2:] if len(item) == 6 else []
46
- image_file, label = item[0], item[1]
47
- image = self.read_image(image_file, use_rgb=self.use_rgb)
48
- image = self.crop_image(image, bbox=bbox) if bbox else image
49
- if self.transform:
50
- image = Image.fromarray(image)
51
- image = self.transform(image)
52
- if image is None:
53
- index = int(random.uniform(0, self.num_images))
54
- return self.__getitem__(index)
55
- return {"image": image, "label": label}
45
+ return super(FolderDataset, self).__getitem__(index)
56
46
 
57
- def load_dataset(self, filename, data_root="", use_sub=False):
47
+ def load_dataset(self, data_file, data_root="", use_sub=False):
58
48
  """
59
49
  保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,,ymax]
60
- :param filename:
50
+ :param data_file:
61
51
  :param data_root:
62
- :return: item_list [path,label] 或者 [path,label,xmin,ymin,xmax,,ymax]
52
+ :return: item_list [{"file":file,"label":label}]
63
53
  """
64
- if isinstance(filename, str): filename = [filename]
54
+ if isinstance(data_file, str): data_file = [data_file]
65
55
  item_list = []
66
- for i, dir in enumerate(filename):
67
- print("loading image from:{}".format(dir))
56
+ for i, dir in enumerate(data_file):
68
57
  if not os.path.exists(dir): raise Exception("文件不存在,image_dir:{}".format(dir))
69
58
  paths, labels = file_utils.get_files_labels(dir, postfix=file_utils.IMG_POSTFIX)
59
+ print("loading data from:{},have {}".format(dir, len(paths)))
70
60
  # TODO # 避免多个数据集的相同的label
71
61
  if use_sub: labels = [os.path.join(str(i), l) for l in labels]
72
- data = [[p, l] for p, l in zip(paths, labels)]
62
+ data = [{"file": p, "label": l} for p, l in zip(paths, labels)]
73
63
  item_list += data
74
64
  return item_list
75
65
 
@@ -23,12 +23,13 @@ from pybaseutils.dataloader import data_resample
23
23
 
24
24
  class TextDataset(Dataset):
25
25
 
26
- def __init__(self, filename, data_root=None, class_name=None, transform=None, shuffle=False, use_rgb=False,
26
+ def __init__(self, data_file, data_root=None, class_name=None, transform=None, shuffle=False, use_rgb=False,
27
27
  phase="test", disp=False, check=False, **kwargs):
28
28
  """
29
- :param filename:
30
- :param data_root:
31
- :param class_name:
29
+ 数据文件保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
30
+ :param data_file: 数据文件路径,List[str] or str
31
+ :param data_root: 数据文件根目录
32
+ :param class_name: 类别文件/列表/字典
32
33
  :param transform:
33
34
  :param shuffle:
34
35
  :param use_rgb:
@@ -41,18 +42,21 @@ class TextDataset(Dataset):
41
42
  self.use_rgb = use_rgb
42
43
  self.transform = transform
43
44
  self.phase = phase
45
+ self.label_index = kwargs.get("label_index", "label") # 类别字段key
44
46
  self.class_name, self.class_dict = self.parser_classes(class_name)
45
- self.item_list = self.parser_dataset(filename, data_root=data_root, shuffle=shuffle, check=check)
47
+ self.item_list = self.parser_dataset(data_file, data_root=data_root, label_index=self.label_index,
48
+ shuffle=shuffle, check=check)
46
49
  self.resample = kwargs.get("resample", False)
47
50
  if self.resample:
48
51
  self.data_resample = data_resample.DataResample(self.item_list,
49
- label_index=1,
52
+ label_index=self.label_index,
50
53
  shuffle=shuffle,
51
54
  disp=disp)
52
55
  self.item_list = self.data_resample.update(True)
53
56
  class_count = self.data_resample.class_count # resample前,每个类别的分布
54
57
  balance_nums = self.data_resample.balance_nums # resample后,每个类别的分布
55
- self.class_count = self.count_class_info(self.item_list, class_name=self.class_name)
58
+ self.class_count = self.count_class_info(self.item_list, class_name=self.class_name,
59
+ label_index=self.label_index)
56
60
  self.num_images = len(self.item_list)
57
61
  self.classes = list(self.class_dict.values())
58
62
  self.num_classes = max(self.classes) + 1
@@ -81,46 +85,53 @@ class TextDataset(Dataset):
81
85
  print("loss_labels: {}".format(class_lack))
82
86
  print("------------------------------------------------------------------")
83
87
 
84
- def parser_dataset(self, filename, data_root="", shuffle=False, check=False):
88
+ def parser_dataset(self, data_file, data_root="", label_index="label", shuffle=False, check=False):
85
89
  """
86
90
  保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
87
- :param filename:
91
+ :param data_file:
88
92
  :param data_root:
93
+ :param label_index: label index
89
94
  :param shuffle:
90
95
  :param check:
91
96
  :return:
92
97
  """
93
- data_list = self.load_dataset(filename, data_root=data_root)
98
+ data_list = self.load_dataset(data_file, data_root=data_root)
94
99
  if not self.class_name:
95
- self.class_name = list(set([d[1] for d in data_list]))
100
+ self.class_name = list(set([d[label_index] for d in data_list]))
96
101
  self.class_name, self.class_dict = self.parser_classes(self.class_name)
97
102
  item_list = []
98
103
  for data in data_list:
99
- label = data[1]
104
+ label = data[label_index]
100
105
  if label not in self.class_dict: continue
101
- data[1] = self.class_dict[label]
106
+ data[label_index] = self.class_dict[label]
102
107
  item_list.append(data)
103
108
  if check: item_list = self.check_item(item_list)
104
109
  assert self.class_name, f"类别为空,请检查,class_name={self.class_name}"
105
- assert item_list, f"文件列表为空,请检查输入数据,filename={filename}"
110
+ assert item_list, f"文件列表为空,请检查输入数据,data_file={data_file}"
106
111
  if shuffle:
107
112
  random.seed(100)
108
113
  random.shuffle(item_list)
109
114
  return item_list
110
115
 
111
- def load_dataset(self, filename, data_root=""):
116
+ def load_dataset(self, data_file, data_root="", **kwargs):
112
117
  """
113
118
  保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
114
- :param filename:
119
+ :param data_file:
115
120
  :param data_root:
116
- :return: [path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
121
+ :return: item_list [{"file":file,"label":label},"bbox":[]]
117
122
  """
118
- if isinstance(filename, str): filename = [filename]
123
+ if isinstance(data_file, str): data_file = [data_file]
119
124
  item_list = []
120
- for file in filename:
125
+ for file in data_file:
121
126
  root = data_root if data_root else os.path.dirname(file)
122
- data = file_utils.read_data(file, split=",")
123
- data = [[os.path.join(root, d[0])] + d[1:] for d in data]
127
+ content = file_utils.read_data(file, split=",")
128
+ data = []
129
+ for line in content:
130
+ if len(line) == 2:
131
+ data.append({"file": os.path.join(root, line[0]), "label": line[1]})
132
+ elif len(line) == 6:
133
+ data.append({"file": os.path.join(root, line[0]), "label": line[1], "bbox": line[2:]})
134
+ print("loading data from:{},have {}".format(file, len(data)))
124
135
  item_list += data
125
136
  return item_list
126
137
 
@@ -148,7 +159,7 @@ class TextDataset(Dataset):
148
159
  dst_list = []
149
160
  print("Please wait, it's in checking")
150
161
  for item in tqdm(item_list):
151
- file, label = item[0], item[1]
162
+ file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
152
163
  if not os.path.exists(file):
153
164
  print("no file:{}".format(file))
154
165
  continue
@@ -162,9 +173,8 @@ class TextDataset(Dataset):
162
173
  :return: {"image": image, "label": label}
163
174
  """
164
175
  item = self.item_list[index]
165
- bbox = item[2:] if len(item) == 6 else []
166
- image_file, label = item[0], item[1]
167
- image = self.read_image(image_file, use_rgb=self.use_rgb)
176
+ file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
177
+ image = self.read_image(file, use_rgb=self.use_rgb)
168
178
  image = self.crop_image(image, bbox=bbox, **self.kwargs) if bbox else image
169
179
  if self.transform:
170
180
  image = Image.fromarray(image)
@@ -172,7 +182,7 @@ class TextDataset(Dataset):
172
182
  if image is None:
173
183
  index = int(random.uniform(0, self.num_images))
174
184
  return self.__getitem__(index)
175
- return {"image": image, "label": label}
185
+ return {"image": image, "label": label, "file": file}
176
186
 
177
187
  def __len__(self):
178
188
  if self.resample:
@@ -226,17 +236,17 @@ class TextDataset(Dataset):
226
236
  return image
227
237
 
228
238
  @staticmethod
229
- def count_class_info(item_list, class_name=None, index=1):
239
+ def count_class_info(item_list, class_name=None, label_index="label"):
230
240
  """
231
241
  统计类别信息
232
- item_list=[[filename,label,...],[filename,label,...]]
242
+ item_list=[[file,label,...],[file,label,...]]
233
243
  :param item_list:
234
244
  :param class_name:
235
245
  :return:
236
246
  """
237
247
  count = {}
238
248
  for item in item_list:
239
- label = item[index]
249
+ label = item[label_index]
240
250
  count[label] = count[label] + 1 if label in count else 1
241
251
  if class_name: count = {class_name[k]: v for k, v in count.items()}
242
252
  return count
@@ -246,8 +256,8 @@ if __name__ == '__main__':
246
256
  from pybaseutils import image_utils
247
257
  from torchvision import transforms
248
258
 
249
- filenames = [
250
- '/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-images-v1/train.txt',
259
+ data_files = [
260
+ '/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-images-v2/train.txt',
251
261
  ]
252
262
  class_name = None
253
263
  input_size = [112, 112]
@@ -258,18 +268,20 @@ if __name__ == '__main__':
258
268
  transforms.ToTensor(),
259
269
  transforms.Normalize(mean=rgb_mean, std=rgb_std),
260
270
  ])
261
- dataset = TextDataset(filename=filenames,
271
+ class_name = ['fake', 'real']
272
+ dataset = TextDataset(data_file=data_files,
262
273
  transform=transform,
263
274
  class_name=class_name,
264
- resample=False,
275
+ resample=True,
265
276
  shuffle=True,
277
+ check=False,
266
278
  crop_scale=(1.5, 1.5),
267
279
  disp=True)
268
280
  for i in range(len(dataset)):
269
281
  data_info = dataset.__getitem__(i)
270
- image, label = data_info["image"], data_info["label"]
282
+ image, label, file = data_info["image"], data_info["label"], data_info["file"]
271
283
  image = np.asarray(image).transpose(1, 2, 0) # 通道由[c,h,w]->[h,w,c]
272
284
  image = np.asarray(image * 255, dtype=np.uint8)
273
285
  label = np.asarray(label, dtype=np.int32)
274
- print("batch_image.shape:{},batch_label:{}".format(image.shape, label))
286
+ print("{},batch_image.shape:{},batch_label:{}".format(file, image.shape, label))
275
287
  image_utils.cv_show_image("image", image)
@@ -24,7 +24,7 @@ from datetime import datetime
24
24
  from tqdm import tqdm
25
25
 
26
26
  IMG_POSTFIX = ['*.jpg', '*.jpeg', '*.png', '*.tif', "*.JPG", "*.bmp"]
27
- VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov']
27
+ VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov', "*.flv"]
28
28
 
29
29
 
30
30
  def str2bool(v):
@@ -380,19 +380,19 @@ def image_unnormalize(image, mean=None, std=None):
380
380
  image_unnormalization = image_unnormalize
381
381
 
382
382
 
383
- def data_unnormalize(data, omin, omax, imin=None, imax=None):
384
- """
385
- NORMALIZATION 将数据x归一化到任意区间[ymin,omax]范围的方法
386
- :param data: 输入参数x:需要被归一化的数据,numpy
387
- :param omin: 输入参数omin:归一化的区间[omin,omax]下限
388
- :param omax: 输入参数ymax:归一化的区间[omin,omax]上限
389
- :param imin: 输入参数imin的最小值
390
- :param imax: 输入参数ymax的最大值
383
+ def data_normalize(x, ymin=0, ymax=1.0, xmin=None, xmax=None):
384
+ """
385
+ NORMALIZATION 将数据x归一化到任意区间[ymin,ymax]范围的方法
386
+ :param x: 输入参数x:需要被归一化的数据,numpy
387
+ :param ymin: 输入参数ymin:归一化的区间[ymin,ymax]下限
388
+ :param ymax: 输入参数ymax:归一化的区间[ymin,ymax]上限
389
+ :param xmin: 输入参数xmin的最小值
390
+ :param xmax: 输入参数xmax的最大值
391
391
  :return: 输出参数y:归一化到区间[omin,omax]的数据
392
392
  """
393
- imax = imax if imax is not None else np.max(data) # %计算最大值
394
- imin = imin if imin is not None else np.min(data) # %计算最小值
395
- y = (omax - omin) * (data - imin) / (imax - imin) + omin
393
+ xmax = np.max(x) if xmax is None else xmax # %计算最大值
394
+ xmin = np.min(x) if xmin is None else xmin # %计算最小值
395
+ y = (ymax - ymin) * (x - xmin) / (xmax - xmin) + ymin
396
396
  return y
397
397
 
398
398
 
@@ -106,7 +106,50 @@ def plot_bar(x, y, xlabel="X", ylabel="Y", title="bar", bin_width=1, vis=True, s
106
106
  if vis: plt.savefig('out.png')
107
107
 
108
108
 
109
- def plot_multi_line(x_data_list, y_data_list, line_names=None, title="", xlabel="", ylabel=""):
109
+ def plot_line(x, y, name=None, title="", xlabel="", ylabel="", color="b"):
110
+ """
111
+ :param x: List[]
112
+ :param y: List[]
113
+ :param names: List[]
114
+ :param title:
115
+ :param xlabel:
116
+ :param ylabel:
117
+ :return:
118
+ """
119
+ # 绘图
120
+ # plt.figure()
121
+ if x is None: x = list(range(0, len(y)))
122
+ lw = 2
123
+ plt.figure(figsize=(10, 10))
124
+ plt.plot(x, y, color=color, lw=lw, label=name) # 假正率为横坐标,真正率为纵坐标做曲线
125
+ # plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
126
+ # plt.plot([0, 1], [1, 0], color='navy', lw=lw, linestyle='--') # 绘制y=1-x的直线
127
+ # plt.xlim([xlim_min - 0.01 * x_deta, xlim_max + 0.1 * x_deta])
128
+ # plt.ylim([ylim_min - 0.01 * y_deta, ylim_max + 0.1 * y_deta])
129
+ # 设置横纵坐标的名称以及对应字体格式
130
+ font = {'family': 'Times New Roman',
131
+ 'weight': 'normal',
132
+ 'size': 20,
133
+ }
134
+ plt.xlabel(xlabel, font)
135
+ plt.ylabel(ylabel, font)
136
+ plt.title(title)
137
+ plt.legend(loc="lower right") # "upper right"
138
+ # plt.legend(loc="upper right")#"upper right"
139
+ plt.grid(True) # 显示网格;
140
+ plt.show()
141
+
142
+
143
+ def plot_lines(X, Y, names=None, title="", xlabel="", ylabel=""):
144
+ """
145
+ :param X: List[List]
146
+ :param Y: List[List]
147
+ :param names: List[]
148
+ :param title:
149
+ :param xlabel:
150
+ :param ylabel:
151
+ :return:
152
+ """
110
153
  # 绘图
111
154
  # plt.figure()
112
155
  lw = 2
@@ -117,10 +160,9 @@ def plot_multi_line(x_data_list, y_data_list, line_names=None, title="", xlabel=
117
160
 
118
161
  xlim_min = 0
119
162
  ylim_min = 0
120
- if not line_names:
121
- line_names = " " * len(x_data_list)
122
- for x, y, color, line_name in zip(x_data_list, y_data_list, colors, line_names):
123
- plt.plot(x, y, color=color, lw=lw, label=line_name) # 假正率为横坐标,真正率为纵坐标做曲线
163
+ if not names: names = " " * len(X)
164
+ for x, y, color, label in zip(X, Y, colors, names):
165
+ plt.plot(x, y, color=color, lw=lw, label=label) # 假正率为横坐标,真正率为纵坐标做曲线
124
166
  if xlim_max < max(x):
125
167
  xlim_max = max(x)
126
168
  if ylim_max < max(y):
@@ -150,6 +192,9 @@ def plot_multi_line(x_data_list, y_data_list, line_names=None, title="", xlabel=
150
192
  plt.show()
151
193
 
152
194
 
195
+ plot_multi_line = plot_lines
196
+
197
+
153
198
  def plot_skew_kurt(data, name="Title"):
154
199
  """
155
200
  https://blog.csdn.net/u012735708/article/details/84750295
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pybaseutils
3
- Version: 2.1.3
3
+ Version: 2.1.4
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -243,6 +243,10 @@ test_py/registry/base.py
243
243
  test_py/registry/component.py
244
244
  test_py/registry/main.py
245
245
  test_py/registry/register.py
246
+ test_py/single_class/GRU.py
247
+ test_py/single_class/TCN.py
248
+ test_py/single_class/__init__.py
249
+ test_py/single_class/demo.py
246
250
  test_py/test_fr/__init__.py
247
251
  test_py/test_fr/demo11.py
248
252
  test_py/test_fr/idcardocr.py
@@ -49,4 +49,8 @@ class Promote():
49
49
 
50
50
 
51
51
  if __name__ == '__main__':
52
- image_file = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/第3批数据/aije-action-train-v22/江门_检查工器具_20240910_172411_6606_0000.jpg"
52
+ data = ["1.jpg", "2.jpg"]
53
+ label = [0, 1]
54
+ item_list = list(zip(data, label))
55
+ item_list = zip()
56
+ print(item_list)
@@ -0,0 +1,28 @@
1
+ # -*-coding: utf-8 -*-
2
+ """
3
+ @Author : PKing
4
+ @E-mail : 390737991@qq.com
5
+ @Date : 2022-12-31 11:37:30
6
+ @Brief :
7
+ """
8
+ import os
9
+ import cv2
10
+ import numpy as np
11
+ from pybaseutils import file_utils, image_utils
12
+ from pybaseutils.cvutils import video_utils
13
+
14
+
15
+ def video2frames_demo(root, out):
16
+ files = file_utils.get_files_lists(root, postfix=file_utils.VIDEO_POSTFIX)
17
+ print("save:{}".format(out))
18
+ for video_file in files:
19
+ print(video_file)
20
+ # video_utils.video2frames_similarity(video_file, out_dir=out, func=None, interval=20, thresh=0.3, vis=True)
21
+ video_utils.video2frames(video_file, out_dir=out, func=None, interval=15, vis=True)
22
+
23
+
24
+ if __name__ == "__main__":
25
+ root = "/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-video-v1/test"
26
+ out = os.path.join(os.path.dirname(root), "frame")
27
+ out = file_utils.create_dir(out, os.path.basename(root))
28
+ video2frames_demo(root, out)
@@ -0,0 +1,36 @@
1
+ # -*-coding: utf-8 -*-
2
+ """
3
+ @Author : PKing
4
+ @E-mail :
5
+ @Date : 2024-02-05 18:19:18
6
+ @Brief : https://tianchi.aliyun.com/notebook/231732
7
+ """
8
+ import torch
9
+ from torch import nn
10
+
11
+
12
+ class ModelGRU(nn.Module):
13
+ def __init__(self, input_size=1, output_size=4, hidden_size=300):
14
+ """
15
+ :param input_size: The number of expected features in the input `x`
16
+ :param output_size: num_class
17
+ :param hidden_size: The number of features in the hidden state `h`
18
+ """
19
+ super(ModelGRU, self).__init__()
20
+ self.hidden_layer_size = hidden_size
21
+ self.lstm = nn.GRU(
22
+ input_size=input_size,
23
+ hidden_size=hidden_size,
24
+ dropout=0.8,
25
+ batch_first=True
26
+ )
27
+ self.linear = nn.Linear(hidden_size, output_size)
28
+
29
+ def forward(self, inputs):
30
+ """
31
+ :param inputs: shape is (batch,dim-size,1)
32
+ :return:
33
+ """
34
+ r_out, h_c = self.lstm(inputs, None)
35
+ x = self.linear(r_out[:, -1, :])
36
+ return x