pybaseutils 2.0.2__tar.gz → 2.0.5__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 (246) hide show
  1. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/PKG-INFO +1 -1
  2. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_cvat2labelme.py +7 -4
  4. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2yolo.py +3 -3
  5. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_yolo2voc.py +1 -1
  6. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/coords_utils.py +12 -0
  7. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/video_utils.py +2 -2
  8. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_coco_det.py +5 -3
  9. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_coco_ins.py +3 -2
  10. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_coco_kps.py +6 -4
  11. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_yolo.py +31 -8
  12. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/file_utils.py +3 -3
  13. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/image_utils.py +44 -5
  14. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/plot_roc.py +57 -5
  15. pybaseutils-2.0.5/pybaseutils/transforms/augment_utils.py +127 -0
  16. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/PKG-INFO +1 -1
  17. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/SOURCES.txt +8 -1
  18. pybaseutils-2.0.5/test_py/aije/action_dataset.py +86 -0
  19. pybaseutils-2.0.5/test_py/aije/build_pyarmor.py +34 -0
  20. pybaseutils-2.0.5/test_py/aije/build_service.py +61 -0
  21. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_voc_crop.py +7 -7
  22. pybaseutils-2.0.5/test_py/aije/video_convertor.py +27 -0
  23. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_cvat2labelme.py +4 -3
  24. pybaseutils-2.0.5/test_py/converter/get_pair_data.py +58 -0
  25. pybaseutils-2.0.5/test_py/converter/ucf101_dataset.py +36 -0
  26. pybaseutils-2.0.5/test_py/cython_build/build_cython.py +27 -0
  27. pybaseutils-2.0.5/test_py/demo1.py +54 -0
  28. pybaseutils-2.0.5/test_py/demo2.py +29 -0
  29. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_coco_vis.py +12 -5
  30. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_lableme_vis.py +1 -1
  31. pybaseutils-2.0.2/test_py/aije/video_demo.py +0 -47
  32. pybaseutils-2.0.2/test_py/demo1.py +0 -84
  33. pybaseutils-2.0.2/test_py/demo2.py +0 -25
  34. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/LICENCE +0 -0
  35. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/README.md +0 -0
  36. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/__init__.py +0 -0
  37. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/audio_utils.py +0 -0
  38. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/pyaudio_utils.py +0 -0
  39. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/vad_utils.py +0 -0
  40. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/base64_utils.py +0 -0
  41. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/batch_utils.py +0 -0
  42. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/build_utils/__init__.py +0 -0
  43. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/build_utils/cython_utils.py +0 -0
  44. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  45. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/__init__.py +0 -0
  46. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/kmean.py +0 -0
  47. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/maxmin_distance.py +0 -0
  48. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/similarity.py +0 -0
  49. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/color_utils.py +0 -0
  50. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/config_utils.py +0 -0
  51. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/__init__.py +0 -0
  52. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_coco.py +0 -0
  53. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_cvat.py +0 -0
  54. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_labelme.py +0 -0
  55. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_voc.py +0 -0
  56. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/concat_coco.py +0 -0
  57. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  58. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_coco2voc.py +0 -0
  59. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  60. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  61. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  62. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  63. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2coco.py +0 -0
  64. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  65. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2voc.py +0 -0
  66. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/__init__.py +0 -0
  67. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/corner_utils.py +0 -0
  68. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/monitor.py +0 -0
  69. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/mouse_utils.py +0 -0
  70. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/__init__.py +0 -0
  71. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/base_coco.py +0 -0
  72. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/base_dataset.py +0 -0
  73. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_labelme.py +0 -0
  74. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_voc.py +0 -0
  75. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  76. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/QueueTable.py +0 -0
  77. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/__init__.py +0 -0
  78. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/demo.py +0 -0
  79. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/kalman_filter.py +0 -0
  80. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/mean_filter.py +0 -0
  81. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/motion_filter.py +0 -0
  82. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/pose_filter.py +0 -0
  83. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/font_style/__init__.py +0 -0
  84. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/font_utils.py +0 -0
  85. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/geometry_tools.py +0 -0
  86. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/heatmap_utils.py +0 -0
  87. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/json_utils.py +0 -0
  88. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/log.py +0 -0
  89. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/logger.py +0 -0
  90. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/__init__.py +0 -0
  91. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/accuracy.py +0 -0
  92. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/average_meter.py +0 -0
  93. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/class_report.py +0 -0
  94. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/plot_pr.py +0 -0
  95. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/numpy_utils.py +0 -0
  96. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pandas_utils.py +0 -0
  97. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/plot_utils.py +0 -0
  98. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/__init__.py +0 -0
  99. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/bones_utils.py +0 -0
  100. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/human_pose.py +0 -0
  101. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/pose_utils.py +0 -0
  102. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pycpp/__init__.py +0 -0
  103. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pycpp/demo.py +0 -0
  104. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pycpp/main.py +0 -0
  105. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/server/__init__.py +0 -0
  106. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/server/apm_server.py +0 -0
  107. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/setup_config.py +0 -0
  108. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/singleton_utils.py +0 -0
  109. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/thread_utils.py +0 -0
  110. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/time_utils.py +0 -0
  111. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracemalloc_utils.py +0 -0
  112. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracemalloc_utils2.py +0 -0
  113. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/QueueTable.py +0 -0
  114. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/__init__.py +0 -0
  115. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/demo.py +0 -0
  116. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/kalman_filter.py +0 -0
  117. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/mean_filter.py +0 -0
  118. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/motion_filter.py +0 -0
  119. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/pose_filter.py +0 -0
  120. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/__init__.py +0 -0
  121. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/affine_transform.py +0 -0
  122. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/face_alignment.py +0 -0
  123. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/transform_utils.py +0 -0
  124. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/word_utils.py +0 -0
  125. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/worker.py +0 -0
  126. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/yaml_utils.py +0 -0
  127. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/dependency_links.txt +0 -0
  128. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/not-zip-safe +0 -0
  129. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/top_level.txt +0 -0
  130. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/setup.cfg +0 -0
  131. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/setup.py +0 -0
  132. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/WebCrawler/__init__.py +0 -0
  133. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/WebCrawler/search_image.py +0 -0
  134. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
  135. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/__init__.py +0 -0
  136. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/__init__.py +0 -0
  137. {pybaseutils-2.0.2/test_py/cython_build → pybaseutils-2.0.5/test_py/aije}/build_cython.py +0 -0
  138. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/convert_labelme2coco.py +0 -0
  139. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/convert_labelme2voc.py +0 -0
  140. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/copy_move.py +0 -0
  141. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_labelme_crop.py +0 -0
  142. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_video_aije.py +0 -0
  143. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_voc_vis.py +0 -0
  144. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/__init__.py +0 -0
  145. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/demo.py +0 -0
  146. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/main.py +0 -0
  147. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/main_read.py +0 -0
  148. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/segment.py +0 -0
  149. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  150. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/speechbrain_demo.py +0 -0
  151. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/captcha/__init__.py +0 -0
  152. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/captcha/demo.py +0 -0
  153. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/class_attribute.py +0 -0
  154. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/class_names.py +0 -0
  155. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/AffectNet.py +0 -0
  156. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/AsianMovie.py +0 -0
  157. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/BITVehicle2voc.py +0 -0
  158. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/BSTLD2voc.py +0 -0
  159. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/CCPD.py +0 -0
  160. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/CCPD2voc.py +0 -0
  161. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/FL3D_dataset.py +0 -0
  162. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/FreiHAND2coco.py +0 -0
  163. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/MTFL2voc.py +0 -0
  164. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/TT100K.py +0 -0
  165. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/WaterMeters1.py +0 -0
  166. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/WaterMeters2.py +0 -0
  167. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/__init__.py +0 -0
  168. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/concat_coco.py +0 -0
  169. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_coco2voc.py +0 -0
  170. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_gesture2hand.py +0 -0
  171. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_labelme2coco.py +0 -0
  172. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_labelme2cvat.py +0 -0
  173. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_labelme2voc.py +0 -0
  174. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_voc2labelme.py +0 -0
  175. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/fatigue_driving.py +0 -0
  176. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/fdd_dataset.py +0 -0
  177. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/handpose2coco.py +0 -0
  178. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/insects_for_aichallenger.py +0 -0
  179. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/tt100k_utils.py +0 -0
  180. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/ua_detrac2voc.py +0 -0
  181. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/voc_sbd2labelme.py +0 -0
  182. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/__init__.py +0 -0
  183. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/build_pyarmor.py +0 -0
  184. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/cryptography_demo.py +0 -0
  185. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/fun_sum.py +0 -0
  186. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/main.py +0 -0
  187. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/model_des_enctypt.py +0 -0
  188. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/model_enctypt.py +0 -0
  189. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo3.py +0 -0
  190. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_async_await1.py +0 -0
  191. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_async_await2.py +0 -0
  192. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_copy_files.py +0 -0
  193. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_copy_files_for_voc.py +0 -0
  194. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_ffmpy.py +0 -0
  195. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_for_pair_file.py +0 -0
  196. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_for_polygon.py +0 -0
  197. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_for_trt.py +0 -0
  198. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_get_file_list.py +0 -0
  199. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_gif.py +0 -0
  200. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_gif_video.py +0 -0
  201. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_image_crop.py +0 -0
  202. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_labelme.py +0 -0
  203. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_labelme_crop.py +0 -0
  204. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_metrics.py +0 -0
  205. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_mouse.py +0 -0
  206. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_nii.py +0 -0
  207. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_pandas.py +0 -0
  208. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_plot.py +0 -0
  209. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_rename.py +0 -0
  210. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_standard_image .py +0 -0
  211. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_standard_video .py +0 -0
  212. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_taichi.py +0 -0
  213. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_video.py +0 -0
  214. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_voc_crop.py +0 -0
  215. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_voc_vis.py +0 -0
  216. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_word_similar.py +0 -0
  217. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_worker1.py +0 -0
  218. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_worker2.py +0 -0
  219. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/__init__.py +0 -0
  220. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/demo.py +0 -0
  221. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/detect_face_person.py +0 -0
  222. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/predet_labelme.py +0 -0
  223. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/__init__.py +0 -0
  224. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/demo.py +0 -0
  225. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/text_matching.py +0 -0
  226. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/text_utils.py +0 -0
  227. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/flask_demo/__init__.py +0 -0
  228. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/flask_demo/func.py +0 -0
  229. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/flask_demo/server.py +0 -0
  230. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/__init__.py +0 -0
  231. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/demo_correction_v1.py +0 -0
  232. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/demo_correction_v2.py +0 -0
  233. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/demo_correction_v3.py +0 -0
  234. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/kafka_worker.py +0 -0
  235. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/men_tracemalloc.py +0 -0
  236. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/performance.py +0 -0
  237. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/pose/__init__.py +0 -0
  238. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/pose/human_pose.py +0 -0
  239. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/__init__.py +0 -0
  240. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/base.py +0 -0
  241. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/component.py +0 -0
  242. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/main.py +0 -0
  243. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/register.py +0 -0
  244. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/test_fr/__init__.py +0 -0
  245. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/test_fr/demo11.py +0 -0
  246. {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/test_fr/idcardocr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pybaseutils
3
- Version: 2.0.2
3
+ Version: 2.0.5
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -5,4 +5,4 @@
5
5
  @Date : 2019-05-07 17:40:27
6
6
  """
7
7
 
8
- __version__ = '2.0.2'
8
+ __version__ = '2.0.5'
@@ -38,14 +38,15 @@ def parser_annotations(xml_file):
38
38
  return filename, annos, width, height
39
39
 
40
40
 
41
- def convert_cvat2labelme(anno_dir, image_dir="", vis=False):
41
+ def convert_cvat2labelme(anno_dir, image_dir="", out_dir="", thickness=1, fontScale=1.0, vis=False):
42
42
  """
43
43
  将CVAT标注格式(LabelMe 3.0)转换labelme通用格式
44
- :param anno_dir: 标注文件目录,输出json文件与anno_dir同目录
44
+ :param anno_dir: 标注文件目录,默认输出json文件与anno_dir同目录
45
45
  :param image_dir: 图片文件目录
46
46
  :param vis:
47
47
  :return:
48
48
  """
49
+ if not out_dir: out_dir = os.path.join(os.path.dirname(anno_dir), "json")
49
50
  xml_list = file_utils.get_files_lists(anno_dir, postfix=["*.xml"])
50
51
  for xml_file in tqdm(xml_list):
51
52
  image_name, annos, w, h = parser_annotations(xml_file)
@@ -56,13 +57,15 @@ def convert_cvat2labelme(anno_dir, image_dir="", vis=False):
56
57
  continue
57
58
  if image_dir or vis:
58
59
  image_file = os.path.join(image_dir, image_name)
60
+ print(image_file, "labels:{}".format(labels))
59
61
  image = cv2.imread(image_file)
60
62
  h, w = image.shape[:2]
61
63
  if vis:
62
- image = image_utils.draw_image_contours(image, points, texts=labels)
64
+ image = image_utils.draw_image_contours(image, points, texts=labels, thickness=thickness,
65
+ fontScale=fontScale)
63
66
  image_utils.cv_show_image("det", image)
64
67
  image_id = image_name.split(".")[0]
65
- json_file = os.path.join(anno_dir, f"{image_id}.json")
68
+ json_file = os.path.join(out_dir, f"{image_id}.json")
66
69
  build_labelme.maker_labelme(json_file, points, labels, image_name, image_size=[w, h], image_bs64=None)
67
70
 
68
71
 
@@ -80,7 +80,7 @@ def convert_voc2yolo_file(filename, out_text_dir, out_image_dir=None, class_name
80
80
  format = "jpg"
81
81
  newname = "{}.{}".format(image_id, format)
82
82
  text_path = file_utils.create_dir(out_text_dir, None, "{}.txt".format(image_id))
83
- labels = np.asarray(labels).astype(np.int).reshape(-1)
83
+ labels = np.asarray(labels).astype(np.int32).reshape(-1)
84
84
  contents = create_yolo_dets(bboxes, labels, width=w, height=h)
85
85
  file_utils.write_data(text_path, contents)
86
86
  if out_image_dir:
@@ -131,7 +131,7 @@ def convert_voc2yolo(data_root, out_text_dir, out_image_dir=None, class_name=Non
131
131
  format = "jpg"
132
132
  newname = "{}.{}".format(image_id, format)
133
133
  text_path = file_utils.create_dir(out_text_dir, None, "{}.txt".format(image_id))
134
- labels = np.asarray(labels).astype(np.int).reshape(-1)
134
+ labels = np.asarray(labels).astype(np.int32).reshape(-1)
135
135
  contents = create_yolo_dets(bboxes, labels, width=w, height=h)
136
136
  file_utils.write_data(text_path, contents, split=" ")
137
137
  if out_image_dir:
@@ -183,7 +183,7 @@ def convert_voc2yolo_segment(data_root, out_text_dir, out_image_dir=None, class_
183
183
  format = "jpg"
184
184
  newname = "{}.{}".format(image_id, format)
185
185
  text_path = file_utils.create_dir(out_text_dir, None, "{}.txt".format(image_id))
186
- labels = np.asarray(labels).astype(np.int).reshape(-1)
186
+ labels = np.asarray(labels).astype(np.int32).reshape(-1)
187
187
  contents = create_yolo_segs(bboxes, labels, width=w, height=h)
188
188
  file_utils.write_data(text_path, contents, split=" ")
189
189
  if out_image_dir:
@@ -50,7 +50,7 @@ def convert_yolo2voc(filename, out_xml_dir=None, out_image_dir=None, class_name=
50
50
  format = "jpg"
51
51
  newname = "{}.{}".format(image_id, format)
52
52
  xml_path = file_utils.create_dir(out_xml_dir, None, "{}.xml".format(image_id))
53
- labels = np.asarray(labels).astype(np.int).reshape(-1)
53
+ labels = np.asarray(labels).astype(np.int32).reshape(-1)
54
54
  objects = build_voc.create_objects(bboxes, labels, keypoints=None, class_name=class_name)
55
55
  build_voc.write_voc_xml_objects(newname, image_shape, objects, xml_path)
56
56
  if out_image_dir:
@@ -19,6 +19,7 @@ def clip_xyxy(xyxy: np.ndarray, valid_range):
19
19
  :param valid_range:有效范围(xmin,ymin,xmax,ymax)
20
20
  :return:
21
21
  """
22
+ if len(xyxy) == 0: return xyxy
22
23
  xmin, ymin, xmax, ymax = valid_range
23
24
  xyxy[:, [0, 2]] = np.clip(xyxy[:, [0, 2]], xmin, xmax)
24
25
  xyxy[:, [1, 3]] = np.clip(xyxy[:, [1, 3]], ymin, ymax)
@@ -33,6 +34,7 @@ def clip_cxcywh_minmax(cxcywh, wh_thresh, use_max=True):
33
34
  :param use_max: True:最大值限制, False: 最小值限制
34
35
  :return:
35
36
  """
37
+ if len(cxcywh) == 0: return cxcywh
36
38
  if isinstance(wh_thresh, numbers.Number): wh_thresh = [wh_thresh, wh_thresh]
37
39
  if not isinstance(cxcywh, np.ndarray): cxcywh = np.asarray(cxcywh)
38
40
  centers = cxcywh.copy()
@@ -51,6 +53,7 @@ def clip_cxcywh_minmax(cxcywh, wh_thresh, use_max=True):
51
53
 
52
54
  def xyxy2xywh(xyxy: np.ndarray):
53
55
  """(xmin,ymin,xmax,ymax)==>(xmin,ymin,w,h)"""
56
+ if len(xyxy) == 0: return xyxy
54
57
  if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
55
58
  xywh = xyxy.copy()
56
59
  xywh[:, 2] = xywh[:, 2] - xywh[:, 0] # w=xmax-xmin
@@ -60,6 +63,7 @@ def xyxy2xywh(xyxy: np.ndarray):
60
63
 
61
64
  def xywh2xyxy(xywh: np.ndarray):
62
65
  """(xmin,ymin,w,h)==>(xmin,ymin,xmax,ymax)"""
66
+ if len(xywh) == 0: return xywh
63
67
  if not isinstance(xywh, np.ndarray): xywh = np.asarray(xywh)
64
68
  xyxy = xywh.copy()
65
69
  xyxy[:, 2] = xyxy[:, 0] + xyxy[:, 2] # xmax=xmin+w
@@ -69,6 +73,7 @@ def xywh2xyxy(xywh: np.ndarray):
69
73
 
70
74
  def xyxy2cxcywh(xyxy: np.ndarray, width=None, height=None, normalized=False):
71
75
  """(xmin, ymin, xmax, ymax)==>(cx,cy,w,h)"""
76
+ if len(xyxy) == 0: return xyxy
72
77
  if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
73
78
  cxcywh = xyxy.copy()
74
79
  cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
@@ -82,6 +87,7 @@ def xyxy2cxcywh(xyxy: np.ndarray, width=None, height=None, normalized=False):
82
87
 
83
88
  def cxcywh2xyxy(cxcywh: np.ndarray, width=None, height=None, normalized=False):
84
89
  """(cx,cy,w,h)==>xmin, ymin, xmax, ymax)"""
90
+ if len(cxcywh) == 0: return cxcywh
85
91
  if not isinstance(cxcywh, np.ndarray): cxcywh = np.asarray(cxcywh)
86
92
  xyxy = cxcywh.copy()
87
93
  xyxy[:, 0] = cxcywh[:, 0] - cxcywh[:, 2] / 2 # top left x
@@ -103,6 +109,7 @@ def extend_xyxy(xyxy: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False,
103
109
  使用fixed的长宽会按照相同大小扩展
104
110
  :return:
105
111
  """
