pybaseutils 2.4.5__tar.gz → 2.4.7__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.5 → pybaseutils-2.4.7}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/__init__.py +1 -1
  3. pybaseutils-2.4.7/pybaseutils/base/producer_consumer.py +138 -0
  4. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/video_utils.py +9 -4
  5. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_video_folder.py +7 -4
  6. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_video_text.py +11 -7
  7. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/image_utils.py +46 -15
  8. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/class_report.py +28 -18
  9. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/thread_utils.py +7 -3
  10. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/PKG-INFO +1 -1
  11. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/SOURCES.txt +3 -0
  12. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/dependency_links.txt +0 -0
  13. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/not-zip-safe +0 -0
  14. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/top_level.txt +0 -0
  15. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_labelme_crop_ailt.py +2 -1
  16. pybaseutils-2.4.7/test_py/demo2.py +50 -0
  17. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_video2frame.py +2 -1
  18. pybaseutils-2.4.7/test_py/qrcode/__init__.py +9 -0
  19. pybaseutils-2.4.7/test_py/qrcode/demo.py +100 -0
  20. pybaseutils-2.4.5/test_py/demo2.py +0 -29
  21. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/LICENCE +0 -0
  22. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/README.md +0 -0
  23. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/__init__.py +0 -0
  24. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/audio_utils.py +0 -0
  25. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/pyaudio_utils.py +0 -0
  26. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/vad_utils.py +0 -0
  27. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base/__init__.py +0 -0
  28. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base/dict_queue.py +0 -0
  29. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base/list_queue.py +0 -0
  30. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base64_utils.py +0 -0
  31. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/batch_utils.py +0 -0
  32. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/build_utils/__init__.py +0 -0
  33. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/build_utils/cython_utils.py +0 -0
  34. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  35. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/__init__.py +0 -0
  36. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/kmean.py +0 -0
  37. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/maxmin_distance.py +0 -0
  38. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/similarity.py +0 -0
  39. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/color_utils.py +0 -0
  40. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/config_utils.py +0 -0
  41. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/__init__.py +0 -0
  42. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_coco.py +0 -0
  43. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_cvat.py +0 -0
  44. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_labelme.py +0 -0
  45. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_voc.py +0 -0
  46. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/concat_coco.py +0 -0
  47. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  48. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_coco2voc.py +0 -0
  49. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  50. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  51. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  52. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  53. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  54. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  55. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2coco.py +0 -0
  56. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  57. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2voc.py +0 -0
  58. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  59. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  60. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  61. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/prelabelme.py +0 -0
  62. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/coords_utils.py +0 -0
  63. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/__init__.py +0 -0
  64. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/corner_utils.py +0 -0
  65. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/monitor.py +0 -0
  66. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/mouse_utils.py +0 -0
  67. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/nms_utils.py +0 -0
  68. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/data_utils.py +0 -0
  69. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/__init__.py +0 -0
  70. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/balanced_classes.py +0 -0
  71. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/base_coco.py +0 -0
  72. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/base_dataset.py +0 -0
  73. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/data_resample.py +0 -0
  74. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  75. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  76. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  77. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  78. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_image_text.py +0 -0
  79. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_labelme.py +0 -0
  80. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  81. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  82. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_voc.py +0 -0
  83. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_yolo.py +0 -0
  84. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  85. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dict_uils.py +0 -0
  86. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/file_utils.py +0 -0
  87. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/QueueTable.py +0 -0
  88. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/__init__.py +0 -0
  89. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/demo.py +0 -0
  90. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/kalman_filter.py +0 -0
  91. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/mean_filter.py +0 -0
  92. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/motion_filter.py +0 -0
  93. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/pose_filter.py +0 -0
  94. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/font_style/__init__.py +0 -0
  95. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/font_utils.py +0 -0
  96. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/geometry_tools.py +0 -0
  97. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/heatmap_utils.py +0 -0
  98. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/http_utils.py +0 -0
  99. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/json_utils.py +0 -0
  100. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/log.py +0 -0
  101. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/log_utils.py +0 -0
  102. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/media/__init__.py +0 -0
  103. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/media/ffmpeg_utils.py +0 -0
  104. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/__init__.py +0 -0
  105. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/accuracy.py +0 -0
  106. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/average_meter.py +0 -0
  107. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/plot_pr.py +0 -0
  108. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/plot_roc.py +0 -0
  109. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/numpy_utils.py +0 -0
  110. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pandas_utils.py +0 -0
  111. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/plot_utils.py +0 -0
  112. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/__init__.py +0 -0
  113. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/bones_utils.py +0 -0
  114. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/human_pose.py +0 -0
  115. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/pose_utils.py +0 -0
  116. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pycpp/__init__.py +0 -0
  117. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pycpp/demo.py +0 -0
  118. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pycpp/main.py +0 -0
  119. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/server/__init__.py +0 -0
  120. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/server/apm_server.py +0 -0
  121. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/setup_config.py +0 -0
  122. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/singleton_utils.py +0 -0
  123. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/text_utils.py +0 -0
  124. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/time_utils.py +0 -0
  125. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracemalloc_utils.py +0 -0
  126. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracemalloc_utils2.py +0 -0
  127. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/QueueTable.py +0 -0
  128. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/__init__.py +0 -0
  129. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/demo.py +0 -0
  130. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/kalman_filter.py +0 -0
  131. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/mean_filter.py +0 -0
  132. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/motion_filter.py +0 -0
  133. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/pose_filter.py +0 -0
  134. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/__init__.py +0 -0
  135. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/affine_transform.py +0 -0
  136. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/build_transform.py +0 -0
  137. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/face_alignment.py +0 -0
  138. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/imgaug_utils.py +0 -0
  139. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/transform_utils.py +0 -0
  140. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/__init__.py +0 -0
  141. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/app_gradio_image.py +0 -0
  142. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/app_stweb_image.py +0 -0
  143. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/app_webio_image.py +0 -0
  144. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/demo.py +0 -0
  145. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/word_utils.py +0 -0
  146. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/worker.py +0 -0
  147. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/yaml_utils.py +0 -0
  148. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/setup.cfg +0 -0
  149. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/setup.py +0 -0
  150. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/Image_enhance/__init__.py +0 -0
  151. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/Image_enhance/dmeo01.py +0 -0
  152. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/WebCrawler/__init__.py +0 -0
  153. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/WebCrawler/search_baidu.py +0 -0
  154. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/WebCrawler/search_biying.py +0 -0
  155. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/__init__.py +0 -0
  156. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/__init__.py +0 -0
  157. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/action_dataset.py +0 -0
  158. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/build_cython.py +0 -0
  159. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/build_pyarmor.py +0 -0
  160. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/build_service.py +0 -0
  161. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/convert_cvat2labelme.py +0 -0
  162. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/convert_labelme2coco.py +0 -0
  163. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/convert_labelme2voc.py +0 -0
  164. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/copy_move.py +0 -0
  165. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_labelme_crop_aije.py +0 -0
  166. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_labelme_shock.py +0 -0
  167. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_video_aije.py +0 -0
  168. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_voc_crop.py +0 -0
  169. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_voc_vis.py +0 -0
  170. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/get_pair_data.py +0 -0
  171. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/mask_image.py +0 -0
  172. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/video_convertor.py +0 -0
  173. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/__init__.py +0 -0
  174. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/demo.py +0 -0
  175. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/main.py +0 -0
  176. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/main_read.py +0 -0
  177. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/segment.py +0 -0
  178. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  179. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/speechbrain_demo.py +0 -0
  180. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio_demo1.py +0 -0
  181. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/camera/__init__.py +0 -0
  182. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/camera/demo.py +0 -0
  183. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/captcha/__init__.py +0 -0
  184. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/captcha/demo.py +0 -0
  185. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/class_attribute.py +0 -0
  186. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/class_names.py +0 -0
  187. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/AffectNet.py +0 -0
  188. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/AsianMovie.py +0 -0
  189. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/BITVehicle2voc.py +0 -0
  190. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/BSTLD2voc.py +0 -0
  191. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/CCPD.py +0 -0
  192. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/CCPD2voc.py +0 -0
  193. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/FL3D_dataset.py +0 -0
  194. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/FreiHAND2coco.py +0 -0
  195. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/MTFL2voc.py +0 -0
  196. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/TT100K.py +0 -0
  197. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/WaterMeters1.py +0 -0
  198. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/WaterMeters2.py +0 -0
  199. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/__init__.py +0 -0
  200. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/concat_coco.py +0 -0
  201. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_coco2voc.py +0 -0
  202. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_cvat2labelme.py +0 -0
  203. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_gesture2hand.py +0 -0
  204. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2coco.py +0 -0
  205. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2cvat.py +0 -0
  206. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2labelme.py +0 -0
  207. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2voc.py +0 -0
  208. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_voc2labelme.py +0 -0
  209. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_yolo2labelme.py +0 -0
  210. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/fall_dataset.py +0 -0
  211. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/fatigue_driving.py +0 -0
  212. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/fdd_dataset.py +0 -0
  213. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/get_pair_data.py +0 -0
  214. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/handpose2coco.py +0 -0
  215. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/insects_for_aichallenger.py +0 -0
  216. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/parking_rois_gopro.py +0 -0
  217. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/tt100k_utils.py +0 -0
  218. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/ua_detrac2voc.py +0 -0
  219. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/ucf101_dataset.py +0 -0
  220. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/voc_sbd2labelme.py +0 -0
  221. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/__init__.py +0 -0
  222. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/build_cython.py +0 -0
  223. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/build_pyarmor.py +0 -0
  224. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/cryptography_demo.py +0 -0
  225. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/fun_sum.py +0 -0
  226. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/main.py +0 -0
  227. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/model_des_enctypt.py +0 -0
  228. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/model_enctypt.py +0 -0
  229. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/date_dataset.py +0 -0
  230. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/date_demo.py +0 -0
  231. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/datedataset_bk.py +0 -0
  232. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo1.py +0 -0
  233. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo3.py +0 -0
  234. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo4.py +0 -0
  235. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_async_await1.py +0 -0
  236. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_async_await2.py +0 -0
  237. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_coco_vis.py +0 -0
  238. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_copy_files.py +0 -0
  239. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_copy_files_for_voc.py +0 -0
  240. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_ffmpy.py +0 -0
  241. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_annular_to_rect.py +0 -0
  242. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_pair_file.py +0 -0
  243. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_polygon.py +0 -0
  244. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_trt.py +0 -0
  245. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_get_file_label.py +0 -0
  246. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_get_file_list.py +0 -0
  247. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_gif.py +0 -0
  248. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_gif_video.py +0 -0
  249. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_image_crop.py +0 -0
  250. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_kpts.py +0 -0
  251. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_labelme.py +0 -0
  252. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_labelme_crop.py +0 -0
  253. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_lableme_vis.py +0 -0
  254. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_letterbox.py +0 -0
  255. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_metrics.py +0 -0
  256. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_mosaic.py +0 -0
  257. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_mouse.py +0 -0
  258. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_nii.py +0 -0
  259. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_pandas.py +0 -0
  260. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_plot.py +0 -0
  261. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_prelabelme.py +0 -0
  262. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_rename.py +0 -0
  263. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_standard_image .py +0 -0
  264. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_standard_video .py +0 -0
  265. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_taichi.py +0 -0
  266. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_video_crop.py +0 -0
  267. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_voc_crop.py +0 -0
  268. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_voc_vis.py +0 -0
  269. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_word_similar.py +0 -0
  270. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_worker1.py +0 -0
  271. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_worker2.py +0 -0
  272. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/__init__.py +0 -0
  273. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/demo.py +0 -0
  274. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/detect_face_person.py +0 -0
  275. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/predet_labelme.py +0 -0
  276. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/edit_distance/__init__.py +0 -0
  277. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/edit_distance/demo.py +0 -0
  278. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/edit_distance/text_matching.py +0 -0
  279. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/__init__.py +0 -0
  280. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/app.py +0 -0
  281. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/utils/__init__.py +0 -0
  282. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/utils/utils.py +0 -0
  283. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/get_file_list.py +0 -0
  284. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/gradio_app.py +0 -0
  285. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/gradio_app_v2.py +0 -0
  286. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/__init__.py +0 -0
  287. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/demo_correction_v1.py +0 -0
  288. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/demo_correction_v2.py +0 -0
  289. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/demo_correction_v3.py +0 -0
  290. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/kafka_worker.py +0 -0
  291. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/men_tracemalloc.py +0 -0
  292. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/__init__.py +0 -0
  293. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/demo01.py +0 -0
  294. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/demo02.py +0 -0
  295. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/hello_milvus.py +0 -0
  296. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/milvus_client.py +0 -0
  297. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/model_process.py +0 -0
  298. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/performance.py +0 -0
  299. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/pose/__init__.py +0 -0
  300. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/pose/human_pose.py +0 -0
  301. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/redis_py/__init__.py +0 -0
  302. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/redis_py/knn_search.py +0 -0
  303. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/redis_py/redis_client.py +0 -0
  304. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/__init__.py +0 -0
  305. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/base.py +0 -0
  306. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/component.py +0 -0
  307. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/main.py +0 -0
  308. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/register.py +0 -0
  309. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/GRU.py +0 -0
  310. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/TCN.py +0 -0
  311. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/__init__.py +0 -0
  312. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/demo.py +0 -0
  313. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/slowfastnet.py +0 -0
  314. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/test_fr/__init__.py +0 -0
  315. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/test_fr/demo11.py +0 -0
  316. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/test_fr/idcardocr.py +0 -0
  317. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/web_socket/__init__.py +0 -0
  318. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/web_socket/asr_clients.py +0 -0
  319. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/web_socket/asr_service.py +0 -0
  320. {pybaseutils-2.4.5 → pybaseutils-2.4.7}/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.5
