pybaseutils 2.4.11__tar.gz → 2.4.14__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 (326) hide show
  1. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/PKG-INFO +1 -1
  2. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/camera.py +37 -15
  4. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/base_dataset.py +1 -0
  5. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/file_utils.py +42 -15
  6. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/image_utils.py +1 -1
  7. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/average_meter.py +1 -1
  8. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/class_report.py +44 -17
  9. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/numpy_utils.py +2 -2
  10. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/PKG-INFO +1 -1
  11. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/action_dataset.py +1 -1
  12. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_labelme_crop_aije.py +1 -1
  13. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_labelme_crop_ailt.py +4 -6
  14. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_labelme_shock.py +1 -1
  15. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo2.py +17 -3
  16. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_labelme_crop.py +1 -1
  17. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/demo.py +1 -1
  18. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/slowfastnet.py +3 -3
  19. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/LICENCE +0 -0
  20. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/README.md +0 -0
  21. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/__init__.py +0 -0
  22. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/audio_utils.py +0 -0
  23. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/pyaudio_utils.py +0 -0
  24. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/vad_utils.py +0 -0
  25. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/__init__.py +0 -0
  26. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/dict_queue.py +0 -0
  27. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/list_queue.py +0 -0
  28. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/producer_consumer.py +0 -0
  29. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base64_utils.py +0 -0
  30. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/batch_utils.py +0 -0
  31. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/build_utils/__init__.py +0 -0
  32. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/build_utils/cython_utils.py +0 -0
  33. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  34. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/__init__.py +0 -0
  35. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/kmean.py +0 -0
  36. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/maxmin_distance.py +0 -0
  37. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/similarity.py +0 -0
  38. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/color_utils.py +0 -0
  39. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/config_utils.py +0 -0
  40. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/__init__.py +0 -0
  41. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_coco.py +0 -0
  42. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_cvat.py +0 -0
  43. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_labelme.py +0 -0
  44. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_voc.py +0 -0
  45. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/concat_coco.py +0 -0
  46. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  47. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_coco2voc.py +0 -0
  48. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  49. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  50. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  51. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  52. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  53. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  54. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2coco.py +0 -0
  55. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  56. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2voc.py +0 -0
  57. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  58. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  59. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  60. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/prelabelme.py +0 -0
  61. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/coords_utils.py +0 -0
  62. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/__init__.py +0 -0
  63. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/corner_utils.py +0 -0
  64. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/monitor.py +0 -0
  65. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/mouse_utils.py +0 -0
  66. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/nms_utils.py +0 -0
  67. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/video_utils.py +0 -0
  68. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/data_utils.py +0 -0
  69. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/__init__.py +0 -0
  70. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/balanced_classes.py +0 -0
  71. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/base_coco.py +0 -0
  72. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/data_resample.py +0 -0
  73. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  74. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  75. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  76. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  77. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_image_text.py +0 -0
  78. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_labelme.py +0 -0
  79. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  80. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  81. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  82. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_video_text.py +0 -0
  83. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_voc.py +0 -0
  84. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_yolo.py +0 -0
  85. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  86. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dict_uils.py +0 -0
  87. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/QueueTable.py +0 -0
  88. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/__init__.py +0 -0
  89. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/demo.py +0 -0
  90. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/kalman_filter.py +0 -0
  91. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/mean_filter.py +0 -0
  92. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/motion_filter.py +0 -0
  93. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/pose_filter.py +0 -0
  94. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/font_style/__init__.py +0 -0
  95. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/font_utils.py +0 -0
  96. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/geometry_tools.py +0 -0
  97. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/heatmap_utils.py +0 -0
  98. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/http_utils.py +0 -0
  99. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/json_utils.py +0 -0
  100. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/log.py +0 -0
  101. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/log_utils.py +0 -0
  102. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/media/__init__.py +0 -0
  103. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/media/ffmpeg_utils.py +0 -0
  104. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/__init__.py +0 -0
  105. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/accuracy.py +0 -0
  106. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/plot_pr.py +0 -0
  107. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/plot_roc.py +0 -0
  108. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/nets_utils.py +0 -0
  109. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pandas_utils.py +0 -0
  110. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/plot_utils.py +0 -0
  111. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/__init__.py +0 -0
  112. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/bones_utils.py +0 -0
  113. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/human_pose.py +0 -0
  114. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/pose_utils.py +0 -0
  115. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pycpp/__init__.py +0 -0
  116. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pycpp/demo.py +0 -0
  117. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pycpp/main.py +0 -0
  118. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/server/__init__.py +0 -0
  119. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/server/apm_server.py +0 -0
  120. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/setup_config.py +0 -0
  121. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/singleton_utils.py +0 -0
  122. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/text_utils.py +0 -0
  123. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/thread_utils.py +0 -0
  124. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/time_utils.py +0 -0
  125. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracemalloc_utils.py +0 -0
  126. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracemalloc_utils2.py +0 -0
  127. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/QueueTable.py +0 -0
  128. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/__init__.py +0 -0
  129. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/demo.py +0 -0
  130. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/kalman_filter.py +0 -0
  131. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/mean_filter.py +0 -0
  132. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/motion_filter.py +0 -0
  133. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/pose_filter.py +0 -0
  134. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/__init__.py +0 -0
  135. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/affine_transform.py +0 -0
  136. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/build_transform.py +0 -0
  137. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/face_alignment.py +0 -0
  138. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/imgaug_utils.py +0 -0
  139. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/transform_utils.py +0 -0
  140. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/__init__.py +0 -0
  141. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/app_gradio_image.py +0 -0
  142. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/app_stweb_image.py +0 -0
  143. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/app_webio_image.py +0 -0
  144. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/demo.py +0 -0
  145. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/word_utils.py +0 -0
  146. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/worker.py +0 -0
  147. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/yaml_utils.py +0 -0
  148. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/SOURCES.txt +0 -0
  149. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/dependency_links.txt +0 -0
  150. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/not-zip-safe +0 -0
  151. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/top_level.txt +0 -0
  152. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/setup.cfg +0 -0
  153. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/setup.py +0 -0
  154. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/Image_enhance/__init__.py +0 -0
  155. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/Image_enhance/dmeo01.py +0 -0
  156. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/WebCrawler/__init__.py +0 -0
  157. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/WebCrawler/search_baidu.py +0 -0
  158. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/WebCrawler/search_biying.py +0 -0
  159. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/__init__.py +0 -0
  160. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/__init__.py +0 -0
  161. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/build_cython.py +0 -0
  162. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/build_pyarmor.py +0 -0
  163. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/build_service.py +0 -0
  164. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/convert_cvat2labelme.py +0 -0
  165. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/convert_labelme2coco.py +0 -0
  166. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/convert_labelme2voc.py +0 -0
  167. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/copy_move.py +0 -0
  168. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_motion_blur.py +0 -0
  169. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_video_aije.py +0 -0
  170. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_voc_crop.py +0 -0
  171. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_voc_vis.py +0 -0
  172. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/get_pair_data.py +0 -0
  173. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/mask_image.py +0 -0
  174. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/video_convertor.py +0 -0
  175. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/__init__.py +0 -0
  176. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/demo.py +0 -0
  177. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/main.py +0 -0
  178. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/main_read.py +0 -0
  179. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/segment.py +0 -0
  180. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  181. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/speechbrain_demo.py +0 -0
  182. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio_demo1.py +0 -0
  183. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/camera/__init__.py +0 -0
  184. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/camera/demo.py +0 -0
  185. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/captcha/__init__.py +0 -0
  186. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/captcha/demo.py +0 -0
  187. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/class_attribute.py +0 -0
  188. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/class_names.py +0 -0
  189. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/AffectNet.py +0 -0
  190. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/AsianMovie.py +0 -0
  191. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/BITVehicle2voc.py +0 -0
  192. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/BSTLD2voc.py +0 -0
  193. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/CCPD.py +0 -0
  194. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/CCPD2voc.py +0 -0
  195. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/FL3D_dataset.py +0 -0
  196. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/FreiHAND2coco.py +0 -0
  197. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/MTFL2voc.py +0 -0
  198. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/TT100K.py +0 -0
  199. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/WaterMeters1.py +0 -0
  200. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/WaterMeters2.py +0 -0
  201. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/__init__.py +0 -0
  202. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/concat_coco.py +0 -0
  203. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_coco2voc.py +0 -0
  204. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_cvat2labelme.py +0 -0
  205. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_gesture2hand.py +0 -0
  206. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2coco.py +0 -0
  207. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2cvat.py +0 -0
  208. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2labelme.py +0 -0
  209. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2voc.py +0 -0
  210. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_voc2labelme.py +0 -0
  211. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_yolo2labelme.py +0 -0
  212. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/fall_dataset.py +0 -0
  213. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/fatigue_driving.py +0 -0
  214. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/fdd_dataset.py +0 -0
  215. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/get_pair_data.py +0 -0
  216. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/handpose2coco.py +0 -0
  217. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/insects_for_aichallenger.py +0 -0
  218. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/parking_rois_gopro.py +0 -0
  219. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/tt100k_utils.py +0 -0
  220. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/ua_detrac2voc.py +0 -0
  221. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/ucf101_dataset.py +0 -0
  222. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/voc_sbd2labelme.py +0 -0
  223. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/__init__.py +0 -0
  224. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/build_cython.py +0 -0
  225. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/build_pyarmor.py +0 -0
  226. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/cryptography_demo.py +0 -0
  227. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/fun_sum.py +0 -0
  228. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/main.py +0 -0
  229. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/model_des_enctypt.py +0 -0
  230. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/model_enctypt.py +0 -0
  231. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/date_dataset.py +0 -0
  232. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/date_demo.py +0 -0
  233. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/datedataset_bk.py +0 -0
  234. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo1.py +0 -0
  235. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo3.py +0 -0
  236. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo4.py +0 -0
  237. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_async_await1.py +0 -0
  238. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_async_await2.py +0 -0
  239. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_coco_vis.py +0 -0
  240. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_copy_files.py +0 -0
  241. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_copy_files_for_voc.py +0 -0
  242. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_ffmpy.py +0 -0
  243. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_annular_to_rect.py +0 -0
  244. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_pair_file.py +0 -0
  245. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_polygon.py +0 -0
  246. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_trt.py +0 -0
  247. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_get_file_label.py +0 -0
  248. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_get_file_list.py +0 -0
  249. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_gif.py +0 -0
  250. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_gif_video.py +0 -0
  251. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_image_crop.py +0 -0
  252. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_kpts.py +0 -0
  253. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_labelme.py +0 -0
  254. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_lableme_vis.py +0 -0
  255. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_letterbox.py +0 -0
  256. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_metrics.py +0 -0
  257. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_mosaic.py +0 -0
  258. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_mouse.py +0 -0
  259. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_nii.py +0 -0
  260. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_pandas.py +0 -0
  261. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_plot.py +0 -0
  262. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_prelabelme.py +0 -0
  263. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_rename.py +0 -0
  264. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_standard_image .py +0 -0
  265. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_standard_video .py +0 -0
  266. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_taichi.py +0 -0
  267. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_video2frame.py +0 -0
  268. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_video_crop.py +0 -0
  269. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_voc_crop.py +0 -0
  270. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_voc_vis.py +0 -0
  271. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_word_similar.py +0 -0
  272. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_worker1.py +0 -0
  273. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_worker2.py +0 -0
  274. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/__init__.py +0 -0
  275. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/demo.py +0 -0
  276. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/detect_face_person.py +0 -0
  277. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/predet_labelme.py +0 -0
  278. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/edit_distance/__init__.py +0 -0
  279. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/edit_distance/demo.py +0 -0
  280. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/edit_distance/text_matching.py +0 -0
  281. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/fast_api/__init__.py +0 -0
  282. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/fast_api/create_image_url.py +0 -0
  283. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/fast_api/get_image_url.py +0 -0
  284. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/__init__.py +0 -0
  285. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/app.py +0 -0
  286. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/utils/__init__.py +0 -0
  287. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/utils/utils.py +0 -0
  288. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/get_file_list.py +0 -0
  289. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/gradio_app.py +0 -0
  290. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/gradio_app_v2.py +0 -0
  291. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/__init__.py +0 -0
  292. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/demo_correction_v1.py +0 -0
  293. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/demo_correction_v2.py +0 -0
  294. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/demo_correction_v3.py +0 -0
  295. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/kafka_worker.py +0 -0
  296. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/men_tracemalloc.py +0 -0
  297. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/__init__.py +0 -0
  298. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/demo01.py +0 -0
  299. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/demo02.py +0 -0
  300. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/hello_milvus.py +0 -0
  301. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/milvus_client.py +0 -0
  302. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/model_process.py +0 -0
  303. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/performance.py +0 -0
  304. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/pose/__init__.py +0 -0
  305. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/pose/human_pose.py +0 -0
  306. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/qrcode/__init__.py +0 -0
  307. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/qrcode/demo.py +0 -0
  308. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/redis_py/__init__.py +0 -0
  309. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/redis_py/knn_search.py +0 -0
  310. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/redis_py/redis_client.py +0 -0
  311. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/__init__.py +0 -0
  312. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/base.py +0 -0
  313. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/component.py +0 -0
  314. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/main.py +0 -0
  315. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/register.py +0 -0
  316. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/GRU.py +0 -0
  317. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/TCN.py +0 -0
  318. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/__init__.py +0 -0
  319. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_camera.py +0 -0
  320. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_fr/__init__.py +0 -0
  321. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_fr/demo11.py +0 -0
  322. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_fr/idcardocr.py +0 -0
  323. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/web_socket/__init__.py +0 -0
  324. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/web_socket/asr_clients.py +0 -0
  325. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/web_socket/asr_service.py +0 -0
  326. {pybaseutils-2.4.11 → pybaseutils-2.4.14}/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.11
