pybaseutils 2.4.3__tar.gz → 2.4.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 (320) hide show
  1. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base/list_queue.py +19 -6
  4. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base64_utils.py +19 -11
  5. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_labelme.py +7 -3
  6. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_yolo2labelme.py +2 -1
  7. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/coords_utils.py +7 -3
  8. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/video_utils.py +147 -44
  9. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/base_dataset.py +3 -3
  10. pybaseutils-2.4.5/pybaseutils/dataloader/parser_labelme_line.py +254 -0
  11. pybaseutils-2.4.5/pybaseutils/dataloader/parser_video_folder.py +158 -0
  12. pybaseutils-2.4.5/pybaseutils/dataloader/parser_video_text.py +153 -0
  13. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_yolo.py +10 -14
  14. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/file_utils.py +53 -34
  15. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/font_style/__init__.py +2 -2
  16. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/geometry_tools.py +1 -0
  17. pybaseutils-2.4.5/pybaseutils/heatmap_utils.py +252 -0
  18. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/http_utils.py +2 -2
  19. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/image_utils.py +143 -6
  20. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/thread_utils.py +36 -12
  21. pybaseutils-2.4.5/pybaseutils/transforms/build_transform.py +52 -0
  22. pybaseutils-2.4.3/pybaseutils/transforms/augment_utils.py → pybaseutils-2.4.5/pybaseutils/transforms/imgaug_utils.py +91 -13
  23. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/PKG-INFO +1 -1
  24. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/SOURCES.txt +13 -3
  25. pybaseutils-2.4.5/test_py/aije/demo_labelme_crop_ailt.py +124 -0
  26. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_video_aije.py +2 -3
  27. pybaseutils-2.4.5/test_py/aije/mask_image.py +48 -0
  28. pybaseutils-2.4.5/test_py/converter/convert_yolo2labelme.py +23 -0
  29. pybaseutils-2.4.5/test_py/converter/fall_dataset.py +145 -0
  30. pybaseutils-2.4.5/test_py/converter/parking_rois_gopro.py +43 -0
  31. pybaseutils-2.4.5/test_py/demo1.py +21 -0
  32. pybaseutils-2.4.5/test_py/demo2.py +29 -0
  33. pybaseutils-2.4.5/test_py/demo4.py +77 -0
  34. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_polygon.py +1 -1
  35. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_get_file_label.py +11 -10
  36. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_lableme_vis.py +6 -9
  37. pybaseutils-2.4.5/test_py/demo_letterbox.py +43 -0
  38. pybaseutils-2.4.3/test_py/demo_video.py → pybaseutils-2.4.5/test_py/demo_video2frame.py +4 -4
  39. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_voc_vis.py +1 -1
  40. pybaseutils-2.4.3/pybaseutils/heatmap_utils.py +0 -190
  41. pybaseutils-2.4.3/test_py/demo1.py +0 -9
  42. pybaseutils-2.4.3/test_py/demo2.py +0 -76
  43. pybaseutils-2.4.3/test_py/demo4.py +0 -19
  44. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/LICENCE +0 -0
  45. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/README.md +0 -0
  46. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/__init__.py +0 -0
  47. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/audio_utils.py +0 -0
  48. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/pyaudio_utils.py +0 -0
  49. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/vad_utils.py +0 -0
  50. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base/__init__.py +0 -0
  51. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base/dict_queue.py +0 -0
  52. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/batch_utils.py +0 -0
  53. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/build_utils/__init__.py +0 -0
  54. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/build_utils/cython_utils.py +0 -0
  55. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  56. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/__init__.py +0 -0
  57. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/kmean.py +0 -0
  58. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/maxmin_distance.py +0 -0
  59. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/similarity.py +0 -0
  60. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/color_utils.py +0 -0
  61. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/config_utils.py +0 -0
  62. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/__init__.py +0 -0
  63. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_coco.py +0 -0
  64. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_cvat.py +0 -0
  65. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_voc.py +0 -0
  66. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/concat_coco.py +0 -0
  67. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  68. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_coco2voc.py +0 -0
  69. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  70. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  71. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  72. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  73. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  74. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  75. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2coco.py +0 -0
  76. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  77. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2voc.py +0 -0
  78. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  79. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  80. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/prelabelme.py +0 -0
  81. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/__init__.py +0 -0
  82. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/corner_utils.py +0 -0
  83. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/monitor.py +0 -0
  84. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/mouse_utils.py +0 -0
  85. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/nms_utils.py +0 -0
  86. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/data_utils.py +0 -0
  87. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/__init__.py +0 -0
  88. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/balanced_classes.py +0 -0
  89. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/base_coco.py +0 -0
  90. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/data_resample.py +0 -0
  91. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  92. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  93. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  94. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  95. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_image_text.py +0 -0
  96. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_labelme.py +0 -0
  97. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  98. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_voc.py +0 -0
  99. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  100. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dict_uils.py +0 -0
  101. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/QueueTable.py +0 -0
  102. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/__init__.py +0 -0
  103. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/demo.py +0 -0
  104. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/kalman_filter.py +0 -0
  105. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/mean_filter.py +0 -0
  106. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/motion_filter.py +0 -0
  107. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/pose_filter.py +0 -0
  108. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/font_utils.py +0 -0
  109. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/json_utils.py +0 -0
  110. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/log.py +0 -0
  111. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/log_utils.py +0 -0
  112. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/media/__init__.py +0 -0
  113. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/media/ffmpeg_utils.py +0 -0
  114. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/__init__.py +0 -0
  115. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/accuracy.py +0 -0
  116. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/average_meter.py +0 -0
  117. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/class_report.py +0 -0
  118. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/plot_pr.py +0 -0
  119. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/plot_roc.py +0 -0
  120. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/numpy_utils.py +0 -0
  121. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pandas_utils.py +0 -0
  122. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/plot_utils.py +0 -0
  123. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/__init__.py +0 -0
  124. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/bones_utils.py +0 -0
  125. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/human_pose.py +0 -0
  126. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/pose_utils.py +0 -0
  127. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pycpp/__init__.py +0 -0
  128. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pycpp/demo.py +0 -0
  129. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pycpp/main.py +0 -0
  130. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/server/__init__.py +0 -0
  131. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/server/apm_server.py +0 -0
  132. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/setup_config.py +0 -0
  133. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/singleton_utils.py +0 -0
  134. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/text_utils.py +0 -0
  135. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/time_utils.py +0 -0
  136. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracemalloc_utils.py +0 -0
  137. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracemalloc_utils2.py +0 -0
  138. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/QueueTable.py +0 -0
  139. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/__init__.py +0 -0
  140. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/demo.py +0 -0
  141. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/kalman_filter.py +0 -0
  142. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/mean_filter.py +0 -0
  143. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/motion_filter.py +0 -0
  144. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/pose_filter.py +0 -0
  145. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/__init__.py +0 -0
  146. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/affine_transform.py +0 -0
  147. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/face_alignment.py +0 -0
  148. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/transform_utils.py +0 -0
  149. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/__init__.py +0 -0
  150. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/app_gradio_image.py +0 -0
  151. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/app_stweb_image.py +0 -0
  152. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/app_webio_image.py +0 -0
  153. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/demo.py +0 -0
  154. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/word_utils.py +0 -0
  155. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/worker.py +0 -0
  156. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/yaml_utils.py +0 -0
  157. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/dependency_links.txt +0 -0
  158. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/not-zip-safe +0 -0
  159. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/top_level.txt +0 -0
  160. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/setup.cfg +0 -0
  161. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/setup.py +0 -0
  162. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/Image_enhance/__init__.py +0 -0
  163. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/Image_enhance/dmeo01.py +0 -0
  164. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/WebCrawler/__init__.py +0 -0
  165. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/WebCrawler/search_baidu.py +0 -0
  166. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/WebCrawler/search_biying.py +0 -0
  167. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/__init__.py +0 -0
  168. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/__init__.py +0 -0
  169. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/action_dataset.py +0 -0
  170. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/build_cython.py +0 -0
  171. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/build_pyarmor.py +0 -0
  172. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/build_service.py +0 -0
  173. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/convert_cvat2labelme.py +0 -0
  174. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/convert_labelme2coco.py +0 -0
  175. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/convert_labelme2voc.py +0 -0
  176. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/copy_move.py +0 -0
  177. /pybaseutils-2.4.3/test_py/aije/demo_labelme_crop.py → /pybaseutils-2.4.5/test_py/aije/demo_labelme_crop_aije.py +0 -0
  178. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_labelme_shock.py +0 -0
  179. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_voc_crop.py +0 -0
  180. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_voc_vis.py +0 -0
  181. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/get_pair_data.py +0 -0
  182. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/video_convertor.py +0 -0
  183. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/__init__.py +0 -0
  184. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/demo.py +0 -0
  185. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/main.py +0 -0
  186. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/main_read.py +0 -0
  187. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/segment.py +0 -0
  188. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  189. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/speechbrain_demo.py +0 -0
  190. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio_demo1.py +0 -0
  191. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/camera/__init__.py +0 -0
  192. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/camera/demo.py +0 -0
  193. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/captcha/__init__.py +0 -0
  194. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/captcha/demo.py +0 -0
  195. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/class_attribute.py +0 -0
  196. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/class_names.py +0 -0
  197. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/AffectNet.py +0 -0
  198. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/AsianMovie.py +0 -0
  199. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/BITVehicle2voc.py +0 -0
  200. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/BSTLD2voc.py +0 -0
  201. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/CCPD.py +0 -0
  202. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/CCPD2voc.py +0 -0
  203. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/FL3D_dataset.py +0 -0
  204. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/FreiHAND2coco.py +0 -0
  205. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/MTFL2voc.py +0 -0
  206. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/TT100K.py +0 -0
  207. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/WaterMeters1.py +0 -0
  208. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/WaterMeters2.py +0 -0
  209. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/__init__.py +0 -0
  210. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/concat_coco.py +0 -0
  211. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_coco2voc.py +0 -0
  212. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_cvat2labelme.py +0 -0
  213. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_gesture2hand.py +0 -0
  214. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2coco.py +0 -0
  215. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2cvat.py +0 -0
  216. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2labelme.py +0 -0
  217. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2voc.py +0 -0
  218. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_voc2labelme.py +0 -0
  219. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/fatigue_driving.py +0 -0
  220. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/fdd_dataset.py +0 -0
  221. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/get_pair_data.py +0 -0
  222. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/handpose2coco.py +0 -0
  223. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/insects_for_aichallenger.py +0 -0
  224. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/tt100k_utils.py +0 -0
  225. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/ua_detrac2voc.py +0 -0
  226. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/ucf101_dataset.py +0 -0
  227. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/voc_sbd2labelme.py +0 -0
  228. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/__init__.py +0 -0
  229. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/build_cython.py +0 -0
  230. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/build_pyarmor.py +0 -0
  231. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/cryptography_demo.py +0 -0
  232. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/fun_sum.py +0 -0
  233. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/main.py +0 -0
  234. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/model_des_enctypt.py +0 -0
  235. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/model_enctypt.py +0 -0
  236. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/date_dataset.py +0 -0
  237. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/date_demo.py +0 -0
  238. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/datedataset_bk.py +0 -0
  239. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo3.py +0 -0
  240. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_async_await1.py +0 -0
  241. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_async_await2.py +0 -0
  242. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_coco_vis.py +0 -0
  243. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_copy_files.py +0 -0
  244. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_copy_files_for_voc.py +0 -0
  245. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_ffmpy.py +0 -0
  246. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_annular_to_rect.py +0 -0
  247. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_pair_file.py +0 -0
  248. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_trt.py +0 -0
  249. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_get_file_list.py +0 -0
  250. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_gif.py +0 -0
  251. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_gif_video.py +0 -0
  252. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_image_crop.py +0 -0
  253. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_kpts.py +0 -0
  254. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_labelme.py +0 -0
  255. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_labelme_crop.py +0 -0
  256. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_metrics.py +0 -0
  257. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_mosaic.py +0 -0
  258. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_mouse.py +0 -0
  259. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_nii.py +0 -0
  260. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_pandas.py +0 -0
  261. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_plot.py +0 -0
  262. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_prelabelme.py +0 -0
  263. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_rename.py +0 -0
  264. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_standard_image .py +0 -0
  265. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_standard_video .py +0 -0
  266. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_taichi.py +0 -0
  267. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_video_crop.py +0 -0
  268. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_voc_crop.py +0 -0
  269. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_word_similar.py +0 -0
  270. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_worker1.py +0 -0
  271. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_worker2.py +0 -0
  272. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/__init__.py +0 -0
  273. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/demo.py +0 -0
  274. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/detect_face_person.py +0 -0
  275. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/predet_labelme.py +0 -0
  276. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/edit_distance/__init__.py +0 -0
  277. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/edit_distance/demo.py +0 -0
  278. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/edit_distance/text_matching.py +0 -0
  279. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/__init__.py +0 -0
  280. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/app.py +0 -0
  281. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/utils/__init__.py +0 -0
  282. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/utils/utils.py +0 -0
  283. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/get_file_list.py +0 -0
  284. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/gradio_app.py +0 -0
  285. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/gradio_app_v2.py +0 -0
  286. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/__init__.py +0 -0
  287. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/demo_correction_v1.py +0 -0
  288. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/demo_correction_v2.py +0 -0
  289. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/demo_correction_v3.py +0 -0
  290. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/kafka_worker.py +0 -0
  291. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/men_tracemalloc.py +0 -0
  292. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/__init__.py +0 -0
  293. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/demo01.py +0 -0
  294. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/demo02.py +0 -0
  295. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/hello_milvus.py +0 -0
  296. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/milvus_client.py +0 -0
  297. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/model_process.py +0 -0
  298. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/performance.py +0 -0
  299. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/pose/__init__.py +0 -0
  300. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/pose/human_pose.py +0 -0
  301. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/redis_py/__init__.py +0 -0
  302. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/redis_py/knn_search.py +0 -0
  303. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/redis_py/redis_client.py +0 -0
  304. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/__init__.py +0 -0
  305. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/base.py +0 -0
  306. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/component.py +0 -0
  307. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/main.py +0 -0
  308. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/register.py +0 -0
  309. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/GRU.py +0 -0
  310. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/TCN.py +0 -0
  311. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/__init__.py +0 -0
  312. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/demo.py +0 -0
  313. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/slowfastnet.py +0 -0
  314. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/test_fr/__init__.py +0 -0
  315. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/test_fr/demo11.py +0 -0
  316. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/test_fr/idcardocr.py +0 -0
  317. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/__init__.py +0 -0
  318. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/asr_clients.py +0 -0
  319. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/asr_service.py +0 -0
  320. {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/chat_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.3
3
+ Version: 2.4.5
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -8,4 +8,4 @@
8
8
  # --------------------------------------------------------
9
9
  """
10
10
 
11
- __version__ = '2.4.3'
11
+ __version__ = '2.4.5'
@@ -9,6 +9,7 @@
9
9
  """
10
10
  import math
11
11
  import queue
12
+ import time
12
13
 
13
14
 
14
15
  class Queue():
@@ -46,7 +47,10 @@ class Queue():
46
47
  :param timeout: 超时时间
47
48
  :return: 弹出的队列数据
48
49
  """
49
- out = self.queue.get(block=block, timeout=timeout)
50
+ try:
51
+ out = self.queue.get(block=block, timeout=timeout)
52
+ except:
53
+ out = None
50
54
  return out
51
55
 
52
56
  def pop_items(self, nums=1, block=True, timeout=None):
@@ -57,7 +61,10 @@ class Queue():
57
61
  :param timeout: 超时时间
58
62
  :return: 弹出的队列数据
59
63
  """
60
- items = [self.pop(block=block, timeout=timeout) for i in range(nums)]
64
+ items = []
65
+ for i in range(nums):
66
+ item = self.pop(block=block, timeout=timeout)
67
+ if item: items.append(item)
61
68
  return items
62
69
 
63
70
  def get(self, index=0):
@@ -93,12 +100,18 @@ class Queue():
93
100
  获取队列的窗口数据
94
101
  :param winsize: 窗口大小
95
102
  :param overlap: 窗口重叠率
103
+ :param block: 是否阻塞等待
104
+ :param timeout: 超时时间
96
105
  :return: 队列窗口数据
97
106
  """
98
- size = int(winsize * overlap)
99
- data1 = self.pop_items(nums=winsize - size, block=block, timeout=timeout)
100
- data2 = self.get_items(nums=size)
101
- return data1 + data2
107
+ while self.qsize() < winsize and block: # 等待队列数据足够
108
+ time.sleep(0.05)
109
+ if self.qsize() >= winsize:
110
+ size = int(winsize * overlap)
111
+ data1 = self.pop_items(nums=winsize - size, block=block, timeout=timeout)
112
+ data2 = self.get_items(nums=size)
113
+ return data1 + data2
114
+ return []
102
115
 
103
116
 
104
117
  if __name__ == '__main__':
@@ -9,6 +9,8 @@
9
9
  """
10
10
  import sys
11
11
  import os
12
+
13
+ import PIL.Image as Image
12
14
  import cv2
13
15
  import base64
14
16
  import numpy as np
@@ -64,8 +66,8 @@ def image2base64(image: np.ndarray, prefix=IMG_PREFIX, use_rgb=False) -> str:
64
66
  img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
65
67
  ext = prefix.split("/")
66
68
  # ext = "." + ext[1] if len(ext) == 2 else ".png" # TODO libpng error: bad parameters to zlib
67
- ext = "." + ext[1] if len(ext) == 2 else ".jpg"
68
- img = cv2.imencode(ext, img)[1]
69
+ # ext = "." + ext[1] if len(ext) == 2 else ".jpg"
70
+ img = cv2.imencode('.jpg', img)[1]
69
71
  bs64 = prefix + base64.b64encode(img).decode()
70
72
  return bs64
71
73
 
@@ -77,7 +79,7 @@ def file2base64(file, prefix=IMG_PREFIX) -> str:
77
79
  :param prefix: base64字符串前缀,用于表识字符串的类型
78
80
  :return:base64字符串
79
81
  """
80
- bs64 = prefix + base64.b64encode(open(file, 'rb').read()).decode()
82
+ bs64 = prefix + base64.b64encode(open(file, 'rb').read()).decode("utf-8")
81
83
  return bs64
82
84
 
83
85
 
@@ -105,6 +107,8 @@ def array2base64(data: Any, prefix=IMG_PREFIX, use_rgb=False) -> Any:
105
107
  """
106
108
  if isinstance(data, np.ndarray) and data.dtype == np.uint8:
107
109
  return image2base64(data, prefix=prefix, use_rgb=use_rgb)
110
+ elif isinstance(data, Image.Image):
111
+ return image2base64(np.asarray(data), prefix=prefix, use_rgb=use_rgb)
108
112
  elif isinstance(data, np.ndarray):
109
113
  return data.tolist()
110
114
  elif isinstance(data, np.integer):
@@ -122,22 +126,25 @@ def array2base64(data: Any, prefix=IMG_PREFIX, use_rgb=False) -> Any:
122
126
  return data
123
127
 
124
128
 
125
- def base642array(data: Any, prefix=IMG_PREFIX, use_rgb=False) -> Any:
129
+ def base642array(data: Any, prefix=IMG_PREFIX, use_rgb=False, img_type="numpy") -> Any:
126
130
  """
127
131
  反序列化:将输入数据含有base64字符串都解码为图像数据(ndarray)
128
132
  :param data: 输入数据
129
133
  :param prefix: base64字符串前缀,用于表识字符串的类型
130
134
  :param use_rgb: True:输入image是RGB的图像, False:输入image是BGR格式的图像
135
+ :param img_type: numpy:返回numpy图像, pil:返回PIL图像
131
136
  :return:
132
137
  """
133
138
  if isinstance(data, str) and prefix == data[0:len(prefix)]:
134
- return base642image(data, prefix=prefix, use_rgb=use_rgb)
139
+ data = base642image(data, prefix=prefix, use_rgb=use_rgb) # numpy image
140
+ if img_type == "pil": data = Image.fromarray(data)
141
+ return data
135
142
  elif isinstance(data, list):
136
143
  for i in range(len(data)):
137
- data[i] = base642array(data[i], prefix=prefix, use_rgb=use_rgb)
144
+ data[i] = base642array(data[i], prefix=prefix, use_rgb=use_rgb, img_type=img_type)
138
145
  elif isinstance(data, dict):
139
146
  for k, v in data.items():
140
- data[k] = base642array(v, prefix=prefix, use_rgb=use_rgb)
147
+ data[k] = base642array(v, prefix=prefix, use_rgb=use_rgb, img_type=img_type)
141
148
  return data
142
149
 
143
150
 
@@ -147,13 +154,14 @@ if __name__ == "__main__":
147
154
  from pybaseutils import file_utils, image_utils
148
155
 
149
156
  image_dir = "/home/PKing/Downloads/image"
150
- image_dir = "/media/PKing/dev1/SDK/base-utils/data/labelme/JPEGImages"
151
157
  image_list = file_utils.get_images_list(image_dir)
152
158
  for image_file in image_list:
153
159
  print(image_file)
154
160
  src = image_utils.read_image(image_file, use_rgb=True)
155
- image_utils.show_image("src", src, delay=10)
156
- data = {"image": src, "file": image_file}
161
+ image_base64 = image2base64(src, prefix="data:image/jpeg;base64,", )
162
+ img = Image.fromarray(src)
163
+ data = {"image": img, "file": image_file}
157
164
  data = serialization(data)
158
165
  data = deserialization(data)
159
- print(data.keys())
166
+ dst = data["image"]
167
+ image_utils.show_image("src", src, delay=0)
@@ -12,7 +12,7 @@ from tqdm import tqdm
12
12
  from pybaseutils import image_utils, file_utils, json_utils
13
13
 
14
14
 
15
- def save_labelme(out_root, image_file, points, names, class_dict, group=None, image=None, prefix="",
15
+ def save_labelme(out_root, image_file, points, names, class_dict={}, group=None, image=None, prefix="",
16
16
  index=0, vis=False, delay=0):
17
17
  """
18
18
  :param out_root: 输出根目录
@@ -39,15 +39,19 @@ def save_labelme(out_root, image_file, points, names, class_dict, group=None, im
39
39
  image_id, postfix = file_utils.split_postfix(image_name)
40
40
  if prefix:
41
41
  flag_ = file_utils.get_time(format="p") if index < 0 else f"{index:0=5d}"
42
- image_name = f"{prefix}_{flag_}.{postfix}"
42
+ image_name = f"{prefix}_{flag_}.jpg"
43
43
  image_id, postfix = file_utils.split_postfix(image_name)
44
44
  json_file = file_utils.create_dir(out_root, "images", f"{image_id}.json")
45
45
  file_path = file_utils.create_dir(out_root, "images", f"{image_name}")
46
46
  maker_labelme(json_file, points, names, image_name, group=group, image_size=(w, h), image_bs64=None)
47
- file_utils.copy_file(image_file, file_path)
47
+ if isinstance(image, np.ndarray):
48
+ cv2.imwrite(file_path, image)
49
+ else:
50
+ file_utils.copy_file(image_file, file_path)
48
51
  if len(points) == 0:
49
52
  print("points is empty,file={}".format(file_path))
50
53
 
54
+
51
55
  def maker_labelme(json_file, points, labels, image_name, image_size, group=None, image_bs64=None, keypoints=[]):
52
56
  """
53
57
  制作label数据格式
@@ -73,6 +73,7 @@ def convert_yolo2labelme(data_root,
73
73
  class_name=None,
74
74
  class_dict={},
75
75
  task="",
76
+ check=False,
76
77
  prefix="",
77
78
  max_num=-1,
78
79
  vis=True,
@@ -93,7 +94,7 @@ def convert_yolo2labelme(data_root,
93
94
  image_dir=None,
94
95
  class_name=class_name,
95
96
  task=task,
96
- check=False,
97
+ check=check,
97
98
  phase="val",
98
99
  shuffle=False)
99
100
  print("have num:{}".format(len(dataset)))
@@ -198,8 +198,8 @@ def shrink_polygon_pyclipper(polygon, ratio):
198
198
  使用Polygon库计算多边形区域的周长和面积,使用pyclipper库进行shrink
199
199
  https://blog.csdn.net/shyjhyp11/article/details/126396170
200
200
  https://www.cnblogs.com/01black-white/p/15292193.html
201
- :param polygon:
202
- :param ratio:
201
+ :param polygon: (n,2)
202
+ :param ratio: 缩放的比例,如果大于1是放大,小于1是缩小
203
203
  :return:
204
204
  """
205
205
  from shapely.geometry import Polygon
@@ -219,6 +219,9 @@ def shrink_polygon_pyclipper(polygon, ratio):
219
219
  return shrinked
220
220
 
221
221
 
222
+ extend_polygon = shrink_polygon_pyclipper
223
+
224
+
222
225
  def get_square_boxes(boxes, use_max=True, use_mean=False, baseline=-1):
223
226
  """
224
227
  将boxes转换为正方形的boxes
@@ -499,7 +502,8 @@ def demo_for_augment():
499
502
  for i in range(1000):
500
503
  boxes = extend_xyxy(boxes, scale=[1.2, 1.2])
501
504
  dst_image, dst_label, dst_boxes = augment(image, boxes.copy(), labels.copy())
502
- image = show_targets_image("detd", image, dst_label, dst_boxes, center2bboxes=True, untranspose=False, waitKey=0)
505
+ image = show_targets_image("detd", image, dst_label, dst_boxes, center2bboxes=True, untranspose=False,
506
+ waitKey=0)
503
507
 
504
508
 
505
509
  if __name__ == "__main__":
@@ -1,13 +1,16 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  """
3
- @Author : Pan
4
- @E-mail : 390737991@qq.com
5
- @Date : 2022-05-24 16:46:51
6
- @Brief :
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-12-12 14:23:50
7
+ # @Brief :
8
+ # --------------------------------------------------------
7
9
  """
8
10
  import os
9
11
  import cv2
10
12
  import numpy as np
13
+ import math
11
14
  from typing import Callable
12
15
  from tqdm import tqdm
13
16
  from pybaseutils import image_utils, file_utils
@@ -40,7 +43,7 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, fps=-1, use_pil=
40
43
  name = os.path.basename(video_file).split(".")[0]
41
44
  if not gif_file: gif_file = os.path.join(os.path.dirname(video_file), name + ".gif")
42
45
  if not os.path.exists(gif_file): file_utils.create_file_path(gif_file)
43
- width, height, num_frames, _fps = get_video_info(video_file)
46
+ width, height, num_frames, _fps = get_video_info(video_file, **kwargs)
44
47
  video_cap = video_iterator(video_file, save_video=None, interval=interval, **kwargs)
45
48
  frames = []
46
49
  for data_info in video_cap:
@@ -56,29 +59,98 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, fps=-1, use_pil=
56
59
  image_utils.frames2gif_by_imageio(frames, gif_file=gif_file, fps=fps, loop=0)
57
60
 
58
61
 
59
- def video2frames(video_file, out_dir=None, func=None, interval=1, start=0, end=-1, vis=True, delay=10):
62
+ def get_video_sampling(freq, time, fps, random=False):
60
63
  """
64
+ 获得抽帧时间点和索引
65
+ :param freq: 抽帧频率
66
+ :param time: time: 开始播放时间time[0],结束播放时间time[1],单位秒S
67
+ :param fps: 视频帧率FPS
68
+ :param random: 是否随机抽帧(在每一秒内随机抽freq帧)
69
+ :return:
70
+ """
71
+ if freq <= 0: freq = fps
72
+ if random:
73
+ times = []
74
+ tange = np.arange(time[0], math.ceil(time[1]) + 1e-6, 1)
75
+ for i in range(len(tange) - 1):
76
+ t = np.random.uniform(tange[i], tange[i + 1], size=freq)
77
+ t = np.sort(t)
78
+ times.append(t)
79
+ times = np.concatenate(times)
80
+ # times = np.sort(np.random.uniform(time[0], time[1], size=freq))
81
+ else:
82
+ times = np.arange(time[0], time[1], 1 / freq)
83
+ index = times * fps
84
+ index = index.astype(int)
85
+ return times, index
86
+
87
+
88
+ def load_video(video_file, time=(0, -1), freq=0, size=(), use_rgb=False, random=False, **kwargs):
89
+ """
90
+ 加载视频文件,返回视频抽帧图像数据列表
91
+ :param video_file:
92
+ :param time: 设置时间范围,默认值为(0, -1),表示播放所有视频帧
93
+ :param freq: 抽帧频率,默认值为视频帧率FPS
94
+ :param size: 帧图像大小,默认值为视频原始大小
95
+ :param use_rgb:
96
+ :param kwargs:
97
+ :return:
98
+ """
99
+ time = list(time)
100
+ video_cap = get_video_capture(video_file)
101
+ width, height, numFrames, fps = get_video_info(video_cap, **kwargs)
102
+ if time[1] < 0: time[1] = numFrames / fps
103
+ video_time, video_index = get_video_sampling(freq, time, fps, random=random)
104
+ frames = []
105
+ for t, count in zip(video_time, video_index):
106
+ video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
107
+ ret, frame = video_cap.read()
108
+ if not ret: break
109
+ if size: frame = image_utils.resize_image(frame, size=size)
110
+ if use_rgb: frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
111
+ h, w = frame.shape[:2]
112
+ data_info = {"count": count, "time": t, "frame": frame, "w": w, "h": h, "fps": fps}
113
+ frames.append(data_info)
114
+ video_cap.release()
115
+ return frames
116
+
117
+
118
+ def video2frames(video_file, out_dir=None, task: Callable = None, interval=1, size=(), freq=0,
119
+ vis=False, delay=10, **kwargs):
120
+ """
121
+ video_iterator(video_file: int | str, save_video: str or int = None, interval=1, size=(), freq=0,
122
+ task: Callable = None, vis=False, **kwargs):
61
123
  视频抽帧图像
62
124
  :param video_file: 视频文件
63
- :param out_dir: 保存抽帧图像的目录
64
- :param func: 回调函数,对每一帧图像进行处理
125
+ :param out_dir: 保存抽帧图像的目录,os.path.join(os.path.dirname(video_file), name)
126
+ 当out_dir为None时,返回抽帧图像数据列表
127
+ :param task: 回调函数,对每一帧图像进行处理
65
128
  :param interval: 保存间隔
66
129
  :param vis: 是否可视化显示
67
130
  :return:
68
131
  """
69
- name = os.path.basename(video_file).split(".")[0]
70
- if not out_dir: out_dir = os.path.join(os.path.dirname(video_file), name)
71
- video_cap = video_iterator(video_file, save_video=None, interval=interval, start=start, end=end)
132
+ video_cap = video_iterator(video_file, save_video=None, interval=interval, size=size, freq=freq, **kwargs)
133
+ filename = None
134
+ if out_dir:
135
+ name = os.path.basename(video_file).split(".")[0]
136
+ # out_dir = os.path.join(os.path.dirname(video_file), name)
137
+ prefix = kwargs.get("prefix", "")
138
+ filename = "{}_{}".format(prefix, name) if prefix else name
139
+ frames = []
72
140
  for data_info in video_cap:
73
141
  frame = data_info["frame"]
74
142
  count = data_info["count"]
75
- if func: frame = func(frame)
143
+ if task: frame = task(frame)
76
144
  if vis: image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
77
- frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
78
- cv2.imwrite(frame_file, frame)
145
+ if filename:
146
+ frame_file = os.path.join(out_dir, "{}_{:0=5d}.jpg".format(filename, count))
147
+ cv2.imwrite(frame_file, frame)
148
+ data_info["file"] = frame_file
149
+ frames.append(data_info)
150
+ return frames
79
151
 
80
152
 
81
- def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True):
153
+ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True, **kwargs):
82
154
  """
83
155
  视频抽帧图像
84
156
  :param video_file: 视频文件
@@ -92,10 +164,11 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
92
164
  name = os.path.basename(video_file).split(".")[0]
93
165
  if not out_dir: out_dir = os.path.join(os.path.dirname(video_file), name)
94
166
  video_cap = get_video_capture(video_file)
95
- width, height, num_frames, fps = get_video_info(video_cap)
167
+ width, height, num_frames, fps = get_video_info(video_cap, **kwargs)
96
168
  if not os.path.exists(out_dir): os.makedirs(out_dir)
97
169
  count = 0
98
170
  last_frame = None
171
+ frame_files = []
99
172
  while True:
100
173
  if count % interval == 0:
101
174
  # 设置抽帧的位置
@@ -110,6 +183,7 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
110
183
  frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
111
184
  last_frame = curr_frame.copy()
112
185
  cv2.imwrite(frame_file, curr_frame)
186
+ frame_files.append(frame_file)
113
187
  if vis:
114
188
  text = "TH={},diff={:3.3f}".format(thresh, diff)
115
189
  image = image_utils.draw_text(curr_frame, point=(10, 70), color=(0, 255, 0),
@@ -118,6 +192,7 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
118
192
  count += 1
119
193
  video_cap.release()
120
194
  cv2.destroyAllWindows()
195
+ return frame_files
121
196
 
122
197
 
123
198
  def frames2video(image_dir, video_file=None, func=None, size=None, postfix=["*.png", "*.jpg"], interval=1, fps=30,
@@ -160,7 +235,7 @@ def frames2video(image_dir, video_file=None, func=None, size=None, postfix=["*.p
160
235
  cv2.destroyAllWindows()
161
236
 
162
237
 
163
- def video2video(video_file: int or str, save_video: str or int, interval=1, task: Callable = None,
238
+ def video2video(video_file: int or str, save_video: str or int, interval=1, size=(), freq=0, task: Callable = None,
164
239
  vis=True, **kwargs):
165
240
  """
166
241
  转换视频格式
@@ -169,13 +244,14 @@ def video2video(video_file: int or str, save_video: str or int, interval=1, task
169
244
  :param interval: 间隔
170
245
  :return:
171
246
  """
172
- video_capture(video_file=video_file, save_video=save_video, interval=interval, task=task, vis=vis, **kwargs)
247
+ video_capture(video_file=video_file, save_video=save_video, interval=interval, size=size, freq=freq, task=task,
248
+ vis=vis, **kwargs)
173
249
 
174
250
 
175
251
  convert_video_format = video2video
176
252
 
177
253
 
178
- def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True, delay=20):
254
+ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True, delay=20, **kwargs):
179
255
  """
180
256
  转换视频格式
181
257
  :param video_file: *.avi,*.mp4,...
@@ -185,7 +261,7 @@ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True,
185
261
  :return:
186
262
  """
187
263
  video_cap = get_video_capture(video_file)
188
- width, height, num_frames, fps = get_video_info(video_cap)
264
+ width, height, num_frames, fps = get_video_info(video_cap, **kwargs)
189
265
  frame = np.zeros(shape=(height, width), dtype=np.uint8)
190
266
  frame = image_utils.resize_image(frame, size=size)
191
267
  height, width = frame.shape[:2]
@@ -207,8 +283,8 @@ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True,
207
283
  video_writer.release()
208
284
 
209
285
 
210
- def video_capture(video_file: int or str, save_video: str or int = None, interval=1, freq=0, task: Callable = None,
211
- vis=True, **kwargs):
286
+ def video_capture(video_file: int or str, save_video: str or int = None, interval=1, size=(), freq=0,
287
+ task: Callable = None, vis=True, **kwargs):
212
288
  """
213
289
  读取摄像头或者视频流
214
290
  :param video_file: String 视频文件,如*.avi,*.mp4,...
@@ -223,16 +299,22 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
223
299
  :return:
224
300
  """
225
301
  video_file = file_utils.str2number(video_file)
226
- if isinstance(video_file, str): assert os.path.exists(video_file), f"video_file={video_file}"
227
- video_cap = image_utils.get_video_capture(video_file)
228
- w, h, num_frames, fps = image_utils.get_video_info(video_cap)
229
- start = int(kwargs.get("start", 0) * fps)
230
- end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
231
- if num_frames <= 0: num_frames = end
232
- end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
302
+ if isinstance(video_file, str) and os.path.isfile(video_file):
303
+ assert os.path.exists(video_file), f"video_file={video_file}"
304
+ video_cap = image_utils.get_video_capture(video_file, fps=None)
305
+ w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
306
+ time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
307
+ clip = kwargs.get("clip", tuple()) # TODO 开始播放位置index[0],结束播放位置index[1]
308
+ start, end = 0, -1
309
+ if time and fps > 0:
310
+ start, end = int(time[0] * fps), int(time[1] * fps)
311
+ elif clip:
312
+ start, end = int(clip[0]), int(clip[1])
313
+ end = min(end, num_frames) if end > 0 else num_frames # TODO 当num_frames<0时,使用0<end<count继续播放
233
314
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
234
315
  interval = int(fps / freq) if freq > 0 else interval
235
316
  save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
317
+ save_fps = kwargs.get("save_fps", save_fps)
236
318
  count = 0
237
319
  video_writer = None
238
320
  while True:
@@ -242,6 +324,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
242
324
  # if isinstance(video_file, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
243
325
  # ret, frame = video_cap.read()
244
326
  if not ret or 0 < end < count or frame is None: break
327
+ if size: frame = image_utils.resize_image(frame, size=size)
245
328
  if task: frame = task(frame, **kwargs)
246
329
  h, w = frame.shape[:2]
247
330
  if vis: image_utils.cv_show_image(kwargs.get("title", "video"), frame, delay=kwargs.get("delay", 10))
@@ -255,13 +338,13 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
255
338
  video_writer.release()
256
339
 
257
340
 
258
- def video_iterator(video_file: int or str, save_video: str or int = None, interval=1, size=(), freq=0,
341
+ def video_iterator(video_file: int | str, save_video: str or int = None, interval=1, size=(), freq=0,
259
342
  task: Callable = None, vis=False, **kwargs):
260
343
  """
261
344
  读取摄像头或者视频流迭代器
262
345
  Usage:
263
346
  from pybaseutils.cvutils import video_utils
264
- video_cap = video_utils.video_iterator(video_file, save_video, start=4, end=10)
347
+ video_cap = video_utils.video_iterator(video_file, save_video, time=(4, 10))
265
348
  for data_info in video_cap:
266
349
  frame = data_info["frame"]
267
350
  ...
@@ -275,43 +358,61 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
275
358
  :param kwargs:回调函数输入参数,
276
359
  delay: 控制显示延时,默认10S
277
360
  title: 控制显示窗口名,默认video
278
- start: 开始播放时间,单位S
279
- end: 结束播放时间,单位S
280
- speed: 播放速度
361
+ time: 开始播放时间time[0],结束播放时间time[1],单位秒S
362
+ clip: 开始播放位置index[0],结束播放位置index[1]
363
+ speed: 保存视频的播放速度,默认是播放帧率
364
+ save_fps: 保存视频的帧率,默认是播放帧率
281
365
  :return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
366
+ 当输入是视频文件时,返回视频偏移量time和duration都是播放时间,单位S,差异不大
367
+ 当输入是摄像头时, 返回视频偏移量time是视频播放时间,duration是根据count计算的播放的时间
282
368
  """
283
369
  video_file = file_utils.str2number(video_file)
284
- if isinstance(video_file, str): assert os.path.exists(video_file), f"video_file={video_file}"
370
+ if isinstance(video_file, str) and os.path.isfile(video_file):
371
+ assert os.path.exists(video_file), f"video_file={video_file}"
285
372
  video_cap = image_utils.get_video_capture(video_file, fps=None)
286
- w, h, num_frames, fps = image_utils.get_video_info(video_cap)
287
- start = int(kwargs.get("start", 0) * fps)
288
- end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
373
+ w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
374
+ time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
375
+ clip = kwargs.get("clip", tuple()) # TODO 开始播放位置index[0],结束播放位置index[1]
376
+ start, end = 0, -1
377
+ if time and fps > 0:
378
+ start, end = int(time[0] * fps), int(time[1] * fps)
379
+ elif clip:
380
+ start, end = int(clip[0]), int(clip[1])
289
381
  end = min(end, num_frames) if end > 0 else num_frames # TODO 当num_frames<0时,使用0<end<count继续播放
290
382
  interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
291
383
  interval = int(fps / freq) if freq > 0 else interval
292
384
  save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
385
+ save_fps = kwargs.get("save_fps", save_fps)
293
386
  count = 0
294
387
  video_writer = None
295
388
  use_fast = kwargs.get("use_fast", False)
296
389
  data_info = {}
390
+ t0 = -1
297
391
  while True:
298
392
  ret, frame = (False, None) if use_fast else video_cap.read()
393
+ t = video_cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
394
+ if t0 < 0 < t: t0 = t
395
+ if t0 > 0: t = t - t0 # 获得视频偏移量毫秒为单位
396
+ finish = 0 < end <= (count + interval)
299
397
  if count % interval == 0 and count >= start:
300
398
  # TODO 设置抽帧的位置,但某些格式视频容易出现问题
301
399
  if use_fast and isinstance(video_file, str):
302
400
  video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
303
401
  ret, frame = video_cap.read()
304
- if not ret or 0 < end < count or frame is None: break
402
+ if not ret or 0 < end <= count or frame is None: break
305
403
  if size: frame = image_utils.resize_image(frame, size=size)
306
404
  if task: frame = task(frame, **kwargs)
307
- t = round(count / fps, 3)
308
- data_info = {"count": count, "time": t, "frame": frame, "w": w, "h": h, "fps": fps, "offset": count}
405
+ h, w = frame.shape[:2]
406
+ d = round(count / fps, 3) # TODO 通过fps计算播放时间
407
+ t = round(t, 3) # 通过视频偏移量计算播放时间
408
+ data_info = {"count": count, "time": t, "frame": frame, "w": w, "h": h, "fps": fps,
409
+ "finish": finish, 'duration': d}
309
410
  # TODO 返回data_info
310
411
  yield data_info
311
412
  frame = data_info["frame"]
312
- h, w = frame.shape[:2]
313
413
  if vis: image_utils.cv_show_image(kwargs.get("title", "video"), frame, delay=kwargs.get("delay", 10))
314
414
  if save_video:
415
+ h, w = frame.shape[:2]
315
416
  if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
316
417
  video_writer.write(frame)
317
418
  count += 1
@@ -340,10 +441,12 @@ def rotation_task(frame, **kwargs):
340
441
 
341
442
 
342
443
  if __name__ == "__main__":
343
- video_file = "/home/dm/nasdata/release/CSDN/双目测距Demo视频(Python).MP4"
444
+ # video_file = "/home/dm/nasdata/release/CSDN/双目测距Demo视频(Python).MP4"
344
445
  # video_file = "/home/dm/视频/双目测距Demo视频(Python).mp4"
345
446
  # dst_file = "/home/dm/视频/双目测距Demo视频(Python)1.mp4"
346
447
  # video2frames(video_file, interval=10, vis=True)
347
448
  # frames2video(image_dir, interval=1, vis=True)
348
- video2gif(video_file, interval=15, func=resize_task, fps=3, use_pil=False, vis=True)
449
+ # video2gif(video_file, interval=15, func=resize_task, fps=3, use_pil=False, vis=True)
349
450
  # video2video(video_file, dst_file, vis=True)
451
+ video_file = "/home/PKing/Videos/aije-data/检查绝缘棒.mp4"
452
+ load_video(video_file, time=(0, -1), freq=2, size=(), use_rgb=False)
@@ -329,7 +329,7 @@ def cat_targets(objs: list, keys=[], out_info={}):
329
329
  return out_info
330
330
 
331
331
 
332
- def get_targets(obj_info: dict, targets=[], key='label', keys=[]):
332
+ def get_targets(obj_info: dict, targets=[], key='names', keys=[]):
333
333
  """
334
334
  从obj_info查找符合条件的目标,支持正则表达式
335
335
  :param obj_info:
@@ -338,9 +338,9 @@ def get_targets(obj_info: dict, targets=[], key='label', keys=[]):
338
338
  :param keys: 用于指定返回的keys
339
339
  :return:
340
340
  """
341
- if not obj_info: return {}
341
+ output = {k: [] for k in keys}
342
+ if not obj_info: return output
342
343
  label = obj_info[key]
343
- output = {}
344
344
  for i in range(len(label)):
345
345
  matches = text_utils.find_match_texts(texts=[label[i]], pattern=targets, org=True)
346
346
  if len(matches) == 0: continue