3
+ Version: 2.4.7
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.5'
11
+ __version__ = '2.4.7'
@@ -0,0 +1,138 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-10-29 16:52:22
7
+ # @Brief :
8
+ # --------------------------------------------------------
9
+ """
10
+ import os
11
+ import numpy as np
12
+ import time
13
+ import threading
14
+ from typing import List, Dict, Callable
15
+ from pybaseutils import thread_utils, file_utils, image_utils, base64_utils
16
+ from pybaseutils.cvutils import video_utils
17
+ from pybaseutils.base import list_queue
18
+
19
+ thread_lock = threading.Lock()
20
+
21
+
22
+ class ProducerConsumer:
23
+ def __init__(self, winsize=3, overlap=0.0, max_workers=2, **kwargs) -> None:
24
+ """
25
+ :param winsize:
26
+ :param overlap:
27
+ :param max_workers:
28
+ :param kwargs:
29
+ """
30
+ self.tag = self.__class__.__name__
31
+ self.winsize = winsize
32
+ self.overlap = overlap
33
+ self.max_workers = max_workers
34
+ self.kwargs = kwargs
35
+ self.producer = list_queue.Queue(maxsize=self.winsize) # 生产者
36
+ self.consumer = list_queue.Queue(maxsize=self.winsize) # 消费者
37
+ self.producer_end = False # 生产者是否结束
38
+ self.consumer_end = False # 消费者是否结束
39
+
40
+ def stop_producer(self):
41
+ """
42
+ 停止生产者线程
43
+ :return:
44
+ """
45
+ self.producer_end = True
46
+
47
+ def stop_consumer(self):
48
+ """
49
+ 停止消费者线程
50
+ :return:
51
+ """
52
+ self.consumer_end = True
53
+
54
+ def task(self, data: List, *args, **kwargs):
55
+ """
56
+ 任务函数,处理输入数据
57
+ :param data: 输入数据
58
+ :return: 处理结果
59
+ """
60
+ print(f"args ={args},kwargs={kwargs}")
61
+ time.sleep(5)
62
+ result = "收到消息:" + file_utils.get_time(format="s")
63
+ return result
64
+
65
+ def task_consumer(self, task, *args, **kwargs):
66
+ """消费者任务"""
67
+ print(f"start consumer thread")
68
+ self.consumer_end = False
69
+ pool = thread_utils.ThreadPool(max_workers=self.max_workers)
70
+ future = []
71
+ while True:
72
+ winsize = self.producer.qsize() if self.producer_end else self.winsize
73
+ while self.producer.qsize() >= winsize and len(future) < self.max_workers:
74
+ data = self.producer.get_window(winsize=winsize, overlap=self.overlap, block=False) # 提取窗口数据
75
+ f = pool.submit(task, data, args, **kwargs)
76
+ future.append(f)
77
+ print(f"producer={self.producer.qsize()} consumer={self.consumer.qsize()} "
78
+ f"winsize={winsize} future={len(future)}")
79
+ if not future: time.sleep(0.1)
80
+ tmp = []
81
+ for f in future:
82
+ try:
83
+ self.consumer.put(f.result(timeout=0.1))
84
+ except Exception as e:
85
+ tmp.append(f)
86
+ future = tmp
87
+ # 生产者队列空,且停止发送数据(pend=True)
88
+ if len(future) == 0 and self.producer_end and self.producer.qsize() == 0:
89
+ print(f"finish consumer thread")
90
+ break
91
+ self.consumer_end = True # 消费者停止处理数据
92
+
93
+ def start_consumer(self, task: Callable, *args, **kwargs):
94
+ """启动消费者线程
95
+ :param task: 任务函数
96
+ :param args: 任务函数参数
97
+ :param kwargs: 任务函数参数
98
+ :return:
99
+ """
100
+ thread = threading.Thread(target=self.task_consumer, args=args, kwargs={"task": task, **kwargs})
101
+ thread.daemon = True
102
+ thread.start()
103
+
104
+ def example(self, video, realtime=False, freq=2, vis=True):
105
+ """
106
+ :param video: 视频文件路径或者摄像头ID
107
+ :param realtime: 是否实时处理视频帧,实时处理会丢弃很多视频帧,非实时会处理所有视频帧,但视频播放会很卡顿
108
+ :param freq:
109
+ :return:
110
+ """
111
+ # TODO 打开视频文件或摄像头
112
+ w, h, num_frames, fps = image_utils.get_video_info(video)
113
+ interval = int(fps / freq) if fps > 0 else 1
114
+ video_cap = video_utils.video_iterator(video, save_video=None)
115
+ self.start_consumer(task=self.task, param1="123", param2="456") # 启动消费者线程
116
+ # TODO 主线程处理视频帧
117
+ for data_info in video_cap:
118
+ image = data_info["frame"][:, :, ::-1] # BGR to RGB
119
+ image = image_utils.resize_image(image, size=(None, 640))
120
+ data_info["frame"] = image
121
+ # TODO 视频抽帧,放入生产者队列,非实时处理会阻塞,实时处理会丢弃旧的视频帧
122
+ if data_info['count'] % interval == 0:
123
+ # data_info['text'] = text
124
+ # data_info['freq'] = freq
125
+ self.producer.put(data_info, block=not realtime)
126
+ if vis: image_utils.show_image("image", image, delay=20)
127
+ if data_info["finish"]: self.stop_producer() # 标记生产者是否结束
128
+ while self.consumer.qsize() > 0 or (self.producer_end and not self.consumer_end):
129
+ result = self.consumer.pop(block=False, timeout=0.005)
130
+ if result: print(result)
131
+
132
+
133
+ if __name__ == '__main__':
134
+ # video_file = "/home/PKing/nasdata/Project/LLM/MLLM-Factory/data/video2.mp4"
135
+ video_file = "/home/PKing/Videos/aije-data/检查绝缘手套-nodate-35s.mp4"
136
+ freq = 2
137
+ infer = ProducerConsumer(winsize=freq * 3, max_workers=1)
138
+ result = infer.example(video=video_file, freq=2)
@@ -61,12 +61,12 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, fps=-1, use_pil=
61
61
 
62
62
  def get_video_sampling(freq, time, fps, random=False):
63
63
  """
