pybaseutils 2.4.34__tar.gz → 2.4.35__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 (333) hide show
  1. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/PKG-INFO +9 -5
  2. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/producer_consumer.py +0 -0
  4. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base64_utils.py +10 -3
  5. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/color_utils.py +26 -0
  6. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
  7. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/file_utils.py +31 -0
  8. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/image_utils.py +121 -25
  9. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/class_report.py +10 -5
  10. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/build_transform.py +0 -0
  11. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/PKG-INFO +9 -5
  12. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/SOURCES.txt +0 -0
  13. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/dependency_links.txt +0 -0
  14. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/not-zip-safe +0 -0
  15. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/top_level.txt +0 -0
  16. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/setup.cfg +0 -0
  17. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/setup.py +22 -3
  18. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/mask_image.py +0 -0
  19. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/camera/demo.py +5 -3
  20. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/fall_dataset.py +0 -0
  21. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/parking_rois_gopro.py +0 -0
  22. pybaseutils-2.4.35/test_py/demo3.py +21 -0
  23. pybaseutils-2.4.35/test_py/demo4.py +30 -0
  24. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_gif_video.py +3 -1
  25. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/qrcode/__init__.py +0 -0
  26. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/qrcode/demo.py +0 -0
  27. pybaseutils-2.4.34/test_py/demo3.py +0 -67
  28. pybaseutils-2.4.34/test_py/demo4.py +0 -70
  29. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/LICENCE +0 -0
  30. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/README.md +0 -0
  31. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/__init__.py +0 -0
  32. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/audio_utils.py +0 -0
  33. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/pyaudio_utils.py +0 -0
  34. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/vad_utils.py +0 -0
  35. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/__init__.py +0 -0
  36. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/dict_queue.py +0 -0
  37. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/list_queue.py +0 -0
  38. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/batch_utils.py +0 -0
  39. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/build_utils/__init__.py +0 -0
  40. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/build_utils/cython_utils.py +0 -0
  41. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  42. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/__init__.py +0 -0
  43. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/kmean.py +0 -0
  44. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/maxmin_distance.py +0 -0
  45. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/similarity.py +0 -0
  46. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/config_utils.py +0 -0
  47. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/__init__.py +0 -0
  48. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_coco.py +0 -0
  49. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_cvat.py +0 -0
  50. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_labelme.py +0 -0
  51. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_voc.py +0 -0
  52. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/concat_coco.py +0 -0
  53. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  54. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_coco2voc.py +0 -0
  55. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  56. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  57. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  58. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
  59. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  60. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  61. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2coco.py +0 -0
  62. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  63. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2voc.py +0 -0
  64. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  65. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
  66. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  67. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/prelabelme.py +0 -0
  68. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/coords_utils.py +0 -0
  69. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/__init__.py +0 -0
  70. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/camera.py +0 -0
  71. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/corner_utils.py +0 -0
  72. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/frame_record.py +0 -0
  73. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/mouse_utils.py +0 -0
  74. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/nms_utils.py +0 -0
  75. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/video_utils.py +0 -0
  76. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/data_utils.py +0 -0
  77. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/__init__.py +0 -0
  78. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/balanced_classes.py +0 -0
  79. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/base_coco.py +0 -0
  80. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/base_dataset.py +0 -0
  81. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/data_resample.py +0 -0
  82. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  83. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  84. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  85. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  86. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_image_text.py +0 -0
  87. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_labelme.py +0 -0
  88. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
  89. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_video_folder.py +0 -0
  90. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_video_text.py +0 -0
  91. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_voc.py +0 -0
  92. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_yolo.py +0 -0
  93. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  94. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dict_uils.py +0 -0
  95. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dict_utils.py +0 -0
  96. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/QueueTable.py +0 -0
  97. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/__init__.py +0 -0
  98. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/demo.py +0 -0
  99. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/kalman_filter.py +0 -0
  100. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/mean_filter.py +0 -0
  101. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/motion_filter.py +0 -0
  102. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/pose_filter.py +0 -0
  103. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/font_style/__init__.py +0 -0
  104. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/font_utils.py +0 -0
  105. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/geometry_tools.py +0 -0
  106. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/heatmap_utils.py +0 -0
  107. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/http_utils.py +0 -0
  108. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/json_utils.py +0 -0
  109. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/log.py +0 -0
  110. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/log_utils.py +0 -0
  111. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/media/__init__.py +0 -0
  112. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/media/ffmpeg_utils.py +0 -0
  113. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/__init__.py +0 -0
  114. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/accuracy.py +0 -0
  115. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/average_meter.py +0 -0
  116. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/plot_pr.py +0 -0
  117. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/plot_roc.py +0 -0
  118. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/nets_utils.py +0 -0
  119. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/numpy_utils.py +0 -0
  120. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pandas_utils.py +0 -0
  121. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/plot_utils.py +0 -0
  122. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/__init__.py +0 -0
  123. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/bones_utils.py +0 -0
  124. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/human_pose.py +0 -0
  125. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/pose_utils.py +0 -0
  126. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pycpp/__init__.py +0 -0
  127. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pycpp/demo.py +0 -0
  128. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pycpp/main.py +0 -0
  129. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/server/__init__.py +0 -0
  130. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/server/apm_server.py +0 -0
  131. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/setup_config.py +0 -0
  132. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/singleton_utils.py +0 -0
  133. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/text_utils.py +0 -0
  134. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/thread_utils.py +0 -0
  135. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/time_utils.py +0 -0
  136. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracemalloc_utils.py +0 -0
  137. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracemalloc_utils2.py +0 -0
  138. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/QueueTable.py +0 -0
  139. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/__init__.py +0 -0
  140. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/demo.py +0 -0
  141. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/kalman_filter.py +0 -0
  142. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/mean_filter.py +0 -0
  143. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/motion_filter.py +0 -0
  144. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/pose_filter.py +0 -0
  145. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/__init__.py +0 -0
  146. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/affine_transform.py +0 -0
  147. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/face_alignment.py +0 -0
  148. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/imgaug_utils.py +0 -0
  149. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/transform_utils.py +0 -0
  150. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/__init__.py +0 -0
  151. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/app_gradio_image.py +0 -0
  152. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/app_stweb_image.py +0 -0
  153. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/app_webio_image.py +0 -0
  154. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/demo.py +0 -0
  155. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/word_utils.py +0 -0
  156. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/worker.py +0 -0
  157. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/yaml_utils.py +0 -0
  158. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/Image_enhance/__init__.py +0 -0
  159. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/Image_enhance/dmeo01.py +0 -0
  160. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/__init__.py +0 -0
  161. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/download_pdf.py +0 -0
  162. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/search_baidu.py +0 -0
  163. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/search_biying.py +0 -0
  164. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/__init__.py +0 -0
  165. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/__init__.py +0 -0
  166. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/action_dataset.py +0 -0
  167. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/build_cython.py +0 -0
  168. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/build_pyarmor.py +0 -0
  169. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/build_service.py +0 -0
  170. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/convert_cvat2labelme.py +0 -0
  171. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/convert_labelme2coco.py +0 -0
  172. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/convert_labelme2voc.py +0 -0
  173. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/copy_move.py +0 -0
  174. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_labelme_crop_aije.py +0 -0
  175. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
  176. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_labelme_shock.py +0 -0
  177. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_motion_blur.py +0 -0
  178. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_video_aije.py +0 -0
  179. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_voc_crop.py +0 -0
  180. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_voc_vis.py +0 -0
  181. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/get_pair_data.py +0 -0
  182. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/video_convertor.py +0 -0
  183. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/__init__.py +0 -0
  184. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/demo.py +0 -0
  185. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/main.py +0 -0
  186. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/main_read.py +0 -0
  187. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/segment.py +0 -0
  188. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  189. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/speechbrain_demo.py +0 -0
  190. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio_demo1.py +0 -0
  191. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/camera/__init__.py +0 -0
  192. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/camera.py +0 -0
  193. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/captcha/__init__.py +0 -0
  194. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/captcha/demo.py +0 -0
  195. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/class_attribute.py +0 -0
  196. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/class_names.py +0 -0
  197. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/AffectNet.py +0 -0
  198. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/AsianMovie.py +0 -0
  199. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/BITVehicle2voc.py +0 -0
  200. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/BSTLD2voc.py +0 -0
  201. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/CCPD.py +0 -0
  202. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/CCPD2voc.py +0 -0
  203. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/FL3D_dataset.py +0 -0
  204. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/FreiHAND2coco.py +0 -0
  205. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/MTFL2voc.py +0 -0
  206. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/TT100K.py +0 -0
  207. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/WaterMeters1.py +0 -0
  208. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/WaterMeters2.py +0 -0
  209. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/__init__.py +0 -0
  210. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/car_accident.py +0 -0
  211. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/concat_coco.py +0 -0
  212. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_coco2voc.py +0 -0
  213. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_cvat2labelme.py +0 -0
  214. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_gesture2hand.py +0 -0
  215. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2coco.py +0 -0
  216. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2cvat.py +0 -0
  217. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2labelme.py +0 -0
  218. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2voc.py +0 -0
  219. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_voc2labelme.py +0 -0
  220. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_yolo2labelme.py +0 -0
  221. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/fatigue_driving.py +0 -0
  222. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/fdd_dataset.py +0 -0
  223. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/get_pair_data.py +0 -0
  224. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/handpose2coco.py +0 -0
  225. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/insects_for_aichallenger.py +0 -0
  226. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/tt100k_utils.py +0 -0
  227. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/ua_detrac2voc.py +0 -0
  228. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/ucf101_dataset.py +0 -0
  229. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/voc_sbd2labelme.py +0 -0
  230. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/__init__.py +0 -0
  231. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/build_cython.py +0 -0
  232. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/build_pyarmor.py +0 -0
  233. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/cryptography_demo.py +0 -0
  234. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/fun_sum.py +0 -0
  235. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/main.py +0 -0
  236. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/model_des_enctypt.py +0 -0
  237. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/model_enctypt.py +0 -0
  238. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/date_dataset.py +0 -0
  239. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/date_demo.py +0 -0
  240. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/datedataset_bk.py +0 -0
  241. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo1.py +0 -0
  242. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo2.py +0 -0
  243. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_async_await1.py +0 -0
  244. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_async_await2.py +0 -0
  245. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_coco_vis.py +0 -0
  246. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_copy_files.py +0 -0
  247. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_copy_files_for_voc.py +0 -0
  248. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_ffmpy.py +0 -0
  249. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_annular_to_rect.py +0 -0
  250. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_pair_file.py +0 -0
  251. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_polygon.py +0 -0
  252. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_trt.py +0 -0
  253. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_get_file_label.py +0 -0
  254. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_get_file_list.py +0 -0
  255. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_gif.py +0 -0
  256. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_image_crop.py +0 -0
  257. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_kpts.py +0 -0
  258. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_labelme.py +0 -0
  259. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_labelme_crop.py +0 -0
  260. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_lableme_vis.py +0 -0
  261. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_letterbox.py +0 -0
  262. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_metrics.py +0 -0
  263. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_mosaic.py +0 -0
  264. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_mouse.py +0 -0
  265. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_nii.py +0 -0
  266. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_pandas.py +0 -0
  267. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_plot.py +0 -0
  268. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_prelabelme.py +0 -0
  269. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_rename.py +0 -0
  270. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_standard_image .py +0 -0
  271. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_standard_video .py +0 -0
  272. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_taichi.py +0 -0
  273. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_video2frame.py +0 -0
  274. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_video_crop.py +0 -0
  275. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_video_segm.py +0 -0
  276. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_voc_crop.py +0 -0
  277. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_voc_vis.py +0 -0
  278. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_word_similar.py +0 -0
  279. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_worker1.py +0 -0
  280. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_worker2.py +0 -0
  281. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/__init__.py +0 -0
  282. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/demo.py +0 -0
  283. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/detect_face_person.py +0 -0
  284. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/predet_labelme.py +0 -0
  285. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/edit_distance/__init__.py +0 -0
  286. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/edit_distance/demo.py +0 -0
  287. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/edit_distance/text_matching.py +0 -0
  288. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/fast_api/__init__.py +0 -0
  289. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/fast_api/create_image_url.py +0 -0
  290. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/fast_api/get_image_url.py +0 -0
  291. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/__init__.py +0 -0
  292. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/app.py +0 -0
  293. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/utils/__init__.py +0 -0
  294. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/utils/utils.py +0 -0
  295. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/get_file_list.py +0 -0
  296. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/gradio_app.py +0 -0
  297. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/gradio_app_v2.py +0 -0
  298. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/__init__.py +0 -0
  299. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/demo_correction_v1.py +0 -0
  300. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/demo_correction_v2.py +0 -0
  301. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/demo_correction_v3.py +0 -0
  302. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/kafka_worker.py +0 -0
  303. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/men_tracemalloc.py +0 -0
  304. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/__init__.py +0 -0
  305. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/demo01.py +0 -0
  306. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/demo02.py +0 -0
  307. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/hello_milvus.py +0 -0
  308. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/milvus_client.py +0 -0
  309. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/model_process.py +0 -0
  310. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/performance.py +0 -0
  311. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/pose/__init__.py +0 -0
  312. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/pose/human_pose.py +0 -0
  313. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/redis_py/__init__.py +0 -0
  314. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/redis_py/knn_search.py +0 -0
  315. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/redis_py/redis_client.py +0 -0
  316. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/__init__.py +0 -0
  317. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/base.py +0 -0
  318. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/component.py +0 -0
  319. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/main.py +0 -0
  320. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/register.py +0 -0
  321. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/GRU.py +0 -0
  322. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/TCN.py +0 -0
  323. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/__init__.py +0 -0
  324. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/demo.py +0 -0
  325. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/slowfastnet.py +0 -0
  326. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_camera.py +0 -0
  327. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_fr/__init__.py +0 -0
  328. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_fr/demo11.py +0 -0
  329. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_fr/idcardocr.py +0 -0
  330. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/web_socket/__init__.py +0 -0
  331. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/web_socket/asr_clients.py +0 -0
  332. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/web_socket/asr_service.py +0 -0
  333. {pybaseutils-2.4.34 → pybaseutils-2.4.35}/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.4.35
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.4.35'
@@ -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,8 @@
10
10
  import cv2
