pybaseutils 2.4.6__tar.gz → 2.4.8__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 (328) hide show
  1. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base/list_queue.py +5 -0
  4. pybaseutils-2.4.8/pybaseutils/base/producer_consumer.py +155 -0
  5. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base64_utils.py +2 -2
  6. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/video_utils.py +30 -26
  7. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_labelme.py +22 -16
  8. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  9. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dict_uils.py +2 -1
  10. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/image_utils.py +19 -14
  11. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/json_utils.py +28 -2
  12. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/singleton_utils.py +3 -0
  13. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/build_transform.py +0 -0
  14. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/PKG-INFO +1 -1
  15. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/SOURCES.txt +4 -0
  16. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/dependency_links.txt +0 -0
  17. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/not-zip-safe +0 -0
  18. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/top_level.txt +0 -0
  19. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/setup.cfg +0 -0
  20. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_labelme_crop_ailt.py +7 -4
  21. pybaseutils-2.4.8/test_py/aije/demo_motion_blur.py +91 -0
  22. pybaseutils-2.4.8/test_py/aije/demo_video_aije.py +42 -0
  23. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/mask_image.py +0 -0
  24. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/fall_dataset.py +0 -0
  25. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/parking_rois_gopro.py +0 -0
  26. pybaseutils-2.4.8/test_py/demo1.py +46 -0
  27. pybaseutils-2.4.8/test_py/demo2.py +69 -0
  28. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_gif_video.py +4 -4
  29. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_lableme_vis.py +1 -5
  30. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_nii.py +5 -5
  31. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_video2frame.py +5 -4
  32. pybaseutils-2.4.8/test_py/fast_api/__init__.py +9 -0
  33. pybaseutils-2.4.8/test_py/fast_api/create_image_url.py +55 -0
  34. pybaseutils-2.4.8/test_py/fast_api/get_image_url.py +88 -0
  35. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/qrcode/__init__.py +0 -0
  36. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/qrcode/demo.py +0 -0
  37. pybaseutils-2.4.8/test_py/registry/main.py +23 -0
  38. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/chat_service.py +52 -28
  39. pybaseutils-2.4.6/pybaseutils/base/producer_consumer.py +0 -138
  40. pybaseutils-2.4.6/test_py/aije/demo_video_aije.py +0 -97
  41. pybaseutils-2.4.6/test_py/demo1.py +0 -21
  42. pybaseutils-2.4.6/test_py/demo2.py +0 -50
  43. pybaseutils-2.4.6/test_py/registry/main.py +0 -62
  44. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/LICENCE +0 -0
  45. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/README.md +0 -0
  46. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/__init__.py +0 -0
  47. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/audio_utils.py +0 -0
  48. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/pyaudio_utils.py +0 -0
  49. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/vad_utils.py +0 -0
  50. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base/__init__.py +0 -0
  51. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base/dict_queue.py +0 -0
  52. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/batch_utils.py +0 -0
  53. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/build_utils/__init__.py +0 -0
  54. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/build_utils/cython_utils.py +0 -0
  55. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  56. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/__init__.py +0 -0
  57. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/kmean.py +0 -0
  58. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/maxmin_distance.py +0 -0
  59. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/similarity.py +0 -0
  60. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/color_utils.py +0 -0
  61. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/config_utils.py +0 -0
  62. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/__init__.py +0 -0
  63. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_coco.py +0 -0
  64. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_cvat.py +0 -0
  65. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_labelme.py +0 -0
  66. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_voc.py +0 -0
  67. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/concat_coco.py +0 -0
  68. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  69. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_coco2voc.py +0 -0
  70. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  71. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  72. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  73. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  74. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  75. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  76. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2coco.py +0 -0
  77. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  78. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2voc.py +0 -0
  79. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  80. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  81. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  82. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/prelabelme.py +0 -0
  83. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/coords_utils.py +0 -0
  84. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/__init__.py +0 -0
  85. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/corner_utils.py +0 -0
  86. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/monitor.py +0 -0
  87. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/mouse_utils.py +0 -0
  88. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/nms_utils.py +0 -0
  89. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/data_utils.py +0 -0
  90. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/__init__.py +0 -0
  91. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/balanced_classes.py +0 -0
  92. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/base_coco.py +0 -0
  93. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/base_dataset.py +0 -0
  94. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/data_resample.py +0 -0
  95. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  96. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  97. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  98. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  99. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_image_text.py +0 -0
  100. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  101. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  102. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_video_text.py +0 -0
  103. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_voc.py +0 -0
  104. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_yolo.py +0 -0
  105. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  106. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/file_utils.py +0 -0
  107. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/QueueTable.py +0 -0
  108. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/__init__.py +0 -0
  109. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/demo.py +0 -0
  110. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/kalman_filter.py +0 -0
  111. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/mean_filter.py +0 -0
  112. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/motion_filter.py +0 -0
  113. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/pose_filter.py +0 -0
  114. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/font_style/__init__.py +0 -0
  115. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/font_utils.py +0 -0
  116. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/geometry_tools.py +0 -0
  117. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/heatmap_utils.py +0 -0
  118. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/http_utils.py +0 -0
  119. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/log.py +0 -0
  120. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/log_utils.py +0 -0
  121. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/media/__init__.py +0 -0
  122. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/media/ffmpeg_utils.py +0 -0
  123. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/__init__.py +0 -0
  124. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/accuracy.py +0 -0
  125. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/average_meter.py +0 -0
  126. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/class_report.py +0 -0
  127. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/plot_pr.py +0 -0
  128. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/plot_roc.py +0 -0
  129. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/numpy_utils.py +0 -0
  130. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pandas_utils.py +0 -0
  131. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/plot_utils.py +0 -0
  132. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/__init__.py +0 -0
  133. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/bones_utils.py +0 -0
  134. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/human_pose.py +0 -0
  135. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/pose_utils.py +0 -0
  136. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pycpp/__init__.py +0 -0
  137. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pycpp/demo.py +0 -0
  138. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pycpp/main.py +0 -0
  139. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/server/__init__.py +0 -0
  140. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/server/apm_server.py +0 -0
  141. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/setup_config.py +0 -0
  142. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/text_utils.py +0 -0
  143. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/thread_utils.py +0 -0
  144. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/time_utils.py +0 -0
  145. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracemalloc_utils.py +0 -0
  146. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracemalloc_utils2.py +0 -0
  147. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/QueueTable.py +0 -0
  148. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/__init__.py +0 -0
  149. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/demo.py +0 -0
  150. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/kalman_filter.py +0 -0
  151. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/mean_filter.py +0 -0
  152. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/motion_filter.py +0 -0
  153. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/pose_filter.py +0 -0
  154. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/__init__.py +0 -0
  155. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/affine_transform.py +0 -0
  156. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/face_alignment.py +0 -0
  157. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/imgaug_utils.py +0 -0
  158. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/transform_utils.py +0 -0
  159. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/__init__.py +0 -0
  160. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/app_gradio_image.py +0 -0
  161. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/app_stweb_image.py +0 -0
  162. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/app_webio_image.py +0 -0
  163. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/demo.py +0 -0
  164. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/word_utils.py +0 -0
  165. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/worker.py +0 -0
  166. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/yaml_utils.py +0 -0
  167. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/setup.py +0 -0
  168. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/Image_enhance/__init__.py +0 -0
  169. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/Image_enhance/dmeo01.py +0 -0
  170. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/WebCrawler/__init__.py +0 -0
  171. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/WebCrawler/search_baidu.py +0 -0
  172. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/WebCrawler/search_biying.py +0 -0
  173. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/__init__.py +0 -0
  174. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/__init__.py +0 -0
  175. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/action_dataset.py +0 -0
  176. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/build_cython.py +0 -0
  177. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/build_pyarmor.py +0 -0
  178. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/build_service.py +0 -0
  179. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/convert_cvat2labelme.py +0 -0
  180. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/convert_labelme2coco.py +0 -0
  181. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/convert_labelme2voc.py +0 -0
  182. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/copy_move.py +0 -0
  183. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_labelme_crop_aije.py +0 -0
  184. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_labelme_shock.py +0 -0
  185. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_voc_crop.py +0 -0
  186. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_voc_vis.py +0 -0
  187. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/get_pair_data.py +0 -0
  188. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/video_convertor.py +0 -0
  189. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/__init__.py +0 -0
  190. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/demo.py +0 -0
  191. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/main.py +0 -0
  192. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/main_read.py +0 -0
  193. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/segment.py +0 -0
  194. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  195. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/speechbrain_demo.py +0 -0
  196. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio_demo1.py +0 -0
  197. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/camera/__init__.py +0 -0
  198. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/camera/demo.py +0 -0
  199. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/captcha/__init__.py +0 -0
  200. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/captcha/demo.py +0 -0
  201. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/class_attribute.py +0 -0
  202. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/class_names.py +0 -0
  203. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/AffectNet.py +0 -0
  204. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/AsianMovie.py +0 -0
  205. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/BITVehicle2voc.py +0 -0
  206. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/BSTLD2voc.py +0 -0
  207. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/CCPD.py +0 -0
  208. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/CCPD2voc.py +0 -0
  209. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/FL3D_dataset.py +0 -0
  210. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/FreiHAND2coco.py +0 -0
  211. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/MTFL2voc.py +0 -0
  212. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/TT100K.py +0 -0
  213. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/WaterMeters1.py +0 -0
  214. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/WaterMeters2.py +0 -0
  215. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/__init__.py +0 -0
  216. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/concat_coco.py +0 -0
  217. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_coco2voc.py +0 -0
  218. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_cvat2labelme.py +0 -0
  219. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_gesture2hand.py +0 -0
  220. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2coco.py +0 -0
  221. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2cvat.py +0 -0
  222. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2labelme.py +0 -0
  223. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2voc.py +0 -0
  224. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_voc2labelme.py +0 -0
  225. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_yolo2labelme.py +0 -0
  226. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/fatigue_driving.py +0 -0
  227. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/fdd_dataset.py +0 -0
  228. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/get_pair_data.py +0 -0
  229. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/handpose2coco.py +0 -0
  230. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/insects_for_aichallenger.py +0 -0
  231. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/tt100k_utils.py +0 -0
  232. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/ua_detrac2voc.py +0 -0
  233. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/ucf101_dataset.py +0 -0
  234. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/voc_sbd2labelme.py +0 -0
  235. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/__init__.py +0 -0
  236. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/build_cython.py +0 -0
  237. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/build_pyarmor.py +0 -0
  238. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/cryptography_demo.py +0 -0
  239. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/fun_sum.py +0 -0
  240. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/main.py +0 -0
  241. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/model_des_enctypt.py +0 -0
  242. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/model_enctypt.py +0 -0
  243. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/date_dataset.py +0 -0
  244. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/date_demo.py +0 -0
  245. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/datedataset_bk.py +0 -0
  246. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo3.py +0 -0
  247. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo4.py +0 -0
  248. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_async_await1.py +0 -0
  249. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_async_await2.py +0 -0
  250. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_coco_vis.py +0 -0
  251. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_copy_files.py +0 -0
  252. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_copy_files_for_voc.py +0 -0
  253. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_ffmpy.py +0 -0
  254. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_annular_to_rect.py +0 -0
  255. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_pair_file.py +0 -0
  256. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_polygon.py +0 -0
  257. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_trt.py +0 -0
  258. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_get_file_label.py +0 -0
  259. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_get_file_list.py +0 -0
  260. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_gif.py +0 -0
  261. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_image_crop.py +0 -0
  262. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_kpts.py +0 -0
  263. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_labelme.py +0 -0
  264. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_labelme_crop.py +0 -0
  265. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_letterbox.py +0 -0
  266. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_metrics.py +0 -0
  267. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_mosaic.py +0 -0
  268. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_mouse.py +0 -0
  269. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_pandas.py +0 -0
  270. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_plot.py +0 -0
  271. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_prelabelme.py +0 -0
  272. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_rename.py +0 -0
  273. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_standard_image .py +0 -0
  274. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_standard_video .py +0 -0
  275. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_taichi.py +0 -0
  276. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_video_crop.py +0 -0
  277. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_voc_crop.py +0 -0
  278. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_voc_vis.py +0 -0
  279. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_word_similar.py +0 -0
  280. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_worker1.py +0 -0
  281. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_worker2.py +0 -0
  282. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/__init__.py +0 -0
  283. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/demo.py +0 -0
  284. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/detect_face_person.py +0 -0
  285. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/predet_labelme.py +0 -0
  286. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/edit_distance/__init__.py +0 -0
  287. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/edit_distance/demo.py +0 -0
  288. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/edit_distance/text_matching.py +0 -0
  289. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/__init__.py +0 -0
  290. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/app.py +0 -0
  291. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/utils/__init__.py +0 -0
  292. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/utils/utils.py +0 -0
  293. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/get_file_list.py +0 -0
  294. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/gradio_app.py +0 -0
  295. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/gradio_app_v2.py +0 -0
  296. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/__init__.py +0 -0
  297. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/demo_correction_v1.py +0 -0
  298. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/demo_correction_v2.py +0 -0
  299. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/demo_correction_v3.py +0 -0
  300. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/kafka_worker.py +0 -0
  301. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/men_tracemalloc.py +0 -0
  302. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/__init__.py +0 -0
  303. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/demo01.py +0 -0
  304. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/demo02.py +0 -0
  305. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/hello_milvus.py +0 -0
  306. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/milvus_client.py +0 -0
  307. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/model_process.py +0 -0
  308. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/performance.py +0 -0
  309. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/pose/__init__.py +0 -0
  310. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/pose/human_pose.py +0 -0
  311. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/redis_py/__init__.py +0 -0
  312. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/redis_py/knn_search.py +0 -0
  313. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/redis_py/redis_client.py +0 -0
  314. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/__init__.py +0 -0
  315. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/base.py +0 -0
  316. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/component.py +0 -0
  317. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/register.py +0 -0
  318. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/GRU.py +0 -0
  319. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/TCN.py +0 -0
  320. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/__init__.py +0 -0
  321. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/demo.py +0 -0
  322. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/slowfastnet.py +0 -0
  323. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/test_fr/__init__.py +0 -0
  324. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/test_fr/demo11.py +0 -0
  325. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/test_fr/idcardocr.py +0 -0
  326. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/__init__.py +0 -0
  327. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/asr_clients.py +0 -0
  328. {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/asr_service.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.6
3
+ Version: 2.4.8
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.6'
11
+ __version__ = '2.4.8'
@@ -113,6 +113,11 @@ class Queue():
113
113
  return data1 + data2
114
114
  return []
115
115
 
116
+ def clear(self):
117
+ """清空队列"""
118
+ with self.queue.mutex:
119
+ self.queue.queue.clear()
120
+
116
121
 
117
122
  if __name__ == '__main__':
118
123
  q = Queue(maxsize=3)
@@ -0,0 +1,155 @@
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.log = kwargs.get('log', print) if kwargs.get('log', print) else print
32
+ self.winsize = winsize
33
+ self.overlap = overlap
34
+ self.max_workers = max_workers
35
+ self.kwargs = kwargs
36
+ self.producer = list_queue.Queue(maxsize=self.winsize) # 生产者
37
+ self.consumer = list_queue.Queue(maxsize=self.winsize) # 消费者
38
+ self.producer_end = False # 生产者是否结束
39
+ self.consumer_end = False # 消费者是否结束
40
+
41
+ def stop_producer(self):
42
+ """
43
+ 停止生产者线程
44
+ :return:
45
+ """
46
+ self.producer_end = True
47
+ self.log("stop producer")
48
+
49
+ def stop_consumer(self):
50
+ """
51
+ 停止消费者线程
52
+ :return:
53
+ """
54
+ self.consumer_end = True
55
+ self.log("stop consumer")
56
+
57
+ def task(self, data: List, *args, **kwargs):
58
+ """
59
+ 任务函数,处理输入数据
60
+ :param data: 输入数据
61
+ :return: 处理结果
62
+ """
63
+ self.log(f"args ={args},kwargs={kwargs}")
64
+ time.sleep(3)
65
+ result = "收到消息:" + file_utils.get_time(format="s")
66
+ return result
67
+
68
+ def task_consumer(self, task, *args, **kwargs):
69
+ """消费者任务"""
70
+ self.log(f"start consumer thread")
71
+ self.consumer_end = False
72
+ pool = thread_utils.ThreadPool(max_workers=self.max_workers)
73
+ future = []
74
+ while True:
75
+ # winsize = self.producer.qsize() if self.producer_end else self.winsize
76
+ if self.producer_end and self.producer.qsize() <= self.winsize:
77
+ winsize, overlap = self.producer.qsize(), 0 # TODO 如果生产者已经结束,则一次性处理剩余的数据
78
+ else:
79
+ winsize, overlap = self.winsize, self.overlap
80
+ while self.producer.qsize() >= winsize > 0 and len(future) < self.max_workers:
81
+ data = self.producer.get_window(winsize=winsize, overlap=overlap, block=False) # 提取窗口数据
82
+ f = pool.submit(task, data, args, **kwargs)
83
+ future.append(f)
84
+ self.log(f"tid={id(f)} producer={self.producer.qsize()} consumer={self.consumer.qsize()} "
85
+ f"winsize={winsize} future={len(future)} ")
86
+ if not future: time.sleep(0.1)
87
+ tmp = []
88
+ for f in future:
89
+ try:
90
+ self.consumer.put(f.result(timeout=0.1))
91
+ except Exception as e:
92
+ tmp.append(f)
93
+ future = tmp
94
+ # 生产者队列空,且停止发送数据(pend=True)
95
+ if len(future) == 0 and self.producer_end and self.producer.qsize() == 0:
96
+ print(f"finish consumer thread")
97
+ break
98
+ self.stop_consumer() # 消费者停止处理数据
99
+
100
+ def start_consumer(self, task: Callable, *args, **kwargs):
101
+ """启动消费者线程
102
+ :param task: 任务函数
103
+ :param args: 任务函数参数
104
+ :param kwargs: 任务函数参数
105
+ :return:
106
+ """
107
+ thread = threading.Thread(target=self.task_consumer, args=args, kwargs={"task": task, **kwargs})
108
+ thread.daemon = True
109
+ thread.start()
110
+
111
+
112
+ def example(text, video, realtime=False, freq=2, wintime=3, overlap=0.5, max_workers=2, delay=20, vis=True, **kwargs):
113
+ """
114
+ 实时分析功能,从视频中提取帧进行分析
115
+ :param text: 用户问题/任务描述
116
+ :param video: 视频文件路径或者摄像头ID
117
+ :param realtime: 是否实时处理视频帧,实时处理会丢弃很多视频帧,非实时会处理所有视频帧,但视频播放会很卡顿
118
+ :param freq: 视频帧提取频率(Hz)
119
+ :param wintime: 窗口时间长度,单位秒
120
+ :param overlap: 滑动窗口重叠比例
121
+ :param max_workers: 视频处理线程数
122
+ :return:
123
+ """
124
+ winsize = int(wintime * freq)
125
+ pc = ProducerConsumer(winsize=winsize, overlap=overlap, max_workers=max_workers, **kwargs)
126
+ # TODO 打开视频文件或摄像头
127
+ w, h, num_frames, fps = image_utils.get_video_info(video)
128
+ fpm = 1 / fps
129
+ interval = int(fps / freq) if fps > 0 else 1
130
+ video_cap = video_utils.video_iterator(video, save_video=None)
131
+ pc.start_consumer(task=pc.task, text=text, freq=freq) # 启动消费者线程
132
+ # TODO 主线程处理视频帧
133
+ for data_info in video_cap:
134
+ t1 = time.time()
135
+ image = data_info["frame"][:, :, ::-1] # BGR to RGB
136
+ image = image_utils.resize_image(image, size=(None, 640))
137
+ data_info["frame"] = image
138
+ # TODO 视频抽帧,放入生产者队列,非实时处理会阻塞,实时处理会丢弃旧的视频帧
139
+ if data_info['count'] % interval == 0:
140
+ # data_info['text'] = text
141
+ # data_info['freq'] = freq
142
+ pc.producer.put(data_info, block=not realtime)
143
+ if vis: image_utils.show_image("image", image, delay=1, use_rgb=True)
144
+ if data_info["finish"]: pc.stop_producer() # 标记生产者是否结束
145
+ td = time.time() - t1 # 秒
146
+ time.sleep(max(0.0, fpm - td)) # 保证视频有40ms延时
147
+ while pc.consumer.qsize() > 0 or (pc.producer_end and not pc.consumer_end):
148
+ result = pc.consumer.pop(block=False, timeout=0.005)
149
+ if result: print("result={}".format(result))
150
+
151
+
152
+ if __name__ == '__main__':
153
+ text = "请分析这个视频"
154
+ video_file = "/home/PKing/Videos/video4.mp4"
155
+ example(text=text, video=video_file, freq=2)
@@ -159,8 +159,8 @@ if __name__ == "__main__":
159
159
  print(image_file)
160
160
  src = image_utils.read_image(image_file, use_rgb=True)
161
161
  image_base64 = image2base64(src, prefix="data:image/jpeg;base64,", )
162
- img = Image.fromarray(src)
163
- data = {"image": img, "file": image_file}
162
+ pltimg = Image.fromarray(src)
163
+ data = {"image": pltimg, "file": image_file}
164
164
  data = serialization(data)
165
165
  data = deserialization(data)
166
166
  dst = data["image"]
@@ -11,6 +11,7 @@ import os
11
11
  import cv2
12
12
  import numpy as np
13
13
  import math
14
+ import time as timelib
14
15
  from typing import Callable
15
16
  from tqdm import tqdm
16
17
  from pybaseutils import image_utils, file_utils
@@ -147,11 +148,11 @@ def video2frames(video_file, out_dir=None, task: Callable = None, interval=1, si
147
148
  frame_file = os.path.join(out_dir, "{}_{:0=5d}.jpg".format(filename, count))
148
149
  cv2.imwrite(frame_file, frame)
149
150
  data_info["file"] = frame_file
150
- frames.append(data_info)
151
+ if not out_dir: frames.append(data_info)
151
152
  return frames
152
153
 
153
154
 
154
- def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True, **kwargs):
155
+ def video2frames_similarity(video_file, out_dir=None, func=None, prefix="", interval=1, thresh=0.3, vis=True, **kwargs):
155
156
  """
156
157
  视频抽帧图像
157
158
  :param video_file: 视频文件
@@ -162,7 +163,8 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
162
163
  :return:
163
164
  """
164
165
  sm = monitor.StatusMonitor()
165
- name = os.path.basename(video_file).split(".")[0]
166
+ name = os.path.basename(video_file).split(".")[0].replace("-", "_")
167
+ if prefix: name = f"{prefix}_{name}"
166
168
  if not out_dir: out_dir = os.path.join(os.path.dirname(video_file), name)
167
169
  video_cap = get_video_capture(video_file)
168
170
  width, height, num_frames, fps = get_video_info(video_cap, **kwargs)
@@ -181,13 +183,13 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
181
183
  last_frame = curr_frame.copy()
182
184
  diff = sm.get_frame_similarity(curr_frame, last_frame, size=(256, 256), vis=False)
183
185
  if diff > thresh:
184
- frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
186
+ frame_file = os.path.join(out_dir, "{}_{:0=6d}.jpg".format(name, count))
185
187
  last_frame = curr_frame.copy()
186
188
  cv2.imwrite(frame_file, curr_frame)
187
189
  frame_files.append(frame_file)
188
190
  if vis:
189
191
  text = "TH={},diff={:3.3f}".format(thresh, diff)
190
- image = image_utils.draw_text(curr_frame, point=(10, 70), color=(0, 255, 0),
192
+ image = image_utils.draw_text(curr_frame, point=(10, 100), color=(0, 255, 0),
191
193
  text=text, drawType="simple")
192
194
  image = image_utils.cv_show_image("image", image, delay=5)
193
195
  count += 1
@@ -245,7 +247,7 @@ def video2video(video_file: int or str, save_video: str or int, interval=1, size
245
247
  :param interval: 间隔
246
248
  :return:
247
249
  """
248
- video_capture(video_file=video_file, save_video=save_video, interval=interval, size=size, freq=freq, task=task,
250
+ video_capture(video=video_file, save_video=save_video, interval=interval, size=size, freq=freq, task=task,
249
251
  vis=vis, **kwargs)
250
252
 
251
253
 
@@ -284,11 +286,11 @@ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True,
284
286
  video_writer.release()
285
287
 
286
288
 
287
- def video_capture(video_file: int or str, save_video: str or int = None, interval=1, size=(), freq=0,
289
+ def video_capture(video: int or str, save_video: str or int = None, interval=1, size=(), freq=0,
288
290
  task: Callable = None, vis=True, **kwargs):
289
291
  """
290
292
  读取摄像头或者视频流
291
- :param video_file: String 视频文件,如*.avi,*.mp4,...
293
+ :param video: String 视频文件,如*.avi,*.mp4,...
292
294
  Int 摄像头ID,如0,1,2
293
295
  :param save_video: 保存task视频处理后的结果
294
296
  :param interval: 抽帧处理间隔
@@ -299,13 +301,13 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
299
301
  title: 控制显示窗口名
300
302
  :return:
301
303
  """
302
- video_file = file_utils.str2number(video_file)
303
- if isinstance(video_file, str) and os.path.isfile(video_file):
304
- assert os.path.exists(video_file), f"video_file={video_file}"
305
- video_cap = image_utils.get_video_capture(video_file, fps=None)
304
+ video = file_utils.str2number(video)
305
+ if isinstance(video, str) and os.path.isfile(video):
306
+ assert os.path.exists(video), f"video={video}"
307
+ video_cap = image_utils.get_video_capture(video, fps=None)
306
308
  w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
307
309
  time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
308
- clip = kwargs.get("clip", tuple()) # TODO 开始播放位置index[0],结束播放位置index[1]
310
+ clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
309
311
  start, end = 0, -1
310
312
  if time and fps > 0:
311
313
  start, end = int(time[0] * fps), int(time[1] * fps)
@@ -322,7 +324,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
322
324
  ret, frame = video_cap.read()
323
325
  if count % interval == 0 and count >= start:
324
326
  # TODO 设置抽帧的位置,但某些格式视频容易出现问题
325
- # if isinstance(video_file, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
327
+ # if isinstance(video, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
326
328
  # ret, frame = video_cap.read()
327
329
  if not ret or 0 < end < count or frame is None: break
328
330
  if size: frame = image_utils.resize_image(frame, size=size)
@@ -339,17 +341,17 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
339
341
  video_writer.release()
340
342
 
341
343
 
342
- def video_iterator(video_file: int | str, save_video: str or int = None, interval=1, size=(), freq=0,
344
+ def video_iterator(video, save_video: str or int = None, interval=1, size=(), freq=0,
343
345
  task: Callable = None, vis=False, **kwargs):
344
346
  """
345
347
  读取摄像头或者视频流迭代器
346
348
  Usage:
347
349
  from pybaseutils.cvutils import video_utils
348
- video_cap = video_utils.video_iterator(video_file, save_video, time=(4, 10))
350
+ video_cap = video_utils.video_iterator(video, save_video, time=(4, 10))
349
351
  for data_info in video_cap:
350
352
  frame = data_info["frame"]
351
353
  ...
352
- :param video_file: String 视频文件,如*.avi,*.mp4,...
354
+ :param video: String 视频文件,如*.avi,*.mp4,...
353
355
  Int 摄像头ID,如0,1,2
354
356
  :param save_video: 保存task视频处理后的结果
355
357
  :param interval: 抽帧处理间隔,当interval=-1,表示当interval=fps,即一秒一帧
@@ -360,20 +362,20 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
360
362
  delay: 控制显示延时,默认10S
361
363
  title: 控制显示窗口名,默认video
362
364
  time: 开始播放时间time[0],结束播放时间time[1],单位秒S
363
- clip: 开始播放位置index[0],结束播放位置index[1]
365
+ clip: 开始播放位置clip[0],结束播放位置clip[1]
364
366
  speed: 保存视频的播放速度,默认是播放帧率
365
367
  save_fps: 保存视频的帧率,默认是播放帧率
366
368
  :return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
367
369
  当输入是视频文件时,返回视频偏移量time和duration都是播放时间,单位S,差异不大
368
370
  当输入是摄像头时, 返回视频偏移量time是视频播放时间,duration是根据count计算的播放的时间
369
371
  """
370
- video_file = file_utils.str2number(video_file)
371
- if isinstance(video_file, str) and os.path.isfile(video_file):
372
- assert os.path.exists(video_file), f"video_file={video_file}"
373
- video_cap = image_utils.get_video_capture(video_file, fps=None)
372
+ video = file_utils.str2number(video)
373
+ if isinstance(video, str) and os.path.isfile(video):
374
+ assert os.path.exists(video), f"video={video}"
375
+ video_cap = image_utils.get_video_capture(video, fps=None)
374
376
  w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
375
377
  time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
376
- clip = kwargs.get("clip", tuple()) # TODO 开始播放位置index[0],结束播放位置index[1]
378
+ clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
377
379
  start, end = 0, -1
378
380
  if time and fps > 0:
379
381
  start, end = int(time[0] * fps), int(time[1] * fps)
@@ -390,14 +392,15 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
390
392
  data_info = {}
391
393
  t0 = -1
392
394
  while True:
393
- ret, frame = (False, None) if use_fast else video_cap.read()
395
+ systime = timelib.time()
396
+ ret, frame = (False, None) if use_fast else video_cap.read() # 读取视频很快,但读取USB摄像头比较耗时
394
397
  t = video_cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
395
398
  if t0 < 0 < t: t0 = t
396
399
  if t0 > 0: t = t - t0 # 获得视频偏移量毫秒为单位
397
400
  finish = 0 < end <= (count + interval)
398
401
  if count % interval == 0 and count >= start:
399
402
  # TODO 设置抽帧的位置,但某些格式视频容易出现问题
400
- if use_fast and isinstance(video_file, str):
403
+ if use_fast and isinstance(video, str):
401
404
  video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
402
405
  ret, frame = video_cap.read()
403
406
  if not ret or 0 < end <= count or frame is None: break
@@ -407,7 +410,7 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
407
410
  d = round(count / fps, 3) # TODO 通过fps计算播放时间
408
411
  t = round(t, 3) # 通过视频偏移量计算播放时间
409
412
  data_info = {"count": count, "time": t, "frame": frame, "w": w, "h": h, "fps": fps,
410
- "finish": finish, 'duration': d}
413
+ "finish": finish, 'duration': d, 'systime': systime}
411
414
  # TODO 返回data_info
412
415
  yield data_info
413
416
  frame = data_info["frame"]
@@ -416,6 +419,7 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
416
419
  h, w = frame.shape[:2]
417
420
  if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
418
421
  video_writer.write(frame)
422
+ if data_info['finish']: break # 控制结束
419
423
  count += 1
420
424
  video_cap.release()
421
425
  if video_writer:
@@ -14,6 +14,7 @@ import glob
14
14
  import random
15
15
  import numbers
16
16
  import json
17
+ import traceback
17
18
  from tqdm import tqdm
18
19
  from pybaseutils import image_utils, file_utils, json_utils, text_utils
19
20
  from pybaseutils.dataloader.base_dataset import Dataset, ConcatDataset
@@ -145,21 +146,26 @@ class LabelMeDataset(Dataset):
145
146
  class_name = []
146
147
  for image_id in tqdm(image_ids, desc="check data"):
147
148
  image_file, anno_file, image_id = self.get_image_anno_file(image_id)
148
- if not os.path.exists(anno_file):
149
- continue
150
- if not os.path.exists(image_file):
151
- continue
152
- annotation, width, height = self.load_annotations(anno_file)
153
- data_info = self.parser_annotation(annotation, self.total_names, size=(width, height),
154
- min_points=self.min_points,
155
- unique=self.unique)
156
- if self.use_kpt:
157
- data_info = self.get_kpts_info(data_info, anno_file=anno_file, check_kpt=self.check_kpt, disp=True)
158
- labels = data_info["labels"]
159
- if len(labels) == 0:
149
+ try:
150
+ if not os.path.exists(anno_file):
151
+ continue
152
+ if not os.path.exists(image_file):
153
+ continue
154
+ annotation, width, height = self.load_annotations(anno_file)
155
+ data_info = self.parser_annotation(annotation, self.total_names, size=(width, height),
156
+ min_points=self.min_points,
157
+ unique=self.unique)
158
+ if self.use_kpt:
159
+ data_info = self.get_kpts_info(data_info, anno_file=anno_file, check_kpt=self.check_kpt, disp=True)
160
+ labels = data_info["labels"]
161
+ if len(labels) == 0:
162
+ continue
163
+ dst_ids.append(image_id)
164
+ class_name += labels
165
+ except Exception as e:
166
+ traceback.print_exc()
167
+ print(anno_file)
160
168
  continue
161
- dst_ids.append(image_id)
162
- class_name += labels
163
169
  if self.class_name is None:
164
170
  class_name = sorted(list(set(class_name)))
165
171
  self.class_name, self.class_dict = self.parser_classes(class_name)
@@ -417,8 +423,8 @@ class LabelMeDataset(Dataset):
417
423
  with open(anno_file, "r") as f:
418
424
  annotation: dict = json.load(f)
419
425
  annos = annotation.get("shapes", [])
420
- width = annotation.get('imageWidth', -1)
421
- height = annotation.get('imageHeight', -1)
426
+ width = int(annotation.get('imageWidth', -1))
427
+ height = int(annotation.get('imageHeight', -1))
422
428
  except Exception as e:
423
429
  # print(e,"illegal annotation:{}".format(anno_file))
424
430
  annos = []
@@ -15,7 +15,7 @@ from collections import defaultdict
15
15
 
16
16
  class Objects(object):
17
17
  def __init__(self, boxes, label, score, names=[], size=[], segms=None, masks=None, keypt=None,
18
- traid=None, trace=None, color=[], image=None):
18
+ traid=None, trace=None, color=[], image=None, file=""):
19
19
  self.boxes = boxes # 目标框(xmin,ymin,xmax,ymax)
20
20
  self.score = score # 目标框置信度
21
21
  self.label = label # 目标框类别
@@ -28,6 +28,7 @@ class Objects(object):
28
28
  self.trace = trace # 轨迹的历史boxes
29
29
  self.color = [(255, 0, 0)] * len(boxes) # 目标框颜色
30
30
  self.size = size # 原始图像大小
31
+ self.file = file # 文件路径
31
32
  self.depth = None # 深度图
32
33
  self.metas = defaultdict() # 其他信息
33
34
 
@@ -11,6 +11,8 @@
11
11
  import os
12
12
  import copy
13
13
  import re
14
+ import time
15
+
14
16
  import cv2
15
17
  import numpy as np
16
18
  import matplotlib.pyplot as plt
@@ -49,6 +51,8 @@ coco_skeleton_v2 = [[15, 13], [13, 11], [16, 14], [14, 12], [11, 12], [5, 11], [
49
51
  mpii_skeleton = [[0, 1], [1, 2], [3, 4], [4, 5], [2, 6], [6, 3], [12, 11], [7, 12],
50
52
  [11, 10], [13, 14], [14, 15], [8, 9], [8, 7], [6, 7], [7, 13]]
51
53
 
54
+ pltimg = None
55
+
52
56
 
53
57
  def create_image(shape, color=(255, 255, 255), dtype=np.uint8, use_rgb=False):
54
58
  """
@@ -155,7 +159,7 @@ def show_batch_image(title, batch_images, index=0):
155
159
  cv_show_image(title, image)
156
160
 
157
161
 
158
- def show_image_plt(title, image, use_rgb=True):
162
+ def show_image_plt(title, image, use_rgb=True, delay=30):
159
163
  """
160
164
  use matplotlib to show image
161
165
  调用matplotlib显示RGB图片
@@ -164,18 +168,19 @@ def show_image_plt(title, image, use_rgb=True):
164
168
  :param use_rgb: True:输入image是RGB的图像, False:返输入image是BGR格式的图像
165
169
  :return:
166
170
  """
167
- # plt.figure("show_image")
168
- # print(image.dtype)
169
- if image.shape[-1] == 3 and (not use_rgb):
170
- image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 将BGR转为RGB
171
- channel = len(image.shape)
172
- if channel == 3:
173
- plt.imshow(image)
171
+ global pltimg
172
+ if use_rgb: image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 将BGR转为RGB
173
+ if pltimg is None:
174
+ plt.ion() # 启用交互模式(关键!)
175
+ plt.axis('off') # 坐标轴为 on/off
176
+ plt.tight_layout(pad=0)
177
+ pltimg = plt.imshow(image) # 循环显示很慢
178
+ plt.show() # 这里耗时,仅调用一次
174
179
  else:
175
- plt.imshow(image, cmap='gray')
176
- plt.axis('on') # 关掉坐标轴为 off
177
- plt.title(title) # 图像题目
178
- plt.show()
180
+ pltimg.set_data(image)
181
+ plt.title(title)
182
+ if delay == 0: pltimg = plt.imshow(image)
183
+ plt.pause(delay / 1000.0)
179
184
  return image
180
185
 
181
186
 
@@ -3299,10 +3304,10 @@ def get_video_capture(video, width=None, height=None, fps=None):
3299
3304
  return video_cap
3300
3305
 
3301
3306
 
3302
- def get_video_info(video_cap: int | str | cv2.VideoCapture, disp=True, **kwargs):
3307
+ def get_video_info(video_cap, disp=True, **kwargs):
3303
3308
  """
3304
3309
  获得视频的基础信息
3305
- :param video_cap:视频对象 或者视频文件路径
3310
+ :param video_cap:视频对象 或者视频文件路径 int | str | cv2.VideoCapture
3306
3311
  :param disp: 是否显示视频信息
3307
3312
  :return:
3308
3313
  """
@@ -11,6 +11,7 @@ import os
11
11
  import toolz
12
12
  import json
13
13
  import numbers
14
+ import PIL.Image as Image
14
15
  from collections import Counter
15
16
  from typing import List, Tuple, Dict
16
17
  from pybaseutils.file_utils import load_json, read_json_data, save_json, write_json_path
@@ -34,6 +35,23 @@ def formatting(data):
34
35
  return info
35
36
 
36
37
 
38
+ def format_array(data):
39
+ """格式化数组数据,将numpy数组转换为PIL.Image对象"""
40
+ if isinstance(data, np.ndarray):
41
+ try:
42
+ r = Image.fromarray(data)
43
+ except:
44
+ r = data.shape
45
+ return r
46
+ elif isinstance(data, list):
47
+ for i in range(len(data)):
48
+ data[i] = format_array(data[i])
49
+ elif isinstance(data, dict):
50
+ for k, v in data.items():
51
+ data[k] = format_array(v)
52
+ return data
53
+
54
+
37
55
  def get_keys_vaules(data, func=None):
38
56
  """
39
57
  遍历json数据并获得所有value的key路径
@@ -139,6 +157,14 @@ def toolz_assoc_in(data, keys, value):
139
157
  return toolz.assoc_in(data, cur_keys, value)
140
158
 
141
159
 
160
+ def get_index(data: list, v):
161
+ """获得列表中所有值为v的索引"""
162
+ indices = [i for i, x in enumerate(data) if x == v]
163
+ return indices
164
+
165
+
142
166
  if __name__ == "__main__":
143
- data = {'C': 0, 'A': 5, 'B': 3, 'D': 2}
144
- print(dict_sort(data))
167
+ # data = {'C': 0, 'A': 5, 'B': 3, 'D': 2}
168
+ # print(dict_sort(data))
169
+ i= get_index(data=[], v=7)
170
+ print(i)
@@ -41,6 +41,9 @@ def synchronized(func):
41
41
 
42
42
 
43
43
  class Singleton(type):
44
+ """
45
+ 使用方法:class Pipeline(metaclass=Singleton)
46
+ """
44
47
  def __init__(cls, *args, **kwargs):
45
48
  cls.__instance = None
46
49
  super().__init__(*args, **kwargs)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.6
3
+ Version: 2.4.8
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -213,6 +213,7 @@ test_py/aije/copy_move.py
213
213
  test_py/aije/demo_labelme_crop_aije.py
214
214
  test_py/aije/demo_labelme_crop_ailt.py
215
215
  test_py/aije/demo_labelme_shock.py
216
+ test_py/aije/demo_motion_blur.py
216
217
  test_py/aije/demo_video_aije.py
217
218
  test_py/aije/demo_voc_crop.py
218
219
  test_py/aije/demo_voc_vis.py
@@ -279,6 +280,9 @@ test_py/detector/predet_labelme.py
279
280
  test_py/edit_distance/__init__.py
280
281
  test_py/edit_distance/demo.py
281
282
  test_py/edit_distance/text_matching.py
283
+ test_py/fast_api/__init__.py
284
+ test_py/fast_api/create_image_url.py
285
+ test_py/fast_api/get_image_url.py
282
286
  test_py/flask_demo/__init__.py
283
287
  test_py/flask_demo/app.py
284
288
  test_py/flask_demo/utils/__init__.py
File without changes
@@ -100,17 +100,20 @@ if __name__ == '__main__':
100
100
  对labelme的数据目标进行裁剪,用于制作分类数据集
101
101
  """
102
102
  # TODO 蓝色长条标签和鞋套是否相似
103
- target_name = ['身穿工作服', '未穿工作服',
103
+ target_name = ['身穿工作服', '未穿工作服', '螺丝刀',
104
104
  '绝缘鞋', '脚穿绝缘鞋', '长筒靴', '脚穿长筒靴', '其他鞋', '脚穿其他鞋', '脚穿鞋套',
105
105
  '手', '绝缘手套', '手穿绝缘手套', '棉纱手套', '手穿棉纱手套', '其他手套', '手穿其他手套',
106
106
  '胶枪灯', '胶枪灯红色', '胶枪灯绿色',
107
- 'PDA', 'PDA*', '手与*接触', '电视柜台面'
107
+ 'PDA', 'PDA*', '清洁布', '手与*接触', '电视柜台面', '*标签'
108
108
  ]
109
109
  # '*长条标签'
110
110
  datasets = [
111
- '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20251208-PDA/images',
112
- # '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20251208-PDA-val/images',
111
+ '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260120/images',
112
+ '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260130/images',
113
+ '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260206/images',
113
114
  ]
115
+ datasets = "/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/文件列表.txt"
116
+ datasets = file_utils.read_data(datasets, split=None)
114
117
  # dataroot = '/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det'
115
118
  # datasets = get_sub_dataset(dataroot)
116
119
  class_name = []