pybaseutils 2.4.34__tar.gz → 2.5.0__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 (336) hide show
  1. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/PKG-INFO +9 -5
  2. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/audio_utils.py +8 -4
  4. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/producer_consumer.py +0 -0
  5. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base64_utils.py +10 -3
  6. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/color_utils.py +25 -0
  7. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme.py +35 -1
  8. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  9. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_voc.py +1 -1
  10. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/file_utils.py +31 -0
  11. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/font_style/__init__.py +1 -0
  12. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/font_utils.py +24 -0
  13. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/image_utils.py +133 -72
  14. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/class_report.py +10 -5
  15. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/thread_utils.py +31 -0
  16. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/build_transform.py +0 -0
  17. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/PKG-INFO +9 -5
  18. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/SOURCES.txt +2 -0
  19. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/dependency_links.txt +0 -0
  20. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/not-zip-safe +0 -0
  21. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/top_level.txt +0 -0
  22. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/setup.cfg +0 -0
  23. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/setup.py +23 -3
  24. pybaseutils-2.5.0/test_py/aije/demo_labelme_class_counts.py +20 -0
  25. pybaseutils-2.5.0/test_py/aije/demo_labelme_crop_aicq.py +138 -0
  26. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_crop_aije.py +1 -1
  27. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_crop_ailt.py +23 -17
  28. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/mask_image.py +0 -0
  29. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/camera/demo.py +5 -3
  30. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/fall_dataset.py +0 -0
  31. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/parking_rois_gopro.py +0 -0
  32. pybaseutils-2.5.0/test_py/demo1.py +10 -0
  33. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo2.py +6 -4
  34. pybaseutils-2.5.0/test_py/demo3.py +35 -0
  35. pybaseutils-2.5.0/test_py/demo4.py +30 -0
  36. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_gif_video.py +7 -5
  37. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/qrcode/__init__.py +0 -0
  38. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/qrcode/demo.py +0 -0
  39. pybaseutils-2.4.34/test_py/demo1.py +0 -43
  40. pybaseutils-2.4.34/test_py/demo3.py +0 -67
  41. pybaseutils-2.4.34/test_py/demo4.py +0 -70
  42. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/LICENCE +0 -0
  43. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/README.md +0 -0
  44. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/__init__.py +0 -0
  45. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/pyaudio_utils.py +0 -0
  46. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/vad_utils.py +0 -0
  47. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/__init__.py +0 -0
  48. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/dict_queue.py +0 -0
  49. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/list_queue.py +0 -0
  50. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/batch_utils.py +0 -0
  51. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/build_utils/__init__.py +0 -0
  52. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/build_utils/cython_utils.py +0 -0
  53. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  54. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/__init__.py +0 -0
  55. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/kmean.py +0 -0
  56. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/maxmin_distance.py +0 -0
  57. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/similarity.py +0 -0
  58. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/config_utils.py +0 -0
  59. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/__init__.py +0 -0
  60. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_coco.py +0 -0
  61. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_cvat.py +0 -0
  62. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_labelme.py +0 -0
  63. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_voc.py +0 -0
  64. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/concat_coco.py +0 -0
  65. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  66. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_coco2voc.py +0 -0
  67. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  68. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  69. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  70. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  71. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  72. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  73. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2coco.py +0 -0
  74. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  75. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2voc.py +0 -0
  76. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  77. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  78. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  79. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/prelabelme.py +0 -0
  80. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/coords_utils.py +0 -0
  81. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/__init__.py +0 -0
  82. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/camera.py +0 -0
  83. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/corner_utils.py +0 -0
  84. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/frame_record.py +0 -0
  85. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/mouse_utils.py +0 -0
  86. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/nms_utils.py +0 -0
  87. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/video_utils.py +0 -0
  88. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/data_utils.py +0 -0
  89. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/__init__.py +0 -0
  90. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/balanced_classes.py +0 -0
  91. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/base_coco.py +0 -0
  92. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/base_dataset.py +0 -0
  93. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/data_resample.py +0 -0
  94. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  95. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  96. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  97. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  98. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_image_text.py +0 -0
  99. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  100. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  101. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_video_text.py +0 -0
  102. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_yolo.py +0 -0
  103. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  104. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dict_uils.py +0 -0
  105. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dict_utils.py +0 -0
  106. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/QueueTable.py +0 -0
  107. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/__init__.py +0 -0
  108. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/demo.py +0 -0
  109. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/kalman_filter.py +0 -0
  110. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/mean_filter.py +0 -0
  111. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/motion_filter.py +0 -0
  112. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/pose_filter.py +0 -0
  113. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/geometry_tools.py +0 -0
  114. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/heatmap_utils.py +0 -0
  115. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/http_utils.py +0 -0
  116. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/json_utils.py +0 -0
  117. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/log.py +0 -0
  118. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/log_utils.py +0 -0
  119. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/media/__init__.py +0 -0
  120. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/media/ffmpeg_utils.py +0 -0
  121. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/__init__.py +0 -0
  122. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/accuracy.py +0 -0
  123. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/average_meter.py +0 -0
  124. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/plot_pr.py +0 -0
  125. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/plot_roc.py +0 -0
  126. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/nets_utils.py +0 -0
  127. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/numpy_utils.py +0 -0
  128. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pandas_utils.py +0 -0
  129. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/plot_utils.py +0 -0
  130. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/__init__.py +0 -0
  131. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/bones_utils.py +0 -0
  132. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/human_pose.py +0 -0
  133. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/pose_utils.py +0 -0
  134. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pycpp/__init__.py +0 -0
  135. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pycpp/demo.py +0 -0
  136. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pycpp/main.py +0 -0
  137. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/server/__init__.py +0 -0
  138. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/server/apm_server.py +0 -0
  139. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/setup_config.py +0 -0
  140. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/singleton_utils.py +0 -0
  141. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/text_utils.py +0 -0
  142. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/time_utils.py +0 -0
  143. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracemalloc_utils.py +0 -0
  144. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracemalloc_utils2.py +0 -0
  145. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/QueueTable.py +0 -0
  146. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/__init__.py +0 -0
  147. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/demo.py +0 -0
  148. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/kalman_filter.py +0 -0
  149. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/mean_filter.py +0 -0
  150. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/motion_filter.py +0 -0
  151. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/pose_filter.py +0 -0
  152. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/__init__.py +0 -0
  153. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/affine_transform.py +0 -0
  154. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/face_alignment.py +0 -0
  155. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/imgaug_utils.py +0 -0
  156. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/transform_utils.py +0 -0
  157. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/__init__.py +0 -0
  158. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/app_gradio_image.py +0 -0
  159. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/app_stweb_image.py +0 -0
  160. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/app_webio_image.py +0 -0
  161. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/demo.py +0 -0
  162. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/word_utils.py +0 -0
  163. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/worker.py +0 -0
  164. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/yaml_utils.py +0 -0
  165. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/Image_enhance/__init__.py +0 -0
  166. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/Image_enhance/dmeo01.py +0 -0
  167. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/__init__.py +0 -0
  168. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/download_pdf.py +0 -0
  169. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/search_baidu.py +0 -0
  170. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/search_biying.py +0 -0
  171. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/__init__.py +0 -0
  172. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/__init__.py +0 -0
  173. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/action_dataset.py +0 -0
  174. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/build_cython.py +0 -0
  175. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/build_pyarmor.py +0 -0
  176. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/build_service.py +0 -0
  177. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/convert_cvat2labelme.py +0 -0
  178. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/convert_labelme2coco.py +0 -0
  179. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/convert_labelme2voc.py +0 -0
  180. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/copy_move.py +0 -0
  181. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_shock.py +0 -0
  182. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_motion_blur.py +0 -0
  183. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_video_aije.py +0 -0
  184. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_voc_crop.py +0 -0
  185. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_voc_vis.py +0 -0
  186. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/get_pair_data.py +0 -0
  187. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/video_convertor.py +0 -0
  188. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/__init__.py +0 -0
  189. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/demo.py +0 -0
  190. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/main.py +0 -0
  191. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/main_read.py +0 -0
  192. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/segment.py +0 -0
  193. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  194. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/speechbrain_demo.py +0 -0
  195. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio_demo1.py +0 -0
  196. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/camera/__init__.py +0 -0
  197. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/camera.py +0 -0
  198. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/captcha/__init__.py +0 -0
  199. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/captcha/demo.py +0 -0
  200. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/class_attribute.py +0 -0
  201. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/class_names.py +0 -0
  202. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/AffectNet.py +0 -0
  203. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/AsianMovie.py +0 -0
  204. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/BITVehicle2voc.py +0 -0
  205. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/BSTLD2voc.py +0 -0
  206. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/CCPD.py +0 -0
  207. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/CCPD2voc.py +0 -0
  208. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/FL3D_dataset.py +0 -0
  209. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/FreiHAND2coco.py +0 -0
  210. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/MTFL2voc.py +0 -0
  211. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/TT100K.py +0 -0
  212. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/WaterMeters1.py +0 -0
  213. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/WaterMeters2.py +0 -0
  214. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/__init__.py +0 -0
  215. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/car_accident.py +0 -0
  216. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/concat_coco.py +0 -0
  217. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_coco2voc.py +0 -0
  218. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_cvat2labelme.py +0 -0
  219. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_gesture2hand.py +0 -0
  220. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2coco.py +0 -0
  221. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2cvat.py +0 -0
  222. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2labelme.py +0 -0
  223. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2voc.py +0 -0
  224. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_voc2labelme.py +0 -0
  225. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_yolo2labelme.py +0 -0
  226. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/fatigue_driving.py +0 -0
  227. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/fdd_dataset.py +0 -0
  228. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/get_pair_data.py +0 -0
  229. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/handpose2coco.py +0 -0
  230. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/insects_for_aichallenger.py +0 -0
  231. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/tt100k_utils.py +0 -0
  232. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/ua_detrac2voc.py +0 -0
  233. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/ucf101_dataset.py +0 -0
  234. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/voc_sbd2labelme.py +0 -0
  235. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/__init__.py +0 -0
  236. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/build_cython.py +0 -0
  237. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/build_pyarmor.py +0 -0
  238. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/cryptography_demo.py +0 -0
  239. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/fun_sum.py +0 -0
  240. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/main.py +0 -0
  241. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/model_des_enctypt.py +0 -0
  242. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/model_enctypt.py +0 -0
  243. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/date_dataset.py +0 -0
  244. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/date_demo.py +0 -0
  245. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/datedataset_bk.py +0 -0
  246. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_async_await1.py +0 -0
  247. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_async_await2.py +0 -0
  248. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_coco_vis.py +0 -0
  249. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_copy_files.py +0 -0
  250. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_copy_files_for_voc.py +0 -0
  251. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_ffmpy.py +0 -0
  252. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_annular_to_rect.py +0 -0
  253. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_pair_file.py +0 -0
  254. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_polygon.py +0 -0
  255. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_trt.py +0 -0
  256. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_get_file_label.py +0 -0
  257. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_get_file_list.py +0 -0
  258. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_gif.py +0 -0
  259. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_image_crop.py +0 -0
  260. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_kpts.py +0 -0
  261. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_labelme.py +0 -0
  262. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_labelme_crop.py +0 -0
  263. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_lableme_vis.py +0 -0
  264. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_letterbox.py +0 -0
  265. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_metrics.py +0 -0
  266. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_mosaic.py +0 -0
  267. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_mouse.py +0 -0
  268. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_nii.py +0 -0
  269. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_pandas.py +0 -0
  270. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_plot.py +0 -0
  271. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_prelabelme.py +0 -0
  272. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_rename.py +0 -0
  273. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_standard_image .py +0 -0
  274. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_standard_video .py +0 -0
  275. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_taichi.py +0 -0
  276. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_video2frame.py +0 -0
  277. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_video_crop.py +0 -0
  278. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_video_segm.py +0 -0
  279. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_voc_crop.py +0 -0
  280. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_voc_vis.py +0 -0
  281. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_word_similar.py +0 -0
  282. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_worker1.py +0 -0
  283. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_worker2.py +0 -0
  284. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/__init__.py +0 -0
  285. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/demo.py +0 -0
  286. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/detect_face_person.py +0 -0
  287. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/predet_labelme.py +0 -0
  288. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/edit_distance/__init__.py +0 -0
  289. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/edit_distance/demo.py +0 -0
  290. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/edit_distance/text_matching.py +0 -0
  291. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/fast_api/__init__.py +0 -0
  292. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/fast_api/create_image_url.py +0 -0
  293. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/fast_api/get_image_url.py +0 -0
  294. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/__init__.py +0 -0
  295. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/app.py +0 -0
  296. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/utils/__init__.py +0 -0
  297. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/utils/utils.py +0 -0
  298. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/get_file_list.py +0 -0
  299. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/gradio_app.py +0 -0
  300. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/gradio_app_v2.py +0 -0
  301. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/__init__.py +0 -0
  302. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v1.py +0 -0
  303. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v2.py +0 -0
  304. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v3.py +0 -0
  305. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/kafka_worker.py +0 -0
  306. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/men_tracemalloc.py +0 -0
  307. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/__init__.py +0 -0
  308. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/demo01.py +0 -0
  309. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/demo02.py +0 -0
  310. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/hello_milvus.py +0 -0
  311. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/milvus_client.py +0 -0
  312. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/model_process.py +0 -0
  313. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/performance.py +0 -0
  314. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/pose/__init__.py +0 -0
  315. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/pose/human_pose.py +0 -0
  316. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/redis_py/__init__.py +0 -0
  317. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/redis_py/knn_search.py +0 -0
  318. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/redis_py/redis_client.py +0 -0
  319. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/__init__.py +0 -0
  320. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/base.py +0 -0
  321. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/component.py +0 -0
  322. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/main.py +0 -0
  323. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/register.py +0 -0
  324. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/GRU.py +0 -0
  325. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/TCN.py +0 -0
  326. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/__init__.py +0 -0
  327. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/demo.py +0 -0
  328. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/slowfastnet.py +0 -0
  329. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_camera.py +0 -0
  330. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_fr/__init__.py +0 -0
  331. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_fr/demo11.py +0 -0
  332. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_fr/idcardocr.py +0 -0
  333. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/web_socket/__init__.py +0 -0
  334. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/web_socket/asr_clients.py +0 -0
  335. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/web_socket/asr_service.py +0 -0
  336. {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/web_socket/chat_service.py +0 -0
@@ -1,13 +1,19 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: pybaseutils
3
- Version: 2.4.34
3
+ Version: 2.5.0
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
7
7
  Author-email: 390737991@qq.com
8
8
  License: MIT
9
- Platform: UNKNOWN
10
9
  License-File: LICENCE
10
+ Dynamic: author
11
+ Dynamic: author-email
12
+ Dynamic: description
13
+ Dynamic: home-page
14
+ Dynamic: license
15
+ Dynamic: license-file
16
+ Dynamic: summary
11
17
 
12
18
  base-utils
13
19
  ==========
@@ -142,5 +148,3 @@ base_utils(C++)
142
148
  DEBUG_IMSHOW("image", image);
143
149
  return 0;
144
150
  }
