pybaseutils 2.0.1__tar.gz → 2.0.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/PKG-INFO +1 -1
  2. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_cvat2labelme.py +2 -2
  4. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/coords_utils.py +12 -0
  5. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/video_utils.py +8 -28
  6. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_coco_det.py +5 -3
  7. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_coco_ins.py +3 -2
  8. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_coco_kps.py +6 -4
  9. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_yolo.py +31 -8
  10. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/file_utils.py +3 -3
  11. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/image_utils.py +23 -4
  12. pybaseutils-2.0.4/pybaseutils/transforms/augment_utils.py +127 -0
  13. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/PKG-INFO +1 -1
  14. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/SOURCES.txt +5 -0
  15. pybaseutils-2.0.4/test_py/aije/build_pyarmor.py +34 -0
  16. pybaseutils-2.0.4/test_py/aije/build_service.py +61 -0
  17. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_cvat2labelme.py +3 -3
  18. pybaseutils-2.0.4/test_py/converter/ucf101_dataset.py +36 -0
  19. pybaseutils-2.0.4/test_py/cython_build/build_cython.py +27 -0
  20. pybaseutils-2.0.4/test_py/demo1.py +45 -0
  21. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_coco_vis.py +12 -5
  22. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_lableme_vis.py +1 -1
  23. pybaseutils-2.0.1/test_py/demo1.py +0 -81
  24. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/LICENCE +0 -0
  25. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/README.md +0 -0
  26. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/__init__.py +0 -0
  27. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/audio_utils.py +0 -0
  28. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/pyaudio_utils.py +0 -0
  29. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/vad_utils.py +0 -0
  30. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/base64_utils.py +0 -0
  31. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/batch_utils.py +0 -0
  32. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/build_utils/__init__.py +0 -0
  33. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/build_utils/cython_utils.py +0 -0
  34. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  35. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/__init__.py +0 -0
  36. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/kmean.py +0 -0
  37. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/maxmin_distance.py +0 -0
  38. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/similarity.py +0 -0
  39. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/color_utils.py +0 -0
  40. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/config_utils.py +0 -0
  41. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/__init__.py +0 -0
  42. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_coco.py +0 -0
  43. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_cvat.py +0 -0
  44. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_labelme.py +0 -0
  45. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_voc.py +0 -0
  46. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/concat_coco.py +0 -0
  47. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  48. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_coco2voc.py +0 -0
  49. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  50. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  51. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  52. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  53. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2coco.py +0 -0
  54. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  55. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2voc.py +0 -0
  56. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  57. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  58. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/__init__.py +0 -0
  59. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/corner_utils.py +0 -0
  60. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/monitor.py +0 -0
  61. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/mouse_utils.py +0 -0
  62. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/__init__.py +0 -0
  63. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/base_coco.py +0 -0
  64. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/base_dataset.py +0 -0
  65. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_labelme.py +0 -0
  66. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_voc.py +0 -0
  67. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  68. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/QueueTable.py +0 -0
  69. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/__init__.py +0 -0
  70. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/demo.py +0 -0
  71. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/kalman_filter.py +0 -0
  72. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/mean_filter.py +0 -0
  73. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/motion_filter.py +0 -0
  74. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/pose_filter.py +0 -0
  75. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/font_style/__init__.py +0 -0
  76. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/font_utils.py +0 -0
  77. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/geometry_tools.py +0 -0
  78. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/heatmap_utils.py +0 -0
  79. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/json_utils.py +0 -0
  80. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/log.py +0 -0
  81. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/logger.py +0 -0
  82. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/__init__.py +0 -0
  83. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/accuracy.py +0 -0
  84. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/average_meter.py +0 -0
  85. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/class_report.py +0 -0
  86. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/plot_pr.py +0 -0
  87. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/plot_roc.py +0 -0
  88. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/numpy_utils.py +0 -0
  89. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pandas_utils.py +0 -0
  90. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/plot_utils.py +0 -0
  91. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/__init__.py +0 -0
  92. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/bones_utils.py +0 -0
  93. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/human_pose.py +0 -0
  94. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/pose_utils.py +0 -0
  95. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pycpp/__init__.py +0 -0
  96. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pycpp/demo.py +0 -0
  97. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pycpp/main.py +0 -0
  98. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/server/__init__.py +0 -0
  99. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/server/apm_server.py +0 -0
  100. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/setup_config.py +0 -0
  101. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/singleton_utils.py +0 -0
  102. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/thread_utils.py +0 -0
  103. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/time_utils.py +0 -0
  104. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracemalloc_utils.py +0 -0
  105. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracemalloc_utils2.py +0 -0
  106. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/QueueTable.py +0 -0
  107. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/__init__.py +0 -0
  108. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/demo.py +0 -0
  109. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/kalman_filter.py +0 -0
  110. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/mean_filter.py +0 -0
  111. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/motion_filter.py +0 -0
  112. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/pose_filter.py +0 -0
  113. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/__init__.py +0 -0
  114. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/affine_transform.py +0 -0
  115. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/face_alignment.py +0 -0
  116. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/transform_utils.py +0 -0
  117. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/word_utils.py +0 -0
  118. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/worker.py +0 -0
  119. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/yaml_utils.py +0 -0
  120. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/dependency_links.txt +0 -0
  121. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/not-zip-safe +0 -0
  122. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/top_level.txt +0 -0
  123. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/setup.cfg +0 -0
  124. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/setup.py +0 -0
  125. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/WebCrawler/__init__.py +0 -0
  126. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/WebCrawler/search_image.py +0 -0
  127. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
  128. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/__init__.py +0 -0
  129. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/__init__.py +0 -0
  130. {pybaseutils-2.0.1/test_py/cython_build → pybaseutils-2.0.4/test_py/aije}/build_cython.py +0 -0
  131. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/convert_labelme2coco.py +0 -0
  132. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/convert_labelme2voc.py +0 -0
  133. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/copy_move.py +0 -0
  134. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_labelme_crop.py +0 -0
  135. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_video_aije.py +0 -0
  136. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_voc_crop.py +0 -0
  137. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_voc_vis.py +0 -0
  138. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/video_demo.py +0 -0
  139. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/__init__.py +0 -0
  140. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/demo.py +0 -0
  141. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/main.py +0 -0
  142. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/main_read.py +0 -0
  143. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/segment.py +0 -0
  144. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  145. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/speechbrain_demo.py +0 -0
  146. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/captcha/__init__.py +0 -0
  147. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/captcha/demo.py +0 -0
  148. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/class_attribute.py +0 -0
  149. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/class_names.py +0 -0
  150. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/AffectNet.py +0 -0
  151. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/AsianMovie.py +0 -0
  152. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/BITVehicle2voc.py +0 -0
  153. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/BSTLD2voc.py +0 -0
  154. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/CCPD.py +0 -0
  155. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/CCPD2voc.py +0 -0
  156. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/FL3D_dataset.py +0 -0
  157. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/FreiHAND2coco.py +0 -0
  158. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/MTFL2voc.py +0 -0
  159. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/TT100K.py +0 -0
  160. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/WaterMeters1.py +0 -0
  161. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/WaterMeters2.py +0 -0
  162. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/__init__.py +0 -0
  163. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/concat_coco.py +0 -0
  164. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_coco2voc.py +0 -0
  165. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_gesture2hand.py +0 -0
  166. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_labelme2coco.py +0 -0
  167. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_labelme2cvat.py +0 -0
  168. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_labelme2voc.py +0 -0
  169. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_voc2labelme.py +0 -0
  170. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/fatigue_driving.py +0 -0
  171. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/fdd_dataset.py +0 -0
  172. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/handpose2coco.py +0 -0
  173. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/insects_for_aichallenger.py +0 -0
  174. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/tt100k_utils.py +0 -0
  175. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/ua_detrac2voc.py +0 -0
  176. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/voc_sbd2labelme.py +0 -0
  177. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/__init__.py +0 -0
  178. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/build_pyarmor.py +0 -0
  179. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/cryptography_demo.py +0 -0
  180. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/fun_sum.py +0 -0
  181. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/main.py +0 -0
  182. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/model_des_enctypt.py +0 -0
  183. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/model_enctypt.py +0 -0
  184. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo2.py +0 -0
  185. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo3.py +0 -0
  186. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_async_await1.py +0 -0
  187. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_async_await2.py +0 -0
  188. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_copy_files.py +0 -0
  189. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_copy_files_for_voc.py +0 -0
  190. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_ffmpy.py +0 -0
  191. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_for_pair_file.py +0 -0
  192. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_for_polygon.py +0 -0
  193. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_for_trt.py +0 -0
  194. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_get_file_list.py +0 -0
  195. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_gif.py +0 -0
  196. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_gif_video.py +0 -0
  197. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_image_crop.py +0 -0
  198. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_labelme.py +0 -0
  199. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_labelme_crop.py +0 -0
  200. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_metrics.py +0 -0
  201. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_mouse.py +0 -0
  202. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_nii.py +0 -0
  203. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_pandas.py +0 -0
  204. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_plot.py +0 -0
  205. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_rename.py +0 -0
  206. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_standard_image .py +0 -0
  207. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_standard_video .py +0 -0
  208. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_taichi.py +0 -0
  209. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_video.py +0 -0
  210. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_voc_crop.py +0 -0
  211. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_voc_vis.py +0 -0
  212. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_word_similar.py +0 -0
  213. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_worker1.py +0 -0
  214. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_worker2.py +0 -0
  215. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/__init__.py +0 -0
  216. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/demo.py +0 -0
  217. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/detect_face_person.py +0 -0
  218. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/predet_labelme.py +0 -0
  219. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/__init__.py +0 -0
  220. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/demo.py +0 -0
  221. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/text_matching.py +0 -0
  222. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/text_utils.py +0 -0
  223. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/flask_demo/__init__.py +0 -0
  224. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/flask_demo/func.py +0 -0
  225. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/flask_demo/server.py +0 -0
  226. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/__init__.py +0 -0
  227. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/demo_correction_v1.py +0 -0
  228. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/demo_correction_v2.py +0 -0
  229. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/demo_correction_v3.py +0 -0
  230. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/kafka_worker.py +0 -0
  231. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/men_tracemalloc.py +0 -0
  232. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/performance.py +0 -0
  233. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/pose/__init__.py +0 -0
  234. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/pose/human_pose.py +0 -0
  235. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/__init__.py +0 -0
  236. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/base.py +0 -0
  237. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/component.py +0 -0
  238. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/main.py +0 -0
  239. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/register.py +0 -0
  240. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/test_fr/__init__.py +0 -0
  241. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/test_fr/demo11.py +0 -0
  242. {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/test_fr/idcardocr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pybaseutils
3
- Version: 2.0.1
3
+ Version: 2.0.4
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -5,4 +5,4 @@
5
5
  @Date : 2019-05-07 17:40:27
6
6
  """
7
7
 
8
- __version__ = '2.0.1'
8
+ __version__ = '2.0.4'
@@ -38,7 +38,7 @@ 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="", thickness=1, fontScale=1.0, vis=False):
42
42
  """
43
43
  将CVAT标注格式(LabelMe 3.0)转换labelme通用格式
44
44
  :param anno_dir: 标注文件目录,输出json文件与anno_dir同目录
@@ -59,7 +59,7 @@ def convert_cvat2labelme(anno_dir, image_dir="", vis=False):
59
59
  image = cv2.imread(image_file)
60
60
  h, w = image.shape[:2]
61
61
  if vis:
62
- image = image_utils.draw_image_contours(image, points, texts=labels)
62
+ image = image_utils.draw_image_contours(image, points, texts=labels, thickness=thickness, fontScale=fontScale)
63
63
  image_utils.cv_show_image("det", image)
64
64
  image_id = image_name.split(".")[0]
65
65
  json_file = os.path.join(anno_dir, f"{image_id}.json")
@@ -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)
@@ -177,11 +177,8 @@ def frames2video(image_dir, video_file=None, func=None, size=None, postfix=["*.p
177
177
  cv2.destroyAllWindows()
178
178
 
179
179
 
180
- def convert_video_format(video_file, save_video, start=0, interval=1):
181
- return video2video(video_file, save_video, start=start, interval=interval)
182
-
183
-
184
- def video2video(video_file, save_video, task=None, start=0, interval=1, vis=True, delay=20):
180
+ def video2video(video_file: int or str, save_video: str or int, interval=1, task: Callable = None,
181
+ vis=True, **kwargs):
185
182
  """
186
183
  转换视频格式
187
184
  :param video_file: *.avi,*.mp4,...
@@ -189,27 +186,10 @@ def video2video(video_file, save_video, task=None, start=0, interval=1, vis=True
189
186
  :param interval: 间隔
190
187
  :return:
191
188
  """
192
- video_cap = get_video_capture(video_file)
193
- width, height, num_frames, fps = get_video_info(video_cap)
194
- # video_writer = get_video_writer(save_video, width, height, fps)
195
- video_writer = None
196
- # freq = int(fps / detect_freq)
197
- count = start
198
- while True:
199
- # if count % interval == 0:
200
- if count % interval == 0 and count > 0:
201
- # 设置抽帧的位置
202
- video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
203
- isSuccess, frame = video_cap.read()
204
- if not isSuccess or 0 < num_frames < count: break
205
- if task: frame = task(frame, count=count)
206
- height, width = frame.shape[:2]
207
- if not video_writer: video_writer = get_video_writer(save_video, width, height, fps)
208
- if vis: image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
209
- video_writer.write(frame)
210
- count += 1
211
- video_cap.release()
212
- video_writer.release()
189
+ video_capture(video_file=video_file, save_video=save_video, interval=interval, task=task, vis=vis, **kwargs)
190
+
191
+
192
+ convert_video_format = video2video
213
193
 
214
194
 
215
195
  def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True, delay=20):
@@ -261,7 +241,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
261
241
  video_cap = image_utils.get_video_capture(video_file)
262
242
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
263
243
  start = int(kwargs.get("start", 0) * fps)
264
- end = int(kwargs.get("end", num_frames / fps) * fps)
244
+ end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
265
245
  end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
266
246
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
267
247
  save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
@@ -313,7 +293,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
313
293
  video_cap = image_utils.get_video_capture(video_file)
314
294
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
315
295
  start = int(kwargs.get("start", 0) * fps)
316
- end = int(kwargs.get("end", num_frames / fps) * fps)
296
+ end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
317
297
  end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
318
298
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
319
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,6 +1905,9 @@ def get_box_crop(image, box):
1905
1905
  return roi
1906
1906
 
1907
1907
 
1908
+ get_bbox_crop = get_box_crop
1909
+
1910
+
1908
1911
  def get_bboxes_crop(image, bboxes):
1909
1912
  """
1910
1913
  已经废弃,使用get_boxes_crop代替
@@ -2435,7 +2438,8 @@ def pointPolygonTest(point, contour, measureDist=False):
2435
2438
  return dist
2436
2439
 
2437
2440
 
2438
- 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"):
2439
2443
  """
2440
2444
  参考:draw_image_mask_color
2441
2445
  :param image:
@@ -2456,13 +2460,28 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
2456
2460
  bgimg = image.copy()
2457
2461
  bgimg = cv2.fillPoly(bgimg, p, color=c)
2458
2462
  image = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
2459
- 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)
2460
2465
  return image