64
- 获得抽帧时间点和索引
64
+ 根据抽帧频率和时间范围,获得抽帧时间点和索引
65
65
  :param freq: 抽帧频率
66
66
  :param time: time: 开始播放时间time[0],结束播放时间time[1],单位秒S
67
67
  :param fps: 视频帧率FPS
68
68
  :param random: 是否随机抽帧(在每一秒内随机抽freq帧)
69
- :return:
69
+ :return: times,index
70
70
  """
71
71
  if freq <= 0: freq = fps
72
72
  if random:
@@ -79,7 +79,8 @@ def get_video_sampling(freq, time, fps, random=False):
79
79
  times = np.concatenate(times)
80
80
  # times = np.sort(np.random.uniform(time[0], time[1], size=freq))
81
81
  else:
82
- times = np.arange(time[0], time[1], 1 / freq)
82
+ times = np.arange(time[0], time[1], 1 / freq) # (
83
+ # 开始时间, 结束时间, 抽帧时间间隔)
83
84
  index = times * fps
84
85
  index = index.astype(int)
85
86
  return times, index
@@ -338,7 +339,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
338
339
  video_writer.release()
339
340
 
340
341
 
341
- def video_iterator(video_file: int | str, save_video: str or int = None, interval=1, size=(), freq=0,
342
+ def video_iterator(video_file, save_video: str or int = None, interval=1, size=(), freq=0,
342
343
  task: Callable = None, vis=False, **kwargs):
343
344
  """