3
+ Version: 2.4.14
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.11'
11
+ __version__ = '2.4.14'
@@ -2,20 +2,42 @@ import cv2
2
2
  import time
3
3
  import numpy as np
4
4
  import subprocess
5
+ import json
6
+
7
+
8
+ def get_video_size(video):
9
+ """获取视频原始分辨率"""
10
+ cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', video]
11
+ result = subprocess.check_output(cmd).decode()
12
+ info = json.loads(result)
13
+ for stream in info['streams']:
14
+ if stream['codec_type'] == 'video':
15
+ return stream['width'], stream['height']
16
+ return None, None
5
17
 
6
18
 
7
19
  class CameraCapture(object):
8
- def __init__(self, video: str or int = 0, size=(1920, 1080), fps=30):
20
+ def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0, pad=False):
9
21
  """
10
22
  :param video: 视频设备路径或索引(如 0 或 "/dev/video0")
11
- :param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
12
23
  :param fps: 视频帧率
24
+ :param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
25
+ :param scale: 视频缩放比例
26
+ :param pad: 是否保持原始视频比例并填充到指定分辨率
13
27
  """
14
- self.size = size
15
28
  self.fps = fps
16
29
  self.stopped = False
17
30
  if isinstance(video, int): video = f"/dev/video{video}"