112
+ if len(xyxy) == 0: return xyxy
106
113
  if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
107
114
  cxcywh = xyxy.copy()
108
115
  if fixed:
@@ -130,6 +137,7 @@ def extend_xywh(xywh: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False,
130
137
  :param scale: [sx,sy]==>(W,H)
131
138
  :return:
132
139
  """
140
+ if len(xywh) == 0: return xywh
133
141
  if not isinstance(xywh, np.ndarray): xywh = np.asarray(xywh)
134
142
  xyxy = xywh2xyxy(xywh)
135
143
  xyxy = extend_xyxy(xyxy, scale, valid_range=valid_range, fixed=fixed, use_max=use_max)
@@ -148,6 +156,7 @@ def extend_xyxy_similar_square(xyxy, use_max=True, weight=1.0, valid_range=[]):
148
156
  :param valid_range:有效范围(xmin,ymin,xmax,ymax)
149
157
  :return:
150
158
  """
159
+ if len(xyxy) == 0: return xyxy
151
160
  if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
152
161
  center = xyxy2cxcywh(xyxy)
153
162
  if use_max:
@@ -162,6 +171,7 @@ def extend_xyxy_similar_square(xyxy, use_max=True, weight=1.0, valid_range=[]):
162
171
  if valid_range: _boxes = clip_xyxy(_boxes, valid_range=valid_range)
163
172
  return _boxes
164
173
 
174
+
165
175
  def shrink_polygon_pyclipper(polygon, ratio):
166
176
  """
167
177
  使用Polygon库计算多边形区域的周长和面积,使用pyclipper库进行shrink
@@ -196,6 +206,7 @@ def get_square_boxes(boxes, use_max=True, baseline=-1):
196
206
  :param baseline: 当baseline>0,表示正方形最小边长
197
207
  :return:
198
208
  """
209
+ if len(boxes) == 0: return boxes
199
210
  if not isinstance(boxes, np.ndarray): boxes = np.asarray(boxes)
200
211
  center = xyxy2cxcywh(boxes)
201
212
  if use_max:
@@ -222,6 +233,7 @@ def get_square_rects(rects, use_max=True, baseline=-1):
222
233
  :param baseline: 当baseline>0,表示正方形最小边长
223
234
  :return:
224
235
  """
236
+ if len(rects) == 0: return rects
225
237
  boxes = xywh2xyxy(rects)
226
238
  boxes = get_square_boxes(boxes, use_max=use_max, baseline=baseline)
227
239
  rects = xyxy2xywh(boxes)
@@ -241,7 +241,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
241
241
  video_cap = image_utils.get_video_capture(video_file)
242
242
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
243
243
  start = int(kwargs.get("start", 0) * fps)
244
- end = int(kwargs.get("end", num_frames / fps) * fps)
244
+ end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
245
245
  end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
246
246
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
247
247
  save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
@@ -293,7 +293,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
293
293
  video_cap = image_utils.get_video_capture(video_file)
294
294
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
295
295
  start = int(kwargs.get("start", 0) * fps)
296
- end = int(kwargs.get("end", num_frames / fps) * fps)
296
+ end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
297
297
  end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
298
298
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
299
299
  save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
@@ -53,9 +53,9 @@ class CocoDetection(CocoDataset):
53
53
 
54
54
  def __getitem__(self, index):
55
55
  image_id = self.image_ids[index]
56
- anno_info, file_info = self.get_object_annotations(image_id)
56
+ anns_info, file_info = self.get_object_annotations(image_id)
57
57
  image, width, height, image_file = self.get_object_image(file_info)
58
- boxes, labels = self.get_object_detection(anno_info)
58
+ boxes, labels = self.get_object_detection(anns_info)
59
59
  if self.transform and len(boxes) > 0:
60
60
  image, boxes, labels = self.transform(image, boxes, labels)
61
61
  num_boxes = len(boxes)
@@ -65,7 +65,9 @@ class CocoDetection(CocoDataset):
65
65
  if num_boxes == 0:
66
66
  index = int(random.uniform(0, len(self)))
67
67
  return self.__getitem__(index)
68
- data = {"image": image, "target": target, "labels": labels, "image_id": image_id,
68
+ data = {"image": image, "boxes": boxes, "labels": labels,
69
+ "segs": [], "mask": [], "keypoints": [], "target": target,
70
+ "image_id": image_id, "annotations": anns_info, "file_info": file_info,
69
71
  "image_file": image_file, "size": [width, height], "class_name": self.class_name}
70
72
  return data
71
73
 
@@ -40,7 +40,8 @@ class CocoInstance(CocoDataset):
40
40
  anns_info, file_info = self.get_object_annotations(image_id)
41
41
  image, width, height, image_file = self.get_object_image(file_info)
42
42
  boxes, labels, mask, segs = self.get_object_instance(anns_info, h=height, w=width, decode=self.decode)
43
- data = {"segs": segs, "mask": mask, "image": image, "boxes": boxes, "labels": labels,
43
+ data = {"image": image, "boxes": boxes, "labels": labels,
44
+ "segs": segs, "mask": mask, "keypoints": [], "target": [],
44
45
  "image_id": image_id, "annotations": anns_info, "file_info": file_info,
45
46
  "image_file": image_file, "size": [width, height], "class_name": self.class_name}
46
47
  return data
@@ -103,7 +104,7 @@ def show_target_image(image, mask, boxes, labels, points=[], class_name=[], thic
103
104
  color_image, color_mask = color_utils.draw_image_mask_color(image, mask)
104
105
  color_image = image_utils.draw_image_bboxes_labels(color_image, boxes, labels, class_name=class_name,
105
106
  thickness=thickness, fontScale=fontScale, drawType="chinese")
106
- if len(points)>0:
107
+ if len(points) > 0:
107
108
  color_mask = image_utils.draw_image_contours(color_mask, contours=points)
108
109
  color_image = image_utils.draw_image_contours(color_image, contours=points)
109
110
  vis_image = image_utils.image_hstack([image, mask, color_image, color_mask])
@@ -32,6 +32,7 @@ class CocoKeypoint(base_coco.CocoDataset):
32
32
  target_transform=target_transform, use_rgb=use_rgb,
33
33
  shuffle=shuffle, decode=decode, **kwargs)
34
34
  if not class_name: class_name = [self.class_name[1]]
35
+ if isinstance(class_name, dict): class_name = list(class_name.keys())
35
36
  self.kps_info = self.load_keypoints_info(target=class_name)
36
37
  self.num_joints = num_joints
37
38
  if class_name[0] in BONES:
@@ -70,9 +71,10 @@ class CocoKeypoint(base_coco.CocoDataset):
70
71
  anns_info, file_info = self.get_object_annotations(image_id)
71
72
  image, width, height, image_file = self.get_object_image(file_info)
72
73
  boxes, labels, keypoints = self.get_keypoint_info(anns_info, self.num_joints)
73
- data = {"keypoints": keypoints, "image": image, "boxes": boxes, "labels": labels, "image_id": image_id,
74
- "annotations": anns_info, "file_info": file_info, "image_file": image_file,
75
- "size": [width, height], "class_name": self.class_name}
74
+ data = {"image": image, "boxes": boxes, "labels": labels,
75
+ "segs": [], "mask": [], "keypoints": keypoints, "target": [],
76
+ "image_id": image_id, "annotations": anns_info, "file_info": file_info,
77
+ "image_file": image_file, "size": [width, height], "class_name": self.class_name}
76
78
  return data
77
79
 
78
80
 
@@ -116,7 +118,7 @@ def CocoKeypoints(anno_file=None,
116
118
  return datasets
117
119
 
118
120
 
119
- def show_target_image(image, keypoints, boxes, skeleton, colors=None,thickness=2, vis_id=False, use_rgb=True):
121
+ def show_target_image(image, keypoints, boxes, skeleton, colors=None, thickness=2, vis_id=False, use_rgb=True):
120
122
  image = image_utils.draw_key_point_in_image(image,
121
123
  keypoints,
122
124
  pointline=skeleton,
@@ -217,13 +217,13 @@ class YOLODataset(Dataset):
217
217
  image = self.read_image(image_file, use_rgb=self.use_rgb)
218
218
  shape = image.shape
219
219
  annotation = self.load_annotations(anno_file)
220
- boxes, labels, points = self.parser_annotation(annotation, shape, self.class_dict)
220
+ boxes, labels, points = self.parser_annotation_segs(annotation, shape, self.class_dict)
221
221
  data = {"image": image, "boxes": boxes, "labels": labels, "points": points,
222
222
  "image_file": image_file, "anno_file": anno_file}
223
223
  return data
224
224
 
225
225
  @staticmethod
226
- def parser_annotation(annotation: dict, shape, class_dict):
226
+ def parser_annotation_boxes(annotation: dict, shape, class_dict):
227
227
  """
228
228
  :param annotation: labelme标注的数据
229
229
  :param class_dict: label映射
@@ -249,6 +249,28 @@ class YOLODataset(Dataset):
249
249
  bboxes = image_utils.points2bbox(points)
250
250
  return bboxes, labels, points
251
251
 
252
+ @staticmethod
253
+ def parser_annotation_segs(annotation: dict, shape, class_dict):
254
+ """
255
+ :param annotation: labelme标注的数据
256
+ :param class_dict: label映射
257
+ :param shape: 图片shape(H,W,C),可进行坐标点的维度检查,避免越界
258
+ :return:
259
+ """
260
+ # dim=5,annotation is [class_index, cx, cy, w, h]
261
+ # dim=9,annotation is [class_index, x1, y1, x2, y2, x3, y3, x4, y4],四个角点
262
+ h, w = shape[:2]
263
+ bboxes, labels, points = [], [], []
264
+ for anno in annotation:
265
+ label = anno[0]
266
+ polys = np.asarray(anno[1:]).reshape(-1, 2)
267
+ polys = polys * [w, h]
268
+ boxes = image_utils.polygons2boxes([polys])[0]
269
+ labels.append(label)
270
+ points.append(polys)
271
+ bboxes.append(boxes)
272
+ return bboxes, labels, points
273
+
252
274
  def index2id(self, index):
253
275
  """
254
276
  :param index: int or str
@@ -319,16 +341,17 @@ def show_target_image(image, bboxes, labels, points=[], class_name=None, use_rgb
319
341
  :param use_rgb:
320
342
  :return:
321
343
  """
322
- image = image_utils.draw_image_contours(image, contours=points)
323
- # image = image_utils.draw_image_bboxes_labels(image, bboxes, labels, class_name=class_name)
324
- image_utils.cv_show_image("det", image, use_rgb=use_rgb)
344
+ dst = image.copy()
345
+ dst = image_utils.draw_image_contours(dst, contours=points, alpha=0.1, thickness=1)
346
+ dst = image_utils.image_hstack([image, dst])
347
+ image_utils.cv_show_image("det", dst, use_rgb=use_rgb)
325
348
 
326
349
 
327
350
  if __name__ == "__main__":
328
351
  # filename = "/home/dm/nasdata/dataset/csdn/helmet/helmet-dataset-v2/train.txt"
329
352
  # filename = "/home/dm/nasdata/dataset/csdn/helmet/helmet-asian/total.txt"
330
353
  # filename = "/home/dm/nasdata/dataset/csdn/helmet/helmet-asian/total.txt"
331
- filename = "/home/PKing/Downloads/dota8/dota8/images/train/train.txt"
354
+ filename = "/home/PKing/nasdata/tmp/tmp/medical/肾结石CT/valid/sample.txt"
332
355
  dataset = YOLODataset(filename=filename,
333
356
  data_root=None,
334
357
  anno_dir=None,
@@ -341,8 +364,8 @@ if __name__ == "__main__":
341
364
  for i in range(len(dataset)):
342
365
  print(i) # i=20
343
366
  data = dataset.__getitem__(i)
344
- image, bboxes, labels = data["image"], data["box"], data["label"]
345
- points = data["point"]
367
+ image, bboxes, labels = data["image"], data["boxes"], data["labels"]
368
+ points = data["points"]
346
369
  h, w = image.shape[:2]
347
370
  image_file = data["image_file"]
348
371
  show_target_image(image, bboxes, labels, points=points)
@@ -550,15 +550,15 @@ def move_dir(src, dst, sub=False):
550
550
 
551
551
  def move_file(srcfile, dstfile):
552
552
  """ 移动文件或重命名"""
553
- if not os.path.isfile(srcfile):
554
- print("%s not exist!" % (srcfile))
555
- else:
553
+ if os.path.exists(srcfile) and os.path.isfile(srcfile):
556
554
  fpath, fname = os.path.split(dstfile) # 分离文件名和路径
557
555
  if not os.path.exists(fpath):
558
556
  os.makedirs(fpath) # 创建路径
559
557
  shutil.move(srcfile, dstfile)
560
558
  # print("copy %s -> %s"%( srcfile,dstfile))
561
559
  # time.sleep(1 / 1000.)
560
+ else:
561
+ print("%s not exist!" % (srcfile))
562
562
 
563
563
 
564
564
  def copy_file(srcfile, dstfile):
@@ -1905,7 +1905,7 @@ def get_box_crop(image, box):
1905
1905
  return roi
1906
1906
 
1907
1907
 
1908
- get_bbox_crop =get_box_crop
1908
+ get_bbox_crop = get_box_crop
1909
1909
 
1910
1910
 
1911
1911
  def get_bboxes_crop(image, bboxes):
@@ -2438,7 +2438,8 @@ def pointPolygonTest(point, contour, measureDist=False):
2438
2438
  return dist
2439
2439
 
2440
2440
 
2441
- def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), alpha=0.5, thickness=2, drawType="ch"):
2441
+ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), alpha=0.5, thickness=1, fontScale=0.8,
2442
+ drawType="ch"):
2442
2443
  """
2443
2444
  参考:draw_image_mask_color
2444
2445
  :param image:
@@ -2459,13 +2460,51 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
2459
2460
  bgimg = image.copy()
2460
2461
  bgimg = cv2.fillPoly(bgimg, p, color=c)
2461
2462
  image = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
2462
- if t: image = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness, drawType=drawType)
2463
+ if t: image = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness,
2464
+ fontScale=fontScale, drawType=drawType)
2463
2465
  return image
2464
2466
 
2465
2467
 
2466
2468
  draw_image_mask_color = color_utils.draw_image_mask_color
2467
2469
 
2468
2470
 
2471
+ def draw_mask_contours(contours: List[np.ndarray], size, value=255):
2472
+ """
2473
+ 参考:draw_image_mask_color
2474
+ :param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
2475
+ :return:
2476
+ """
2477
+ mask = np.zeros(shape=(size[1], size[0]), dtype=np.uint8)
2478
+ for i in range(0, len(contours)):
2479
+ p = np.asarray(contours[i], dtype=np.int32)
2480
+ if len(p.shape) == 2: p = [p]
2481
+ mask[:] = cv2.drawContours(mask, p, contourIdx=-1, color=value, thickness=-1)
2482
+ return mask
2483
+
2484
+
2485
+ def contours_interpolation(contours, n=1000):
2486
+ """
2487
+ 对图像轮廓或者对直线进行线性差值,来源于ultralytics/utils/ops.py
2488
+ 轮廓插值,线性插值,直线插值
2489
+ Inputs a list of contours (n,2) and returns a list of contours (n,2) up-sampled to n points each.
2490
+
2491
+ Args:
2492
+ contours (list): a list of (n,2) arrays, where n is the number of points in the segment.
2493
+ n (int): number of points to resample the segment to. Defaults to 1000
2494
+
2495
+ Returns:
2496
+ contours (list): the resampled contours.
2497
+ """
2498
+ for i, s in enumerate(contours):
2499
+ s = np.concatenate((s, s[0:1, :]), axis=0)
2500
+ x = np.linspace(0, len(s) - 1, n)
2501
+ xp = np.arange(len(s))
2502
+ contours[i] = (
2503
+ np.concatenate([np.interp(x, xp, s[:, i]) for i in range(2)], dtype=np.float32).reshape(2, -1).T
2504
+ ) # segment xy
2505
+ return contours
2506
+
2507
+
2469
2508
  def get_mask_boundrect_cv(mask, binarize=False, shift=0):
2470
2509
  """