145
-
146
-
@@ -8,4 +8,4 @@
8
8
  # --------------------------------------------------------
9
9
  """
10
10
 
11
- __version__ = '2.4.34'
11
+ __version__ = '2.5.0'
@@ -19,7 +19,6 @@ from ffmpy import FFmpeg
19
19
  import matplotlib.pyplot as plt
20
20
  from scipy.fft import fft
21
21
  from IPython.display import Audio, display
22
- from playsound import playsound
23
22
  from scipy.io import wavfile
24
23
 
25
24
  import numpy as np
@@ -267,6 +266,8 @@ def sound_audio(audio, sr=16000):
267
266
 
268
267
  def sound_audio_file(audio_file, jupyter=False):
269
268
  """
269
+ sudo apt-get install libasound2-dev
270
+ pip install simpleaudio==1.0.4
270
271
  :param audio_file:
271
272
  :param jupyter:
272
273
  :return:
@@ -274,7 +275,10 @@ def sound_audio_file(audio_file, jupyter=False):
274
275
  if jupyter:
275
276
  display(Audio(audio_file))
276
277
  else:
277
- playsound(audio_file)
278
+ import simpleaudio as sa
279
+ wave_obj = sa.WaveObject.from_wave_file(audio_file)
280
+ play_obj = wave_obj.play() # 播放
281
+ play_obj.wait_done() # 等待播放结束(可选,但推荐)
278
282
 