18
- # 构建 FFmpeg 命令
31
+ self.dsize = size
32
+ self.ssize = get_video_size(video)
33
+ if size and pad:
34
+ vf = f'scale={self.dsize[0]}:{self.dsize[1]}:force_original_aspect_ratio=decrease,pad={self.dsize[0]}:{self.dsize[1]}:(ow-iw)/2:(oh-ih)/2'
35
+ elif size:
36
+ vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
37
+ else:
38
+ vf = f'scale=trunc(iw*{scale}):trunc(ih*{scale})'
39
+ self.dsize = (int(self.ssize[0] * scale), int(self.ssize[1] * scale))
40
+ # TODO FFmpeg 命令
19
41
  # -re: 以原生帧率读取(模拟直播流)
20
42
  # -fflags nobuffer: 关键!禁用缓冲区
21
43
  # -flags low_delay: 关键!低延迟模式
@@ -30,25 +52,25 @@ class CameraCapture(object):
30
52
  '-i', video, # 输入设备
31
53
  '-f', 'rawvideo', # 输出原始视频流
32
54
  '-pix_fmt', 'bgr24', # 像素格式 BGR (OpenCV 格式)
33
- '-s', f'{size[0]}x{size[1]}', # 分辨率
55
+ '-vf', vf, # 分辨率
34
56
  '-r', str(fps), # 帧率