2471
2510
  获得mask的最大外接矩形框(其速度比get_mask_boundrect快2倍左右)
@@ -2903,7 +2942,7 @@ def get_video_capture(video, width=None, height=None, fps=None):
2903
2942
  return video_cap
2904
2943
 
2905
2944
 
2906
- def get_video_info(video_cap: cv2.VideoCapture):
2945
+ def get_video_info(video_cap: cv2.VideoCapture, vis=True):
2907
2946
  """
2908
2947
  获得视频的基础信息
2909
2948
  :param video_cap:视频对象
@@ -2913,7 +2952,7 @@ def get_video_info(video_cap: cv2.VideoCapture):
2913
2952
  height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
2914
2953
  num_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
2915
2954
  fps = int(video_cap.get(cv2.CAP_PROP_FPS))
2916
- print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
2955
+ if vis: print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
2917
2956
  return width, height, num_frames, fps
2918
2957
 
2919
2958
 
@@ -39,9 +39,9 @@ def plot_roc_curve(true_labels, pred_scores, vis=True):
39
39
  # 绘制ROC曲线
40
40
  if vis:
41
41
  plt_roc_curve([fpr], [tpr], [roc_auc], names=[""])
42
- print("FPR :{}".format(fpr))
43
- print("TPR :{}".format(tpr))
44
- print("Threshold :{}".format(threshold))
42
+ # print("FPR :{}".format(fpr))
43
+ # print("TPR :{}".format(tpr))
44
+ # print("Threshold :{}".format(threshold))
45
45
  print("AUC(ROC) :{}".format(roc_auc))
46
46
  print("best_threshold:{} ".format(threshold[optimal_index]))
47
47
  return fpr, tpr, roc_auc, threshold, optimal_index
@@ -134,8 +134,60 @@ def custom_roc_curve(y_true, y_score):
134
134
  plt.show()
135
135
 
136
136
 
137
+ def get_best_accuracy(true_labels, pred_scores, threshold=(0, 1.0, 0.05), vis=False):
138
+ """
139
+ 计算最佳准确率和阈值
140
+ :param true_labels:
141
+ :param pred_scores:
142
+ :param vis:
143
+ :return: best_acc, best_th
144
+ """
145
+ true_labels, pred_scores = np.asarray(true_labels), np.asarray(pred_scores)
146
+ threshold = np.arange(threshold[0], threshold[1], threshold[2])
147
+ acc_list = []
148
+ for th in threshold:
149
+ pred_labels = np.asarray(pred_scores > th, dtype=np.int32)
150
+ acc = metrics.accuracy_score(y_true=true_labels, y_pred=pred_labels)
151
+ acc_list.append(acc)
152
+ index = np.argmax(acc_list)
153
+ best_th = threshold[index]
154
+ best_acc = acc_list[index]
155
+ if vis:
156
+ print("best threshold :{}".format(best_th))
157
+ print("best Accuracy :{}".format(best_acc))
158
+ plt_curve(X=threshold, Y=acc_list, xtitle="threshold", ytitle="Accuracy", title="", grid=True)
159
+ return best_acc, best_th
160
+
161
+
162
+ def plt_curve(X, Y, xtitle="", ytitle="", title="", grid=True):
163
+ """
164
+ 绘制PR-threshold曲线
165
+ :param X: Precision
166
+ :param recall: Recall
167
+ :param Y
168
+ :param title:曲线名称
169
+ :return:
170
+ """
171
+ lw = 2
172
+ plt.figure(figsize=(10, 10))
173
+ colors = ["b", "r", "c", "m", "g", "y", "k", "w"]
174
+ plt.plot(X, Y, color=colors[0], lw=lw, label=ytitle)
175
+ plt.xlim([0.0, 1.05])
176
+ plt.ylim([0.0, 1.05])
177
+ # 设置横纵坐标的名称以及对应字体格式
178
+ font = {'weight': 'normal', 'size': 20}
179
+ plt.xlabel(xtitle, font)
180
+ plt.ylabel('', font)
181
+ plt.title(title, font)
182
+ plt.legend(loc="lower right") # "upper right"
183
+ # plt.legend(loc="upper right")#"upper right"
184
+ plt.grid(grid) # 显示网格;
185
+ plt.show()
186
+
187
+
137
188
  if __name__ == "__main__":
138
189
  true_labels = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] # 真实类别
139
- pred_scores = [0.1, 0.2, 0.7, 0.3, 0.4, 0.5, 0.2, 0.7, 0.8, 0.9] # 预测类别分数
190
+ pred_scores = [0.1, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] # 预测类别分数
140
191
  # pred_scores = [0.11, 0.21, 0.71, 0.31, 0.41, 0.51, 0.21, 0.71, 0.81, 0.91] # 预测类别分数
141
- plot_roc_curve(true_labels, pred_scores)
192
+ # plot_roc_curve(true_labels, pred_scores)
193
+ print(get_best_accuracy(true_labels, pred_scores, vis=True))