279
283
 
280
284
  def sound_audio_buffer(audio_buffer, tmp_audio="./tmp.wav"):
@@ -470,8 +474,8 @@ if __name__ == '__main__':
470
474
  video_out = "../../data/video/test-video-result.mp4"
471
475
  audio_file = "../../data/audio/bus_chinese.wav"
472
476
 
473
- test_time(audio_file)
474
- # playsound(audio_file)
477
+ # test_time(audio_file)
478
+ sound_audio_file(audio_file,jupyter=False)
475
479
  # playsound(audio_file)
476
480
  # display_time_domain(audio_file)
477
481
  # display_freq_domain(audio_file)
@@ -11,13 +11,16 @@ import sys
11
11
  import os
12
12
 
13
13
  import PIL.Image as Image
14
+ from PIL import ImageFile
14
15
  import cv2
15
16
  import base64
16
17
  import numpy as np
17
18
  from typing import Any
19
+ from io import BytesIO
18
20
 
19
21
  IMG_PREFIX = "image/jpg" # 图片base64字符串前缀
20
22
  precision = 6 # 小数点精度
23
+ ImageFile.LOAD_TRUNCATED_IMAGES = True # 允许加载截断的图像
21
24
 
22
25
 
23
26
  def isbase64(data: str, prefix=IMG_PREFIX):