2461
2466
 
2462
2467
 
2463
2468
  draw_image_mask_color = color_utils.draw_image_mask_color
2464
2469
 
2465
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
+
2466
2485
  def get_mask_boundrect_cv(mask, binarize=False, shift=0):
2467
2486
  """
2468
2487
  获得mask的最大外接矩形框(其速度比get_mask_boundrect快2倍左右)
@@ -2900,7 +2919,7 @@ def get_video_capture(video, width=None, height=None, fps=None):
2900
2919
  return video_cap
2901
2920
 
2902
2921
 
2903
- def get_video_info(video_cap: cv2.VideoCapture):
2922
+ def get_video_info(video_cap: cv2.VideoCapture, vis=True):
2904
2923
  """
2905
2924
  获得视频的基础信息
2906
2925
  :param video_cap:视频对象
@@ -2910,7 +2929,7 @@ def get_video_info(video_cap: cv2.VideoCapture):
2910
2929
  height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
2911
2930
  num_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
2912
2931
  fps = int(video_cap.get(cv2.CAP_PROP_FPS))
2913
- print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
2932
+ if vis: print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
2914
2933
  return width, height, num_frames, fps
2915
2934
 
2916
2935
 
@@ -0,0 +1,127 @@
1
+ # -*-coding: utf-8 -*-
2
+ """
3
+ @Author : PKing
4
+ @E-mail :
5
+ @Date : 2024-07-25 08:33:57
6
+ @Brief : https://imgaug.readthedocs.io/en/latest/index.html
7
+ """
8
+ import os
9
+ import cv2
10
+ import numpy as np
11
+ from typing import List, Tuple
12
+ from imgaug import augmenters as iaa
13
+ from pybaseutils import file_utils, image_utils
14
+ from imgaug.augmentables.segmaps import SegmentationMapsOnImage
15
+ from imgaug.augmentables.kps import KeypointsOnImage
16
+
17
+
18
+ class Compose(object):
19
+ def __init__(self, transforms: List = [], fixed=True):
20
+ """
21
+ :param transforms:
22
+ :param fixed: images的图片是否使用相同的增强方式
23
+ """
24
+ self.fixed = fixed
25
+ self.transforms = transforms if transforms else []
26
+ self.aug = iaa.Sequential(children=self.transforms, random_order=False, seed=2004)
27
+
28
+ def __call__(self, image=None, images=None, **kwargs):
29
+ """
30
+ kwargs = ["image","images", "heatmaps", "segmentation_maps",
31
+ "keypoints", "bounding_boxes", "polygons",
32
+ "line_strings"]
33
+ :param kwargs:
34
+ :return:
35
+ """
36
+ if isinstance(images, list) and len(images) > 0:
37
+ if self.fixed:
38
+ aug = self.aug.to_deterministic()
39
+ images = [aug(image=images[i], **kwargs) for i in range(len(images))]
40
+ else:
41
+ images = self.aug(images=images, **kwargs)
42
+ return images
43
+ if isinstance(image, np.ndarray):
44
+ image = self.aug(image=image, **kwargs)
45
+ return image
46
+
47
+
48
+ def augment_example(input_size=(224, 224)):
49
+ transforms = [
50
+ iaa.Resize({"width": int(input_size[0] * 1.2), "height": "keep-aspect-ratio"}),
51
+ iaa.Fliplr(0.5), # 以75%的概率水平翻转图像
52
+ iaa.LinearContrast((0.75, 1.5)), # 加强或减弱图像的对比度
53
+ iaa.ContrastNormalization((0.8, 1.2)), # 随机调整对比度
54
+ iaa.Multiply((0.8, 1.2), per_channel=0.2), # 亮度变化
55
+ iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
56
+ translate_percent={"x": (-0.1, 0.1), "y": (-0.1, 0.1)},
57
+ rotate=(-5, 5),
58
+ shear=(-8, 8)
59
+ ),
60
+ iaa.Crop(percent=(0, 0.1)),
61
+ iaa.Resize({"width": input_size[0], "height": input_size[1]}),
62
+ # 以50%的概率对图像进行小的高斯模糊增强
63
+ # iaa.Sometimes(0.5, iaa.GaussianBlur(sigma=(0, 0.5))),
64
+ #
65
+ # # 添加高斯噪声
66
+ # iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05 * 255), per_channel=0.5),
67
+ # # 使部分图像变亮,部分变暗
68
+ # # 对图像进行仿射变换
69
+ # iaa.PadToFixedSize(width=100, height=100),
70
+ # iaa.CropToFixedSize(width=100, height=100),
71
+ # iaa.CropToFixedSize(width=size[0], height=size[1]),
72
+ # iaa.Resize({"width": int(size[0]), "height": "keep-aspect-ratio"}),
73
+ # iaa.PadToFixedSize(width=size[0], height=size[1]),
74
+ # iaa.CenterPadToFixedSize(width=size[0], height=size[1]),
75
+ ]
76
+ return transforms
77
+
78
+
79
+ def demo_for_image():
80
+ # image = cv2.rotate(image, rotateCode=cv2.ROTATE_90_CLOCKWISE)
81
+ transforms = augment_example()
82
+ augment = Compose(transforms=transforms, fixed=True)
83
+ for i in range(100):
84
+ image_path = "../../data/test.png"
85
+ image = image_utils.read_image(image_path)
86
+ images = [image.copy(), image.copy()]
87
+ images = augment(images=images)
88
+ [print(img.shape) for img in images]
89
+ result = image_utils.image_hstack(images)
90
+ image_utils.cv_show_image("image", image, delay=5)
91
+ image_utils.cv_show_image("result", result)
92
+
93
+
94
+ def demo_for_segment():
95
+ transforms = augment_example()
96
+ augment = Compose(transforms=transforms, fixed=True)
97
+ for i in range(100):
98
+ image = image_utils.read_image("../../data/test.png")
99
+ mask = image_utils.read_image("../../data/mask.png")
100
+ mask = image_utils.get_image_mask(mask)
101
+ auimg, segimg = augment(image=image, segmentation_maps=SegmentationMapsOnImage(mask, shape=mask.shape))
102
+ mask = np.asarray(segimg.arr[:, :, 0], dtype=np.uint8)
103
+ color_image, color_mask = image_utils.draw_image_mask_color(auimg, mask)
104
+ result = image_utils.image_hstack([image, color_image, mask])
105
+ image_utils.cv_show_image("image", result)
106
+
107
+
108
+ def demo_for_keypoint():
109
+ transforms = augment_example()
110
+ augment = Compose(transforms=transforms, fixed=True)
111
+ for i in range(100):
112
+ image = image_utils.read_image("../../data/test.png")
113
+ mask = image_utils.read_image("../../data/mask.png")
114
+ mask = image_utils.get_image_mask(mask)
115
+ contours = image_utils.find_mask_contours(mask)
116
+ auimg, contours = augment(image=image, keypoints=contours)
117
+ h, w = auimg.shape[:2]
118
+ mask = image_utils.draw_mask_contours(contours, size=(w, h))
119
+ color_image = image_utils.draw_image_contours(auimg, contours)
120
+ result = image_utils.image_hstack([image, color_image, mask])
121
+ image_utils.cv_show_image("image", result)
122
+
123
+
124
+ if __name__ == "__main__":
125
+ # demo_for_image()
126
+ # demo_for_segment()
127
+ demo_for_keypoint()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pybaseutils
3
- Version: 2.0.1
3
+ Version: 2.0.4
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -108,6 +108,7 @@ pybaseutils/tracking/motion_filter.py
108
108
  pybaseutils/tracking/pose_filter.py