11
11
  import matplotlib.pyplot as plt
12
12
  import numpy as np
13
+ from collections import defaultdict, Counter
14
+ from pybaseutils import file_utils
13
15
 
14
16
  VOC_NAMES = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat",
15
17
  "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person",
@@ -28,6 +30,30 @@ COCO_NAMES = ['background', 'person', 'bicycle', 'car', 'motorcycle', 'airplane'
28
30
  'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
29
31
  'teddy bear', 'hair drier', 'toothbrush']
30
32
 
33
+ color_table = [(0, 0, 0), (0, 255, 0), (255, 0, 0), (0, 0, 255), (0, 255, 255), (255, 0, 255), (255, 255, 0),
34
+ (128, 0, 0), (0, 128, 0), (128, 128, 0),
35
+ (0, 0, 128), (128, 0, 128), (0, 128, 128), (128, 128, 128),
36
+ (64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0),
37
+ (64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128),
38
+ (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)] * 100
39
+
40
+
41
+ class ColorHash():
42
+ def __init__(self):
43
+ self.color = dict()
44
+ self.cnums = len(color_table)
45
+
46
+ def get_color(self, label: str):
47
+ """
48
+ :param label: str or list
49
+ :return:
50
+ """
51
+ h = file_utils.get_hash(texts=[str(label)])
52
+ if h not in self.color:
53
+ i = len(self.color) + 1
54
+ self.color[h] = color_table[i % self.cnums]
55
+ return self.color[h]
56
+
31
57
 