@@ -36,10 +39,14 @@ def base642image(bs64, prefix=IMG_PREFIX, use_rgb=False) -> np.ndarray:
36
39
  if prefix == bs64[0:len(prefix)]:
37
40
  bs64 = bs64[len(prefix):]
38
41
  bs64 = bytes(bs64, 'utf-8')
39
- image = base64.b64decode(bs64)
40
- image = np.frombuffer(image, np.uint8)
41
- image = cv2.imdecode(image, flags=cv2.IMREAD_UNCHANGED)
42
+ imgbf = base64.b64decode(bs64)
43
+ # image = np.frombuffer(imgbf, np.uint8)
44
+ # image = cv2.imdecode(image, flags=cv2.IMREAD_UNCHANGED)
42
45
  # image = cv2.imdecode(image, cv2.IMREAD_COLOR)
46
+ # if image is None:
47
+ image = Image.open(BytesIO(imgbf)) # 修复截断的图像
48
+ image = np.array(image)
49
+ image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
43
50
  if use_rgb:
44
51
  image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
45
52
  return image
@@ -10,6 +10,7 @@
10
10
  import cv2
11
11
  import matplotlib.pyplot as plt
12
12
  import numpy as np
13
+ from collections import defaultdict, Counter
13
14
 
14
15
  VOC_NAMES = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat",
15
16
  "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person",
@@ -28,6 +29,30 @@ COCO_NAMES = ['background', 'person', 'bicycle', 'car', 'motorcycle', 'airplane'
28
29
  'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
29
30
  'teddy bear', 'hair drier', 'toothbrush']
30
31
 
32
+ color_table = [(0, 0, 0), (0, 255, 0), (255, 0, 0), (0, 0, 255), (0, 255, 255), (255, 0, 255), (255, 255, 0),
33
+ (128, 0, 0), (0, 128, 0), (128, 128, 0),
34
+ (0, 0, 128), (128, 0, 128), (0, 128, 128), (128, 128, 128),
35
+ (64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0),
36
+ (64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128),
37
+ (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)] * 100
38
+
39
+
40
+ class ColorLabel():
41
+ def __init__(self):
42
+ self.color = dict()
43
+ self.cnums = len(color_table)
44
+
45
+ def get_color(self, label: str):
46
+ """
47
+ :param label: str or list
48
+ :return:
49
+ """
50
+ h = str(label)
51
+ if h not in self.color:
52
+ i = len(self.color) + 1
53
+ self.color[h] = color_table[i % self.cnums]
54
+ return self.color[h]
55
+
31
56
 
32
57
  def get_colormap(data_type="custom"):
33
58
  if data_type == 'pascal':