109
109
  pybaseutils/transforms/__init__.py
110
110
  pybaseutils/transforms/affine_transform.py
111
+ pybaseutils/transforms/augment_utils.py
111
112
  pybaseutils/transforms/face_alignment.py
112
113
  pybaseutils/transforms/transform_utils.py
113
114
  test_py/__init__.py
@@ -154,6 +155,9 @@ test_py/WebCrawler/__init__.py
154
155
  test_py/WebCrawler/search_image.py
155
156
  test_py/WebCrawler/search_image_for_baidu.py
156
157
  test_py/aije/__init__.py
158
+ test_py/aije/build_cython.py
159
+ test_py/aije/build_pyarmor.py
160
+ test_py/aije/build_service.py
157
161
  test_py/aije/convert_labelme2coco.py
158
162
  test_py/aije/convert_labelme2voc.py
159
163
  test_py/aije/copy_move.py
@@ -198,6 +202,7 @@ test_py/converter/handpose2coco.py
198
202
  test_py/converter/insects_for_aichallenger.py
199
203
  test_py/converter/tt100k_utils.py
200
204
  test_py/converter/ua_detrac2voc.py
205
+ test_py/converter/ucf101_dataset.py
201
206
  test_py/converter/voc_sbd2labelme.py
202
207
  test_py/cython_build/__init__.py