344
345
  读取摄像头或者视频流迭代器
@@ -450,3 +451,7 @@ if __name__ == "__main__":
450
451
  # video2video(video_file, dst_file, vis=True)
451
452
  video_file = "/home/PKing/Videos/aije-data/检查绝缘棒.mp4"
452
453
  load_video(video_file, time=(0, -1), freq=2, size=(), use_rgb=False)
454
+
455
+ times, index = get_video_sampling(freq=4, time=(0, 4), fps=20, random=False)
456
+ print(times)
457
+ print(index)
@@ -99,7 +99,6 @@ class VideoFolderDataset(parser_image_folder.FolderDataset):
99
99
  :param video_file:
100
100
  :param size:
101
101
  :param use_rgb:
102
- :param duration: 最大时长
103
102
  :param freq: 抽帧频率
104
103
  :param use_cut:
105
104
  :return:
@@ -108,7 +107,10 @@ class VideoFolderDataset(parser_image_folder.FolderDataset):
108
107
  width, height, numFrames, fps = video_utils.get_video_info(video_cap, disp=False)
109
108
  time = (0, numFrames / fps)
110
109
  video_time, video_idx = video_utils.get_video_sampling(self.freq, time, fps, random=shuffle)
111
- # assert len(video_idx) == max_nums, "video_idx len error:{}".format(video_idx)
110
+ # TODO 居中裁剪
111
+ clip = (int(len(video_idx) / 2 - self.seq_len / 2), int(len(video_idx) / 2 + self.seq_len / 2))
112
+ clip = (max(clip[0], 0), min(clip[1], len(video_idx)))
113
+ video_idx = video_idx[clip[0]:clip[1]]
112
114
  frames = []