35
57
  '-' # 输出到 stdout
36
58
  ]
37
59
  # 启动进程
38
- self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
39
60
  print(f"command: {' '.join(command)}")
61
+ self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
40
62
 
41
63
  def read(self):
42
64
  if self.stopped:
43
65
  self.stop()
44
66
  return False, None
45
67
  # 读取一帧的数据量 (宽 * 高 * 3通道)
46
- buf = self.pipe.stdout.read(self.size[0] * self.size[1] * 3)
47
- if len(buf) != self.size[0] * self.size[1] * 3:
68
+ buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
69
+ if len(buf) != self.dsize[0] * self.dsize[1] * 3:
48
70
  self.stop()
49
71
  return False, None # 读取失败或结束
50
72
  # TODO 将字节流转换为numpy数组图像(bgr)
51
- bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.size[1], self.size[0], 3))
73
+ bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
52
74
  return True, bgr
53
75
 
54
76
  def release(self):
@@ -81,10 +103,10 @@ class CameraCapture(object):
81
103
 
82
104
 
83
105
  if __name__ == '__main__':
84
- fps = 30
85
- width = 1920
86
- height = 1080
87
- video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
88
- # video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 "video=Integrated Webcam"
89
- cap = CameraCapture(video=video, size=(width, height), fps=fps)
106
+ fps = 10
107
+ # video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
108
+ video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
109
+ video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
110
+ cap = CameraCapture(video=video, size=(640, 640), scale=0.5, pad=True, fps=fps)
111
+ # cap = CameraCapture(video=video, size=(), scale=0.5, fps=fps)
90
112
  cap.display()