32
58
  def get_colormap(data_type="custom"):
33
59
  if data_type == 'pascal':
@@ -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读取文件
@@ -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_hash = color_utils.ColorHash()
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]]
@@ -1167,7 +1169,7 @@ def draw_image_boxes_labels_texts(image, boxes, labels, texts, color=None, thick
1167
1169
  for i, (label, bbox, name) in enumerate(zip(labels, boxes, texts)):
1168
1170
  bbox = [int(b) for b in bbox]
1169
1171
  if color_type == "class":
1170
- c = color if color else colors[(int(label) + 1) % 20] # 相同类别相同颜色
1172
+ c = color if color else color_hash.get_color(label) # 相同类别相同颜色
1171
1173
  else:
1172
1174
  c = color if color else colors[(i + 1) % 20] # 每个实例不同颜色
1173
1175
  image = draw_image_bbox_text(image, bbox, str(name), color=c, thickness=thickness, fontScale=fontScale,
@@ -1472,13 +1474,12 @@ def draw_text(image, point, text, color=(255, 0, 0), fontScale=0, thickness=0, d
1472
1474
  """
1473
1475
  point = (int(point[0]), int(point[1]))
1474
1476
  thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1475
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
1476
- # fontFace=cv2.FONT_HERSHEY_SIMPLEX
1477
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
1477
1478
  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])
1479
+ text_wh, baseline = cv2.getTextSize(str(text), fontFace, fontScale, abs(thickness))
1480
+ text_loc = (point[0], point[1] + text_wh[1])
1480
1481
  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
+ (text_loc[0] + text_wh[0], text_loc[1] + text_wh[1]), color=color, thickness=-1)
1482
1483
  # draw score value
1483
1484
  cv2.putText(image, str(text), (text_loc[0], text_loc[1] + baseline), fontFace, fontScale, (255, 255, 255),
1484
1485
  abs(thickness), 2)
@@ -1489,7 +1490,7 @@ def draw_text(image, point, text, color=(255, 0, 0), fontScale=0, thickness=0, d
1489
1490
  return image
1490
1491
 
1491
1492
 
1492
- def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, alpha=0, drawType="custom", top=True):
1493
+ def draw_image_bbox_text_bk(image, bbox, text, color, thickness=2, fontScale=0.8, alpha=0, drawType="custom", top=True):
1493
1494
  """
1494
1495
  :param image:
1495
1496
  :param bbox:
@@ -1508,32 +1509,100 @@ def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, a
1508
1509
  thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1509
1510
  # text_loc = (bbox[0], bbox[1]) if top else (bbox[0], bbox[3])
1510
1511
  if not text: drawType = "simple"
1511
- text_size, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, abs(thickness))
1512
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1512
1513
  if top:
1513
- # text_loc = (bbox[0], bbox[1] + text_size[1]) # 在左上角下方绘制文字
1514
+ # text_loc = (bbox[0], bbox[1] + text_wh[1]) # 在左上角下方绘制文字
1514
1515
  text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
1515
1516
  else:
1516
- text_loc = (bbox[0], bbox[3] + text_size[1] + baseline // 2)
1517
+ text_loc = (bbox[0], bbox[3] + text_wh[1] + baseline // 2)
1517
1518
  if drawType == "chinese" or drawType == "ch":
1518
1519
  if not top: text_loc = (text_loc[0], text_loc[1] - baseline)
1519
1520
  cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
1520
1521
  cv2_putText(image, str(text), text_loc, color=color, fontScale=fontScale, thickness=abs(thickness))
1521
1522
  elif drawType == "simple" or drawType == "en":
1522
1523
  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
+ cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
1524
1525
  elif drawType == "custom":
1526
+ text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
1527
+ # text_loc = (bbox[0], bbox[1] + baseline) # 在左上角上方绘制文字
1525
1528
  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
+ bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
1530
+ bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
1531
+ # bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
1529
1532
  cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
1530
1533
  cv2.rectangle(image, bg1, bg2, color, -1)
1531
1534
  # draw score value
1532
- cv2.putText(image, str(text), (text_loc[0], text_loc[1]), cv2.FONT_HERSHEY_SIMPLEX, fontScale,
1535
+ cv2.putText(image, str(text), (text_loc[0], text_loc[1]), cv2.FONT_HERSHEY_COMPLEX, fontScale,
1533
1536
  (255, 255, 255), abs(thickness))
1534
1537
  return image
1535
1538
 
1536
1539
 
1540
+ def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, alpha=0, drawType="custom", top=True):
1541
+ """
1542
+ :param image:
1543
+ :param bbox:
1544
+ :param color:
1545
+ :param text:
1546
+ :param drawType:
1547
+ :param top:
1548
+ :return:
1549
+ """
1550
+ text = str(text)
1551
+ if alpha > 0:
1552
+ bgimg = draw_image_bbox_text(image.copy(), bbox, text=text, color=color, thickness=thickness,
1553
+ fontScale=fontScale, drawType=drawType, top=top, alpha=0)
1554
+ image[:] = cv2.addWeighted(bgimg, 1 - alpha, image, alpha, 0)
1555
+ return image
1556
+ if drawType == "ch" or drawType == "chinese":
1557
+ image = draw_ch_text(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
1558
+ elif drawType == "simple":
1559
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1560
+ text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
1561
+ cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness, 8, 0)
1562
+ cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
1563
+ else: # custom ,en
1564
+ image = draw_en_text(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
1565
+ return image
1566
+
1567
+
1568
+ def draw_ch_text(image, bbox, text, color, thickness=2, fontScale=0.8):
1569
+ thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1570
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1571
+ text_wh = (text_wh[0], int(text_wh[1] * 0.7)) # 与draw_en_text区别,底纹缩小80%
1572
+ text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
1573
+ text_bgy = text_loc[1] - text_wh[1] - baseline // 2
1574
+ if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
1575
+ text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
1576
+ cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
1577
+ bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
1578
+ bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
1579
+ # bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
1580
+ cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
1581
+ cv2.rectangle(image, bg1, bg2, color, -1)
1582
+ # draw score value
1583
+ cv2_putText(image, str(text), text_loc, color=(255, 255, 255), fontScale=fontScale, thickness=abs(thickness))
1584
+ return image
1585
+
1586
+
1587
+ def draw_en_text(image, bbox, text, color, thickness=2, fontScale=0.8):
1588
+ thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1589
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1590
+ text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
1591
+ text_bgy = text_loc[1] - text_wh[1] - baseline // 2
1592
+ if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
1593
+ text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
1594
+ cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
1595
+ bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
1596
+ bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
1597
+ # bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
1598
+ cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
1599
+ cv2.rectangle(image, bg1, bg2, color, -1)
1600
+ # draw score value
1601
+ cv2.putText(image, str(text), (text_loc[0], text_loc[1]), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=fontScale,
1602
+ color=(255, 255, 255), thickness=abs(thickness))
1603
+ return image
1604
+
1605
+
1537
1606
  def draw_text_line(image, point, text_line: str, bg_color=(255, 0, 0), thickness=0, fontScale=0, drawType="custom"):
1538
1607
  """
1539
1608
  :param image:
@@ -1543,14 +1612,13 @@ def draw_text_line(image, point, text_line: str, bg_color=(255, 0, 0), thickness
1543
1612
  :return:
1544
1613
  """
1545
1614
  thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
1546
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
1547
- # fontFace=cv2.FONT_HERSHEY_SIMPLEX
1615
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
1548
1616
  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)
1617
+ # text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
1618
+ text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
1551
1619
  for i, text in enumerate(text_line):
1552
1620
  if text:
1553
- draw_point = (point[0], point[1] + (text_size[1] + 2 + baseline) * i)
1621
+ draw_point = (point[0], point[1] + (text_wh[1] + 2 + baseline) * i)
1554
1622
  image = draw_text(image, draw_point, text, bg_color, thickness=thickness, drawType=drawType)
1555
1623
  return image
1556
1624
 
@@ -1599,11 +1667,11 @@ def get_font_type(size, font=""):
1599
1667
 
1600
1668
  def cv2_putText(img, text, point, fontFace=None, fontScale=0.8, color=(255, 0, 0), thickness=None):
1601
1669
  # 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))
1670
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
1603
1671
  pilimg = Image.fromarray(img) # Image.fromarray()将数组类型转成图片格式,与np.array()相反
1604
1672
  draw = ImageDraw.Draw(pilimg) # PIL图片上打印汉字
1605
- size = text_size[1] # 字体大小
1606
- point = (point[0], point[1] - text_size[1] + baseline // 2)
1673
+ size = text_wh[1] # 字体大小
1674
+ point = (point[0], point[1] - text_wh[1] + baseline // 2)
1607
1675
  font = get_font_type(size=size)
1608
1676
  draw.text(point, text, color, font)
1609
1677
  img[:] = np.asarray(pilimg)
@@ -2333,7 +2401,7 @@ def draw_yaw_pitch_roll_in_right_axis(image,
2333
2401
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
2334
2402
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
2335
2403
  if vis:
2336
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
2404
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
2337
2405
  image = cv2.putText(image, str(text),
2338
2406
  # (int(cx), int(cy) + 10),
2339
2407
  (10, 10),
@@ -2379,7 +2447,7 @@ def draw_yaw_pitch_roll_in_left_axis(image,
2379
2447
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
2380
2448
  cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
2381
2449
  if vis:
2382
- fontFace = cv2.FONT_HERSHEY_SIMPLEX
2450
+ fontFace = cv2.FONT_HERSHEY_COMPLEX
2383
2451
  image = cv2.putText(image, str(text),
2384
2452
  # (int(cx), int(cy) + 10),
2385
2453
  (10, 10),
@@ -2715,6 +2783,34 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
2715
2783
  return image
2716
2784
 
2717
2785
 
2786
+ def draw_image_contours_labels_texts(image, contours: List[np.ndarray], labels=[], texts=[], color=(), alpha=0.5,
2787
+ thickness=1, fontScale=0.8, drawType="ch", colors=None):
2788
+ """
2789
+ 参考:draw_image_mask_color
2790
+ :param image:
2791
+ :param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
2792
+ :param texts:轮廓文本
2793
+ :param color:绘制轮廓的颜色
2794
+ :param alpha:绘制颜色的透明度 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
2795
+ :param thickness:轮廓线宽
2796
+ :return:
2797
+ """
2798
+ colors = [(0, 0, 0)] + colors if colors else color_table
2799
+ for i in range(0, len(contours)):
2800
+ c = color if color else color_hash.get_color(labels[i]) # 相同类别相同颜色
2801
+ t = str(texts[i]) if texts else ""
2802
+ p = np.asarray(contours[i], dtype=np.int32)
2803
+ b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))
2804
+ if len(p.shape) == 2: p = [p]
2805
+ image[:] = cv2.drawContours(image, p, contourIdx=-1, color=c, thickness=thickness)
2806
+ bgimg = image.copy()
2807
+ bgimg = cv2.fillPoly(bgimg, p, color=c)
2808
+ image[:] = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
2809
+ if t: image[:] = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness,
2810
+ fontScale=fontScale, drawType=drawType)
2811
+ return image
2812
+
2813
+
2718
2814
  draw_image_mask_color = color_utils.draw_image_mask_color
2719
2815
 
2720
2816
 
@@ -85,7 +85,7 @@ def get_confusion_matrix(true_labels, pred_labels, target_names=None, filename=N
85
85
 
86
86
 
87
87
  def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
88
- output_dict=False, matrix=False, plot=False):
88
+ output_dict=False, output_csv="", matrix=False, plot=False):
89
89
  """
90
90
  Usage
91
91
  -------
@@ -108,6 +108,7 @@ def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
108
108
  :param target_names:
109
109
  :param labels:
110
110
  :param output_dict:
111
+ :param output_csv: 'output/data.csv'
111
112
  :param matrix: 是否绘制混淆矩阵
112
113
  :return:
113
114
  """
@@ -132,6 +133,10 @@ def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
132
133
  result["accuracy"] = {'precision': p, 'recall': r, 'f1-score': result["accuracy"], 'support': support}
133
134
  output = pandas_utils.dict2df(result)
134
135
  output = output.round(4) # 保留4位小数
136
+ if output_csv:
137
+ output_csv = output_csv.replace(".csv", "-f1s{:3.4f}.csv".format(result["accuracy"]["f1-score"]))
138
+ output.to_csv(output_csv, index=True)
139
+ # TODO: 若发现表格中英文字体显示没有对齐,则需要安装wcwidth库: pip install --upgrade tabulate wcwidth
135
140
  output = output.to_markdown()
136
141
  if matrix:
137
142
  conf_matrix = get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
@@ -176,10 +181,10 @@ def create_file_path(filename):
176
181
  if __name__ == "__main__":
177
182
  # true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
178
183
  # pred_labels = [1, 1, 2, 2, 2, 1, 0] # X
179
- true_labels = ["A", "B", "A", "B", "C", "D"]
180
- pred_labels = ["A", "D", "C", "B", "C", "A"]
184
+ true_labels = ["A", "B机器", "A机器人", "B", "C", "D"]
185
+ pred_labels = ["A", "D", "C", "B", "C", "A你好"]
181
186
  target_names = None
182
- confuse_file = "./confuse.csv"
187
+ output_excel = "./result.csv"
183
188
  result = get_metrics_report(true_labels, pred_labels, target_names=target_names, output_dict=False,
184
- matrix=True, plot=False)
189
+ output_csv=output_excel, plot=False)
185
190
  print(result)
@@ -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.4.35
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
-
File without changes
@@ -9,15 +9,34 @@
9
9
  """
10
10
  import os
11
11
  import pybaseutils
12
- import pypandoc
13
12
  from setuptools import setup, find_packages
14
13
 
15
14
  root = os.path.dirname(__file__)
16
- long_description = pypandoc.convert_file('README.md', 'rst')
15
+
16
+
17
+ def get_description():
18
+ """
19
+ 安全读取 README 作为 long_description。
20
+ 优先尝试用 pypandoc 转换为 rst;若不可用则回退到原始 markdown。
21
+ """
22
+ mdfile = os.path.join(root, 'README.md')
23
+ try: # 优先尝试 pypandoc 转换
24
+ import pypandoc
25
+ return pypandoc.convert_file(mdfile, 'rst')
26
+ except (ImportError, OSError):
27
+ pass
28
+ try:
29
+ # 回退:直接读取原始 markdown
30
+ with open(mdfile, 'r', encoding='utf-8') as f:
31
+ return f.read()
32
+ except FileNotFoundError:
33
+ return ''
34
+
35
+
17
36
  setup(name='pybaseutils',
18
37
  version=pybaseutils.__version__,
19
38
  description='pybaseutils',
20
- long_description=long_description,
39
+ long_description=get_description(),
21
40
  url='https://github.com/PanJinquan/base-utils',
22
41
  author='PanJinquan',
23
42
  author_email='390737991@qq.com',
@@ -81,7 +81,8 @@ class CameraDemo():
81
81
 
82
82
  def capture(self, title="camera", save_video="./camera.avi"):
83
83
  format = '%Y-%m-%dT%H:%M:%S' # 海康摄像头默认格式
84
- video_url = f"rtsp://{self.username}:{self.password}@{self.ip}/Streaming/Channels/1"
84
+ # video_url = f"rtsp://{self.username}:{self.password}@{self.ip}/Streaming/Channels/1"
85
+ video_url = f"rtsp://{self.username}:{self.password}@{self.ip}:554"
85
86
  print(f"正在连接摄像头: {video_url}")
86
87
  # 创建视频流连接
87
88
  cap = cv2.VideoCapture(video_url)
@@ -140,8 +141,9 @@ class CameraDemo():
140
141
 
141
142
  if __name__ == "__main__":
142
143
  # 摄像头信息,按'q'键退出程序
143
- ip = "192.168.2.35"
144
+ # rtsp://admin:zhgp@2024@192.168.28.61
145
+ ip = "192.168.28.61"
144
146
  username = "admin"
145
- password = "C2332416"
147
+ password = "zhgp@2024"
146
148
  c = CameraDemo(ip, username, password)
147
149
  c.capture()
@@ -0,0 +1,21 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-07-08 14:10:15
7
+ # @Brief :
8
+ # --------------------------------------------------------
9
+ """
10
+ import cv2
11
+ import numpy as np
12
+ from pybaseutils import file_utils, image_utils
13
+
14
+ import cv2
15
+
16
+ data="ABCDabcd你好我是一名学生1234567890"
17
+ fontScale = 1.0
18
+ thickness = 1
19
+ for text in data:
20
+ text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX , fontScale, abs(thickness))
21
+ print(f"fontScale={fontScale}, thickness={thickness}, text={text}, text_wh={text_wh}, baseline={baseline}")
@@ -0,0 +1,30 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-07-08 14:10:15
7
+ # @Brief : 转换labelme标注数据为voc格式
8
+ # --------------------------------------------------------
9
+ """
10
+ import os
11
+ import numpy as np
12
+ import cv2
13
+ from pybaseutils.converter import convert_labelme2voc
14
+ from pybaseutils import time_utils, image_utils, file_utils, json_utils
15
+ fontScale=2.0
16
+ alpha = 0.
17
+ if __name__ == "__main__":
18
+ image_file = "../data/test_image/grid1.png"
19
+
20
+ for i in range(100):
21
+ image = cv2.imread(image_file)
22
+ boxes = [[0, i, 500, 300]]
23
+ # texts = ["ABC"] * len(boxes)
24
+ texts = ["ABC你是一名学生"] * len(boxes)
25
+ print(boxes)
26
+ image = image_utils.draw_image_boxes_texts(image, boxes, texts, thickness=1, fontScale=fontScale, alpha=alpha,drawType="simple")
27
+ image_utils.show_image("ch", image)
28
+ image = cv2.imread(image_file)
29
+ image = image_utils.draw_image_boxes_texts(image, boxes, texts, thickness=1, fontScale=fontScale, alpha=alpha,drawType="en")
30
+ image_utils.show_image("en", image)
@@ -39,7 +39,9 @@ def android_gif():
39
39
 
40
40
  def python_gif():
41
41
  video_file = "/home/PKing/nasdata/Project/LLM/MLLM-Factory/docs/chat-demo.mp4"
42
- video_utils.video2gif(video_file, interval=10, func=resize_fun, fps=4, time=(0.5, 24), use_pil=True, vis=True)
42
+ video_file = "/media/PKing/dev1/project/AI-Labelme/docs/video-track-label.mp4"
43
+ # video_utils.video2gif(video_file, interval=10, func=resize_fun, fps=4, time=(0.5, 24), use_pil=True, vis=True)
44
+ video_utils.video2gif(video_file, interval=8, func=resize_fun, fps=4, use_pil=True, vis=True)
43
45
 
44
46
 
45
47
  def image_gif():