113
115
  for count in video_idx:
114
116
  video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
@@ -120,9 +122,10 @@ class VideoFolderDataset(parser_image_folder.FolderDataset):
120
122
  if len(frames) < 3: return [] # 帧太少,无效视频
121
123
  if len(frames) < self.seq_len:
122
124
  pad = self.seq_len - len(frames)
123
- images = [frames[-1].copy()] * pad
125
+ images = [frames[-1]] * pad
124
126
  frames += images
125
- frames = frames[:self.seq_len]
127
+ frames = frames[0:self.seq_len]
128
+ assert len(frames) == self.seq_len, "frames size error:{}".format(len(frames))
126
129
  return frames
127
130
 
128
131
 
@@ -94,7 +94,6 @@ class VideoTextDataset(parser_image_text.TextDataset):
94
94
  :param video_file:
95
95
  :param size:
96
96
  :param use_rgb:
97
- :param duration: 最大时长
98
97
  :param freq: 抽帧频率
99
98
  :param use_cut:
100
99
  :return:
@@ -103,7 +102,10 @@ class VideoTextDataset(parser_image_text.TextDataset):
103
102
  width, height, numFrames, fps = video_utils.get_video_info(video_cap, disp=False)
104
103
  time = (0, numFrames / fps)
105
104
  video_time, video_idx = video_utils.get_video_sampling(self.freq, time, fps, random=shuffle)
106
- # assert len(video_idx) == max_nums, "video_idx len error:{}".format(video_idx)
105
+ # TODO 居中裁剪
106
+ clip = (int(len(video_idx) / 2 - self.seq_len / 2), int(len(video_idx) / 2 + self.seq_len / 2))
107
+ clip = (max(clip[0], 0), min(clip[1], len(video_idx)))
108
+ video_idx = video_idx[clip[0]:clip[1]]
107
109
  frames = []
108
110
  for count in video_idx:
109
111
  video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
@@ -115,9 +117,10 @@ class VideoTextDataset(parser_image_text.TextDataset):
115
117
  if len(frames) < 3: return [] # 帧太少,无效视频
116
118
  if len(frames) < self.seq_len:
117
119
  pad = self.seq_len - len(frames)
118
- images = [frames[-1].copy()] * pad
120
+ images = [frames[-1]] * pad
119
121
  frames += images
120
- frames = frames[:self.seq_len]
122
+ frames = frames[0:self.seq_len]
123
+ assert len(frames) == self.seq_len, "frames size error:{}".format(len(frames))
121
124
  return frames
122
125
 
123
126
 
@@ -126,10 +129,11 @@ if __name__ == '__main__':
126
129
  from classifier.dataset import build_dataset
127
130
  from pybaseutils import image_utils
128
131
 
129
- data_file = ["/home/PKing/nasdata/tmp/UCF101/UCF101/file_test.txt"]
132
+ data_file = ["/home/PKing/nasdata/tmp/UCF101/UCF101/val.txt"]
130
133
  batch_size = 1
131
134
  input_size = [224, 224]
132
- trans_type = "train_video"
135
+ # trans_type = "train_video"
136
+ trans_type = "test_video"
133
137
  transform = build_transform.image_transform(input_size=input_size, trans_type=trans_type)
134
138
  cfg = {"duration": 5, "freq": 2}
135
139
  class_name = ["ApplyEyeMakeup", "ApplyLipstick", "Archery"]
@@ -143,7 +147,7 @@ if __name__ == '__main__':
143
147
  cfg=cfg,
144
148
  disp=True)
145
149
  for i in range(len(dataset)):
146
- data = dataset.__getitem__(10)
150
+ data = dataset.__getitem__(0)
147
151
  video_file, image, label = data["file"], data["image"], data["label"]
148
152
  image = image.transpose((1, 2, 3, 0))
149
153
  image = np.asarray((image * 0.5 + 0.5) * 255, dtype=np.uint8)