203
208
  test_py/cython_build/build_cython.py
@@ -0,0 +1,34 @@
1
+ # -*-coding: utf-8 -*-
2
+ """
3
+ @Author : PKing
4
+ @E-mail :
5
+ @Date : 2023-09-20 14:35:22
6
+ @Brief : pip install pyarmor==7.7.4
7
+ https://pyarmor.readthedocs.io/en/v5.4.0/project.html#managing-obfuscated-scripts-with-project
8
+ https://pyarmor.readthedocs.io/en/v7.3.0/project.html#project-configuration-file
9
+ https://docs.python.org/2/distutils/sourcedist.html#commands (Commands)
10
+ https://baijiahao.baidu.com/s?id=1775756280786745996&wfr=spider&for=pc
11
+ https://www.jianshu.com/p/c1d3d79e3545/
12
+ """
13
+
14
+ import os
15
+ from pybaseutils import file_utils
16
+ from pybaseutils.build_utils import pyarmor_utils
17
+
18
+ IGNORE_DIRS = ['.git', '.idea', 'docs', 'build', 'dist']
19
+
20
+ if __name__ == '__main__':
21
+ root = os.path.dirname(__file__)
22
+ build = os.path.join(root, "build")
23
+ entry = "app/main.py"
24
+ manifest = "global-include *.py," \
25
+ "exclude test/*.py," \
26
+ "prune app/infercore/human_detector/yolov5/utils," \
27
+ "prune app/infercore/human_pose/hrnet/yolov5/utils," \
28
+ "prune app/infercore/equipment_detector/yolov5/utils," \
29
+ "prune app/infercore/equipment_detector/yolov8/ultralytics," \
30
+ "prune app/infercore/base," \
31
+ "prune app/infercore/modules," \
32
+ "exclude app/infercore/modules/indoor_component.py," \
33
+ "exclude app/infercore/modules/outdoor_component.py,"
34
+ pyarmor_utils.build_pyarmor_project(root, entry, build, manifest=manifest, exclude_dirs=IGNORE_DIRS)