@@ -384,6 +384,7 @@ def get_targets_overlap(obj_info1: dict, obj_info2: dict, key="boxes", keys=[],
384
384
  boxes2 = obj_info2[key]
385
385
  nums1 = len(boxes1)
386
386
  nums2 = len(boxes2)
387
+ if nums1==0 or nums2==0:return []
387
388
  ious = image_utils.get_boxes_iom(boxes1, boxes2) if use_iom else image_utils.get_boxes_iou(boxes1, boxes2)
388
389
  output = []
389
390
  for i in range(len(boxes1)):
@@ -78,6 +78,9 @@ def get_time(format="p"):
78
78
  # time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f') # 20200508_143059_379116
79
79
  time = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
80
80
  time = time[:-2]
81
+ elif format.lower() == "d": # 精确到微妙
82
+ # time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f') # 20200508_143059_379116
83
+ time = datetime.now().strftime("%Y%m%d")
81
84
  elif format.lower() == "y": # 2025-06-18 11:02:05
82
85
  # time = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S") #
83
86
  time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@@ -891,6 +894,27 @@ def get_sub_list(file_list, dirname: str):
891
894
  return sub_list
892
895
 
893
896
 
897
+ def get_sub_info(image_dir, postfix=IMG_POSTFIX, sub=0):
898
+ """
899
+ 获得目image_dir下每个子文件夹的数据,以dict数据返回
900
+ :param image_dir:
901
+ :param postfix: 后缀
902
+ :param sub: 是否去除根路径
903
+ :return: {"sub1":[file1,file2,...],"sub2":[file1,file2,...],"sub3":...}
904
+ """
905
+ sub_names = get_sub_paths(image_dir)
906
+ data_info = defaultdict(list)
907
+ for name in sub_names:
908
+ files = get_files_list(os.path.join(image_dir, name), postfix=postfix)
909
+ if sub == 1:
910
+ files = get_sub_list(files, dirname=image_dir)
911
+ elif sub == -1:
912
+ files = get_sub_list(files, dirname=os.path.dirname(image_dir))
913
+ data_info[name].extend(files)
914
+ data_info = dict(data_info)
915
+ return data_info
916
+
917
+
894
918
  def split_train_test(file_list, ratio=0.2, shuffle=False):
895
919
  """
896
920
  划分训练集和测试集
@@ -1146,15 +1170,17 @@ def print_dict(dict_data, save_path):
1146
1170
  def get_pair_data(image_dir, pair_num=-1):
1147
1171
  """
1148
1172
  获得图片对数据
1173
+ Uages:
1174
+ pairs = file_utils.get_pair_data(image_dir, pair_num=-1)
1175
+ file_utils.write_data(pairs_file, pairs)
1149
1176
  :param image_dir:
1150
1177
  :param pair_num:-1 表示所有对
1151
- :return:
1178
+ :return: [file1, file2, 1] 1表示相同类别,0表示不同类别
1152
1179
  """
1153
1180
  max_nums = int(pair_num / 2)
1154
1181
  image_list = get_files_lists(image_dir)
1155
1182
  image_list = get_sub_list(image_list, dirname=image_dir)
1156
1183
  nums = len(image_list)
1157
- print("have {} images and {} combinations".format(nums, nums * (nums - 1) / 2))
1158
1184
  pairs = []
1159
1185
  for paths in itertools.combinations(image_list, 2):
1160
1186
  file1, file2 = paths
@@ -1170,6 +1196,7 @@ def get_pair_data(image_dir, pair_num=-1):
1170
1196
  pair1 = pairs[pairs[:, -1] == "1", :]
1171
1197
  nums1 = len(pair1)
1172
1198
  nums0 = len(pair0)
1199
+ print("have {} images, pair0:{}, pair1:{}".format(nums, nums0, nums1))
1173
1200
  if pair_num < 0: max_nums = nums1
1174
1201
  if max_nums > nums1:
1175
1202
  raise Exception("pair_nums({}) must be less than num_pair1({})".format(max_nums, nums1))
@@ -1191,7 +1218,7 @@ def get_pair_files(data_root, out_root=None, image_sub="", label_sub="",
1191
1218
  :param image_sub:
1192
1219
  :param label_sub:
1193
1220
  :param label_postfix: label文件后缀,如txt,png,json等
1194
- :return:
1221
+ :return: [file1,file2]
1195
1222
  """
1196
1223
  image_dir = os.path.join(data_root, image_sub)
1197
1224
  label_dir = os.path.join(data_root, label_sub)
@@ -1201,11 +1228,11 @@ def get_pair_files(data_root, out_root=None, image_sub="", label_sub="",
1201
1228
  for i, image_name in tqdm(enumerate(file_list)):
1202
1229
  postfix = image_name.split(".")[-1]
1203
1230
  lable_name = image_name.replace(f".{postfix}", f".{label_postfix}")
1204
- image_file = os.path.join(image_dir, image_name)
1205
- lable_file = os.path.join(label_dir, lable_name)
1206
- if os.path.exists(image_file) and os.path.exists(lable_file):
1207
- image_file, lable_file = get_sub_list([image_file, lable_file], dirname=data_root)
1208
- pair_list.append([image_file, lable_file])
1231
+ file1 = os.path.join(image_dir, image_name)
1232
+ file2 = os.path.join(label_dir, lable_name)
1233
+ if os.path.exists(file1) and os.path.exists(file2):
1234
+ file1, file2 = get_sub_list([file1, file2], dirname=data_root)
1235
+ pair_list.append([file1, file2])
1209
1236
  if out_root:
1210
1237
  filename = os.path.join(out_root, "file_list.txt")
1211
1238
  write_data(filename, pair_list, split=",", mode='w')
@@ -1214,10 +1241,11 @@ def get_pair_files(data_root, out_root=None, image_sub="", label_sub="",
1214
1241
 
1215
1242
  def read_pair_data(filename, split=True):
1216
1243
  """
1217
- read pair data,data:[image1.jpg image2.jpg 0]
1244
+ 读取图片对数据,data:[image1.jpg image2.jpg 0]
1245
+ 可以使用get_pair_data(image_dir, pair_num=-1)获得图片对数据
1218
1246
  :param filename:
1219
1247
  :param split:
1220
- :return:
1248
+ :return: [pair1, pair2, label] 1表示相同类别,0表示不同类别
1221
1249
  """
1222
1250
  pair_list = read_data(filename)
1223
1251
  if split:
@@ -1225,12 +1253,12 @@ def read_pair_data(filename, split=True):
1225
1253
  pair1 = pair_list[:, :1].reshape(-1)
1226
1254
  pair2 = pair_list[:, 1:2].reshape(-1)
1227
1255
  # convert to 0/1
1228
- issames_data = np.asarray(pair_list[:, 2:3].reshape(-1), dtype=np.int)
1229
- issames_data = np.where(issames_data > 0, 1, 0)
1256
+ label = np.asarray(pair_list[:, 2:3].reshape(-1), dtype=np.int32)
1257
+ label = np.where(label > 0, 1, 0)
1230
1258
  pair1 = pair1.tolist()
1231
1259
  pair2 = pair2.tolist()
1232
- issames_data = issames_data.tolist()
1233
- return pair1, pair2, issames_data
1260
+ label = label.tolist()
1261
+ return pair1, pair2, label
1234
1262
  return pair_list
1235
1263
 
1236
1264
 
@@ -1579,7 +1607,6 @@ def zip_file(src, dst=None, s=None):
1579
1607
  return dst
1580
1608
 
1581
1609
 
1582
-
1583
1610
  if __name__ == '__main__':
1584
1611
  from pybaseutils import time_utils
1585
1612
 
@@ -300,7 +300,7 @@ def get_prewhiten_image(x):
300
300
  '''
301
301
  mean = np.mean(x)
302
302
  std = np.std(x)
303
- std_adj = np.maximum(std, 1.0 / np.sqrt(x.size))
303
+ std_adj = np.maximum(std, 1.0 / np.sqrt(x.dsize))
304
304
  y = np.multiply(np.subtract(x, mean), 1 / std_adj)
305
305
  return y
306
306
 
@@ -63,7 +63,7 @@ class MultiAverageMeter(object):
63
63
 
64
64
  def accuracy(output, target, topk=(1, 5)):
65
65
  maxk = max(topk)
66
- batch_size = target.size(0)
66
+ batch_size = target.dsize(0)
67
67
  _, pred = output.topk(maxk, 1, True, True)
68
68
  pred = pred.t()
69
69
  correct = pred.eq(target.view(1, -1).expand_as(pred))
@@ -12,6 +12,26 @@ from sklearn import metrics
12
12
  from pybaseutils import pandas_utils
13
13
 
14
14
 
15
+ def get_metrics(true_labels, pred_labels, keys=['accuracy', 'precision', 'recall', 'f1_score']):
16
+ """
17
+ 计算分类指标
18
+ :param true_labels: 真实样本的标签
19
+ :param pred_labels: 预测的标签
20
+ :param keys: 计算的指标,默认计算accuracy, precision, recall, f1_score
21
+ :return: 分类指标
22
+ """
23
+ aprf = {}
24
+ if 'accuracy' in keys:
25
+ aprf['accuracy'] = metrics.accuracy_score(true_labels, pred_labels)
26
+ if 'precision' in keys:
27
+ aprf['precision'] = metrics.precision_score(true_labels, pred_labels, average=None) # 每个类别
28
+ if 'recall' in keys:
29
+ aprf['recall'] = metrics.recall_score(true_labels, pred_labels, average=None)
30
+ if 'f1_score' in keys:
31
+ aprf['f1_score'] = metrics.f1_score(true_labels, pred_labels, average=None)
32
+ return aprf
33
+
34
+
15
35
  def plot_confusion_matrix(conf_matrix, labels_name, title, normalization=True):
16
36
  if normalization:
17
37
  conf_matrix = conf_matrix.astype('float') / conf_matrix.sum(axis=1)[:, np.newaxis] # 归一化
@@ -67,10 +87,17 @@ def get_confusion_matrix(true_labels, pred_labels, target_names=None, filename=N
67
87
  def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
68
88
  output_dict=False, matrix=False, plot=False):
69
89
  """
90
+ Usage
91
+ -------
92
+ true_labels = ["A", "B", "A", "B"]
93
+ pred_labels = ["A", "B", "C", "B"]
94
+ out_result = get_metrics_report(true_labels, pred_labels)
95
+ -------
70
96
  true_labels = [0, 1, 2, 3, 4, 1] # Y
71
97
  pred_labels = [0, 1, 1, 2, 2, 1] # X
72
98
  target_names = ["A", "B", "C", "D", "E"]
73
- out_result = get_metrics_report(true_labels, pred_labels, target_names=target_names, output_dict=False)
99
+ out_result = get_metrics_report(true_labels, pred_labels, target_names=target_names)
100
+ -------
74
101
  宏平均(macro avg)和微平均(micro avg)
75
102
  如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异
76
103
  如果每个class的样本数量差异很大,而且你想:
@@ -84,32 +111,33 @@ def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
84
111
  :param matrix: 是否绘制混淆矩阵
85
112
  :return:
86
113
  """
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]
92
114
  result = metrics.classification_report(true_labels,
93
115
  pred_labels,
94
116
  labels=labels,
95
117
  digits=4,
96
118
  target_names=target_names,
97
- output_dict=output_dict,
119
+ output_dict=True,
98
120
  zero_division=0)
99
121
  if output_dict:
100
122
  macro_avg = result["macro avg"]
101
- accuracy = result["accuracy"]
102
123
  weighted_avg = result["weighted avg"]
103
- out_result = {"macro_avg": macro_avg, "accuracy": accuracy, "weighted_avg": weighted_avg}
124
+ accuracy = result["accuracy"]
125
+ output = {"macro_avg": macro_avg, "accuracy": accuracy, "weighted_avg": weighted_avg}
104
126
  # pdf=pd.DataFrame.from_dict(result)
105
127
  # save_csv("classification_report.csv", pdf)
106
128
  else:
107
- out_result = result
129
+ p = (result['macro avg']['precision'] + result['weighted avg']['precision']) / 2
130
+ r = (result['macro avg']['recall'] + result['weighted avg']['recall']) / 2
131
+ support = result['macro avg']['support']
132
+ result["accuracy"] = {'precision': p, 'recall': r, 'f1-score': result["accuracy"], 'support': support}
133
+ output = pandas_utils.dict2df(result)
134
+ output = output.round(4) # 保留4位小数
135
+ output = output.to_markdown()
108
136
  if matrix:
109
137
  conf_matrix = get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
110
138
  normalization=True, plot=plot, title="Confusion Matrix")
111
139
  # out_result["confusion_matrix"] = conf_matrix
112
- return out_result
140
+ return output
113
141
 
114
142
 
115
143
  get_classification_report = get_metrics_report
@@ -148,11 +176,10 @@ def create_file_path(filename):
148
176
  if __name__ == "__main__":
149
177
  # true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
150
178
  # 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"]
179
+ true_labels = ["A", "B", "A", "B", "C", "D"]
180
+ pred_labels = ["A", "D", "C", "B", "C", "A"]
154
181
  target_names = None
155
182
  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)
158
- print(out_result)
183
+ result = get_metrics_report(true_labels, pred_labels, target_names=target_names, output_dict=False,
184
+ matrix=True, plot=False)
185
+ print(result)
@@ -489,13 +489,13 @@ def L2_loss(y_true, y_pre):
489
489
  def mean_squared_error(y_true, y_pre):
490
490
  """MSE(Mean Squared Error)平均平方误差(L2)"""
491
491
  l2 = np.sum(np.square(y_true - y_pre))
492
- return l2 / y_true.size
492
+ return l2 / y_true.dsize
493
493
 
494
494
 
495
495
  def mean_absolute_error(y_true, y_pre):
496
496
  """MAE(Mean Absolute Error)平均绝对差值(L1),也等于MAD(Mean Absolute Difference)"""
497
497
  l1 = np.sum(np.abs(y_true - y_pre))
498
- return l1 / y_true.size
498
+ return l1 / y_true.dsize
499
499
 
500
500
 
501
501
  def mean(data):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.11
3
+ Version: 2.4.14
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -47,7 +47,7 @@ def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=Fals
47
47
  thickness=2, fontScale=0.8, drawType="chinese")
48
48
  image_utils.cv_show_image("image", m, use_rgb=False, delay=0)
49
49
  for i, img in enumerate(crops):
50
- if img.size < min_size: continue
50
+ if img.dsize < min_size: continue
51
51
  name = class_name[int(labels[i])] if class_name else labels[i]
52
52
  if out_dir:
53
53
  file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id, i)
@@ -49,7 +49,7 @@ def save_object_crops(data_info, out_dir, class_name=None, target_name=None, sca
49
49
  thickness=2, fontScale=0.8, drawType='chinese')
50
50
  image_utils.cv_show_image('image', m, use_rgb=False, delay=0)
51
51
  for i, img in enumerate(crops):
52
- if img.size < min_size: continue
52
+ if img.dsize < min_size: continue
53
53
  name = class_name[int(labels[i])] if class_name else labels[i]
54
54
  if out_dir:
55
55
  file_name = '{}_{:0=4d}_{}.jpg'.format(image_id, i, flag) if flag else '{}_{:0=4d}.jpg'.format(image_id, i)
@@ -49,7 +49,7 @@ def save_object_crops(data_info, out_dir, class_name=None, target_name=None, sca
49
49
  thickness=2, fontScale=0.8, drawType='chinese')
50
50
  image_utils.cv_show_image('image', m, use_rgb=False, delay=0)
51
51
  for i, img in enumerate(crops):
52
- if img.size < min_size: continue
52
+ if img.dsize < min_size: continue
53
53
  name = class_name[int(labels[i])] if class_name else labels[i]
54
54
  if out_dir:
55
55
  file_name = '{}_{:0=4d}_{}.jpg'.format(image_id, i, flag) if flag else '{}_{:0=4d}.jpg'.format(image_id, i)
@@ -106,17 +106,15 @@ if __name__ == '__main__':
106
106
  '胶枪灯', '胶枪灯红色', '胶枪灯绿色',
107
107
  'PDA', 'PDA*', '清洁布', '手与*接触', '电视柜台面', '*标签'
108
108
  ]
109
- # '*长条标签'
110
109
  datasets = [
111
- '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260227/images',
112
- '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260211/images',
110
+ '/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260420/images',
113
111
  ]
114
112
  # datasets = "/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/文件列表.txt"
115
- datasets = file_utils.read_data(datasets, split=None)
113
+ # datasets = file_utils.read_data(datasets, split=None)
116
114
  # dataroot = '/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det'
117
115
  # datasets = get_sub_dataset(dataroot)
118
116
  class_name = []
119
- datasets = sorted(datasets)
117
+ # datasets = sorted(datasets)
120
118
  for anno_dir in datasets:
121
119
  print(anno_dir)
122
120
  assert os.path.exists(anno_dir), anno_dir
@@ -46,7 +46,7 @@ def save_object_crops(data_info, item_list, out_dir, class_name=None, scale=[],
46
46
  else:
47
47
  crops = image_utils.get_bboxes_crop(image, bboxes)
48
48
  img = crops[0]
49
- if img.size < min_size: continue
49
+ if img.dsize < min_size: continue
50
50
  name = "_".join(labels + list(set(attrib_name)))
51
51
  if out_dir:
52
52
  file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id,
@@ -61,6 +61,20 @@ def video_iterator(video):
61
61
 
62
62
 
63
63
  if __name__ == '__main__':
64
- x = 123
65
- x = None
66
- print(f"{str(x):7}")
64
+ from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
65
+
66
+ true_labels = ["A", "B", "A", "B", "C"]
67
+ pred_labels = ["A", "B", "C", "B", "C"]
68
+
69
+ accuracy = accuracy_score(true_labels, pred_labels)
70
+ precision = precision_score(true_labels, pred_labels, average=None) # 每个类别
71
+ recall = recall_score(true_labels, pred_labels, average=None)
72
+ f1_score = f1_score(true_labels, pred_labels, average=None)
73
+
74
+ print(f"准确率: {accuracy}")
75
+ print(f"精确率: {dict(zip(set(true_labels), precision))}")
76
+ print(f"召回率: {dict(zip(set(true_labels), recall))}")
77
+ print(f"F1值: {dict(zip(set(true_labels), f1_score))}")
78
+
79
+
80
+
@@ -48,7 +48,7 @@ def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=Fals
48
48
  thickness=2, fontScale=0.8, drawType="chinese")
49
49
  image_utils.cv_show_image("image", m, use_rgb=False, delay=0)
50
50
  for i, img in enumerate(crops):
51
- if img.size < min_size: continue
51
+ if img.dsize < min_size: continue
52
52
  name = class_name[int(labels[i])] if class_name else labels[i]
53
53
  if out_dir:
54
54
  file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id, i)
@@ -89,7 +89,7 @@ class LabelSmoothingCrossEntropy(nn.Module):
89
89
  self.reduction = reduction
90
90
 
91
91
  def forward(self, output, target):
92
- c = output.size()[-1]
92
+ c = output.dsize()[-1]
93
93
  log_preds = F.log_softmax(output, dim=-1)
94
94
  if self.reduction == 'sum':
95
95
  loss = -log_preds.sum()
@@ -111,7 +111,7 @@ class SlowFast(nn.Module):
111
111
  x = torch.cat([x, lateral[3]],dim=1)
112
112
  x = self.slow_res5(x)
113
113
  x = nn.AdaptiveAvgPool3d(1)(x)
114
- x = x.view(-1, x.size(1))
114
+ x = x.view(-1, x.dsize(1))
115
115
  return x
116
116
 
117
117
  def FastPath(self, input):
@@ -137,7 +137,7 @@ class SlowFast(nn.Module):
137
137
 
138
138
  res5 = self.fast_res5(res4)
139
139
  x = nn.AdaptiveAvgPool3d(1)(res5)
140
- x = x.view(-1, x.size(1))
140
+ x = x.view(-1, x.dsize(1))
141
141
 
142
142
  return x, lateral
143
143
 
@@ -214,4 +214,4 @@ if __name__ == "__main__":
214
214
  input_tensor = torch.autograd.Variable(torch.rand(1, 3, 64, 224, 224))
215
215
  model = resnet50(class_num=num_classes)
216
216
  output = model(input_tensor)
217
- print(output.size())
217
+ print(output.dsize())
File without changes
File without changes