@@ -719,26 +719,40 @@ def resize_image_clip(image, clip_max=1920, interpolation=cv2.INTER_LINEAR):
719
719
  return image
720
720
 
721
721
 
722
+ def autosize(size, dsize):
723
+ """
724
+ 自动调整图像大小
725
+ :param size : 原始图像大小 (width, height) image.shape[:2][::-1] or image.size
726
+ :param dsize: 目标图像大小 (width, height)
727
+ :return: 调整后的图像大小 (width, height)
728
+ """
729
+ if not dsize: return size
730
+ dsize = (dsize, dsize) if isinstance(dsize, numbers.Number) else dsize
731
+ dw, dh = dsize
732
+ sw, sh = size
733
+ if (dh is None) and (dw is None): # 错误写法:resize_height and resize_width is None
734
+ return None
735
+ if dh is None:
736
+ dh = int(sh * dw / sw)
737
+ elif dw is None:
738
+ dw = int(sw * dh / sh)
739
+ dsize = (int(dw), int(dh))
740
+ return dsize
741
+
742
+
722
743
  def resize_image(image, size: Tuple, interpolation=cv2.INTER_LINEAR):
723
744
  """
724
745
  tf.image.resize_images(images,size),images=[batch, height, width, channels],size=(new_height, new_width)
725
746
  cv2.resize(image, dsize=(width, height)),与image.shape相反
726
747
  images[50,10]与image.shape的原理相同,它表示的是image=(y=50,x=10)
727
748
  :param image:
728
- :param size: (width,height)
749
+ :param size: (width,height) image.shape[:2][::-1] or image.size
729
750
  :return:
730
751
  """
731
752
  if not size: return image
732
- size = (size, size) if len(size) == 1 else size
733
- dw, dh = size
734
- sh, sw = image.shape[:2]
735
- if (dh is None) and (dw is None): # 错误写法:resize_height and resize_width is None
736
- return image
737
- if dh is None:
738
- dh = int(sh * dw / sw)
739
- elif dw is None:
740
- dw = int(sw * dh / sh)
741
- image = cv2.resize(image, dsize=(int(dw), int(dh)), interpolation=interpolation)
753
+ ssize = image.shape[:2][::-1]
754
+ dsize = autosize(ssize, size)
755
+ if size and dsize: image = cv2.resize(image, dsize=dsize, interpolation=interpolation)
742
756
  return image
743
757
 
744
758
 
@@ -2410,6 +2424,23 @@ def boxes2polygons(boxes: np.ndarray or List[np.ndarray]):
2410
2424
  return polygons
2411
2425
 
2412
2426
 
2427
+ def get_point_circle_contour(points, r, nums=16):
2428
+ """
2429
+ 以给定的中心坐标和半径生成圆的轮廓点
2430
+ :param points: (n_points, 2),圆的中心坐标 (x, y)
2431
+ :param r: 圆的半径
2432
+ :param nums: 轮廓点的数量
2433
+ :return: 圆的轮廓点坐标数组 (n_points,nums, 2)
2434
+ """
2435
+ if len(points) == 0: return points
2436
+ if not isinstance(points, np.ndarray): points = np.asarray(points)
2437
+ theta = np.linspace(0, 2 * np.pi, nums, endpoint=False)
2438
+ x_contour = points[:, 0:1] + r * np.cos(theta)
2439
+ y_contour = points[:, 1:2] + r * np.sin(theta)
2440
+ output = np.concatenate((x_contour[:, :, None], y_contour[:, :, None]), axis=2)
2441
+ return output
2442
+
2443
+
2413
2444
  def get_mask_iou(mask1, mask2, binarize=True, iom=False):
2414
2445
  """
2415
2446
  计算IOU=交集(A,B)/并集(A,B)
@@ -2659,7 +2690,7 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
2659
2690
  :param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
2660
2691
  :param texts:轮廓文本
2661
2692
  :param color:绘制轮廓的颜色
2662
- :param alpha:绘制颜色的透明度
2693
+ :param alpha:绘制颜色的透明度 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
2663
2694
  :param thickness:轮廓线宽
2664
2695
  :return:
2665
2696
  """
@@ -3131,7 +3162,7 @@ def image_composite(image: np.ndarray, alpha: np.ndarray, bg_img=(219, 142, 67))
3131
3162
  https://blog.csdn.net/guduruyu/article/details/71439733
3132
3163
  更有效的C++实现: https://www.aiuai.cn/aifarm1237.html
3133
3164
  :param image: RGB图像(uint8)
3134
- :param alpha: 单通道的alpha图像(uint8)
3165
+ :param alpha: 单通道的alpha图像(uint8), 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
3135
3166
  :param bg_img: 背景图像,可以是任意的分辨率图像,也可以指定指定纯色的背景
3136
3167
  :return: 返回与背景合成的图像
3137
3168
  """
@@ -3268,10 +3299,10 @@ def get_video_capture(video, width=None, height=None, fps=None):
3268
3299
  return video_cap
3269
3300
 
3270
3301
 
3271
- def get_video_info(video_cap: int | str | cv2.VideoCapture, disp=True, **kwargs):
3302
+ def get_video_info(video_cap, disp=True, **kwargs):
3272
3303
  """
3273
3304
  获得视频的基础信息
3274
- :param video_cap:视频对象 或者视频文件路径
3305
+ :param video_cap:视频对象 或者视频文件路径 int | str | cv2.VideoCapture
3275
3306
  :param disp: 是否显示视频信息
3276
3307
  :return:
3277
3308
  """
@@ -64,12 +64,13 @@ def get_confusion_matrix(true_labels, pred_labels, target_names=None, filename=N
64
64
  return conf_matrix
65
65
 
66
66
 
67
- def get_classification_report(true_labels, pred_labels, labels=None, target_names=None, output_dict=False):
67
+ def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
68
+ output_dict=False, matrix=False, plot=False):
68
69
  """
69
70
  true_labels = [0, 1, 2, 3, 4, 1] # Y
70
71
  pred_labels = [0, 1, 1, 2, 2, 1] # X
71
72
  target_names = ["A", "B", "C", "D", "E"]
72
- out_result = get_classification_report(true_labels, pred_labels, target_names=target_names, output_dict=False)
73
+ out_result = get_metrics_report(true_labels, pred_labels, target_names=target_names, output_dict=False)
73
74
  宏平均(macro avg)和微平均(micro avg)
74
75
  如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异
75
76
  如果每个class的样本数量差异很大,而且你想:
@@ -77,21 +78,24 @@ def get_classification_report(true_labels, pred_labels, labels=None, target_name
77
78
  更注重样本量少的class:使用宏平均,若宏平均比微平均小,应检查样本量少的class
78
79
  :param true_labels:
79
80
  :param pred_labels:
80
- :param labels:
81
81
  :param target_names:
82
+ :param labels:
82
83
  :param output_dict:
84
+ :param matrix: 是否绘制混淆矩阵
83
85
  :return:
84
86
  """
85
- true_labels = np.array(true_labels, dtype=np.int32)
86
- pred_labels = np.array(pred_labels, dtype=np.int32)
87
- if target_names:
88
- labels = list(range(len(target_names)))
87
+ # if target_names is None:
88
+ # target_names = list(set(pred_labels) | set(true_labels))
89
+ # else:
90
+ # true_labels = [target_names[int(i)] for i in true_labels]
91
+ # pred_labels = [target_names[int(i)] for i in pred_labels]
89
92
  result = metrics.classification_report(true_labels,
90
93
  pred_labels,
91
94
  labels=labels,
92
95
  digits=4,
93
96
  target_names=target_names,
94
- output_dict=output_dict)
97
+ output_dict=output_dict,
98
+ zero_division=0)
95
99
  if output_dict:
96
100
  macro_avg = result["macro avg"]
97
101
  accuracy = result["accuracy"]
@@ -99,12 +103,18 @@ def get_classification_report(true_labels, pred_labels, labels=None, target_name
99
103
  out_result = {"macro_avg": macro_avg, "accuracy": accuracy, "weighted_avg": weighted_avg}
100
104
  # pdf=pd.DataFrame.from_dict(result)
101
105
  # save_csv("classification_report.csv", pdf)
102
-
103
106
  else:
104
107
  out_result = result
108
+ if matrix:
109
+ conf_matrix = get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
110
+ normalization=True, plot=plot, title="Confusion Matrix")
111
+ # out_result["confusion_matrix"] = conf_matrix
105
112
  return out_result
106
113
 
107
114
 
115
+ get_classification_report = get_metrics_report
116
+
117
+
108
118
  def create_dir(parent_dir, dir1=None, filename=None):
109
119
  """
110
120
  create directory
@@ -136,13 +146,13 @@ def create_file_path(filename):
136
146
 
137
147
 
138
148
  if __name__ == "__main__":
139
- true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
140
- pred_labels = [1, 1, 2, 2, 2, 1, 0] # X
141
- # true_labels = [0, 1, 1, 2, 2]
142
- # pred_labels = [0, 1, 1, 2, 2]
143
- target_names = ["A0", "B1", "C2", "D3"]
144
- confuse_file = "confuse.csv"
145
- out_result = get_classification_report(true_labels, pred_labels, target_names=target_names, output_dict=False)
149
+ # true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
150
+ # pred_labels = [1, 1, 2, 2, 2, 1, 0] # X
151
+ true_labels = ["A", "B", "A", "B"]
152
+ pred_labels = ["A", "B", "A", "B"]
153
+ # target_names = ["A0", "B1", "C2", "D3"]
154
+ target_names = None
155
+ confuse_file = "./confuse.csv"
156
+ out_result = get_classification_report(true_labels, pred_labels, target_names=target_names, output_dict=False,
157
+ matrix=True, plot=True)
146
158
  print(out_result)
147
- get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
148
- normalization=False, filename=confuse_file, plot=True, title="Confusion Matrix")
@@ -151,7 +151,10 @@ class ThreadPool(object):
151
151
  """
152
152
  递交线程任务
153
153
  pool=thread_utils.ThreadPool(max_workers=1)
154
- pool.submit(func, args=(参数1,参数2,参数3,...))
154
+ future = pool.submit(func, args=(参数1,参数2,参数3,...))
155
+ print(future.done()) # 是否完成
156
+ result = future.result() # 等待线程任务完成,获取结果
157
+ print(future.done()) # 是否完成
155
158
  :param func:
156
159
  :param args:
157
160
  :param kwargs:
@@ -250,13 +253,14 @@ def performanceThreadPool():
250
253
  pool = ThreadPool(max_workers=2)
251
254
  future = pool.submit(consumer, "1.jpg", "2.jpg")
252
255
  future = pool.submit(consumer, "1.jpg", "2.jpg")
253
- future = pool.submit(consumer, "1.jpg", "2.jpg")
256
+ # future = pool.submit(consumer, "1.jpg", "2.jpg")
254
257
  print(future.done())
255
- result = future.result()
258
+ result = future.result() # 等待线程任务完成,获取结果
256
259
  print(future.done())
257
260
  print("result:{}".format(result))
258
261
  time.sleep(1)
259
262
 
263
+
260
264
  def performanceThreadPool2():
261
265
  from pybaseutils import time_utils
262
266
  pool = ThreadPool(max_workers=2)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.5
3
+ Version: 2.4.7
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -43,6 +43,7 @@ pybaseutils/audio/vad_utils.py
43
43
  pybaseutils/base/__init__.py
44
44
  pybaseutils/base/dict_queue.py
45
45
  pybaseutils/base/list_queue.py
46
+ pybaseutils/base/producer_consumer.py
46
47
  pybaseutils/build_utils/__init__.py
47
48
  pybaseutils/build_utils/cython_utils.py
48
49
  pybaseutils/build_utils/pyarmor_utils.py
@@ -293,6 +294,8 @@ test_py/milvus_demo/hello_milvus.py
293
294
  test_py/milvus_demo/milvus_client.py
294
295
  test_py/pose/__init__.py
295
296
  test_py/pose/human_pose.py
297
+ test_py/qrcode/__init__.py
298
+ test_py/qrcode/demo.py
296
299
  test_py/redis_py/__init__.py
297
300
  test_py/redis_py/knn_search.py
298
301
  test_py/redis_py/redis_client.py
@@ -99,11 +99,12 @@ if __name__ == '__main__':
99
99
  """
