pybaseutils 2.2.22__tar.gz → 2.2.25__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 (297) hide show
  1. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/PKG-INFO +4 -4
  2. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/README.md +2 -2
  3. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/__init__.py +1 -1
  4. pybaseutils-2.2.25/pybaseutils/converter/prelabelme.py +115 -0
  5. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/coords_utils.py +28 -19
  6. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/corner_utils.py +25 -6
  7. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/video_utils.py +10 -22
  8. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/base_dataset.py +4 -11
  9. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/data_resample.py +2 -0
  10. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_image_folder.py +4 -4
  11. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_image_text.py +53 -32
  12. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_labelme.py +7 -9
  13. pybaseutils-2.2.25/pybaseutils/dataloader/parser_labelme_crop.py +141 -0
  14. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_voc.py +1 -2
  15. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_yolo.py +1 -2
  16. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/file_utils.py +65 -30
  17. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/font_style/__init__.py +1 -1
  18. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/geometry_tools.py +5 -7
  19. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/http_utils.py +47 -21
  20. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/image_utils.py +50 -8
  21. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/json_utils.py +9 -28
  22. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/log.py +24 -14
  23. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/numpy_utils.py +84 -33
  24. pybaseutils-2.2.25/pybaseutils/pandas_utils.py +258 -0
  25. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/human_pose.py +3 -4
  26. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/text_utils.py +35 -0
  27. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/time_utils.py +39 -21
  28. pybaseutils-2.2.25/pybaseutils/web/app_gradio_image.py +147 -0
  29. pybaseutils-2.2.25/pybaseutils/web/demo.py +35 -0
  30. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/PKG-INFO +4 -4
  31. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/SOURCES.txt +9 -3
  32. pybaseutils-2.2.25/test_py/WebCrawler/search_baidu.py +55 -0
  33. pybaseutils-2.2.25/test_py/WebCrawler/search_biying.py +55 -0
  34. pybaseutils-2.2.25/test_py/aije/demo_labelme_crop.py +211 -0
  35. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/AffectNet.py +1 -1
  36. pybaseutils-2.2.25/test_py/demo1.py +41 -0
  37. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo2.py +7 -7
  38. pybaseutils-2.2.25/test_py/demo_for_annular_to_rect.py +53 -0
  39. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_gif_video.py +6 -6
  40. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_lableme_vis.py +8 -3
  41. pybaseutils-2.2.25/test_py/demo_prelabelme.py +57 -0
  42. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_rename.py +2 -2
  43. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_standard_video .py +6 -6
  44. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_video.py +5 -4
  45. pybaseutils-2.2.25/test_py/gradio_app.py +165 -0
  46. pybaseutils-2.2.25/test_py/gradio_app_v2.py +28 -0
  47. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/demo01.py +20 -4
  48. pybaseutils-2.2.25/test_py/milvus_demo/demo02.py +67 -0
  49. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/milvus_client.py +57 -29
  50. pybaseutils-2.2.22/pybaseutils/pandas_utils.py +0 -112
  51. pybaseutils-2.2.22/pybaseutils/web/app_flask_image.py +0 -94
  52. pybaseutils-2.2.22/pybaseutils/web/demo.py +0 -13
  53. pybaseutils-2.2.22/test_py/WebCrawler/search_image.py +0 -78
  54. pybaseutils-2.2.22/test_py/WebCrawler/search_image_for_baidu.py +0 -74
  55. pybaseutils-2.2.22/test_py/aije/demo_labelme_crop.py +0 -122
  56. pybaseutils-2.2.22/test_py/demo1.py +0 -29
  57. pybaseutils-2.2.22/test_py/milvus_demo/demo02.py +0 -44
  58. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/LICENCE +0 -0
  59. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/__init__.py +0 -0
  60. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/audio_utils.py +0 -0
  61. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/pyaudio_utils.py +0 -0
  62. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/vad_utils.py +0 -0
  63. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/base64_utils.py +0 -0
  64. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/batch_utils.py +0 -0
  65. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/build_utils/__init__.py +0 -0
  66. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/build_utils/cython_utils.py +0 -0
  67. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  68. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/__init__.py +0 -0
  69. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/kmean.py +0 -0
  70. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/maxmin_distance.py +0 -0
  71. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/similarity.py +0 -0
  72. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/color_utils.py +0 -0
  73. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/config_utils.py +0 -0
  74. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/__init__.py +0 -0
  75. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_coco.py +0 -0
  76. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_cvat.py +0 -0
  77. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_labelme.py +0 -0
  78. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_voc.py +0 -0
  79. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/concat_coco.py +0 -0
  80. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  81. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_coco2voc.py +0 -0
  82. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  83. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  84. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  85. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  86. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  87. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2coco.py +0 -0
  88. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  89. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2voc.py +0 -0
  90. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  91. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  92. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/__init__.py +0 -0
  93. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/monitor.py +0 -0
  94. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/mouse_utils.py +0 -0
  95. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/nms_utils.py +0 -0
  96. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/__init__.py +0 -0
  97. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/balanced_classes.py +0 -0
  98. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/base_coco.py +0 -0
  99. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  100. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  101. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  102. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  103. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/QueueTable.py +0 -0
  104. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/__init__.py +0 -0
  105. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/demo.py +0 -0
  106. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/kalman_filter.py +0 -0
  107. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/mean_filter.py +0 -0
  108. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/motion_filter.py +0 -0
  109. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/pose_filter.py +0 -0
  110. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/font_utils.py +0 -0
  111. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/heatmap_utils.py +0 -0
  112. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/log_utils.py +0 -0
  113. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/__init__.py +0 -0
  114. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/accuracy.py +0 -0
  115. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/average_meter.py +0 -0
  116. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/class_report.py +0 -0
  117. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/plot_pr.py +0 -0
  118. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/plot_roc.py +0 -0
  119. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/plot_utils.py +0 -0
  120. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/__init__.py +0 -0
  121. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/bones_utils.py +0 -0
  122. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/pose_utils.py +0 -0
  123. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pycpp/__init__.py +0 -0
  124. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pycpp/demo.py +0 -0
  125. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pycpp/main.py +0 -0
  126. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/server/__init__.py +0 -0
  127. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/server/apm_server.py +0 -0
  128. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/setup_config.py +0 -0
  129. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/singleton_utils.py +0 -0
  130. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/thread_utils.py +0 -0
  131. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracemalloc_utils.py +0 -0
  132. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracemalloc_utils2.py +0 -0
  133. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/QueueTable.py +0 -0
  134. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/__init__.py +0 -0
  135. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/demo.py +0 -0
  136. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/kalman_filter.py +0 -0
  137. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/mean_filter.py +0 -0
  138. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/motion_filter.py +0 -0
  139. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/pose_filter.py +0 -0
  140. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/__init__.py +0 -0
  141. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/affine_transform.py +0 -0
  142. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/augment_utils.py +0 -0
  143. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/face_alignment.py +0 -0
  144. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/transform_utils.py +0 -0
  145. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/web/__init__.py +0 -0
  146. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/web/app_stweb_image.py +0 -0
  147. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/web/app_webio_image.py +0 -0
  148. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/word_utils.py +0 -0
  149. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/worker.py +0 -0
  150. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/yaml_utils.py +0 -0
  151. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/dependency_links.txt +0 -0
  152. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/not-zip-safe +0 -0
  153. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/top_level.txt +0 -0
  154. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/setup.cfg +0 -0
  155. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/setup.py +0 -0
  156. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/Image_enhance/__init__.py +0 -0
  157. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/Image_enhance/dmeo01.py +0 -0
  158. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/WebCrawler/__init__.py +0 -0
  159. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/__init__.py +0 -0
  160. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/__init__.py +0 -0
  161. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/action_dataset.py +0 -0
  162. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/build_cython.py +0 -0
  163. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/build_pyarmor.py +0 -0
  164. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/build_service.py +0 -0
  165. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/convert_cvat2labelme.py +0 -0
  166. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/convert_labelme2coco.py +0 -0
  167. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/convert_labelme2voc.py +0 -0
  168. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/copy_move.py +0 -0
  169. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_labelme_shock.py +0 -0
  170. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_video_aije.py +0 -0
  171. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_voc_crop.py +0 -0
  172. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_voc_vis.py +0 -0
  173. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/get_pair_data.py +0 -0
  174. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/video_convertor.py +0 -0
  175. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/__init__.py +0 -0
  176. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/demo.py +0 -0
  177. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/main.py +0 -0
  178. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/main_read.py +0 -0
  179. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/segment.py +0 -0
  180. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  181. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/speechbrain_demo.py +0 -0
  182. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio_demo1.py +0 -0
  183. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/camera/__init__.py +0 -0
  184. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/camera/demo.py +0 -0
  185. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/captcha/__init__.py +0 -0
  186. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/captcha/demo.py +0 -0
  187. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/class_attribute.py +0 -0
  188. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/class_names.py +0 -0
  189. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/AsianMovie.py +0 -0
  190. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/BITVehicle2voc.py +0 -0
  191. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/BSTLD2voc.py +0 -0
  192. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/CCPD.py +0 -0
  193. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/CCPD2voc.py +0 -0
  194. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/FL3D_dataset.py +0 -0
  195. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/FreiHAND2coco.py +0 -0
  196. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/MTFL2voc.py +0 -0
  197. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/TT100K.py +0 -0
  198. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/WaterMeters1.py +0 -0
  199. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/WaterMeters2.py +0 -0
  200. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/__init__.py +0 -0
  201. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/concat_coco.py +0 -0
  202. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_coco2voc.py +0 -0
  203. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_cvat2labelme.py +0 -0
  204. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_gesture2hand.py +0 -0
  205. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_labelme2coco.py +0 -0
  206. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_labelme2cvat.py +0 -0
  207. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_labelme2voc.py +0 -0
  208. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_voc2labelme.py +0 -0
  209. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/fatigue_driving.py +0 -0
  210. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/fdd_dataset.py +0 -0
  211. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/get_pair_data.py +0 -0
  212. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/handpose2coco.py +0 -0
  213. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/insects_for_aichallenger.py +0 -0
  214. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/tt100k_utils.py +0 -0
  215. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/ua_detrac2voc.py +0 -0
  216. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/ucf101_dataset.py +0 -0
  217. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/voc_sbd2labelme.py +0 -0
  218. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/__init__.py +0 -0
  219. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/build_cython.py +0 -0
  220. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/build_pyarmor.py +0 -0
  221. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/cryptography_demo.py +0 -0
  222. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/fun_sum.py +0 -0
  223. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/main.py +0 -0
  224. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/model_des_enctypt.py +0 -0
  225. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/model_enctypt.py +0 -0
  226. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/date_dataset.py +0 -0
  227. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/date_demo.py +0 -0
  228. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/datedataset_bk.py +0 -0
  229. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo3.py +0 -0
  230. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_async_await1.py +0 -0
  231. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_async_await2.py +0 -0
  232. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_coco_vis.py +0 -0
  233. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_copy_files.py +0 -0
  234. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_copy_files_for_voc.py +0 -0
  235. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_ffmpy.py +0 -0
  236. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_for_pair_file.py +0 -0
  237. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_for_polygon.py +0 -0
  238. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_for_trt.py +0 -0
  239. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_get_file_label.py +0 -0
  240. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_get_file_list.py +0 -0
  241. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_gif.py +0 -0
  242. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_image_crop.py +0 -0
  243. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_kpts.py +0 -0
  244. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_labelme.py +0 -0
  245. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_labelme_crop.py +0 -0
  246. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_metrics.py +0 -0
  247. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_mosaic.py +0 -0
  248. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_mouse.py +0 -0
  249. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_nii.py +0 -0
  250. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_pandas.py +0 -0
  251. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_plot.py +0 -0
  252. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_standard_image .py +0 -0
  253. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_taichi.py +0 -0
  254. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_video_crop.py +0 -0
  255. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_voc_crop.py +0 -0
  256. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_voc_vis.py +0 -0
  257. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_word_similar.py +0 -0
  258. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_worker1.py +0 -0
  259. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_worker2.py +0 -0
  260. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/__init__.py +0 -0
  261. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/demo.py +0 -0
  262. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/detect_face_person.py +0 -0
  263. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/predet_labelme.py +0 -0
  264. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/edit_distance/__init__.py +0 -0
  265. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/edit_distance/demo.py +0 -0
  266. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/edit_distance/text_matching.py +0 -0
  267. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/__init__.py +0 -0
  268. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/app.py +0 -0
  269. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/utils/__init__.py +0 -0
  270. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/utils/utils.py +0 -0
  271. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/get_file_list.py +0 -0
  272. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/__init__.py +0 -0
  273. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/demo_correction_v1.py +0 -0
  274. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/demo_correction_v2.py +0 -0
  275. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/demo_correction_v3.py +0 -0
  276. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/kafka_worker.py +0 -0
  277. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/men_tracemalloc.py +0 -0
  278. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/__init__.py +0 -0
  279. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/hello_milvus.py +0 -0
  280. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/performance.py +0 -0
  281. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/pose/__init__.py +0 -0
  282. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/pose/human_pose.py +0 -0
  283. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/redis_py/__init__.py +0 -0
  284. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/redis_py/knn_search.py +0 -0
  285. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/redis_py/redis_client.py +0 -0
  286. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/__init__.py +0 -0
  287. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/base.py +0 -0
  288. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/component.py +0 -0
  289. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/main.py +0 -0
  290. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/register.py +0 -0
  291. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/GRU.py +0 -0
  292. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/TCN.py +0 -0
  293. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/__init__.py +0 -0
  294. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/demo.py +0 -0
  295. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/test_fr/__init__.py +0 -0
  296. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/test_fr/demo11.py +0 -0
  297. {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/test_fr/idcardocr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pybaseutils
3
- Version: 2.2.22
3
+ Version: 2.2.25
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -41,9 +41,9 @@ pybaseutils是个人开发常用的python库,集成了python等常用的算法
41
41
  (有延时,可能不是最新版本)
42
42
  - 安装方法2:pip install –upgrade -i https://pypi.org/simple
43
43
  pybaseutils (从pypi源下载最新版本)
44
-
45
- (设置默认的镜像源:pip config set global.index-url
46
- https://pypi.tuna.tsinghua.edu.cn/simple)
44
+ - 设置默认的镜像源:pip config set global.index-url
45
+ https://pypi.tuna.tsinghua.edu.cn/simple)
46
+ - 超时异常:pip –default-timeout=1000000000
47
47
 
48
48
  一些问题修复说明
49
49
  ----------------
@@ -20,8 +20,8 @@ pybaseutils是个人开发常用的python库,集成了python等常用的算法
20
20
 
21
21
  - 安装方法1:pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils (有延时,可能不是最新版本)
22
22
  - 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
23
-
24
- (设置默认的镜像源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple)
23
+ - 设置默认的镜像源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple)
24
+ - 超时异常:pip --default-timeout=1000000000
25
25
 
26
26
  ## 一些问题修复说明
27
27
 
@@ -8,4 +8,4 @@
8
8
  # --------------------------------------------------------
9
9
  """
10
10
 
11
- __version__ = '2.2.22'
11
+ __version__ = '2.2.25'
@@ -0,0 +1,115 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-04-29 09:13:09
7
+ # @Brief :
8
+ # --------------------------------------------------------
9
+ """
10
+ import os
11
+ import cv2
12
+ from tqdm import tqdm
13
+ from pybaseutils.converter import build_labelme
14
+ from pybaseutils import http_utils, base64_utils, file_utils, image_utils
15
+
16
+
17
+ class PreLabelme(object):
18
+ """
19
+ 调用API接口进行预标注,并保持为Labelme数据格式
20
+ 接口必须返回字段:
21
+ boxes 必选
22
+ label 必选
23
+ score 可选
24
+ names 可选
25
+ segms 可选
26
+ """
27
+
28
+ def __init__(self, url, headers=None, timeout=6, max_retries=1):
29
+ """
30
+ :param url:
31
+ """
32
+ self.url = url
33
+ self.headers = headers
34
+ self.timeout = timeout
35
+ self.max_retries = max_retries
36
+
37
+ def request(self, params, **kwargs):
38
+ """
39
+ :param params:
40
+ :return: boxes,label,names,segms,,score
41
+ """
42
+ params.update(kwargs)
43
+ params = base64_utils.serialization(params)
44
+ result = http_utils.post(self.url, params=params, headers=self.headers,
45
+ timeout=self.timeout, max_retries=self.max_retries)
46
+ result = base64_utils.deserialization(result)
47
+ return result
48
+
49
+ def draw_result(self, image, result: dict, vis=True, delay=0):
50
+ """
51
+ :param image: BGR image
52
+ :param boxes:<np.ndarray>: (num_boxes, 4), box=[xmin,ymin,xmax,ymax]
53
+ :param score:<np.ndarray>: (num_boxes,)
54
+ :param label:<np.ndarray>: (num_boxes,)
55
+ :return:
56
+ """
57
+ color = (255, 0, 0)
58
+ boxes = result.get("boxes", [])
59
+ score = result.get("score", [])
60
+ landm = result.get("landm", [])
61
+ segms = result.get("segms", [])
62
+ label = result.get("label", [])
63
+ names = result.get("names", [])
64
+ if not names: names = label
65
+ texts = ["{} {:3.3f}".format(n, s) for n, s in zip(names, score)]
66
+ image = image_utils.draw_image_bboxes_text(image, boxes, texts, color=color, thickness=2,
67
+ fontScale=0.8, drawType="ch")
68
+ image = image_utils.draw_landmark(image, landm, radius=2, fontScale=1.0, color=color)
69
+ if vis: image_utils.cv_show_image("image", image, delay=delay)
70
+ return image
71
+
72
+ def detect_image_dir(self, image_dir, vis=True):
73
+ """
74
+ :param image_dir: directory or image file path
75
+ :param vis:<bool>
76
+ :return:
77
+ """
78
+ image_list = file_utils.get_files_lists(image_dir)
79
+ for image_file in tqdm(image_list):
80
+ image = cv2.imread(image_file)
81
+ result = self.request(params={"image": image})
82
+ if vis: image = self.draw_result(image, result)
83
+
84
+ def prelabel_labelme(self, image_dir, clsss_dict={}, vis=True):
85
+ """
86
+ 进行预标注,并输出labelme数据格式
87
+ :param image_dir: directory or image file path
88
+ :param vis:<bool>
89
+ :return:
90
+ """
91
+ image_list = file_utils.get_files_lists(image_dir)
92
+ for image_file in tqdm(image_list):
93
+ image = cv2.imread(image_file)
94
+ if image is None: continue
95
+ h, w = image.shape[:2]
96
+ result = self.request(params={"image": image})
97
+ image_name = os.path.basename(image_file)
98
+ json_file = file_utils.change_postfix(image_file, postfix=".json")
99
+ boxes = result.get("boxes", [])
100
+ segms = result.get("segms", [])
101
+ label = result.get("label", [])
102
+ names = [clsss_dict[l] for l in label] if clsss_dict else result.get("names", [])
103
+ result['names'] = names
104
+ points = image_utils.boxes2polygons(boxes)
105
+ build_labelme.maker_labelme(json_file, points, names, image_name, image_size=(w, h), image_bs64=None)
106
+ if vis: image = self.draw_result(image, result)
107
+
108
+
109
+ if __name__ == '__main__':
110
+ # url = 'http://192.168.68.102:5000/detect'
111
+ url = 'http://0.0.0.0:5000/detect'
112
+ image_dir = "/media/PKing/新加卷1/个人文件/video/video/frame"
113
+ s = PreLabelme(url=url)
114
+ s.prelabel_labelme(image_dir=image_dir, vis=False)
115
+ # s.detect_image_dir(image_dir=image_dir)
@@ -23,6 +23,7 @@ def clip_xyxy(xyxy: np.ndarray, valid_range):
23
23
  :return:
24
24
  """
25
25
  if len(xyxy) == 0: return xyxy
26
+ if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
26
27
  xmin, ymin, xmax, ymax = valid_range
27
28
  xyxy[:, [0, 2]] = np.clip(xyxy[:, [0, 2]], xmin, xmax)
28
29
  xyxy[:, [1, 3]] = np.clip(xyxy[:, [1, 3]], ymin, ymax)
@@ -105,7 +106,7 @@ def cxcywh2xyxy(cxcywh: np.ndarray, width=None, height=None, normalized=False):
105
106
  def extend_xyxy(xyxy: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False, use_max=True):
106
107
  """
107
108
  :param bboxes: [[xmin, ymin, xmax, ymax]]
108
- :param scale: [sx,sy]==>(W,H)
109
+ :param scale: [sx,sy]==>(W,H),(sx1,sy1,sx2,sy2),1.0表示不缩放,<1.0表示缩小倍数,>1.0表示扩大倍数
109
110
  :param valid_range:有效范围(xmin,ymin,xmax,ymax)
110
111
  :param fixed: 长宽是否按照相同大小扩展
111
112
  当长宽比相差比较大,直接scale会导致短边扩展不明显,
@@ -114,22 +115,30 @@ def extend_xyxy(xyxy: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False,
114
115
  """
115
116
  if len(xyxy) == 0 or len(scale) == 0: return xyxy
116
117
  if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
117
- cxcywh = xyxy.copy()
118
- if fixed:
119
- cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
120
- cxcywh[:, 1] = (xyxy[:, 3] + xyxy[:, 1]) / 2 # cy
121
- dw = (xyxy[:, 2] - xyxy[:, 0]) * (scale[0] - 1)
122
- dh = (xyxy[:, 3] - xyxy[:, 1]) * (scale[1] - 1)
123
- dp = np.vstack((dw, dh))
124
- dp = np.max(dp, axis=0) if use_max else np.min(dp, axis=0)
125
- cxcywh[:, 2] = (xyxy[:, 2] - xyxy[:, 0]) + dp # w
126
- cxcywh[:, 3] = (xyxy[:, 3] - xyxy[:, 1]) + dp # h
127
- else:
128
- cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
129
- cxcywh[:, 1] = (xyxy[:, 3] + xyxy[:, 1]) / 2 # cy
130
- cxcywh[:, 2] = (xyxy[:, 2] - xyxy[:, 0]) * scale[0] # w
131
- cxcywh[:, 3] = (xyxy[:, 3] - xyxy[:, 1]) * scale[1] # h
132
- dxyxy = cxcywh2xyxy(cxcywh, width=None, height=None, normalized=False)
118
+ if len(scale) == 2:
119
+ cxcywh = xyxy.copy()
120
+ if fixed:
121
+ cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
122
+ cxcywh[:, 1] = (xyxy[:, 3] + xyxy[:, 1]) / 2 # cy
123
+ dw = (xyxy[:, 2] - xyxy[:, 0]) * (scale[0] - 1)
124
+ dh = (xyxy[:, 3] - xyxy[:, 1]) * (scale[1] - 1)
125
+ dp = np.vstack((dw, dh))
126
+ dp = np.max(dp, axis=0) if use_max else np.min(dp, axis=0)
127
+ cxcywh[:, 2] = (xyxy[:, 2] - xyxy[:, 0]) + dp # w
128
+ cxcywh[:, 3] = (xyxy[:, 3] - xyxy[:, 1]) + dp # h
129
+ else:
130
+ cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
131
+ cxcywh[:, 1] = (xyxy[:, 3] + xyxy[:, 1]) / 2 # cy
132
+ cxcywh[:, 2] = (xyxy[:, 2] - xyxy[:, 0]) * scale[0] # w
133
+ cxcywh[:, 3] = (xyxy[:, 3] - xyxy[:, 1]) * scale[1] # h
134
+ dxyxy = cxcywh2xyxy(cxcywh, width=None, height=None, normalized=False)
135
+ elif len(scale) == 4:
136
+ xywh = xyxy2xywh(xyxy)
137
+ xyxy[:, 0] = xyxy[:, 0] + xywh[:, 2] * (1 - scale[0])
138
+ xyxy[:, 1] = xyxy[:, 1] + xywh[:, 3] * (1 - scale[1])
139
+ xyxy[:, 2] = xyxy[:, 2] - xywh[:, 2] * (1 - scale[2])
140
+ xyxy[:, 3] = xyxy[:, 3] - xywh[:, 3] * (1 - scale[3])
141
+ dxyxy = xyxy
133
142
  if valid_range: dxyxy = clip_xyxy(dxyxy, valid_range=valid_range)
134
143
  return dxyxy
135
144
 
@@ -205,8 +214,8 @@ def get_square_boxes(boxes, use_max=True, use_mean=False, baseline=-1):
205
214
  """
206
215
  将boxes转换为正方形的boxes
207
216
  :param boxes:
208
- :param use_max: 是否按照每个box(w,h)最大值(True)/最小值(False)进行转换(默认)
209
- :param use_mean: 是否按照每个box(w,h)平均值进行转换(优先级比use_mean高)
217
+ :param use_max: 是否按照每个box(w,h)最大值(True)/最小值(False)进行转换(默认),可以保证目标裁剪完整
218
+ :param use_mean: 是否按照每个box(w,h)平均值进行转换(优先级比use_max高),但当目标长宽比比较大时,可能出现目标裁剪不完整的问题
210
219
  :param baseline: 当baseline>0,表示正方形最小边长
211
220
  :return:
212
221
  """
@@ -76,7 +76,7 @@ def get_target_points(src_pts: np.ndarray):
76
76
  return dst_pts
77
77
 
78
78
 
79
- def get_order_points(src_pts):
79
+ def get_order_points_index(src_pts):
80
80
  """
81
81
  对4个点按顺时针方向进行排序:[top-left, top-right, bottom-right, bottom-left]
82
82
  top-left :对应y+x之和的最小点
@@ -91,13 +91,32 @@ def get_order_points(src_pts):
91
91
  :param src_pts: pts_dst [top-left, top-right, bottom-right, bottom-left]
92
92
  :return:
93
93
  """
94
- dst_pts = np.zeros(shape=(4, 2), dtype=np.float32)
95
94
  s = src_pts.sum(axis=1)
96
- dst_pts[0] = src_pts[np.argmin(s)]
97
- dst_pts[2] = src_pts[np.argmax(s)]
98
95
  d = np.diff(src_pts, axis=1)
99
- dst_pts[1] = src_pts[np.argmin(d)]
100
- dst_pts[3] = src_pts[np.argmax(d)]
96
+ i0 = np.argmin(s)
97
+ i2 = np.argmax(s)
98
+ i1 = np.argmin(d)
99
+ i3 = np.argmax(d)
100
+ return [i0, i1, i2, i3]
101
+
102
+
103
+ def get_order_points(src_pts):
104
+ """
105
+ 对4个点按顺时针方向进行排序:[top-left, top-right, bottom-right, bottom-left]
106
+ top-left :对应y+x之和的最小点
107
+ bottom-right:对应y+x之和的最大点
108
+ top-right :对应y-x之差的最小点
109
+ bottom-left :对应y-x之差的最大点
110
+ 0(top-left)----(w10)----1(top-right)
111
+ | |
112
+ (h30) (h21)
113
+ | |
114
+ 3(bottom-left)--(w23)---2(bottom-right)
115
+ :param src_pts: pts_dst [top-left, top-right, bottom-right, bottom-left]
116
+ :return:
117
+ """
118
+ index = get_order_points_index(src_pts)
119
+ dst_pts = src_pts[index]
101
120
  return dst_pts
102
121
 
103
122
 
@@ -61,7 +61,7 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, use_pil=False, f
61
61
  image_utils.frames2gif_by_imageio(frames, gif_file=gif_file, fps=fps, loop=0)
62
62
 
63
63
 
64
- def video2frames(video_file, out_dir=None, func=None, interval=1, vis=True, delay=10):
64
+ def video2frames(video_file, out_dir=None, func=None, interval=1, start=0, end=-1, vis=True, delay=10):
65
65
  """
66
66
  视频抽帧图像
67
67
  :param video_file: 视频文件
@@ -73,26 +73,14 @@ def video2frames(video_file, out_dir=None, func=None, interval=1, vis=True, dela
73
73
  """
74
74
  name = os.path.basename(video_file).split(".")[0]
75
75
  if not out_dir: out_dir = os.path.join(os.path.dirname(video_file), name)
76
- video_cap = get_video_capture(video_file)
77
- width, height, num_frames, fps = get_video_info(video_cap)
78
- if not interval: interval = fps
79
- if not os.path.exists(out_dir): os.makedirs(out_dir)
80
- count = 0
81
- while True:
82
- if count % interval == 0:
83
- # 设置抽帧的位置
84
- video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
85
- isSuccess, frame = video_cap.read()
86
- if not isSuccess or 0 < num_frames < count: break
87
- if func:
88
- frame = func(frame)
89
- if vis:
90
- image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
91
- frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
92
- cv2.imwrite(frame_file, frame)
93
- count += 1
94
- video_cap.release()
95
- cv2.destroyAllWindows()
76
+ video_cap = video_iterator(video_file, save_video=None, interval=interval, start=start, end=end)
77
+ for data_info in video_cap:
78
+ frame = data_info["frame"]
79
+ count = data_info["count"]
80
+ if func: frame = func(frame)
81
+ if vis: image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
82
+ frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
83
+ cv2.imwrite(frame_file, frame)
96
84
 
97
85
 
98
86
  def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True):
@@ -297,7 +285,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
297
285
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
298
286
  start = int(kwargs.get("start", 0) * fps)
299
287
  end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
300
- end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
288
+ end = min(end, num_frames) if end > 0 else num_frames # TODO 当num_frames<0时,使用0<end<count继续播放
301
289
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
302
290
  save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
303
291
  count = 0
@@ -78,7 +78,7 @@ class Dataset(object):
78
78
  else:
79
79
  class_dict = None
80
80
  if class_dict:
81
- class_dict = json_utils.dict_sort_by_value(class_dict, reverse=False)
81
+ # class_dict = json_utils.dict_sort(class_dict, reverse=False)
82
82
  class_name = {}
83
83
  for n, i in class_dict.items():
84
84
  class_name[i] = "{},{}".format(class_name[i], n) if i in class_name else n
@@ -129,23 +129,16 @@ class Dataset(object):
129
129
  return Dataset.read_file(filename, split=split)
130
130
 
131
131
  @staticmethod
132
- def get_file_list(dir_root, postfix=['*.jpg'], basename=True):
132
+ def get_file_list(dir_root, postfix=['*.jpg'], sub=False, basename=True):
133
133
  """
134
134
  获得文件列表
135
135
  :param dir_root: 图片文件目录
136
136
  :param postfix: 后缀名,可是多个如,['*.jpg','*.png']
137
+ :param sub: 是否去除根路径
137
138
  :param basename: 返回的列表是文件名(True),还是文件的完整路径(False)
138
139
  :return:
139
140
  """
140
- file_list = []
141
- for format in postfix:
142
- format = os.path.join(dir_root, format)
143
- image_list = glob.glob(format)
144
- if image_list:
145
- file_list += image_list
146
- file_list = sorted(file_list)
147
- if basename:
148
- file_list = [os.path.basename(f).split(".")[0] for f in file_list]
141
+ file_list = file_utils.get_files_list(dir_root, prefix="", postfix=postfix, sub=sub, basename=basename)
149
142
  return file_list
150
143
 
151
144
  @staticmethod
@@ -178,6 +178,8 @@ class DataResample(object):
178
178
  class_count[label] += 1
179
179
  except Exception as e:
180
180
  class_count[label] = 1
181
+ from pybaseutils import json_utils
182
+ class_count = json_utils.dict_sort(class_count,use_key=True)
181
183
  return class_count
182
184
 
183
185
  @staticmethod
@@ -50,7 +50,7 @@ class FolderDataset(parser_image_text.TextDataset):
50
50
  保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,,ymax]
51
51
  :param data_file:
52
52
  :param data_root:
53
- :return: item_list [{"file":file,"label":label}]
53
+ :return: item_list [{"file","label","name","bbox"}],bbox非必须
54
54
  """
55
55
  if isinstance(data_file, str): data_file = [data_file]
56
56
  item_list = []
@@ -61,7 +61,7 @@ class FolderDataset(parser_image_text.TextDataset):
61
61
  print("loading data from:{},have {},label:{}".format(dir, len(paths), len(set(labels))))
62
62
  # TODO # 避免多个数据集的相同的label
63
63
  if use_sub: labels = [os.path.join(str(i), l) for l in labels]
64
- data = [{"file": p, "label": l} for p, l in zip(paths, labels)]
64
+ data = [{"file": p, "label": l, 'name': l} for p, l in zip(paths, labels)]
65
65
  item_list += data
66
66
  return item_list
67
67
 
@@ -70,7 +70,7 @@ if __name__ == '__main__':
70
70
  from pybaseutils import image_utils
71
71
  from torchvision import transforms
72
72
 
73
- image_dir = ['/home/PKing/nasdata/release/infrastructure/DMClassification/data/dataset/train']
73
+ image_dir = ['/home/PKing/nasdata/release/infrastructure/DMClassification/data/dataset/test']
74
74
  class_name = []
75
75
  input_size = [224, 224]
76
76
  rgb_mean = [0., 0., 0.]
@@ -84,7 +84,7 @@ if __name__ == '__main__':
84
84
  transform=transform,
85
85
  shuffle=True,
86
86
  class_name=class_name,
87
- resample=True,
87
+ resample=False,
88
88
  disp=True)
89
89
  for i in range(len(dataset)):
90
90
  data_info = dataset.__getitem__(i)
@@ -13,7 +13,7 @@ sys.path.append(os.getcwd())
13
13
  import PIL.Image as Image
14
14
  import numpy as np
15
15
  import random
16
- import math
16
+ import time
17
17
  import cv2
18
18
  from tqdm import tqdm
19
19
  from pybaseutils.dataloader.base_dataset import Dataset, ConcatDataset
@@ -36,17 +36,26 @@ class TextDataset(Dataset):
36
36
  :param phase:
37
37
  :param disp:
38
38
  :param check:
39
- :param kwargs: use_max,use_mean,crop_scale,resample,save_info
39
+ :param kwargs: log: print or log.info
40
+ use_max,
41
+ use_mean,
42
+ crop_scale,
43
+ resample,
44
+ save_info,
45
+ resample_interval
40
46
  """
41
47
  self.data_file = data_file
42
48
  self.data_root = data_root
43
49
  self.use_rgb = use_rgb
44
50
  self.transform = transform
45
51
  self.phase = phase
52
+ self.train = self.phase.lower() == "train"
46
53
  self.shuffle = shuffle
47
54
  self.check = check
48
55
  self.kwargs = kwargs
56
+ self.log = kwargs.get('log', print) if kwargs.get('log', print) else print
49
57
  self.label_index = kwargs.get("label_index", "label") # 类别字段key
58
+ self.crop_scale = kwargs.pop("crop_scale", []) # TODO bbox缩放系数
50
59
  self.class_name, self.class_dict = self.parser_classes(class_name)
51
60
  self.item_list = self.parser_dataset(data_file, data_root=data_root, label_index=self.label_index,
52
61
  shuffle=shuffle, check=check)
@@ -64,16 +73,19 @@ class TextDataset(Dataset):
64
73
  self.classes = list(self.class_dict.values())
65
74
  self.num_classes = max(self.classes) + 1
66
75
  self.num_samples = len(self.item_list)
67
- self.info(save_info=kwargs.get("save_info", ""))
76
+ self.t0 = time.time()
77
+ self.resample_interval = kwargs.get('resample_interval', 60) # TODO 重采样间隔,低于该时间的不进行重采集,避免频繁采样
78
+ if self.log: self.info(save_info=kwargs.get("save_info", ""))
68
79
 
69
80
  def info(self, save_info=""):
70
- print("----------------------- {} DATASET INFO -----------------------".format(self.phase.upper()))
71
- print("Dataset num_samples :{}".format(len(self.item_list)))
72
- print("Dataset num_classes :{}".format(self.num_classes))
73
- print("Dataset class_name :{}".format(self.class_name))
74
- print("Dataset class_dict :{}".format(self.class_dict))
75
- print("Dataset class_count :{}".format(self.class_count))
76
- print("Dataset resample :{}".format(self.resample))
81
+ self.log("----------------------- {} DATASET INFO -----------------------".format(self.phase.upper()))
82
+ self.log("Dataset kwargs :{}".format(self.kwargs))
83
+ self.log("Dataset num_samples :{}".format(len(self.item_list)))
84
+ self.log("Dataset num_classes :{}".format(self.num_classes))
85
+ self.log("Dataset class_name :{}".format(self.class_name))
86
+ self.log("Dataset class_dict :{}".format(self.class_dict))
87
+ self.log("Dataset class_count :{}".format(self.class_count))
88
+ self.log("Dataset resample :{}".format(self.resample))
77
89
  if save_info:
78
90
  if not os.path.exists(save_info): os.makedirs(save_info)
79
91
  m = np.mean(list(self.class_count.values()))
@@ -85,8 +97,8 @@ class TextDataset(Dataset):
85
97
  file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_count.json"), self.class_count)
86
98
  file_utils.write_list_data(os.path.join(save_info, f"{self.phase}_class_name.txt"), self.class_name)
87
99
  file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_lack.json"), class_lack)
88
- print("loss_labels: {}".format(class_lack))
89
- print("------------------------------------------------------------------")
100
+ self.log("loss_labels: {}".format(class_lack))
101
+ self.log("------------------------------------------------------------------")
90
102
 
91
103
  def parser_dataset(self, data_file, data_root="", label_index="label", shuffle=False, check=False):
92
104
  """
@@ -101,6 +113,7 @@ class TextDataset(Dataset):
101
113
  data_list = self.load_dataset(data_file, data_root=data_root)
102
114
  if not self.class_name:
103
115
  self.class_name = list(set([d[label_index] for d in data_list]))
116
+ self.class_name = sorted(self.class_name)
104
117
  self.class_name, self.class_dict = self.parser_classes(self.class_name)
105
118
  item_list = []
106
119
  for data in data_list:
@@ -118,10 +131,10 @@ class TextDataset(Dataset):
118
131
 
119
132
  def load_dataset(self, data_file, data_root="", **kwargs):
120
133
  """
121
- 保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
134
+ txt保存格式:[path,name] 或者 [path,name,xmin,ymin,xmax,ymax]
122
135
  :param data_file:
123
136
  :param data_root:
124
- :return: item_list [{"file":file,"label":label},"bbox":[]]
137
+ :return: item_list [{"file","label","name","bbox"}],bbox非必须
125
138
  """
126
139
  if isinstance(data_file, str): data_file = [data_file]
127
140
  item_list = []
@@ -130,10 +143,9 @@ class TextDataset(Dataset):
130
143
  content = file_utils.read_data(file, split=",")
131
144
  data = []
132
145
  for line in content:
133
- if len(line) == 2:
134
- data.append({"file": os.path.join(root, line[0]), "label": line[1]})
135
- elif len(line) == 6:
136
- data.append({"file": os.path.join(root, line[0]), "label": line[1], "bbox": line[2:]})
146
+ item = {"file": os.path.join(root, line[0]), "label": line[1], 'name': line[1]}
147
+ if len(line) == 6: item['bbox'] = line[2:] # (xmin,ymin,xmax,ymax)
148
+ data.append(item)
137
149
  print("loading data from:{},have {}".format(file, len(data)))
138
150
  item_list += data
139
151
  return item_list
@@ -157,33 +169,41 @@ class TextDataset(Dataset):
157
169
  def __getitem__(self, index):
158
170
  """
159
171
  :param index:
160
- :return: {"image": image, "label": label}
172
+ :return: {"image","label","name"}
161
173
  """
162
174
  item = self.item_list[index]
163
- file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
164
- name = self.class_name[label]
175
+ file, label, name, bbox = item["file"], item[self.label_index], item['name'], item.get("bbox", [])
165
176
  image = self.read_image(file, use_rgb=self.use_rgb)
166
- image = self.crop_image(image, bbox=bbox, **self.kwargs) if bbox else image
177
+ image = self.crop_image(image, bbox=bbox, crop_scale=self.crop_scale, **self.kwargs)
167
178
  if self.transform:
168
- image = Image.fromarray(image)
169
- image = self.transform(image)
179
+ image = self.transform(Image.fromarray(image))
170
180
  if image is None:
171
181
  index = int(random.uniform(0, self.num_samples))
172
182
  return self.__getitem__(index)
173
183
  return dict(image=image, label=label, file=file, name=name)
174
184
 
175
185
  def __len__(self):
176
- if self.resample:
186
+ self.t1 = time.time() # seconds
187
+ dt = (self.t1 - self.t0)
188
+ if dt > self.resample_interval and self.resample: # 如果时间间隔太小则不进行重采样
189
+ print(f"resample {self.phase} dataset")
177
190
  self.item_list = self.data_resample.update(True)
191
+ self.t0 = self.t1
178
192
  return len(self.item_list)
179
193
 
180
- def crop_image(self, image, bbox, **kwargs):
181
- """裁剪图片"""
194
+ def crop_image(self, image, bbox, crop_scale=[], use_max=False, use_mean=True, **kwargs):
195
+ """
196
+ 裁剪图片
197
+ :param image:
198
+ :param bbox:
199
+ :param kwargs: use_max,use_mean,crop_scale
200
+ use_max: 是否按照每个box(w,h)最大值(True)/最小值(False)进行转换(默认),可以保证目标裁剪完整
201
+ use_mean: 是否按照每个box(w,h)平均值进行转换(优先级比use_max高),但当目标长宽比比较大时,可能出现目标裁剪不完整的问题
202
+ :return:
203
+ """
182
204
  if len(bbox) == 0: return image
183
- boxes = image_utils.get_square_boxes(boxes=[bbox],
184
- use_max=kwargs.get("use_max", False),
185
- use_mean=kwargs.get("use_mean", True))
186
- boxes = image_utils.extend_xyxy(boxes, scale=kwargs.get("crop_scale", []))
205
+ boxes = image_utils.get_square_boxes(boxes=[bbox], use_max=use_max, use_mean=use_mean)
206
+ boxes = image_utils.extend_xyxy(boxes, scale=crop_scale)
187
207
  image = image_utils.get_boxes_crop(image, boxes)[0]
188
208
  return image
189
209
 
@@ -236,6 +256,7 @@ class TextDataset(Dataset):
236
256
  for item in item_list:
237
257
  label = item[label_index]
238
258
  count[label] = count[label] + 1 if label in count else 1
259
+ count = json_utils.dict_sort(count, use_key=True)
239
260
  if class_name: count = {class_name[k]: v for k, v in count.items()}
240
261
  return count
241
262
 
@@ -245,7 +266,7 @@ if __name__ == '__main__':
245
266
  from torchvision import transforms
246
267
 
247
268
  data_files = [
248
- '/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-images-v2/train.txt',
269
+ '/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing/anti-spoofing-images-v2/test.txt',
249
270
  ]
250
271
  class_name = None
251
272
  input_size = [112, 112]
@@ -94,8 +94,7 @@ class LabelMeDataset(Dataset):
94
94
  :return:
95
95
  """
96
96
  image_file = os.path.join(image_dir, image_name)
97
- img_postfix = image_name.split(".")[-1]
98
- image_id = image_name[:-len(img_postfix) - 1]
97
+ image_id, img_postfix = file_utils.split_postfix(image_file)
99
98
  anno_file = os.path.join(anno_dir, "{}.json".format(image_id))
100
99
  return image_file, anno_file, image_name
101
100
 
@@ -150,11 +149,11 @@ class LabelMeDataset(Dataset):
150
149
  if not image_dir:
151
150
  image_dir = self.search_path(data_root, ["images", "JPEGImages"])
152
151
  if image_dir and not image_ids:
153
- image_ids = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, basename=False)
154
- image_ids = [os.path.basename(f) for f in image_ids]
152
+ image_ids = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
153
+ if not anno_dir: anno_dir = image_dir
155
154
  elif anno_dir and not image_ids:
156
- image_ids = self.get_file_list(anno_dir, postfix=["*.json", "*.xml"], basename=False)
157
- image_ids = [os.path.basename(f) for f in image_ids]
155
+ image_ids = self.get_file_list(anno_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
156
+ if not image_dir: image_dir = anno_dir
158
157
  assert isinstance(anno_dir, str) and os.path.exists(anno_dir), "no anno_dir :{}".format(anno_dir)
159
158
  assert isinstance(image_dir, str) and os.path.exists(image_dir), "no image_dir:{}".format(image_dir)
160
159
  assert len(image_ids) > 0, f"image_ids is empty,image_dir={image_dir},anno_dir={anno_dir}"
@@ -330,7 +329,7 @@ class LabelMeDataset(Dataset):
330
329
  width = annotation.get('imageWidth', -1)
331
330
  height = annotation.get('imageHeight', -1)
332
331
  except:
333
- print("illegal annotation:{}".format(anno_file))
332
+ # print("illegal annotation:{}".format(anno_file))
334
333
  annos = []
335
334
  width = -1
336
335
  height = -1
@@ -487,8 +486,7 @@ def show_target_image(image, boxes, labels, points, keypoints=[], color=(), thic
487
486
  if __name__ == "__main__":
488
487
  from pybaseutils.converter import build_labelme
489
488
 
490
- anno_dir = "/home/PKing/Downloads/sample/images"
491
- # anno_dir = "/home/PKing/Downloads/冲击试验/sample/images"
489
+ anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/train-v2/01-核相操作/dataset-v01/images"
492
490
  names = None
493
491
  dataset = LabelMeDatasets(filename=None,
494
492
  data_root=None,