pybaseutils 2.2.21__tar.gz → 2.2.24__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 (294) hide show
  1. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/PKG-INFO +1 -1
  2. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_coco.py +1 -1
  4. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_labelme.py +4 -4
  5. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/concat_coco.py +3 -3
  6. pybaseutils-2.2.24/pybaseutils/converter/prelabelme.py +115 -0
  7. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/coords_utils.py +26 -17
  8. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/corner_utils.py +25 -6
  9. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/video_utils.py +12 -22
  10. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/base_dataset.py +3 -10
  11. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_image_text.py +14 -7
  12. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_labelme.py +6 -7
  13. pybaseutils-2.2.24/pybaseutils/dataloader/parser_labelme_crop.py +136 -0
  14. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/file_utils.py +48 -40
  15. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/font_style/__init__.py +1 -1
  16. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/geometry_tools.py +5 -7
  17. pybaseutils-2.2.24/pybaseutils/http_utils.py +256 -0
  18. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/image_utils.py +46 -6
  19. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/json_utils.py +54 -23
  20. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/log.py +1 -1
  21. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/log_utils.py +1 -1
  22. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/class_report.py +1 -1
  23. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/numpy_utils.py +30 -5
  24. pybaseutils-2.2.24/pybaseutils/pandas_utils.py +112 -0
  25. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/text_utils.py +35 -0
  26. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/thread_utils.py +7 -1
  27. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/PKG-INFO +1 -1
  28. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/SOURCES.txt +7 -2
  29. pybaseutils-2.2.24/test_py/WebCrawler/search_baidu.py +55 -0
  30. pybaseutils-2.2.24/test_py/WebCrawler/search_biying.py +55 -0
  31. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/build_service.py +1 -1
  32. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_labelme_crop.py +38 -3
  33. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/FL3D_dataset.py +1 -1
  34. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/handpose2coco.py +1 -1
  35. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/insects_for_aichallenger.py +1 -1
  36. pybaseutils-2.2.24/test_py/demo1.py +28 -0
  37. pybaseutils-2.2.24/test_py/demo2.py +26 -0
  38. pybaseutils-2.2.24/test_py/demo_for_annular_to_rect.py +53 -0
  39. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_lableme_vis.py +1 -1
  40. pybaseutils-2.2.24/test_py/demo_mosaic.py +71 -0
  41. pybaseutils-2.2.24/test_py/demo_prelabelme.py +57 -0
  42. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_rename.py +2 -2
  43. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_standard_video .py +6 -6
  44. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_video.py +5 -4
  45. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/demo01.py +20 -4
  46. pybaseutils-2.2.24/test_py/milvus_demo/demo02.py +67 -0
  47. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/milvus_client.py +57 -29
  48. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/test_fr/idcardocr.py +1 -1
  49. pybaseutils-2.2.21/pybaseutils/http_utils.py +0 -90
  50. pybaseutils-2.2.21/pybaseutils/pandas_utils.py +0 -108
  51. pybaseutils-2.2.21/test_py/WebCrawler/search_image.py +0 -78
  52. pybaseutils-2.2.21/test_py/WebCrawler/search_image_for_baidu.py +0 -74
  53. pybaseutils-2.2.21/test_py/demo1.py +0 -14
  54. pybaseutils-2.2.21/test_py/demo2.py +0 -24
  55. pybaseutils-2.2.21/test_py/milvus_demo/demo02.py +0 -44
  56. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/LICENCE +0 -0
  57. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/README.md +0 -0
  58. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/__init__.py +0 -0
  59. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/audio_utils.py +0 -0
  60. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/pyaudio_utils.py +0 -0
  61. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/vad_utils.py +0 -0
  62. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/base64_utils.py +0 -0
  63. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/batch_utils.py +0 -0
  64. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/build_utils/__init__.py +0 -0
  65. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/build_utils/cython_utils.py +0 -0
  66. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  67. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/__init__.py +0 -0
  68. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/kmean.py +0 -0
  69. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/maxmin_distance.py +0 -0
  70. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/similarity.py +0 -0
  71. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/color_utils.py +0 -0
  72. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/config_utils.py +0 -0
  73. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/__init__.py +0 -0
  74. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_cvat.py +0 -0
  75. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_voc.py +0 -0
  76. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  77. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_coco2voc.py +0 -0
  78. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  79. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  80. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  81. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  82. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  83. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2coco.py +0 -0
  84. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  85. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2voc.py +0 -0
  86. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  87. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  88. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/__init__.py +0 -0
  89. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/monitor.py +0 -0
  90. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/mouse_utils.py +0 -0
  91. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/nms_utils.py +0 -0
  92. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/__init__.py +0 -0
  93. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/balanced_classes.py +0 -0
  94. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/base_coco.py +0 -0
  95. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/data_resample.py +0 -0
  96. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  97. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  98. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  99. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  100. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_voc.py +0 -0
  101. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_yolo.py +0 -0
  102. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  103. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/QueueTable.py +0 -0
  104. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/__init__.py +0 -0
  105. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/demo.py +0 -0
  106. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/kalman_filter.py +0 -0
  107. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/mean_filter.py +0 -0
  108. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/motion_filter.py +0 -0
  109. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/pose_filter.py +0 -0
  110. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/font_utils.py +0 -0
  111. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/heatmap_utils.py +0 -0
  112. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/__init__.py +0 -0
  113. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/accuracy.py +0 -0
  114. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/average_meter.py +0 -0
  115. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/plot_pr.py +0 -0
  116. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/plot_roc.py +0 -0
  117. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/plot_utils.py +0 -0
  118. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/__init__.py +0 -0
  119. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/bones_utils.py +0 -0
  120. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/human_pose.py +0 -0
  121. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/pose_utils.py +0 -0
  122. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pycpp/__init__.py +0 -0
  123. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pycpp/demo.py +0 -0
  124. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pycpp/main.py +0 -0
  125. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/server/__init__.py +0 -0
  126. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/server/apm_server.py +0 -0
  127. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/setup_config.py +0 -0
  128. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/singleton_utils.py +0 -0
  129. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/time_utils.py +0 -0
  130. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracemalloc_utils.py +0 -0
  131. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracemalloc_utils2.py +0 -0
  132. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/QueueTable.py +0 -0
  133. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/__init__.py +0 -0
  134. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/demo.py +0 -0
  135. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/kalman_filter.py +0 -0
  136. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/mean_filter.py +0 -0
  137. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/motion_filter.py +0 -0
  138. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/pose_filter.py +0 -0
  139. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/__init__.py +0 -0
  140. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/affine_transform.py +0 -0
  141. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/augment_utils.py +0 -0
  142. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/face_alignment.py +0 -0
  143. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/transform_utils.py +0 -0
  144. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/__init__.py +0 -0
  145. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/app_flask_image.py +0 -0
  146. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/app_stweb_image.py +0 -0
  147. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/app_webio_image.py +0 -0
  148. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/demo.py +0 -0
  149. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/word_utils.py +0 -0
  150. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/worker.py +0 -0
  151. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/yaml_utils.py +0 -0
  152. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/dependency_links.txt +0 -0
  153. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/not-zip-safe +0 -0
  154. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/top_level.txt +0 -0
  155. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/setup.cfg +0 -0
  156. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/setup.py +0 -0
  157. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/Image_enhance/__init__.py +0 -0
  158. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/Image_enhance/dmeo01.py +0 -0
  159. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/WebCrawler/__init__.py +0 -0
  160. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/__init__.py +0 -0
  161. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/__init__.py +0 -0
  162. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/action_dataset.py +0 -0
  163. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/build_cython.py +0 -0
  164. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/build_pyarmor.py +0 -0
  165. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/convert_cvat2labelme.py +0 -0
  166. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/convert_labelme2coco.py +0 -0
  167. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/convert_labelme2voc.py +0 -0
  168. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/copy_move.py +0 -0
  169. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_labelme_shock.py +0 -0
  170. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_video_aije.py +0 -0
  171. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_voc_crop.py +0 -0
  172. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_voc_vis.py +0 -0
  173. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/get_pair_data.py +0 -0
  174. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/video_convertor.py +0 -0
  175. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/__init__.py +0 -0
  176. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/demo.py +0 -0
  177. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/main.py +0 -0
  178. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/main_read.py +0 -0
  179. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/segment.py +0 -0
  180. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  181. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/speechbrain_demo.py +0 -0
  182. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio_demo1.py +0 -0
  183. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/camera/__init__.py +0 -0
  184. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/camera/demo.py +0 -0
  185. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/captcha/__init__.py +0 -0
  186. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/captcha/demo.py +0 -0
  187. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/class_attribute.py +0 -0
  188. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/class_names.py +0 -0
  189. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/AffectNet.py +0 -0
  190. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/AsianMovie.py +0 -0
  191. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/BITVehicle2voc.py +0 -0
  192. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/BSTLD2voc.py +0 -0
  193. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/CCPD.py +0 -0
  194. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/CCPD2voc.py +0 -0
  195. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/FreiHAND2coco.py +0 -0
  196. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/MTFL2voc.py +0 -0
  197. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/TT100K.py +0 -0
  198. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/WaterMeters1.py +0 -0
  199. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/WaterMeters2.py +0 -0
  200. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/__init__.py +0 -0
  201. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/concat_coco.py +0 -0
  202. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_coco2voc.py +0 -0
  203. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_cvat2labelme.py +0 -0
  204. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_gesture2hand.py +0 -0
  205. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_labelme2coco.py +0 -0
  206. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_labelme2cvat.py +0 -0
  207. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_labelme2voc.py +0 -0
  208. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_voc2labelme.py +0 -0
  209. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/fatigue_driving.py +0 -0
  210. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/fdd_dataset.py +0 -0
  211. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/get_pair_data.py +0 -0
  212. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/tt100k_utils.py +0 -0
  213. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/ua_detrac2voc.py +0 -0
  214. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/ucf101_dataset.py +0 -0
  215. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/voc_sbd2labelme.py +0 -0
  216. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/__init__.py +0 -0
  217. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/build_cython.py +0 -0
  218. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/build_pyarmor.py +0 -0
  219. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/cryptography_demo.py +0 -0
  220. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/fun_sum.py +0 -0
  221. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/main.py +0 -0
  222. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/model_des_enctypt.py +0 -0
  223. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/model_enctypt.py +0 -0
  224. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/date_dataset.py +0 -0
  225. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/date_demo.py +0 -0
  226. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/datedataset_bk.py +0 -0
  227. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo3.py +0 -0
  228. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_async_await1.py +0 -0
  229. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_async_await2.py +0 -0
  230. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_coco_vis.py +0 -0
  231. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_copy_files.py +0 -0
  232. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_copy_files_for_voc.py +0 -0
  233. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_ffmpy.py +0 -0
  234. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_for_pair_file.py +0 -0
  235. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_for_polygon.py +0 -0
  236. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_for_trt.py +0 -0
  237. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_get_file_label.py +0 -0
  238. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_get_file_list.py +0 -0
  239. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_gif.py +0 -0
  240. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_gif_video.py +0 -0
  241. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_image_crop.py +0 -0
  242. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_kpts.py +0 -0
  243. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_labelme.py +0 -0
  244. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_labelme_crop.py +0 -0
  245. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_metrics.py +0 -0
  246. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_mouse.py +0 -0
  247. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_nii.py +0 -0
  248. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_pandas.py +0 -0
  249. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_plot.py +0 -0
  250. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_standard_image .py +0 -0
  251. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_taichi.py +0 -0
  252. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_video_crop.py +0 -0
  253. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_voc_crop.py +0 -0
  254. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_voc_vis.py +0 -0
  255. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_word_similar.py +0 -0
  256. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_worker1.py +0 -0
  257. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_worker2.py +0 -0
  258. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/__init__.py +0 -0
  259. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/demo.py +0 -0
  260. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/detect_face_person.py +0 -0
  261. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/predet_labelme.py +0 -0
  262. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/edit_distance/__init__.py +0 -0
  263. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/edit_distance/demo.py +0 -0
  264. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/edit_distance/text_matching.py +0 -0
  265. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/__init__.py +0 -0
  266. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/app.py +0 -0
  267. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/utils/__init__.py +0 -0
  268. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/utils/utils.py +0 -0
  269. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/get_file_list.py +0 -0
  270. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/__init__.py +0 -0
  271. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/demo_correction_v1.py +0 -0
  272. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/demo_correction_v2.py +0 -0
  273. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/demo_correction_v3.py +0 -0
  274. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/kafka_worker.py +0 -0
  275. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/men_tracemalloc.py +0 -0
  276. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/__init__.py +0 -0
  277. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/hello_milvus.py +0 -0
  278. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/performance.py +0 -0
  279. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/pose/__init__.py +0 -0
  280. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/pose/human_pose.py +0 -0
  281. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/redis_py/__init__.py +0 -0
  282. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/redis_py/knn_search.py +0 -0
  283. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/redis_py/redis_client.py +0 -0
  284. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/__init__.py +0 -0
  285. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/base.py +0 -0
  286. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/component.py +0 -0
  287. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/main.py +0 -0
  288. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/register.py +0 -0
  289. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/GRU.py +0 -0
  290. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/TCN.py +0 -0
  291. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/__init__.py +0 -0
  292. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/demo.py +0 -0
  293. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/test_fr/__init__.py +0 -0
  294. {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/test_fr/demo11.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pybaseutils
3
- Version: 2.2.21
3
+ Version: 2.2.24
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -8,4 +8,4 @@
8
8
  # --------------------------------------------------------
9
9
  """
10
10
 
11
- __version__ = '2.2.21'
11
+ __version__ = '2.2.24'
@@ -120,7 +120,7 @@ class COCOBuilder():
120
120
 
121
121
  def save_coco(self, json_file):
122
122
  file_utils.create_file_path(json_file)
123
- file_utils.write_json_path(json_file, self.coco)
123
+ file_utils.save_json(json_file, self.coco)
124
124
  print("save file:{}".format(json_file))
125
125
 
126
126
  def set_keypoints_category(self, kps_name=[], skeleton=[], cat_id=0):
@@ -48,7 +48,7 @@ def maker_labelme(json_file, points, labels, image_name, image_size, image_bs64=
48
48
  "imageWidth": image_size[0]
49
49
  }
50
50
  if os.path.exists(image_name): file_utils.copy_file_to_dir(image_name, os.path.dirname(json_file))
51
- file_utils.write_json_path(json_file, data)
51
+ file_utils.save_json(json_file, data)
52
52
  return data
53
53
 
54
54
 
@@ -60,9 +60,9 @@ def del_labelme_imagedata(anno_dir):
60
60
  """
61
61
  file_list = file_utils.get_files_lists(anno_dir, postfix=["*.json"])
62
62
  for anno_file in tqdm(file_list):
63
- data_info = json_utils.read_json_data(anno_file)
63
+ data_info = json_utils.load_json(anno_file)
64
64
  data_info["imageData"] = None
65
- json_utils.write_json_path(anno_file, data_info)
65
+ json_utils.save_json(anno_file, data_info)
66
66
 
67
67
 
68
68
  def copy_labelme_files(image_dir, anno_dir, out_root):
@@ -77,7 +77,7 @@ def copy_labelme_files(image_dir, anno_dir, out_root):
77
77
  out_images = file_utils.create_dir(out_root, "images")
78
78
  out_json = file_utils.create_dir(out_root, "json")
79
79
  for json_file in tqdm(json_list):
80
- json_data = json_utils.read_json_data(json_file)
80
+ json_data = json_utils.load_json(json_file)
81
81
  image_name = json_data['imagePath']
82
82
  shapes = json_data.get('shapes', [])
83
83
  image_file = os.path.join(image_dir, image_name)
@@ -103,14 +103,14 @@ class ConcatCoco(object):
103
103
  """
104
104
  if isinstance(file_dict, dict):
105
105
  for dirname, file in file_dict.items():
106
- coco = file_utils.read_json_data(file)
106
+ coco = file_utils.load_json(file)
107
107
  self.add_categories(copy.deepcopy(coco["categories"]))
108
108
  self.add_images(copy.deepcopy(coco["images"]), dirname)
109
109
  self.add_annotations(copy.deepcopy(coco["annotations"]),
110
110
  copy.deepcopy(coco["categories"]))
111
111
  elif isinstance(file_dict, list):
112
112
  for file in file_dict:
113
- coco = file_utils.read_json_data(file)
113
+ coco = file_utils.load_json(file)
114
114
  self.add_categories(copy.deepcopy(coco["categories"]))
115
115
  self.add_images(copy.deepcopy(coco["images"]), dirname=None)
116
116
  self.add_annotations(copy.deepcopy(coco["annotations"]),
@@ -120,7 +120,7 @@ class ConcatCoco(object):
120
120
 
121
121
  def save_coco(self, json_file):
122
122
  file_utils.create_file_path(json_file)
123
- file_utils.write_json_path(json_file, self.coco)
123
+ file_utils.save_json(json_file, self.coco)
124
124
  print("save file:{}".format(json_file))
125
125
 
126
126
 
@@ -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
 
@@ -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):
@@ -238,6 +226,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
238
226
  title: 控制显示窗口名
239
227
  :return:
240
228
  """
229
+ assert os.path.exists(video_file), f"video_file={video_file}"
241
230
  video_cap = image_utils.get_video_capture(video_file)
242
231
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
243
232
  start = int(kwargs.get("start", 0) * fps)
@@ -291,11 +280,12 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
291
280
  speed: 播放速度
292
281
  :return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
293
282
  """
283
+ assert os.path.exists(video_file), f"video_file={video_file}"
294
284
  video_cap = image_utils.get_video_capture(video_file)
295
285
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
296
286
  start = int(kwargs.get("start", 0) * fps)
297
287
  end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
298
- 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继续播放
299
289
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
300
290
  save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
301
291
  count = 0
@@ -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
@@ -47,6 +47,7 @@ class TextDataset(Dataset):
47
47
  self.check = check
48
48
  self.kwargs = kwargs
49
49
  self.label_index = kwargs.get("label_index", "label") # 类别字段key
50
+ self.crop_scale = kwargs.get("crop_scale", []) # TODO bbox缩放系数
50
51
  self.class_name, self.class_dict = self.parser_classes(class_name)
51
52
  self.item_list = self.parser_dataset(data_file, data_root=data_root, label_index=self.label_index,
52
53
  shuffle=shuffle, check=check)
@@ -68,6 +69,7 @@ class TextDataset(Dataset):
68
69
 
69
70
  def info(self, save_info=""):
70
71
  print("----------------------- {} DATASET INFO -----------------------".format(self.phase.upper()))
72
+ print("Dataset kwargs :{}".format(self.kwargs))
71
73
  print("Dataset num_samples :{}".format(len(self.item_list)))
72
74
  print("Dataset num_classes :{}".format(self.num_classes))
73
75
  print("Dataset class_name :{}".format(self.class_name))
@@ -81,10 +83,10 @@ class TextDataset(Dataset):
81
83
  class_lack = sorted(class_lack.items(), key=lambda x: x[1], reverse=True)
82
84
  class_lack = {n[0]: n[1] for n in class_lack}
83
85
  class_lack.update({"mean": m})
84
- file_utils.write_json_path(os.path.join(save_info, f"{self.phase}_class_dict.json"), self.class_dict)
85
- file_utils.write_json_path(os.path.join(save_info, f"{self.phase}_class_count.json"), self.class_count)
86
+ file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_dict.json"), self.class_dict)
87
+ file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_count.json"), self.class_count)
86
88
  file_utils.write_list_data(os.path.join(save_info, f"{self.phase}_class_name.txt"), self.class_name)
87
- file_utils.write_json_path(os.path.join(save_info, f"{self.phase}_class_lack.json"), class_lack)
89
+ file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_lack.json"), class_lack)
88
90
  print("loss_labels: {}".format(class_lack))
89
91
  print("------------------------------------------------------------------")
90
92
 
@@ -163,10 +165,9 @@ class TextDataset(Dataset):
163
165
  file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
164
166
  name = self.class_name[label]
165
167
  image = self.read_image(file, use_rgb=self.use_rgb)
166
- image = self.crop_image(image, bbox=bbox, **self.kwargs) if bbox else image
168
+ image = self.crop_image(image, bbox=bbox, **self.kwargs)
167
169
  if self.transform:
168
- image = Image.fromarray(image)
169
- image = self.transform(image)
170
+ image = self.transform(Image.fromarray(image))
170
171
  if image is None:
171
172
  index = int(random.uniform(0, self.num_samples))
172
173
  return self.__getitem__(index)
@@ -178,7 +179,13 @@ class TextDataset(Dataset):
178
179
  return len(self.item_list)
179
180
 
180
181
  def crop_image(self, image, bbox, **kwargs):
181
- """裁剪图片"""
182
+ """
183
+ 裁剪图片
184
+ :param image:
185
+ :param bbox:
186
+ :param kwargs: use_max,use_mean,crop_scale
187
+ :return:
188
+ """
182
189
  if len(bbox) == 0: return image
183
190
  boxes = image_utils.get_square_boxes(boxes=[bbox],
184
191
  use_max=kwargs.get("use_max", False),
@@ -150,11 +150,11 @@ class LabelMeDataset(Dataset):
150
150
  if not image_dir:
151
151
  image_dir = self.search_path(data_root, ["images", "JPEGImages"])
152
152
  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]
153
+ image_ids = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
154
+ if not anno_dir: anno_dir = image_dir
155
155
  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]
156
+ image_ids = self.get_file_list(anno_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
157
+ if not image_dir: image_dir = anno_dir
158
158
  assert isinstance(anno_dir, str) and os.path.exists(anno_dir), "no anno_dir :{}".format(anno_dir)
159
159
  assert isinstance(image_dir, str) and os.path.exists(image_dir), "no image_dir:{}".format(image_dir)
160
160
  assert len(image_ids) > 0, f"image_ids is empty,image_dir={image_dir},anno_dir={anno_dir}"
@@ -330,7 +330,7 @@ class LabelMeDataset(Dataset):
330
330
  width = annotation.get('imageWidth', -1)
331
331
  height = annotation.get('imageHeight', -1)
332
332
  except:
333
- print("illegal annotation:{}".format(anno_file))
333
+ # print("illegal annotation:{}".format(anno_file))
334
334
  annos = []
335
335
  width = -1
336
336
  height = -1
@@ -487,8 +487,7 @@ def show_target_image(image, boxes, labels, points, keypoints=[], color=(), thic
487
487
  if __name__ == "__main__":
488
488
  from pybaseutils.converter import build_labelme
489
489
 
490
- anno_dir = "/home/PKing/Downloads/sample/images"
491
- # anno_dir = "/home/PKing/Downloads/冲击试验/sample/images"
490
+ anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/train-v2/01-核相操作/dataset-v01/images"
492
491
  names = None
493
492
  dataset = LabelMeDatasets(filename=None,
494
493
  data_root=None,
@@ -0,0 +1,136 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : panjq
5
+ # @Date : 2020-9-20 13:18:34
6
+ # --------------------------------------------------------
7
+ """
8
+
9
+ import os
10
+ import PIL.Image as Image
11
+ import numpy as np
12
+ import random
13
+ import cv2
14
+ import torch
15
+ import copy
16
+ from tqdm import tqdm
17
+ from typing import Dict, List
18
+ from pybaseutils import image_utils, file_utils
19
+ from pybaseutils.dataloader import parser_labelme, parser_image_text
20
+
21
+
22
+ class LabelmeDataset(parser_image_text.TextDataset):
23
+ """加载Labelme数据并进行裁剪,图片和json文件都保存在images目录下"""
24
+
25
+ def __init__(self, filename, class_name=None, transform=None, use_rgb=False, shuffle=False,
26
+ phase="test", disp=False, check=False, **kwargs):
27
+ """
28
+ :param filename:
29
+ :param class_name:
30
+ :param transform:
31
+ :param use_rgb:
32
+ :param shuffle:
33
+ :param phase:
34
+ :param disp:
35
+ :param check:
36
+ :param kwargs: use_max,use_mean,crop_scale
37
+ """
38
+ self.dataset = None
39
+ super(LabelmeDataset, self).__init__(data_file=filename,
40
+ data_root=None,
41
+ class_name=class_name,
42
+ transform=transform,
43
+ shuffle=shuffle,
44
+ use_rgb=use_rgb,
45
+ phase=phase,
46
+ disp=disp,
47
+ check=check,
48
+ label_index="label",
49
+ **kwargs)
50
+ print("LabelmeDataset have images:{},have samples:{}".format(len(self.item_list), self.num_samples))
51
+
52
+ def parser_dataset(self, data_file, **kwargs):
53
+ """
54
+ 获得Labelme所有目标信息
55
+ :param dataset:
56
+ :return:
57
+ """
58
+ self.dataset = parser_labelme.LabelMeDatasets(filename=None,
59
+ data_root=None,
60
+ anno_dir=data_file,
61
+ image_dir=None,
62
+ class_name=self.class_name,
63
+ check=False,
64
+ phase=self.phase,
65
+ use_rgb=self.use_rgb,
66
+ shuffle=self.shuffle,
67
+ read_image=False)
68
+ print("Please wait, it's in checking")
69
+ item_list = []
70
+ for index in tqdm(range(len(self.dataset))):
71
+ info = self.dataset.__getitem__(index)
72
+ file, boxes = info["image_file"], info.get("boxes", [])
73
+ for i in range(len(boxes)):
74
+ if len(boxes[i]) == 0: continue
75
+ item_list.append(dict(file=file,
76
+ bbox=boxes[i],
77
+ label=info["labels"][i],
78
+ name=info["names"][i],
79
+ point=info["points"][i],
80
+ )
81
+ )
82
+ assert len(item_list) > 0, f"item_list is empty, check your data_file is ={data_file}"
83
+ return item_list
84
+
85
+ def __getitem__(self, index):
86
+ """
87
+ :param index:
88
+ :return: {"image": image, "label": label}
89
+ """
90
+ item: dict = copy.deepcopy(self.item_list[index]) # TODO Fix a bug: 避免修改原始数据
91
+ file, bbox = item["file"], item.get("bbox", [])
92
+ image = self.read_image(file, use_rgb=self.use_rgb)
93
+ image = self.crop_image(image, bbox=bbox, **self.kwargs)
94
+ if self.transform:
95
+ image = self.transform(Image.fromarray(image))
96
+ if image is None:
97
+ index = int(random.uniform(0, len(self)))
98
+ return self.__getitem__(index)
99
+ return dict(file=file, image=image, label=item["label"], name=item["name"])
100
+
101
+
102
+ if __name__ == '__main__':
103
+ from torchvision import transforms
104
+
105
+ filename = "/home/PKing/nasdata/tmp/tmp/RealFakeFace/face-gesture/dataset-v3/image"
106
+ # filename = "/home/PKing/nasdata/tmp/tmp/RealFakeFace/living/dataset-v2/image"
107
+ batch_size = 1
108
+ crop_scale = (1.2, 1.2)
109
+ input_size = [224, 224]
110
+ rgb_mean = [0., 0., 0.]
111
+ rgb_std = [1.0, 1.0, 1.0]
112
+ class_name = ["face", "闭眼", "张嘴", "低头", "侧脸"]
113
+ transform = transforms.Compose([
114
+ transforms.Resize(input_size),
115
+ transforms.ToTensor(),
116
+ transforms.Normalize(mean=rgb_mean, std=rgb_std),
117
+ ])
118
+
119
+ dataset = LabelmeDataset(filename=filename,
120
+ transform=transform,
121
+ resample=True,
122
+ shuffle=False,
123
+ class_name=class_name,
124
+ use_rgb=False,
125
+ disp=True,
126
+ crop_scale=crop_scale,
127
+ vis=False)
128
+ for i in range(len(dataset)):
129
+ data_info = dataset.__getitem__(i)
130
+ file = data_info["file"]
131
+ image, label, name = data_info["image"], data_info["label"], data_info["name"]
132
+ image = np.asarray(image).transpose(1, 2, 0) # 通道由[c,h,w]->[h,w,c]
133
+ image = np.asarray(image * 255, dtype=np.uint8)
134
+ label = np.asarray(label, dtype=np.int32)
135
+ print("{},image.shape:{},label:{},name:{}".format(file, image.shape, label, name))
136
+ image_utils.cv_show_image("image", image)