@@ -537,6 +537,34 @@ def LabelMeDatasets(filename=None,
537
537
  return datasets
538
538
 
539
539
 
540
+ def get_class_counts(datasets, save=""):
541
+ """
542
+ 统计每个类别的样本数量
543
+ :param datasets: List[str] or ConcatDataset
544
+ :param save: 保存路径
545
+ :return: 每个类别的样本数量
546
+ """
547
+ from pybaseutils import dict_utils
548
+ if isinstance(datasets, list):
549
+ datasets = LabelMeDatasets(filename=None,
550
+ data_root=None,
551
+ anno_dir=datasets,
552
+ image_dir=None,
553
+ class_name=[],
554
+ check=False,
555
+ phase='val',
556
+ shuffle=False)
557
+ counts = {}
558
+ for i in tqdm(range(len(datasets))):
559
+ info = datasets.__getitem__(i)
560
+ for n in info["names"]:
561
+ counts[n] = counts.get(n, 0) + 1
562
+ counts = dict_utils.dict_sort(counts,use_key=False)
563
+ if save:
564
+ json_utils.save_json(os.path.join(save, "counts.json"), counts)
565
+ return counts
566
+
567
+
540
568
  def parser_labelme(anno_file, class_dict={}, size=()):
541
569
  """
542
570
  :param annotation: labelme标注的数据
@@ -633,4 +661,10 @@ def example_for_segment():
633
661
 
634
662
  if __name__ == "__main__":
635
663
  # example_for_segment()
636
- example_for_keypoints()
664
+ # example_for_keypoints()
665
+ datasets = [
666
+ '/home/PKing/edudata/dataset/AICQ/dataset/data-2026-10-06/images',
667
+ '/home/PKing/edudata/dataset/AICQ/dataset/data-2026-09-30/images',
668
+ ]
669
+ counts = get_class_counts(datasets)
670
+ print(counts)
@@ -119,7 +119,7 @@ class VOCDataset(Dataset):
119
119
  class_set = labels.reshape(-1).tolist() + class_set
120
120
  class_set = list(set(class_set))
121
121
  if ignore_empty and (len(boxes) == 0 or len(labels) == 0):
122
- print("empty annotation:{}".format(annotation_file))
122
+ # print("empty annotation:{}".format(annotation_file))
123
123
  continue
124
124
  dst_ids.append(image_id)
125
125
  class_set = sorted(class_set)
@@ -148,6 +148,25 @@ def get_data_hash(data: np.ndarray):
148
148
  return hash
149
149
 
150
150
 
151
+ def get_hash(image: np.ndarray = None, texts=[]) -> str:
152
+ """根据image和texts数据生成唯一ID(hash)"""
153
+ if texts is None: texts = []
154
+ # 使用更快的哈希算法(如果安全性要求不高)
155
+ hasher = hashlib.sha256() # 或 hashlib.md5() for speed
156
+ # 文本处理
157
+ if texts:
158
+ texts = sorted([t.strip() for t in texts if t and t.strip()])
159
+ if texts: hasher.update('|'.join(texts).encode('utf-8'))
160
+ # 图像处理
161
+ if image is not None and isinstance(image, np.ndarray):
162
+ if not image.flags.c_contiguous: image = np.ascontiguousarray(image) # 确保连续性(视图操作)
163
+ # 使用memoryview避免拷贝
164
+ hasher.update(memoryview(image))
165
+ # 如果完全没有数据,返回空哈希
166
+ v = hasher.hexdigest() if hasher.digest_size > 0 else hashlib.sha256(b'empty').hexdigest()
167
+ return v
168
+
169
+
151
170
  def replace_elements(items, src, dst, ignore=True):
152
171
  """
153
172
  将列表中,值为src改为dst
@@ -264,6 +283,18 @@ def save_json(json_file, json_data):
264
283
  write_json_path = save_json
265
284
 
266
285
 
286
+ def save_jsonl(jsonl_file, data_list: list):
287
+ """
288
+ data_list转为jsonl保持
289
+ :param jsonl_file:
290
+ :param data_list:
291
+ :return:
292
+ """
293
+ with open(jsonl_file, 'w', encoding='utf-8') as f:
294
+ for item in data_list:
295
+ f.write(json.dumps(item, ensure_ascii=False) + '\n')
296
+
297
+
267
298
  def load_json_files(files: list, max_workers=8):
268
299
  """
269
300
  根据url读取文件
@@ -19,6 +19,7 @@ FONT_ROOT = [
19
19
  os.path.expanduser("~/.fonts"), # 用户字体目录
20
20
  BASE_FONT, # 用户字体目录
21
21
  "/usr/share/fonts",
22
+ "./data/fonts",
22
23
  "/usr/share/fonts/truetype",
23
24
  "/usr/share/fonts/opentype",
24
25
  ]
@@ -243,6 +243,30 @@ def re_example():
243
243
  print(out)
244
244
 
245
245
 
246
+ def align_display(s, align='C', width=20, pchar=" "):
247
+ """
248
+ 对齐显示字符串
249
+ print("[{}] 下载进度".format(align_display(item, 'C')))
250
+ :param s: 要显示的字符串
251
+ :param align: 对齐方式,'L' 左对齐,'C' 居中对齐,'R' 右对齐
252
+ :param width: 目标显示宽度
253
+ :param pchar: 对齐字符,默认空格
254
+ :return: 对齐后的字符串
255
+ """
256
+ w = sum(2 if ord(c) > 127 else 1 for c in s) # 计算字符串的显示宽度(中文等宽字符算2,英文算1)
257
+ total_pad = max(width - w, 0)
258
+ if align == 'L':
259
+ L = 0
260
+ R = total_pad
261
+ elif align == 'R':
262
+ L = total_pad
263
+ R = 0
264
+ else: # 默认居中对齐
265
+ L = total_pad // 2
266
+ R = total_pad - L
267
+ return pchar * L + s + pchar * R
268
+
269
+
246
270
  if __name__ == "__main__":
247
271
  draw_font_example()
248
272
  # get_system_fonts()
@@ -43,6 +43,8 @@ color_map = [(0, 0, 0), (56, 56, 255), (151, 157, 255), (31, 112, 255), (29, 178
43
43
  (168, 153, 44), (255, 194, 0), (147, 69, 52), (255, 115, 100),
44
44
  (236, 24, 0), (255, 56, 132), (133, 0, 82), (255, 56, 203), (200, 149, 255), (199, 55, 255)] * 100
45
45
 
46
+ color_label = color_utils.ColorLabel()
47
+
46
48
  root = os.path.dirname(__file__)
47
49
  coco_skeleton = [[1, 3], [1, 0], [2, 4], [2, 0], [0, 5], [0, 6], [5, 7], [7, 9], [6, 8],
48
50
  [8, 10], [5, 11], [6, 12], [11, 12], [11, 13], [13, 15], [12, 14], [14, 16]]
@@ -1124,13 +1126,14 @@ def draw_image_bboxes_text(image, boxes, boxes_name, color=(), thickness=0, font
1124
1126
  return image
1125
1127
 
1126
1128
 
1127
- def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale=0, alpha=0, drawType="custom",
1128
- top=True):
1129
+ def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale=0, alpha=0,
1130
+ drawType="custom", color_type="class", top=True):
1129
1131
  """
1130
1132
  :param image:
1131
1133
  :param boxes:
1132
1134
  :param texts:
1133
1135
  :param color:
1136
+ :param kColor:
1134
1137
  :param thickness:
1135
1138
  :param fontScale:
1136
1139
  :param drawType:
@@ -1138,8 +1141,10 @@ def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale
1138
1141
  :return:
1139
1142
  """
1140
1143
  for i, (bbox, text) in enumerate(zip(boxes, texts)):
1141
- bbox = [int(b) for b in bbox]
1142
- c = color if color else color_table[(i + 1) % 20]
1144
+ if color_type == "class":
1145
+ c = color if color else color_label.get_color(text) # 相同类别相同颜色
1146
+ else:
1147
+ c = color if color else color_table[(i + 1) % len(color_table)] # 每个实例不同颜色
1143
1148
  draw_image_bbox_text(image, bbox, text, color=c, thickness=thickness, fontScale=fontScale, alpha=alpha,
1144
1149
  drawType=drawType, top=top)
1145
1150
  return image
@@ -1161,16 +1166,14 @@ def draw_image_bboxes_labels_text(image, boxes, labels, boxes_name=None, color=N
1161
1166
 
1162
1167
  def draw_image_boxes_labels_texts(image, boxes, labels, texts, color=None, thickness=2, fontScale=0.8,
1163
1168
  drawType="custom", top=True, colors=None, color_type="class"):
1164
- if isinstance(labels, np.ndarray):
1165
- labels = labels.reshape(-1).tolist()
1169
+ if isinstance(labels, np.ndarray): labels = labels.reshape(-1).tolist()
1166
1170
  colors = [(0, 0, 0)] + colors if colors else color_table
1167
- for i, (label, bbox, name) in enumerate(zip(labels, boxes, texts)):
1168
- bbox = [int(b) for b in bbox]
1171
+ for i, (label, bbox, text) in enumerate(zip(labels, boxes, texts)):
1169
1172
  if color_type == "class":
1170
- c = color if color else colors[(int(label) + 1) % 20] # 相同类别相同颜色
1173
+ c = color if color else color_label.get_color(label) # 相同类别相同颜色
1171
1174
  else:
1172
- c = color if color else colors[(i + 1) % 20] # 每个实例不同颜色
1173
- image = draw_image_bbox_text(image, bbox, str(name), color=c, thickness=thickness, fontScale=fontScale,
1175
+ c = color if color else colors[(i + 1) % len(colors)] # 每个实例不同颜色
1176
+ image = draw_image_bbox_text(image, bbox, str(text), color=c, thickness=thickness, fontScale=fontScale,
1174
1177
  drawType=drawType, top=top)
1175
1178
  return image
1176
1179
 
@@ -1253,28 +1256,34 @@ def show_image_rects_texts(title, image, rects, texts, color=None, thickness=0,
1253
1256
  return image
1254
1257
 
1255
1258
 
1256
- def draw_image_bboxes_labels(image, boxes, labels, class_name=None, color=None, thickness=0, fontScale=0,
1257
- drawType="custom", top=True):
1259
+ def draw_image_boxes_labels(image, boxes, labels, class_name=None, color=None, kColor=True, thickness=0, fontScale=0,
1260
+ alpha=0, drawType="custom", top=True):
1258
1261
  """
1259
- :param image:
1260
- :param boxes: [[x1,y1,x2,y2],[x1,y1,x2,y2]]
1261
- :param labels:
1262
+ 绘制框和标签
1263
+ :param image: 图像
1264
+ :param boxes: 框坐标
1265
+ :param labels: 标签index
1266
+ :param class_name: 类别名称
1267
+ :param color:
1268
+ :param kColor: True 相同类别颜色相同,每个类别颜色不同; False 每个实例颜色不同
1269
+ :param thickness:
1270
+ :param fontScale:
1271
+ :param alpha:
1272
+ :param drawType:
1273
+ :param top:
1262
1274
  :return:
1263
1275
  """
1264
1276
  if isinstance(labels, np.ndarray): labels = labels.astype(np.int32).reshape(-1).tolist()
1265
- for label, bbox in zip(labels, boxes):
1266
- bbox = [int(b) for b in bbox]
1267
- c = color
1268
- if isinstance(label, numbers.Number) and class_name:
1269
- c = color_table[(int(label) + 1) % 20]
1270
- label = class_name[int(label)]
1271
- if not c: c = color_table[1]
1277
+ if class_name: labels = [class_name[i] for i in labels]
1278
+ for i, (label, bbox) in enumerate(zip(labels, boxes)):
1279
+ c = color if color else color_label.get_color(label) # 相同类别相同颜色
1280
+ if not kColor: c = color_table[(i + 1) % len(color_table)]
1272
1281
  image = draw_image_bbox_text(image, bbox, str(label), color=c, thickness=thickness, fontScale=fontScale,
1273
- drawType=drawType, top=top)
1282
+ alpha=alpha, drawType=drawType, top=top)
1274
1283
  return image
1275
1284
 
1276
1285
 
1277
- draw_image_boxes_labels = draw_image_bboxes_labels
1286
+ draw_image_bboxes_labels = draw_image_boxes_labels
1278
1287
 
1279
1288
 
1280
1289
  def draw_image_rects_labels(image, rects, labels, class_name=None, color=None, thickness=0, fontScale=0):
@@ -1467,25 +1476,22 @@ def draw_text(image, point, text, color=(255, 0, 0), fontScale=0, thickness=0, d
1467
1476
  :param image:
1468
1477
  :param point:
1469
1478
  :param text:
1470
- :param drawType: custom or simple
1479
+ :param drawType: en/ch/simple
1471
1480
  :return:
1472
1481
  """
1473
1482
  point = (int(point[0]), int(point[1]))
1474
1483
  thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1475
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
1476
- # fontFace=cv2.FONT_HERSHEY_SIMPLEX
1484
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
1477
1485
  if drawType == "custom" or drawType == "en":
1478
- text_size, baseline = cv2.getTextSize(str(text), fontFace, fontScale, abs(thickness))
1479
- text_loc = (point[0], point[1] + text_size[1])
1480
- cv2.rectangle(image, (text_loc[0] - 2 // 2, text_loc[1] - 2 - baseline),
1481
- (text_loc[0] + text_size[0], text_loc[1] + text_size[1]), color=color, thickness=-1)
1482
- # draw score value
1483
- cv2.putText(image, str(text), (text_loc[0], text_loc[1] + baseline), fontFace, fontScale, (255, 255, 255),
1484
- abs(thickness), 2)
1486
+ bbox = [point[0], point[1]]
1487
+ image = draw_bbox_text_en(image, bbox, text, color=color, thickness=thickness, fontScale=fontScale)
1488
+ elif drawType == "chinese" or drawType == "ch":
1489
+ bbox = [point[0], point[1]]
1490
+ image = draw_bbox_text_ch(image, bbox, text, color=color, thickness=thickness, fontScale=fontScale)
1485
1491
  elif drawType == "simple":
1486
1492
  cv2.putText(image, str(text), (point[0], point[1]), fontFace, fontScale, color=color, thickness=abs(thickness))
1487
- if drawType == "chinese" or drawType == "ch":
1488
- cv2_putText(image, str(text), point, color=color, fontScale=fontScale, thickness=abs(thickness))
1493
+ else:
1494
+ cv2.putText(image, str(text), (point[0], point[1]), fontFace, fontScale, color=color, thickness=abs(thickness))
1489
1495
  return image
1490
1496
 
1491
1497
 
@@ -1499,38 +1505,62 @@ def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, a
1499
1505
  :param top:
1500
1506
  :return:
1501
1507
  """
1508
+ bbox = [int(b) for b in bbox]
1502
1509
  text = str(text)
1503
1510
  if alpha > 0:
1504
1511
  bgimg = draw_image_bbox_text(image.copy(), bbox, text=text, color=color, thickness=thickness,
1505
1512
  fontScale=fontScale, drawType=drawType, top=top, alpha=0)
1506
1513
  image[:] = cv2.addWeighted(bgimg, 1 - alpha, image, alpha, 0)
1507
1514
  return image
1508
- thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1509
- # text_loc = (bbox[0], bbox[1]) if top else (bbox[0], bbox[3])
1510
- if not text: drawType = "simple"
1511
- text_size, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, abs(thickness))
1512
- if top:
1513
- # text_loc = (bbox[0], bbox[1] + text_size[1]) # 在左上角下方绘制文字
1515
+ if drawType == "ch" or drawType == "chinese":
1516
+ image = draw_bbox_text_ch(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
1517
+ elif drawType == "simple":
1518
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1514
1519
  text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
1515
- else:
1516
- text_loc = (bbox[0], bbox[3] + text_size[1] + baseline // 2)
1517
- if drawType == "chinese" or drawType == "ch":
1518
- if not top: text_loc = (text_loc[0], text_loc[1] - baseline)
1519
- cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
1520
- cv2_putText(image, str(text), text_loc, color=color, fontScale=fontScale, thickness=abs(thickness))
1521
- elif drawType == "simple" or drawType == "en":
1522
1520
  cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness, 8, 0)
1523
- cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_SIMPLEX, fontScale, color, abs(thickness))
1524
- elif drawType == "custom":
1525
- cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
1526
- bg1 = (text_loc[0], text_loc[1] - text_size[1] - baseline // 2)
1527
- bg2 = (text_loc[0] + text_size[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
1528
- # bg2 = (max(bbox[2], text_loc[0] + text_size[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
1529
- cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
1530
- cv2.rectangle(image, bg1, bg2, color, -1)
1531
- # draw score value
1532
- cv2.putText(image, str(text), (text_loc[0], text_loc[1]), cv2.FONT_HERSHEY_SIMPLEX, fontScale,
1533
- (255, 255, 255), abs(thickness))
1521
+ cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
1522
+ else: # custom ,en
1523
+ image = draw_bbox_text_en(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
1524
+ return image
1525
+
1526
+
1527
+ def draw_bbox_text_ch(image, bbox, text, color, thickness=2, fontScale=0.8):
1528
+ thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1529
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1530
+ baseline = baseline + 1
1531
+ text_wh = (text_wh[0], int(text_wh[1] * 0.8)) # 与draw_bbox_text_en区别,底纹缩小80%
1532
+ text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
1533
+ text_bgy = text_loc[1] - text_wh[1] - baseline // 2
1534
+ if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
1535
+ text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
1536
+ bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
1537
+ bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
1538
+ # bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
1539
+ cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,避免断裂
1540
+ cv2.rectangle(image, bg1, bg2, color, -1) # 绘制底纹
1541
+ if len(bbox) == 4: cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness) # 绘制bbox
1542
+ text_loc = (text_loc[0], int(text_loc[1] * 1.0)) # 调整字体位置
1543
+ cv2_putText(image, str(text), text_loc, color=(255, 255, 255), fontScale=fontScale, thickness=abs(thickness))
1544
+ return image
1545
+
1546
+
1547
+ def draw_bbox_text_en(image, bbox, text, color, thickness=2, fontScale=0.8):
1548
+ thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1549
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, abs(thickness))
1550
+ baseline = baseline + 1
1551
+ text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
1552
+ text_bgy = text_loc[1] - text_wh[1] - baseline // 2
1553
+ if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
1554
+ text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
1555
+ bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
1556
+ bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
1557
+ # bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
1558
+ cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,避免断裂
1559
+ cv2.rectangle(image, bg1, bg2, color, -1) # 绘制底纹
1560
+ if len(bbox) == 4: cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness) # 绘制bbox
1561
+ text_loc = (text_loc[0], int(text_loc[1] * 0.95)) # 调整字体位置
1562
+ cv2.putText(image, str(text), (text_loc[0], text_loc[1]), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
1563
+ fontScale=fontScale, color=(255, 255, 255), thickness=abs(thickness))
1534
1564
  return image
1535
1565
 
1536
1566
 
@@ -1543,14 +1573,13 @@ def draw_text_line(image, point, text_line: str, bg_color=(255, 0, 0), thickness
1543
1573
  :return:
1544
1574
  """
1545
1575
  thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1546
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
1547
- # fontFace=cv2.FONT_HERSHEY_SIMPLEX
1576
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
1548
1577
  text_line = text_line.split("\n")
1549
- # text_size, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
1550
- text_size, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
1578
+ # text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
1579
+ text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
1551
1580
  for i, text in enumerate(text_line):
1552
1581
  if text:
1553
- draw_point = (point[0], point[1] + (text_size[1] + 2 + baseline) * i)
1582
+ draw_point = (point[0], point[1] + (text_wh[1] + 2 + baseline) * i)
1554
1583
  image = draw_text(image, draw_point, text, bg_color, thickness=thickness, drawType=drawType)
1555
1584
  return image
1556
1585
 
@@ -1599,11 +1628,11 @@ def get_font_type(size, font=""):
1599
1628
 
1600
1629
  def cv2_putText(img, text, point, fontFace=None, fontScale=0.8, color=(255, 0, 0), thickness=None):
1601
1630
  # cv2.putText(img, str(text), point, fontFace, fontScale, color=color, thickness=thickness)
1602
- text_size, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, abs(thickness))
1631
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1603
1632
  pilimg = Image.fromarray(img) # Image.fromarray()将数组类型转成图片格式,与np.array()相反
1604
1633
  draw = ImageDraw.Draw(pilimg) # PIL图片上打印汉字
1605
- size = text_size[1] # 字体大小
1606
- point = (point[0], point[1] - text_size[1] + baseline // 2)
1634
+ size = text_wh[1] # 字体大小
1635
+ point = (point[0], point[1] - text_wh[1] + baseline // 2)
1607
1636
  font = get_font_type(size=size)
1608
1637
  draw.text(point, text, color, font)
1609
1638
  img[:] = np.asarray(pilimg)
@@ -2333,7 +2362,7 @@ def draw_yaw_pitch_roll_in_right_axis(image,
2333
2362
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
2334
2363
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
2335
2364
  if vis:
2336
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
2365
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
2337
2366
  image = cv2.putText(image, str(text),
2338
2367
  # (int(cx), int(cy) + 10),
2339
2368
  (10, 10),
@@ -2379,7 +2408,7 @@ def draw_yaw_pitch_roll_in_left_axis(image,
2379
2408
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
2380
2409
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
2381
2410
  if vis:
2382
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
2411
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
2383
2412
  image = cv2.putText(image, str(text),
2384
2413
  # (int(cx), int(cy) + 10),
2385
2414
  (10, 10),
@@ -2701,7 +2730,39 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
2701
2730
  """
2702
2731
  colors = [(0, 0, 0)] + colors if colors else color_table
2703
2732
  for i in range(0, len(contours)):
2704
- c = color if color else colors[(i + 1) % 20]
2733
+ c = color
2734
+ if not color:
2735
+ c = color_label.get_color(texts[i]) if texts else colors[(i + 1) % len(colors)] # 相同类别相同颜色
2736
+ t = str(texts[i]) if texts else ""
2737
+ p = np.asarray(contours[i], dtype=np.int32)
2738
+ b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))
2739
+ if len(p.shape) == 2: p = [p]
2740
+ image[:] = cv2.drawContours(image, p, contourIdx=-1, color=c, thickness=thickness)
2741
+ bgimg = image.copy()
2742
+ bgimg = cv2.fillPoly(bgimg, p, color=c)
2743
+ image[:] = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
2744
+ if t: image[:] = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness,
2745
+ fontScale=fontScale, drawType=drawType)
2746
+ return image
2747
+
2748
+
2749
+ draw_image_contours_texts = draw_image_contours
2750
+
2751
+
2752
+ def draw_image_contours_labels_texts(image, contours: List[np.ndarray], labels=[], texts=[], color=(), alpha=0.5,
2753
+ thickness=1, fontScale=0.8, drawType="ch", colors=None):
2754
+ """
2755
+ 参考:draw_image_mask_color
2756
+ :param image:
2757
+ :param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
2758
+ :param texts:轮廓文本
2759
+ :param color:绘制轮廓的颜色
2760
+ :param alpha:绘制颜色的透明度 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
2761
+ :param thickness:轮廓线宽
2762
+ :return:
2763
+ """
2764
+ for i in range(0, len(contours)):
2765
+ c = color if color else color_label.get_color(labels[i]) # 相同类别相同颜色
2705
2766
  t = str(texts[i]) if texts else ""
2706
2767
  p = np.asarray(contours[i], dtype=np.int32)
2707
2768
  b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))