pybaseutils 2.2.19__tar.gz → 2.2.21__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 (285) hide show
  1. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/PKG-INFO +7 -3
  2. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/README.md +3 -3
  3. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/__init__.py +1 -1
  4. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/file_utils.py +9 -9
  5. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/font_style/__init__.py +1 -1
  6. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/font_utils.py +19 -5
  7. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/image_utils.py +35 -0
  8. pybaseutils-2.2.21/pybaseutils/web/app_flask_image.py +94 -0
  9. pybaseutils-2.2.19/pybaseutils/web/st_image_web.py → pybaseutils-2.2.21/pybaseutils/web/app_stweb_image.py +2 -1
  10. pybaseutils-2.2.21/pybaseutils/web/app_webio_image.py +94 -0
  11. pybaseutils-2.2.21/pybaseutils/web/demo.py +13 -0
  12. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/PKG-INFO +7 -3
  13. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/SOURCES.txt +8 -3
  14. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_labelme_crop.py +50 -14
  15. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_video_aije.py +3 -3
  16. pybaseutils-2.2.21/test_py/audio_demo1.py +32 -0
  17. pybaseutils-2.2.21/test_py/demo1.py +14 -0
  18. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_lableme_vis.py +3 -3
  19. pybaseutils-2.2.21/test_py/flask_demo/app.py +93 -0
  20. pybaseutils-2.2.21/test_py/flask_demo/utils/__init__.py +7 -0
  21. pybaseutils-2.2.21/test_py/flask_demo/utils/utils.py +41 -0
  22. pybaseutils-2.2.19/test_py/demo1.py +0 -48
  23. pybaseutils-2.2.19/test_py/flask_demo/func.py +0 -18
  24. pybaseutils-2.2.19/test_py/flask_demo/server.py +0 -40
  25. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/LICENCE +0 -0
  26. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/__init__.py +0 -0
  27. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/audio_utils.py +0 -0
  28. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/pyaudio_utils.py +0 -0
  29. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/vad_utils.py +0 -0
  30. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/base64_utils.py +0 -0
  31. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/batch_utils.py +0 -0
  32. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/build_utils/__init__.py +0 -0
  33. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/build_utils/cython_utils.py +0 -0
  34. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  35. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/__init__.py +0 -0
  36. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/kmean.py +0 -0
  37. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/maxmin_distance.py +0 -0
  38. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/similarity.py +0 -0
  39. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/color_utils.py +0 -0
  40. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/config_utils.py +0 -0
  41. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/__init__.py +0 -0
  42. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_coco.py +0 -0
  43. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_cvat.py +0 -0
  44. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_labelme.py +0 -0
  45. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_voc.py +0 -0
  46. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/concat_coco.py +0 -0
  47. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  48. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_coco2voc.py +0 -0
  49. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  50. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  51. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  52. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  53. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  54. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2coco.py +0 -0
  55. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  56. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2voc.py +0 -0
  57. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  58. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  59. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/coords_utils.py +0 -0
  60. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/__init__.py +0 -0
  61. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/corner_utils.py +0 -0
  62. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/monitor.py +0 -0
  63. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/mouse_utils.py +0 -0
  64. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/nms_utils.py +0 -0
  65. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/video_utils.py +0 -0
  66. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/__init__.py +0 -0
  67. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/balanced_classes.py +0 -0
  68. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/base_coco.py +0 -0
  69. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/base_dataset.py +0 -0
  70. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/data_resample.py +0 -0
  71. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  72. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  73. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  74. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  75. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_image_text.py +0 -0
  76. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_labelme.py +0 -0
  77. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_voc.py +0 -0
  78. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_yolo.py +0 -0
  79. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  80. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/QueueTable.py +0 -0
  81. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/__init__.py +0 -0
  82. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/demo.py +0 -0
  83. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/kalman_filter.py +0 -0
  84. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/mean_filter.py +0 -0
  85. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/motion_filter.py +0 -0
  86. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/pose_filter.py +0 -0
  87. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/geometry_tools.py +0 -0
  88. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/heatmap_utils.py +0 -0
  89. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/http_utils.py +0 -0
  90. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/json_utils.py +0 -0
  91. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/log.py +0 -0
  92. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/log_utils.py +0 -0
  93. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/__init__.py +0 -0
  94. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/accuracy.py +0 -0
  95. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/average_meter.py +0 -0
  96. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/class_report.py +0 -0
  97. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/plot_pr.py +0 -0
  98. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/plot_roc.py +0 -0
  99. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/numpy_utils.py +0 -0
  100. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pandas_utils.py +0 -0
  101. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/plot_utils.py +0 -0
  102. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/__init__.py +0 -0
  103. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/bones_utils.py +0 -0
  104. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/human_pose.py +0 -0
  105. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/pose_utils.py +0 -0
  106. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pycpp/__init__.py +0 -0
  107. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pycpp/demo.py +0 -0
  108. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pycpp/main.py +0 -0
  109. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/server/__init__.py +0 -0
  110. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/server/apm_server.py +0 -0
  111. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/setup_config.py +0 -0
  112. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/singleton_utils.py +0 -0
  113. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/text_utils.py +0 -0
  114. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/thread_utils.py +0 -0
  115. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/time_utils.py +0 -0
  116. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracemalloc_utils.py +0 -0
  117. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracemalloc_utils2.py +0 -0
  118. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/QueueTable.py +0 -0
  119. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/__init__.py +0 -0
  120. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/demo.py +0 -0
  121. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/kalman_filter.py +0 -0
  122. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/mean_filter.py +0 -0
  123. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/motion_filter.py +0 -0
  124. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/pose_filter.py +0 -0
  125. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/__init__.py +0 -0
  126. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/affine_transform.py +0 -0
  127. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/augment_utils.py +0 -0
  128. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/face_alignment.py +0 -0
  129. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/transform_utils.py +0 -0
  130. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/web/__init__.py +0 -0
  131. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/word_utils.py +0 -0
  132. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/worker.py +0 -0
  133. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/yaml_utils.py +0 -0
  134. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/dependency_links.txt +0 -0
  135. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/not-zip-safe +0 -0
  136. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/top_level.txt +0 -0
  137. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/setup.cfg +0 -0
  138. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/setup.py +0 -0
  139. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/Image_enhance/__init__.py +0 -0
  140. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/Image_enhance/dmeo01.py +0 -0
  141. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/WebCrawler/__init__.py +0 -0
  142. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/WebCrawler/search_image.py +0 -0
  143. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
  144. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/__init__.py +0 -0
  145. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/__init__.py +0 -0
  146. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/action_dataset.py +0 -0
  147. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/build_cython.py +0 -0
  148. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/build_pyarmor.py +0 -0
  149. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/build_service.py +0 -0
  150. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/convert_cvat2labelme.py +0 -0
  151. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/convert_labelme2coco.py +0 -0
  152. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/convert_labelme2voc.py +0 -0
  153. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/copy_move.py +0 -0
  154. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_labelme_shock.py +0 -0
  155. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_voc_crop.py +0 -0
  156. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_voc_vis.py +0 -0
  157. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/get_pair_data.py +0 -0
  158. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/video_convertor.py +0 -0
  159. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/__init__.py +0 -0
  160. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/demo.py +0 -0
  161. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/main.py +0 -0
  162. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/main_read.py +0 -0
  163. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/segment.py +0 -0
  164. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  165. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/speechbrain_demo.py +0 -0
  166. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/camera/__init__.py +0 -0
  167. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/camera/demo.py +0 -0
  168. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/captcha/__init__.py +0 -0
  169. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/captcha/demo.py +0 -0
  170. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/class_attribute.py +0 -0
  171. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/class_names.py +0 -0
  172. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/AffectNet.py +0 -0
  173. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/AsianMovie.py +0 -0
  174. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/BITVehicle2voc.py +0 -0
  175. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/BSTLD2voc.py +0 -0
  176. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/CCPD.py +0 -0
  177. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/CCPD2voc.py +0 -0
  178. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/FL3D_dataset.py +0 -0
  179. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/FreiHAND2coco.py +0 -0
  180. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/MTFL2voc.py +0 -0
  181. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/TT100K.py +0 -0
  182. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/WaterMeters1.py +0 -0
  183. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/WaterMeters2.py +0 -0
  184. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/__init__.py +0 -0
  185. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/concat_coco.py +0 -0
  186. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_coco2voc.py +0 -0
  187. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_cvat2labelme.py +0 -0
  188. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_gesture2hand.py +0 -0
  189. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_labelme2coco.py +0 -0
  190. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_labelme2cvat.py +0 -0
  191. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_labelme2voc.py +0 -0
  192. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_voc2labelme.py +0 -0
  193. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/fatigue_driving.py +0 -0
  194. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/fdd_dataset.py +0 -0
  195. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/get_pair_data.py +0 -0
  196. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/handpose2coco.py +0 -0
  197. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/insects_for_aichallenger.py +0 -0
  198. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/tt100k_utils.py +0 -0
  199. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/ua_detrac2voc.py +0 -0
  200. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/ucf101_dataset.py +0 -0
  201. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/voc_sbd2labelme.py +0 -0
  202. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/__init__.py +0 -0
  203. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/build_cython.py +0 -0
  204. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/build_pyarmor.py +0 -0
  205. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/cryptography_demo.py +0 -0
  206. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/fun_sum.py +0 -0
  207. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/main.py +0 -0
  208. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/model_des_enctypt.py +0 -0
  209. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/model_enctypt.py +0 -0
  210. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/date_dataset.py +0 -0
  211. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/date_demo.py +0 -0
  212. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/datedataset_bk.py +0 -0
  213. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo2.py +0 -0
  214. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo3.py +0 -0
  215. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_async_await1.py +0 -0
  216. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_async_await2.py +0 -0
  217. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_coco_vis.py +0 -0
  218. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_copy_files.py +0 -0
  219. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_copy_files_for_voc.py +0 -0
  220. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_ffmpy.py +0 -0
  221. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_for_pair_file.py +0 -0
  222. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_for_polygon.py +0 -0
  223. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_for_trt.py +0 -0
  224. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_get_file_label.py +0 -0
  225. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_get_file_list.py +0 -0
  226. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_gif.py +0 -0
  227. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_gif_video.py +0 -0
  228. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_image_crop.py +0 -0
  229. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_kpts.py +0 -0
  230. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_labelme.py +0 -0
  231. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_labelme_crop.py +0 -0
  232. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_metrics.py +0 -0
  233. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_mouse.py +0 -0
  234. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_nii.py +0 -0
  235. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_pandas.py +0 -0
  236. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_plot.py +0 -0
  237. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_rename.py +0 -0
  238. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_standard_image .py +0 -0
  239. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_standard_video .py +0 -0
  240. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_taichi.py +0 -0
  241. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_video.py +0 -0
  242. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_video_crop.py +0 -0
  243. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_voc_crop.py +0 -0
  244. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_voc_vis.py +0 -0
  245. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_word_similar.py +0 -0
  246. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_worker1.py +0 -0
  247. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_worker2.py +0 -0
  248. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/__init__.py +0 -0
  249. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/demo.py +0 -0
  250. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/detect_face_person.py +0 -0
  251. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/predet_labelme.py +0 -0
  252. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/edit_distance/__init__.py +0 -0
  253. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/edit_distance/demo.py +0 -0
  254. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/edit_distance/text_matching.py +0 -0
  255. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/flask_demo/__init__.py +0 -0
  256. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/get_file_list.py +0 -0
  257. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/__init__.py +0 -0
  258. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/demo_correction_v1.py +0 -0
  259. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/demo_correction_v2.py +0 -0
  260. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/demo_correction_v3.py +0 -0
  261. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/kafka_worker.py +0 -0
  262. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/men_tracemalloc.py +0 -0
  263. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/__init__.py +0 -0
  264. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/demo01.py +0 -0
  265. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/demo02.py +0 -0
  266. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/hello_milvus.py +0 -0
  267. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/milvus_client.py +0 -0
  268. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/performance.py +0 -0
  269. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/pose/__init__.py +0 -0
  270. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/pose/human_pose.py +0 -0
  271. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/redis_py/__init__.py +0 -0
  272. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/redis_py/knn_search.py +0 -0
  273. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/redis_py/redis_client.py +0 -0
  274. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/__init__.py +0 -0
  275. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/base.py +0 -0
  276. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/component.py +0 -0
  277. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/main.py +0 -0
  278. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/register.py +0 -0
  279. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/GRU.py +0 -0
  280. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/TCN.py +0 -0
  281. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/__init__.py +0 -0
  282. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/demo.py +0 -0
  283. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/test_fr/__init__.py +0 -0
  284. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/test_fr/demo11.py +0 -0
  285. {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/test_fr/idcardocr.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pybaseutils
3
- Version: 2.2.19
3
+ Version: 2.2.21
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -36,11 +36,15 @@ pybaseutils(Python)
36
36
 
37
37
  pybaseutils是个人开发常用的python库,集成了python等常用的算法
38
38
 
39
- - 安装方法1:pip install
40
- - pybaseutils (有延时,可能不是最新版本)
39
+ - 安装方法1:pip install –upgrade -i
40
+ https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils
41
+ (有延时,可能不是最新版本)
41
42
  - 安装方法2:pip install –upgrade -i https://pypi.org/simple
42
43
  pybaseutils (从pypi源下载最新版本)
43
44
 
45
+ (设置默认的镜像源:pip config set global.index-url
46
+ https://pypi.tuna.tsinghua.edu.cn/simple)
47
+
44
48
  一些问题修复说明
45
49
  ----------------
46
50
 
@@ -18,10 +18,10 @@ base_util是个人开发常用的C++库,集成了C/C++ OpenCV等常用的算
18
18
 
19
19
  pybaseutils是个人开发常用的python库,集成了python等常用的算法
20
20
 
21
- - 安装方法1:pip install
22
- - pybaseutils (有延时,可能不是最新版本)
23
- - 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
21
+ - 安装方法1:pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils (有延时,可能不是最新版本)
22
+ - 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
24
23
 
24
+ (设置默认的镜像源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple)
25
25
 
26
26
  ## 一些问题修复说明
27
27
 
@@ -8,4 +8,4 @@
8
8
  # --------------------------------------------------------
9
9
  """
10
10
 
11
- __version__ = '2.2.19'
11
+ __version__ = '2.2.21'
@@ -43,12 +43,11 @@ def get_time(format="p"):
43
43
  :param format:
44
44
  :return:
45
45
  """
46
- if format.lower() == "s":
46
+ if format.lower() == "s": # 精确到秒
47
47
  # time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S')
48
48
  time = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')
49
- elif format.lower() == "p":
50
- # 20200508_143059_379116
51
- time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f')
49
+ elif format.lower() == "p": # 精确到微妙
50
+ time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f') # 20200508_143059_379116
52
51
  time = time[:-2]
53
52
  else:
54
53
  time = (str(datetime.now())[:-10]).replace(' ', '-').replace(':', '-')
@@ -108,14 +107,14 @@ def combine_flags(flags: list, use_time=True, info=True):
108
107
  return out_flags
109
108
 
110
109
 
111
- def write_file(file, data):
110
+ def write_file(file, data, mode='wb'):
112
111
  """写二进制数据"""
113
- with open(file, 'wb') as f: f.write(data)
112
+ with open(file, mode) as f: f.write(data)
114
113
 
115
114
 
116
- def read_file(file):
115
+ def read_file(file, mode='rb'):
117
116
  """读取二进制数据"""
118
- with open(file, 'rb') as f: key = f.read()
117
+ with open(file, mode) as f: key = f.read()
119
118
  return key
120
119
 
121
120
 
@@ -701,7 +700,7 @@ def create_file_path(filename):
701
700
  return out_path
702
701
 
703
702
 
704
- def get_sub_paths(input_dir):
703
+ def get_sub_paths(input_dir, abspath=False):
705
704
  """
706
705
  当前路径下所有子目录
707
706
  :param input_dir:
@@ -715,6 +714,7 @@ def get_sub_paths(input_dir):
715
714
  # print(dirs) # 当前路径下所有子目录
716
715
  # print(files) # 当前路径下所有非目录子文件
717
716
  sub_list.sort()
717
+ if abspath: sub_list = [os.path.join(input_dir, p) for p in sub_list]
718
718
  return sub_list
719
719
 
720
720
 
@@ -6,7 +6,7 @@
6
6
  """
7
7
  import os
8
8
 
9
- # TODO 如果字体缺失,可以把字体拷贝到系统字体目录:cp -r fonts/* ~/.local/share/fonts/
9
+ # TODO 如果字体缺失,可以把字体拷贝到系统字体目录:cp -r font_style/*
10
10
  # windows: C:\Windows\Fonts可查看系统支持的字体
11
11
  # Linux : /usr/share/fonts/truetype 或者~/.local/share/fonts中 可查看系统支持的字体
12
12
 
@@ -58,9 +58,6 @@ class FontType(object):
58
58
  return self.font_type
59
59
 
60
60
 
61
- # font_type = FontType()
62
-
63
-
64
61
  def get_font_type(size, font=""):
65
62
  """
66
63
  Windows字体路径 : /usr/share/fonts/楷体.ttf
@@ -101,8 +98,7 @@ def draw_image_text(image, point, text, style="楷体", size=20, color=(255, 255
101
98
  font = ImageFont.truetype(style, size=size, encoding="utf-8")
102
99
  else:
103
100
  # simhei.ttf 是字体,你如果没有字体,需要下载
104
- font_type.set_font_style(style=style, size=size)
105
- font = font_type.get_font_type()
101
+ font = get_font_type(size=size)
106
102
  draw.text(point, text, fill=color, font=font)
107
103
  image = np.asarray(image)
108
104
  return image
@@ -211,6 +207,24 @@ def get_font_char(font_file, only_chinese=False):
211
207
  return fonts
212
208
 
213
209
 
210
+ def set_pyplot_font(font="simhei"):
211
+ """
212
+ 设置 seaborn,matplotlib等默认字体
213
+ :param font: 字体路径或者名称,或者使用默认的,SimHei
214
+ :return:
215
+ """
216
+ import seaborn
217
+ import matplotlib.pyplot as plt
218
+ import matplotlib.font_manager as fm
219
+ font_file = font if os.path.isfile(font) else FONT_TABLES[font]
220
+ font = os.path.basename(font_file).split(".")[0]
221
+ fm.fontManager.addfont(font_file)
222
+ plt.rcParams['font.sans-serif'] = [font]
223
+ plt.rcParams['axes.unicode_minus'] = False
224
+ seaborn.set_theme(font=font) # 增加一行代码, 设置 seaborn 使用的字体文件
225
+ return font_file
226
+
227
+
214
228
  def draw_font_example():
215
229
  size = 512
216
230
  string = "我"
@@ -1794,6 +1794,17 @@ def nms_boxes_cv2(boxes: np.ndarray, scores: np.ndarray, labels: np.ndarray, sco
1794
1794
  return index
1795
1795
 
1796
1796
 
1797
+ def image2bytes(image):
1798
+ """将numpy数据转换为JPEG编码格式的字节数据"""
1799
+ _, image = cv2.imencode('.jpg', image)
1800
+ return image.tobytes()
1801
+
1802
+
1803
+ def bytes2image(bytes):
1804
+ image = cv2.imdecode(np.frombuffer(bytes, np.uint8), cv2.IMREAD_COLOR)
1805
+ return image
1806
+
1807
+
1797
1808
  def file2base64(file):
1798
1809
  image_base64 = base64.b64encode(open(file, 'rb').read()).decode()
1799
1810
  return image_base64
@@ -2851,6 +2862,29 @@ def get_image_block(image, grid=[3, 3], same=False):
2851
2862
  return image_block
2852
2863
 
2853
2864
 
2865
+ def apply_mosaic(image, boxes, radius=8, scale=[1.0, 1.0]):
2866
+ """
2867
+ 马赛克
2868
+ :param image: BGR image
2869
+ :param boxes: 人脸框(xmin,ymin,xmax,ymax)
2870
+ :param radius: 马赛克强度
2871
+ :param scale: 人脸框扩大范围
2872
+ :return:
2873
+ """
2874
+ h, w = image.shape[:2]
2875
+ boxes = np.asarray(boxes, dtype=np.int32)
2876
+ boxes = extend_xyxy(boxes, scale=scale, valid_range=(0, 0, w, h))
2877
+ for box in boxes:
2878
+ x1, y1, x2, y2 = box
2879
+ roi = image[y1:y2, x1:x2]
2880
+ size = (max((x2 - x1) // radius, 5), max((y2 - y1) // radius, 5))
2881
+ img = cv2.resize(roi, size)
2882
+ # img = cv2.resize(roi, (radius, radius))
2883
+ img = cv2.resize(img, (x2 - x1, y2 - y1), interpolation=cv2.INTER_NEAREST)
2884
+ image[y1:y2, x1:x2] = img
2885
+ return image
2886
+
2887
+
2854
2888
  def image_composite(image: np.ndarray, alpha: np.ndarray, bg_img=(219, 142, 67)):
2855
2889
  """
2856
2890
  图像融合:合成图 = 前景*alpha+背景*(1-alpha)
@@ -3004,6 +3038,7 @@ def get_video_info(video_cap: cv2.VideoCapture, vis=True):
3004
3038
  height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
3005
3039
  num_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
3006
3040
  fps = video_cap.get(cv2.CAP_PROP_FPS)
3041
+ fps = math.ceil(fps)
3007
3042
  if vis: print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
3008
3043
  return width, height, num_frames, fps
3009
3044
 
@@ -0,0 +1,94 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-02-27 16:03:39
7
+ # @Brief : 基于pywebio实现图像处理web小工具
8
+ # 运行方法:python app_webio_image.py
9
+ # --------------------------------------------------------
10
+ """
11
+ import os
12
+ import cv2
13
+ import numpy as np
14
+ from pywebio.input import file_upload, input_group, actions
15
+ from pywebio.output import put_image, put_buttons, put_row, put_column, use_scope, clear, put_text, put_scope
16
+ from pywebio.pin import pin, put_input
17
+ from pywebio.session import set_env
18
+ from pywebio.pin import *
19
+
20
+
21
+ def blur_image(image_path):
22
+ # 读取图像
23
+ image = cv2.imread(image_path)
24
+ # 应用高斯模糊
25
+ blurred_image = cv2.GaussianBlur(image, (15, 15), 0)
26
+ # 保存模糊后的图像
27
+ blurred_image_path = f"blurred_{os.path.basename(image_path)}"
28
+ cv2.imwrite(blurred_image_path, blurred_image)
29
+ return blurred_image_path
30
+
31
+
32
+ def show_image(image_path):
33
+ with use_scope('image_display', clear=True):
34
+ put_image(open(image_path, 'rb').read())
35
+
36
+
37
+ def handle_single_image(file_info):
38
+ file_name = file_info['filename']
39
+ file_content = file_info['content']
40
+ with open(file_name, 'wb') as f:
41
+ f.write(file_content)
42
+ blurred_image_path = blur_image(file_name)
43
+ show_image(blurred_image_path)
44
+
45
+
46
+ def handle_multiple_images(directory):
47
+ global current_image_index
48
+ current_image_index = 0
49
+ images = [os.path.join(directory, f) for f in os.listdir(directory) if
50
+ f.lower().endswith(('.png', '.jpg', '.jpeg'))]
51
+ if not images:
52
+ put_text("No images found in the selected directory.")
53
+ return
54
+ current_image_path = images[current_image_index]
55
+ blurred_image_path = blur_image(current_image_path)
56
+ show_image(blurred_image_path)
57
+ put_buttons(['Previous', 'Next'], onclick=[lambda: switch_image(images, -1), lambda: switch_image(images, 1)])
58
+
59
+
60
+ def switch_image(images, direction):
61
+ global current_image_index
62
+ current_image_index += direction
63
+ current_image_index = max(0, min(current_image_index, len(images) - 1))
64
+ current_image_path = images[current_image_index]
65
+ blurred_image_path = blur_image(current_image_path)
66
+ show_image(blurred_image_path)
67
+
68
+
69
+ def main():
70
+ set_env(output_max_width='80%')
71
+ put_column([
72
+ put_row([
73
+ put_buttons(['选择图片'], onclick=lambda: pin.update(
74
+ name=file_upload(label='选择图片', accept='image/*', help_text='请选择一张图片'))),
75
+ put_buttons(['选择目录'], onclick=lambda: pin.update(name=input_group("选择目录", [
76
+ input('directory', type='text', name='directory', placeholder='请输入目录路径')]))),
77
+ ]),
78
+ put_scope('image_display')
79
+ ])
80
+
81
+ while True:
82
+ event = pin_wait_change('name')
83
+ if event['name'] == 'value':
84
+ value = event['value']
85
+ if isinstance(value, dict): # 单张图片
86
+ handle_single_image(value)
87
+ elif isinstance(value, str): # 目录
88
+ handle_multiple_images(value)
89
+
90
+
91
+ if __name__ == '__main__':
92
+ from pywebio.platform.flask import start_server
93
+
94
+ start_server(main, port=8080, debug=True)
@@ -4,7 +4,8 @@
4
4
  # @Author : Pan
5
5
  # @E-mail :
6
6
  # @Date : 2025-02-18 16:10:49
7
- # @Brief :
7
+ # @Brief : 基于streamlit实现图像处理web小工具
8
+ # 运行方法:streamlit run app_stweb_image.py
8
9
  # --------------------------------------------------------
9
10
  """
10
11
 
@@ -0,0 +1,94 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-02-27 16:03:39
7
+ # @Brief : 基于pywebio实现图像处理web小工具
8
+ # 运行方法:python app_webio_image.py
9
+ # --------------------------------------------------------
10
+ """
11
+ import os
12
+ import cv2
13
+ import numpy as np
14
+ from pywebio.input import file_upload, input_group, actions
15
+ from pywebio.output import put_image, put_buttons, put_row, put_column, use_scope, clear, put_text, put_scope
16
+ from pywebio.pin import pin, put_input
17
+ from pywebio.session import set_env
18
+ from pywebio.pin import *
19
+
20
+
21
+ def blur_image(image_path):
22
+ # 读取图像
23
+ image = cv2.imread(image_path)
24
+ # 应用高斯模糊
25
+ blurred_image = cv2.GaussianBlur(image, (15, 15), 0)
26
+ # 保存模糊后的图像
27
+ blurred_image_path = f"blurred_{os.path.basename(image_path)}"
28
+ cv2.imwrite(blurred_image_path, blurred_image)
29
+ return blurred_image_path
30
+
31
+
32
+ def show_image(image_path):
33
+ with use_scope('image_display', clear=True):
34
+ put_image(open(image_path, 'rb').read())
35
+
36
+
37
+ def handle_single_image(file_info):
38
+ file_name = file_info['filename']
39
+ file_content = file_info['content']
40
+ with open(file_name, 'wb') as f:
41
+ f.write(file_content)
42
+ blurred_image_path = blur_image(file_name)
43
+ show_image(blurred_image_path)
44
+
45
+
46
+ def handle_multiple_images(directory):
47
+ global current_image_index
48
+ current_image_index = 0
49
+ images = [os.path.join(directory, f) for f in os.listdir(directory) if
50
+ f.lower().endswith(('.png', '.jpg', '.jpeg'))]
51
+ if not images:
52
+ put_text("No images found in the selected directory.")
53
+ return
54
+ current_image_path = images[current_image_index]
55
+ blurred_image_path = blur_image(current_image_path)
56
+ show_image(blurred_image_path)
57
+ put_buttons(['Previous', 'Next'], onclick=[lambda: switch_image(images, -1), lambda: switch_image(images, 1)])
58
+
59
+
60
+ def switch_image(images, direction):
61
+ global current_image_index
62
+ current_image_index += direction
63
+ current_image_index = max(0, min(current_image_index, len(images) - 1))
64
+ current_image_path = images[current_image_index]
65
+ blurred_image_path = blur_image(current_image_path)
66
+ show_image(blurred_image_path)
67
+
68
+
69
+ def main():
70
+ set_env(output_max_width='80%')
71
+ put_column([
72
+ put_row([
73
+ put_buttons(['选择图片'], onclick=lambda: pin.update(
74
+ name=file_upload(label='选择图片', accept='image/*', help_text='请选择一张图片'))),
75
+ put_buttons(['选择目录'], onclick=lambda: pin.update(name=input_group("选择目录", [
76
+ input('directory', type='text', name='directory', placeholder='请输入目录路径')]))),
77
+ ]),
78
+ put_scope('image_display')
79
+ ])
80
+
81
+ while True:
82
+ event = pin_wait_change('name')
83
+ if event['name'] == 'value':
84
+ value = event['value']
85
+ if isinstance(value, dict): # 单张图片
86
+ handle_single_image(value)
87
+ elif isinstance(value, str): # 目录
88
+ handle_multiple_images(value)
89
+
90
+
91
+ if __name__ == '__main__':
92
+ from pywebio.platform.flask import start_server
93
+
94
+ start_server(main, port=8080, debug=True)
@@ -0,0 +1,13 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail :
6
+ # @Date : 2025-02-27 16:03:39
7
+ # @Brief : 基于pywebio实现图像处理web小工具
8
+ # 运行方法:python app_webio_image.py
9
+ # --------------------------------------------------------
10
+ """
11
+
12
+ if __name__ == '__main__':
13
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pybaseutils
3
- Version: 2.2.19
3
+ Version: 2.2.21
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -36,11 +36,15 @@ pybaseutils(Python)
36
36
 
37
37
  pybaseutils是个人开发常用的python库,集成了python等常用的算法
38
38
 
39
- - 安装方法1:pip install
40
- - pybaseutils (有延时,可能不是最新版本)
39
+ - 安装方法1:pip install –upgrade -i
40
+ https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils
41
+ (有延时,可能不是最新版本)
41
42
  - 安装方法2:pip install –upgrade -i https://pypi.org/simple
42
43
  pybaseutils (从pypi源下载最新版本)
43
44
 
45
+ (设置默认的镜像源:pip config set global.index-url
46
+ https://pypi.tuna.tsinghua.edu.cn/simple)
47
+
44
48
  一些问题修复说明
45
49
  ----------------
46
50
 
@@ -119,8 +119,12 @@ pybaseutils/transforms/augment_utils.py
119
119
  pybaseutils/transforms/face_alignment.py
120
120
  pybaseutils/transforms/transform_utils.py
121
121
  pybaseutils/web/__init__.py
122
- pybaseutils/web/st_image_web.py
122
+ pybaseutils/web/app_flask_image.py
123
+ pybaseutils/web/app_stweb_image.py
124
+ pybaseutils/web/app_webio_image.py
125
+ pybaseutils/web/demo.py
123
126
  test_py/__init__.py
127
+ test_py/audio_demo1.py
124
128
  test_py/class_attribute.py
125
129
  test_py/class_names.py
126
130
  test_py/date_dataset.py
@@ -245,8 +249,9 @@ test_py/edit_distance/__init__.py
245
249
  test_py/edit_distance/demo.py
246
250
  test_py/edit_distance/text_matching.py
247
251
  test_py/flask_demo/__init__.py
248
- test_py/flask_demo/func.py
249
- test_py/flask_demo/server.py
252
+ test_py/flask_demo/app.py
253
+ test_py/flask_demo/utils/__init__.py
254
+ test_py/flask_demo/utils/utils.py
250
255
  test_py/image_correction/__init__.py
251
256
  test_py/image_correction/demo_correction_v1.py
252
257
  test_py/image_correction/demo_correction_v2.py
@@ -12,7 +12,7 @@ from pybaseutils.dataloader import parser_labelme
12
12
  from pybaseutils import image_utils, file_utils
13
13
 
14
14
 
15
- def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=False,
15
+ def save_object_crops(data_info, out_dir, class_name=None, target_name=None, scale=[], square=False,
16
16
  padding=False, min_size=20 * 20 * 3, flag="", vis=False):
17
17
  """
18
18
  对VOC的数据目标进行裁剪
@@ -51,22 +51,16 @@ def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=Fals
51
51
  name = class_name[int(labels[i])] if class_name else labels[i]
52
52
  if out_dir:
53
53
  file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id, i)
54
- img_file = file_utils.create_dir(out_dir, name, file_name)
54
+ if target_name:
55
+ out_dir_ = out_dir if name in target_name else os.path.join(out_dir, "其他")
56
+ img_file = file_utils.create_dir(out_dir_, name, file_name)
57
+ else:
58
+ img_file = file_utils.create_dir(out_dir, name, file_name)
55
59
  cv2.imwrite(img_file, img)
56
60
  if vis: image_utils.cv_show_image("crop", img, use_rgb=False, delay=0)
57
61
 
58
62
 
59
- if __name__ == "__main__":
60
- """
61
- 对VOC的数据目标进行裁剪
62
- 室内:['主杆', '从此进出标示牌', '其他鞋', '吊物绳', '在此工作标示牌', '垫子', '安全带', '安全帽', '安全绳',
63
- '导线头', '尖嘴钳', '工具袋', '手', '扳手', '抹布', '未穿工作服','柱式绝缘子', '止步高压危险标示牌',
64
- '绝缘手套', '绝缘鞋', '脚扣', '螺丝', '身穿工作服', '遮拦杆', '铁架', '铝扎线']
65
- 室外: []
66
- """
67
- anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det/dataset-v31/images"
68
- class_name = None # 室内\
69
- out_dir = os.path.join(os.path.dirname(anno_dir), "crops")
63
+ def crop_dataset(anno_dir, out_dir=None, class_name=None, target_name=None):
70
64
  dataset = parser_labelme.LabelMeDatasets(filename=None,
71
65
  data_root=None,
72
66
  anno_dir=anno_dir,
@@ -83,4 +77,46 @@ if __name__ == "__main__":
83
77
  # scale = None
84
78
  for i in tqdm(range(len(dataset))):
85
79
  data_info = dataset.__getitem__(i)
86
- save_object_crops(data_info, out_dir, class_name=class_name, scale=scale, flag=flag, vis=False)
80
+ save_object_crops(data_info, out_dir, class_name=class_name, target_name=target_name, scale=scale, flag=flag,
81
+ vis=False)
82
+
83
+
84
+ def get_sub_dataset(data_root):
85
+ sub_paths = file_utils.get_sub_paths(data_root, abspath=True)
86
+ datasets = []
87
+ for sub_path in sub_paths:
88
+ data_list = file_utils.get_sub_paths(sub_path, abspath=True)
89
+ data_list = [os.path.join(p, "images") for p in data_list if os.path.exists(os.path.join(p, "images"))]
90
+ datasets += data_list
91
+ return datasets
92
+
93
+
94
+ if __name__ == "__main__":
95
+ """
96
+ 对labelme的数据目标进行裁剪,用于制作分类数据集
97
+ """
98
+
99
+ target_name = ["身穿工作服", "未穿工作服",
100
+ "绝缘鞋", "脚穿绝缘鞋", "长筒靴", "脚穿长筒靴", "其他鞋", "脚穿其他鞋",
101
+ "手", "绝缘手套", "手穿绝缘手套", "棉纱手套", "手穿棉纱手套", "其他手套", "手穿其他手套",
102
+ "拨动开关分闸", "拨动开关合闸",
103
+ "电容柜开关合闸", "电容柜开关分闸",
104
+ "低压侧总刀闸合闸", "低压侧总刀闸分闸",
105
+ "面板单键开关断开", "面板单键开关合上",
106
+ "面板双键开关断开", "面板双键开关合上",
107
+ "表箱关", "表箱开", "手", "其他",
108
+ ]
109
+ datasets = [
110
+ "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/test-v2/dataset-v01/images",
111
+ "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/test-v2/dataset-v02/images",
112
+ ]
113
+ # dataroot = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det"
114
+ # datasets = get_sub_dataset(dataroot)
115
+ class_name = []
116
+ for anno_dir in datasets:
117
+ print(anno_dir)
118
+ out_dir = os.path.join(os.path.dirname(anno_dir), "crops")
119
+ if os.path.exists(out_dir) and out_dir.endswith("crops"): file_utils.remove_dir(out_dir)
120
+ file_utils.create_dir(out_dir)
121
+ file = file_utils.write_file(os.path.join(out_dir, "分类数据集,请勿删除.txt"), data="", mode="w")
122
+ crop_dataset(anno_dir, out_dir=out_dir, class_name=class_name, target_name=target_name)
@@ -8,7 +8,6 @@
8
8
  import os
9
9
  import cv2
10
10
  import numpy as np
11
- from xpinyin import Pinyin
12
11
  from tqdm import tqdm
13
12
  from pybaseutils import file_utils, image_utils
14
13
  from pybaseutils.cvutils import video_utils, monitor
@@ -73,7 +72,8 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
73
72
 
74
73
  # thresh_dict = {"1号视角": 0.5, "2号视角": 0.15, "3号视角": 0.3, "4号视角": 0.3}
75
74
  # thresh_dict = {"一号位": 0.58, "平视": 0.35, "俯视": 0.35, "右视": 0.25, "左视": 0.3}
76
- thresh_dict = {"第一视角": 0.50, "主视角": 0.50, "平视": 0.30, "俯视": 0.30, "右视": 0.35, "左视": 0.35, "全景": 0.30}
75
+ thresh_dict = {"第一视角": 0.50, "主视角": 0.50, "主视": 0.50, "平视": 0.30, "俯视": 0.30, "右视": 0.35, "左视": 0.35,
76
+ "全景": 0.30}
77
77
 
78
78
 
79
79
  # thresh_dict = {"1号位": 0.58, "平视": 0.35, "全景": 0.35, "俯视": 0.35, "右视": 0.25, "左视": 0.3}
@@ -92,7 +92,7 @@ def video2frames_demo(root, out, prefix="", thresh=0.2):
92
92
 
93
93
 
94
94
  if __name__ == "__main__":
95
- root = "/home/PKing/nasdata/dataset-dmai/AIJE/技能人才系统_数据集管理/01-江门四维数据/01-37道考题视频/江门四维2024-12-06-检查帽撑/video"
95
+ root = "/home/PKing/Downloads/video/08-更换熔丝"
96
96
  prefix = ""
97
97
  out = root + "-train"
98
98
  video2frames_demo(root, out, prefix=prefix)
@@ -0,0 +1,32 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ @Author : PKing
4
+ @E-mail :
5
+ @Date : 2024-02-05 18:19:18
6
+ @Brief :
7
+ """
8
+ import cv2
9
+ import numpy as np
10
+ from pybaseutils import file_utils, image_utils, plot_utils, numpy_utils
11
+ from pybaseutils.audio import audio_utils
12
+
13
+ import pyaudio
14
+ import wave
15
+ import time
16
+
17
+ file = "/home/PKing/Videos/dde-introduction.wav"
18
+ # 打开WAV文档
19
+ wf = wave.open(file, "rb")
20
+
21
+ # 实例化一个PyAudio对象
22
+ pa = pyaudio.PyAudio()
23
+ # 打开声卡
24
+ stream = pa.open(format=pa.get_format_from_width(wf.getsampwidth()), # 从wf中获取采样深度
25
+ channels=wf.getnchannels(), # 从wf中获取声道数
26
+ rate=wf.getframerate(), # 从wf中获取采样率
27
+ output=True) # 设置为输出
28
+ count = 0
29
+ while count < 8 * 500:
30
+ time.sleep(0.001)
31
+ data = wf.readframes(15)
32
+ stream.write(data)
@@ -0,0 +1,14 @@
1
+ import requests
2
+ from urllib.parse import urljoin, urlparse
3
+ from bs4 import BeautifulSoup
4
+ from pybaseutils import file_utils, json_utils
5
+ import glob
6
+
7
+ # 使用示例
8
+ if __name__ == "__main__":
9
+ data_root = "http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/*.json"
10
+ # data_root = "/media/PKing/新加卷/SDK/base-utils/data/person/*.json"
11
+ file = glob.glob(data_root)
12
+ print(file)
13
+ data =json_utils.read_json_data("http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-12.json")
14
+ print(data)
@@ -28,9 +28,9 @@ if __name__ == "__main__":
28
28
  anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det/dataset-v25/json"
29
29
  anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-negetive/dataset-v02/json"
30
30
  # anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-date/date-det/dataset-v01/images"
31
- anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det/09-更换熔断器/dataset-v20/images"
31
+ anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/train-v2-其他/check-helmet/images"
32
32
  names = None
33
- # names = {'unique': 0}
33
+ # names = {'手拿安全帽帽撑': 0}
34
34
  dataset = parser_labelme.LabelMeDatasets(filename=None,
35
35
  data_root=None,
36
36
  anno_dir=anno_dir,
@@ -51,6 +51,6 @@ if __name__ == "__main__":
51
51
  if class_name: labels = [class_name[l] for l in labels]
52
52
  image_file = data["image_file"]
53
53
  anno_file = os.path.join("masker", "{}.json".format(os.path.basename(image_file).split(".")[0]))
54
- print(image_file, labels, points)
54
+ print(image_file, labels)
55
55
  result = parser_labelme.show_target_image(image, bboxes, labels, points, thickness=2)
56
56
  # image_utils.save_image("./"+os.path.basename(image_file), result)