100
100
  对labelme的数据目标进行裁剪,用于制作分类数据集
101
101
  """
102
+ # TODO 蓝色长条标签和鞋套是否相似
102
103
  target_name = ['身穿工作服', '未穿工作服',
103
104
  '绝缘鞋', '脚穿绝缘鞋', '长筒靴', '脚穿长筒靴', '其他鞋', '脚穿其他鞋', '脚穿鞋套',
104
105
  '手', '绝缘手套', '手穿绝缘手套', '棉纱手套', '手穿棉纱手套', '其他手套', '手穿其他手套',
105
106
  '胶枪灯', '胶枪灯红色', '胶枪灯绿色',
106
- 'PDA', 'PDA*', '手与*接触','电视柜台面'
107
+ 'PDA', 'PDA*', '手与*接触', '电视柜台面'
107
108
  ]
108
109
  # '*长条标签'
109
110
  datasets = [
@@ -0,0 +1,50 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ @Author : PKing
4
+ @E-mail : 390737991@qq.com
5
+ @Date : 2022-12-31 11:37:30
6
+ @Brief : https://blog.csdn.net/qdPython/article/details/121381363
7
+ """
8
+ import os
9
+ import cv2
10
+ import random
11
+ import types
12
+ import torch
13
+ import numbers
14
+ from typing import List, Tuple, Dict
15
+ import numpy as np
16
+ from typing import Callable
17
+ from PIL import Image
18
+ from pybaseutils import image_utils, file_utils, text_utils, pandas_utils, json_utils, base64_utils
19
+ import numpy as np
20
+ import cv2
21
+ import math
22
+
23
+ import threading
24
+ import time
25
+
26
+ import numpy as np
27
+
28
+ from test_py.aije.示例代码.MobileNetV2 import output
29
+
30
+
31
+ def cal_contour_mean(image, contours):
32
+ """
33
+ 计算指定轮廓内像素的平均值
34
+ :param image:
35
+ :param contours:
36
+ :return:
37
+ """
38
+ output = []
39
+ for c in contours:
40
+ mask = np.zeros(image.shape[:2], dtype=np.uint8)
41
+ cv2.drawContours(mask, [c], -1, 255, -1) # 填充指定轮廓(白色)
42
+ mean = cv2.mean(image, mask=mask) # 计算掩膜内像素的平均值
43
+ output.append(mean)
44
+ return output
45
+
46
+
47
+ if __name__ == '__main__':
48
+ image_file = "/home/PKing/nasdata/dataset-dmai/AILT/ailt-line/dataset-20251216-test/images/20251216_191638_主视_13300.jpg"
49
+ image = cv2.imread(image_file)
50
+ centers = [[100, 200], [300, 400], [500, 600]]
@@ -21,8 +21,9 @@ def video2frames_demo(root, out, vis=False):
21
21
  # video_utils.video2frames_similarity(video_file, out_dir=out, func=None, interval=20, thresh=0.3, vis=True)
22
22
  video_utils.video2frames(video_file, out_dir=out, task=None, interval=20, vis=vis, prefix="")
23
23
 
24
+
24
25
  if __name__ == "__main__":
25
- root = "/home/PKing/edudata/dataset/AIJE/【TOP】技能人才系统_数据集管理/06-联通岗评/02-训练数据/联通入户布线_143_20251216_191638-打胶枪专题数据/20251216_191638_主视.mp4"
26
+ root = "/home/PKing/edudata/dataset/AIJE/【TOP】技能人才系统_数据集管理/06-联通岗评/02-训练数据/联通入户布线_156_20251219_180523-胶枪打胶专题数据/20251219_180523_主视.mp4"
26
27
  out = os.path.join(os.path.dirname(root), "frames")
27
28
  # out = os.path.join(root, "frames")
28
29
  video2frames_demo(root, out)
@@ -0,0 +1,9 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-12-18 15:10:34
7
+ # @Brief :
8
+ # --------------------------------------------------------
9
+ """