pybaseutils 2.2.20__tar.gz → 2.2.22__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.20 → pybaseutils-2.2.22}/PKG-INFO +1 -1
  2. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_coco.py +1 -1
  4. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_labelme.py +4 -4
  5. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/concat_coco.py +3 -3
  6. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/video_utils.py +2 -0
  7. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_text.py +3 -3
  8. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/file_utils.py +50 -41
  9. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/font_style/__init__.py +1 -1
  10. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/font_utils.py +19 -5
  11. pybaseutils-2.2.22/pybaseutils/http_utils.py +230 -0
  12. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/image_utils.py +26 -0
  13. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/json_utils.py +54 -23
  14. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/log_utils.py +1 -1
  15. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/class_report.py +1 -1
  16. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pandas_utils.py +33 -29
  17. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/thread_utils.py +7 -1
  18. pybaseutils-2.2.22/pybaseutils/web/demo.py +13 -0
  19. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/PKG-INFO +1 -1
  20. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/SOURCES.txt +2 -0
  21. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/build_service.py +1 -1
  22. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_crop.py +50 -14
  23. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_video_aije.py +3 -2
  24. pybaseutils-2.2.20/test_py/demo1.py → pybaseutils-2.2.22/test_py/audio_demo1.py +2 -1
  25. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/FL3D_dataset.py +1 -1
  26. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/handpose2coco.py +1 -1
  27. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/insects_for_aichallenger.py +1 -1
  28. pybaseutils-2.2.22/test_py/demo1.py +29 -0
  29. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo2.py +2 -0
  30. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_lableme_vis.py +1 -1
  31. pybaseutils-2.2.22/test_py/demo_mosaic.py +71 -0
  32. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_rename.py +2 -2
  33. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/test_fr/idcardocr.py +1 -1
  34. pybaseutils-2.2.20/pybaseutils/http_utils.py +0 -90
  35. pybaseutils-2.2.20/pybaseutils/web/demo.py +0 -85
  36. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/LICENCE +0 -0
  37. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/README.md +0 -0
  38. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/__init__.py +0 -0
  39. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/audio_utils.py +0 -0
  40. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/pyaudio_utils.py +0 -0
  41. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/vad_utils.py +0 -0
  42. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/base64_utils.py +0 -0
  43. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/batch_utils.py +0 -0
  44. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/build_utils/__init__.py +0 -0
  45. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/build_utils/cython_utils.py +0 -0
  46. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  47. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/__init__.py +0 -0
  48. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/kmean.py +0 -0
  49. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/maxmin_distance.py +0 -0
  50. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/similarity.py +0 -0
  51. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/color_utils.py +0 -0
  52. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/config_utils.py +0 -0
  53. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/__init__.py +0 -0
  54. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_cvat.py +0 -0
  55. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_voc.py +0 -0
  56. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  57. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2voc.py +0 -0
  58. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  59. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  60. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  61. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  62. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  63. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2coco.py +0 -0
  64. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  65. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2voc.py +0 -0
  66. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  67. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  68. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/coords_utils.py +0 -0
  69. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/__init__.py +0 -0
  70. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/corner_utils.py +0 -0
  71. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/monitor.py +0 -0
  72. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/mouse_utils.py +0 -0
  73. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/nms_utils.py +0 -0
  74. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/__init__.py +0 -0
  75. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/balanced_classes.py +0 -0
  76. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_coco.py +0 -0
  77. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_dataset.py +0 -0
  78. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/data_resample.py +0 -0
  79. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  80. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  81. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  82. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  83. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_labelme.py +0 -0
  84. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_voc.py +0 -0
  85. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_yolo.py +0 -0
  86. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  87. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/QueueTable.py +0 -0
  88. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/__init__.py +0 -0
  89. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/demo.py +0 -0
  90. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/kalman_filter.py +0 -0
  91. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/mean_filter.py +0 -0
  92. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/motion_filter.py +0 -0
  93. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/pose_filter.py +0 -0
  94. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/geometry_tools.py +0 -0
  95. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/heatmap_utils.py +0 -0
  96. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/log.py +0 -0
  97. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/__init__.py +0 -0
  98. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/accuracy.py +0 -0
  99. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/average_meter.py +0 -0
  100. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_pr.py +0 -0
  101. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_roc.py +0 -0
  102. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/numpy_utils.py +0 -0
  103. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/plot_utils.py +0 -0
  104. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/__init__.py +0 -0
  105. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/bones_utils.py +0 -0
  106. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/human_pose.py +0 -0
  107. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/pose_utils.py +0 -0
  108. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pycpp/__init__.py +0 -0
  109. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pycpp/demo.py +0 -0
  110. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pycpp/main.py +0 -0
  111. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/server/__init__.py +0 -0
  112. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/server/apm_server.py +0 -0
  113. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/setup_config.py +0 -0
  114. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/singleton_utils.py +0 -0
  115. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/text_utils.py +0 -0
  116. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/time_utils.py +0 -0
  117. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils.py +0 -0
  118. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils2.py +0 -0
  119. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/QueueTable.py +0 -0
  120. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/__init__.py +0 -0
  121. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/demo.py +0 -0
  122. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/kalman_filter.py +0 -0
  123. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/mean_filter.py +0 -0
  124. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/motion_filter.py +0 -0
  125. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/pose_filter.py +0 -0
  126. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/__init__.py +0 -0
  127. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/affine_transform.py +0 -0
  128. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/augment_utils.py +0 -0
  129. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/face_alignment.py +0 -0
  130. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/transform_utils.py +0 -0
  131. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/__init__.py +0 -0
  132. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/app_flask_image.py +0 -0
  133. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/app_stweb_image.py +0 -0
  134. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/app_webio_image.py +0 -0
  135. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/word_utils.py +0 -0
  136. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/worker.py +0 -0
  137. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/yaml_utils.py +0 -0
  138. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/dependency_links.txt +0 -0
  139. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/not-zip-safe +0 -0
  140. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/top_level.txt +0 -0
  141. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/setup.cfg +0 -0
  142. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/setup.py +0 -0
  143. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/Image_enhance/__init__.py +0 -0
  144. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/Image_enhance/dmeo01.py +0 -0
  145. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/WebCrawler/__init__.py +0 -0
  146. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image.py +0 -0
  147. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
  148. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/__init__.py +0 -0
  149. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/__init__.py +0 -0
  150. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/action_dataset.py +0 -0
  151. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/build_cython.py +0 -0
  152. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/build_pyarmor.py +0 -0
  153. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/convert_cvat2labelme.py +0 -0
  154. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2coco.py +0 -0
  155. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2voc.py +0 -0
  156. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/copy_move.py +0 -0
  157. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_shock.py +0 -0
  158. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_voc_crop.py +0 -0
  159. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_voc_vis.py +0 -0
  160. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/get_pair_data.py +0 -0
  161. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/video_convertor.py +0 -0
  162. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/__init__.py +0 -0
  163. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/demo.py +0 -0
  164. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/main.py +0 -0
  165. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/main_read.py +0 -0
  166. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/segment.py +0 -0
  167. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  168. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/speechbrain_demo.py +0 -0
  169. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/camera/__init__.py +0 -0
  170. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/camera/demo.py +0 -0
  171. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/captcha/__init__.py +0 -0
  172. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/captcha/demo.py +0 -0
  173. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/class_attribute.py +0 -0
  174. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/class_names.py +0 -0
  175. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/AffectNet.py +0 -0
  176. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/AsianMovie.py +0 -0
  177. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/BITVehicle2voc.py +0 -0
  178. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/BSTLD2voc.py +0 -0
  179. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/CCPD.py +0 -0
  180. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/CCPD2voc.py +0 -0
  181. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/FreiHAND2coco.py +0 -0
  182. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/MTFL2voc.py +0 -0
  183. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/TT100K.py +0 -0
  184. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/WaterMeters1.py +0 -0
  185. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/WaterMeters2.py +0 -0
  186. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/__init__.py +0 -0
  187. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/concat_coco.py +0 -0
  188. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_coco2voc.py +0 -0
  189. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_cvat2labelme.py +0 -0
  190. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_gesture2hand.py +0 -0
  191. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2coco.py +0 -0
  192. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2cvat.py +0 -0
  193. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2voc.py +0 -0
  194. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_voc2labelme.py +0 -0
  195. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/fatigue_driving.py +0 -0
  196. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/fdd_dataset.py +0 -0
  197. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/get_pair_data.py +0 -0
  198. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/tt100k_utils.py +0 -0
  199. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/ua_detrac2voc.py +0 -0
  200. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/ucf101_dataset.py +0 -0
  201. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/voc_sbd2labelme.py +0 -0
  202. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/__init__.py +0 -0
  203. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/build_cython.py +0 -0
  204. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/build_pyarmor.py +0 -0
  205. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/cryptography_demo.py +0 -0
  206. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/fun_sum.py +0 -0
  207. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/main.py +0 -0
  208. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/model_des_enctypt.py +0 -0
  209. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/model_enctypt.py +0 -0
  210. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/date_dataset.py +0 -0
  211. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/date_demo.py +0 -0
  212. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/datedataset_bk.py +0 -0
  213. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo3.py +0 -0
  214. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_async_await1.py +0 -0
  215. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_async_await2.py +0 -0
  216. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_coco_vis.py +0 -0
  217. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_copy_files.py +0 -0
  218. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_copy_files_for_voc.py +0 -0
  219. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_ffmpy.py +0 -0
  220. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_for_pair_file.py +0 -0
  221. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_for_polygon.py +0 -0
  222. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_for_trt.py +0 -0
  223. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_get_file_label.py +0 -0
  224. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_get_file_list.py +0 -0
  225. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_gif.py +0 -0
  226. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_gif_video.py +0 -0
  227. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_image_crop.py +0 -0
  228. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_kpts.py +0 -0
  229. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_labelme.py +0 -0
  230. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_labelme_crop.py +0 -0
  231. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_metrics.py +0 -0
  232. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_mouse.py +0 -0
  233. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_nii.py +0 -0
  234. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_pandas.py +0 -0
  235. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_plot.py +0 -0
  236. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_standard_image .py +0 -0
  237. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_standard_video .py +0 -0
  238. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_taichi.py +0 -0
  239. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_video.py +0 -0
  240. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_video_crop.py +0 -0
  241. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_voc_crop.py +0 -0
  242. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_voc_vis.py +0 -0
  243. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_word_similar.py +0 -0
  244. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_worker1.py +0 -0
  245. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_worker2.py +0 -0
  246. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/__init__.py +0 -0
  247. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/demo.py +0 -0
  248. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/detect_face_person.py +0 -0
  249. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/predet_labelme.py +0 -0
  250. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/edit_distance/__init__.py +0 -0
  251. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/edit_distance/demo.py +0 -0
  252. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/edit_distance/text_matching.py +0 -0
  253. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/__init__.py +0 -0
  254. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/app.py +0 -0
  255. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/utils/__init__.py +0 -0
  256. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/utils/utils.py +0 -0
  257. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/get_file_list.py +0 -0
  258. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/__init__.py +0 -0
  259. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v1.py +0 -0
  260. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v2.py +0 -0
  261. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v3.py +0 -0
  262. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/kafka_worker.py +0 -0
  263. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/men_tracemalloc.py +0 -0
  264. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/__init__.py +0 -0
  265. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/demo01.py +0 -0
  266. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/demo02.py +0 -0
  267. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/hello_milvus.py +0 -0
  268. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/milvus_client.py +0 -0
  269. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/performance.py +0 -0
  270. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/pose/__init__.py +0 -0
  271. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/pose/human_pose.py +0 -0
  272. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/redis_py/__init__.py +0 -0
  273. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/redis_py/knn_search.py +0 -0
  274. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/redis_py/redis_client.py +0 -0
  275. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/__init__.py +0 -0
  276. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/base.py +0 -0
  277. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/component.py +0 -0
  278. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/main.py +0 -0
  279. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/register.py +0 -0
  280. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/GRU.py +0 -0
  281. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/TCN.py +0 -0
  282. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/__init__.py +0 -0
  283. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/demo.py +0 -0
  284. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/test_fr/__init__.py +0 -0
  285. {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/test_fr/demo11.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: pybaseutils
3
- Version: 2.2.20
3
+ Version: 2.2.22
4
4
  Summary: pybaseutils
5
5
  Home-page: https://github.com/PanJinquan/base-utils
6
6
  Author: PanJinquan
@@ -8,4 +8,4 @@
8
8
  # --------------------------------------------------------
9
9
  """
10
10
 
11
- __version__ = '2.2.20'
11
+ __version__ = '2.2.22'
@@ -120,7 +120,7 @@ class COCOBuilder():
120
120
 
121
121
  def save_coco(self, json_file):
122
122
  file_utils.create_file_path(json_file)
123
- file_utils.write_json_path(json_file, self.coco)
123
+ file_utils.save_json(json_file, self.coco)
124
124
  print("save file:{}".format(json_file))
125
125
 
126
126
  def set_keypoints_category(self, kps_name=[], skeleton=[], cat_id=0):
@@ -48,7 +48,7 @@ def maker_labelme(json_file, points, labels, image_name, image_size, image_bs64=
48
48
  "imageWidth": image_size[0]
49
49
  }
50
50
  if os.path.exists(image_name): file_utils.copy_file_to_dir(image_name, os.path.dirname(json_file))
51
- file_utils.write_json_path(json_file, data)
51
+ file_utils.save_json(json_file, data)
52
52
  return data
53
53
 
54
54
 
@@ -60,9 +60,9 @@ def del_labelme_imagedata(anno_dir):
60
60
  """
61
61
  file_list = file_utils.get_files_lists(anno_dir, postfix=["*.json"])
62
62
  for anno_file in tqdm(file_list):
63
- data_info = json_utils.read_json_data(anno_file)
63
+ data_info = json_utils.load_json(anno_file)
64
64
  data_info["imageData"] = None
65
- json_utils.write_json_path(anno_file, data_info)
65
+ json_utils.save_json(anno_file, data_info)
66
66
 
67
67
 
68
68
  def copy_labelme_files(image_dir, anno_dir, out_root):
@@ -77,7 +77,7 @@ def copy_labelme_files(image_dir, anno_dir, out_root):
77
77
  out_images = file_utils.create_dir(out_root, "images")
78
78
  out_json = file_utils.create_dir(out_root, "json")
79
79
  for json_file in tqdm(json_list):
80
- json_data = json_utils.read_json_data(json_file)
80
+ json_data = json_utils.load_json(json_file)
81
81
  image_name = json_data['imagePath']
82
82
  shapes = json_data.get('shapes', [])
83
83
  image_file = os.path.join(image_dir, image_name)
@@ -103,14 +103,14 @@ class ConcatCoco(object):
103
103
  """
104
104
  if isinstance(file_dict, dict):
105
105
  for dirname, file in file_dict.items():
106
- coco = file_utils.read_json_data(file)
106
+ coco = file_utils.load_json(file)
107
107
  self.add_categories(copy.deepcopy(coco["categories"]))
108
108
  self.add_images(copy.deepcopy(coco["images"]), dirname)
109
109
  self.add_annotations(copy.deepcopy(coco["annotations"]),
110
110
  copy.deepcopy(coco["categories"]))
111
111
  elif isinstance(file_dict, list):
112
112
  for file in file_dict:
113
- coco = file_utils.read_json_data(file)
113
+ coco = file_utils.load_json(file)
114
114
  self.add_categories(copy.deepcopy(coco["categories"]))
115
115
  self.add_images(copy.deepcopy(coco["images"]), dirname=None)
116
116
  self.add_annotations(copy.deepcopy(coco["annotations"]),
@@ -120,7 +120,7 @@ class ConcatCoco(object):
120
120
 
121
121
  def save_coco(self, json_file):
122
122
  file_utils.create_file_path(json_file)
123
- file_utils.write_json_path(json_file, self.coco)
123
+ file_utils.save_json(json_file, self.coco)
124
124
  print("save file:{}".format(json_file))
125
125
 
126
126
 
@@ -238,6 +238,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
238
238
  title: 控制显示窗口名
239
239
  :return:
240
240
  """
241
+ assert os.path.exists(video_file), f"video_file={video_file}"
241
242
  video_cap = image_utils.get_video_capture(video_file)
242
243
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
243
244
  start = int(kwargs.get("start", 0) * fps)
@@ -291,6 +292,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
291
292
  speed: 播放速度
292
293
  :return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
293
294
  """
295
+ assert os.path.exists(video_file), f"video_file={video_file}"
294
296
  video_cap = image_utils.get_video_capture(video_file)
295
297
  w, h, num_frames, fps = image_utils.get_video_info(video_cap)
296
298
  start = int(kwargs.get("start", 0) * fps)
@@ -81,10 +81,10 @@ class TextDataset(Dataset):
81
81
  class_lack = sorted(class_lack.items(), key=lambda x: x[1], reverse=True)
82
82
  class_lack = {n[0]: n[1] for n in class_lack}
83
83
  class_lack.update({"mean": m})
84
- file_utils.write_json_path(os.path.join(save_info, f"{self.phase}_class_dict.json"), self.class_dict)
85
- file_utils.write_json_path(os.path.join(save_info, f"{self.phase}_class_count.json"), self.class_count)
84
+ file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_dict.json"), self.class_dict)
85
+ file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_count.json"), self.class_count)
86
86
  file_utils.write_list_data(os.path.join(save_info, f"{self.phase}_class_name.txt"), self.class_name)
87
- file_utils.write_json_path(os.path.join(save_info, f"{self.phase}_class_lack.json"), class_lack)
87
+ file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_lack.json"), class_lack)
88
88
  print("loss_labels: {}".format(class_lack))
89
89
  print("------------------------------------------------------------------")
90
90
 
@@ -22,7 +22,7 @@ import argparse
22
22
  import itertools
23
23
  from datetime import datetime
24
24
  from tqdm import tqdm
25
- from pybaseutils import text_utils
25
+ from pybaseutils import text_utils, thread_utils
26
26
 
27
27
  IMG_POSTFIX = ['*.jpg', '*.jpeg', '*.png', '*.tif', "*.JPG", "*.bmp"]
28
28
  VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov', "*.flv", "*.dav"]
@@ -107,14 +107,14 @@ def combine_flags(flags: list, use_time=True, info=True):
107
107
  return out_flags
108
108
 
109
109
 
110
- def write_file(file, data):
110
+ def write_file(file, data, mode='wb'):
111
111
  """写二进制数据"""
112
- with open(file, 'wb') as f: f.write(data)
112
+ with open(file, mode) as f: f.write(data)
113
113
 
114
114
 
115
- def read_file(file):
115
+ def read_file(file, mode='rb'):
116
116
  """读取二进制数据"""
117
- with open(file, 'rb') as f: key = f.read()
117
+ with open(file, mode) as f: key = f.read()
118
118
  return key
119
119
 
120
120
 
@@ -161,7 +161,7 @@ def parser_classes(class_name):
161
161
  return class_name, class_dict
162
162
 
163
163
 
164
- def read_json_data(json_path):
164
+ def load_json(json_path):
165
165
  """
166
166
  读取数据
167
167
  :param json_path:
@@ -172,7 +172,10 @@ def read_json_data(json_path):
172
172
  return json_data
173
173
 
174
174
 
175
- def write_json_path(json_file, json_data):
175
+ read_json_data = load_json
176
+
177
+
178
+ def save_json(json_file, json_data):
176
179
  """
177
180
  写入 JSON 数据
178
181
  :param json_file:
@@ -183,6 +186,30 @@ def write_json_path(json_file, json_data):
183
186
  json.dump(json_data, f, indent=4, ensure_ascii=False)
184
187
 
185
188
 
189
+ write_json_path = save_json
190
+
191
+
192
+ def load_json_files(files: list, max_workers=8):
193
+ """
194
+ 根据url读取文件
195
+ :param files: 文件urls列表
196
+ :param max_workers: 开启线程数目
197
+ :return: 返回读取成功的文件数据file_list
198
+ """
199
+ # pool = thread_utils.ProcessPool(max_workers=max_workers)
200
+ pool = thread_utils.ThreadPool(max_workers=max_workers)
201
+ print("----" * 10)
202
+ print(f"启动{max_workers}个线程读取{len(files)}个文件,请等待....")
203
+ t0 = time.time()
204
+ file_list = pool.task_map(func=load_json, inputs=files)
205
+ t1 = time.time()
206
+ dt = (t1 - t0) * 1000
207
+ # 读取失败的url列表loss_list
208
+ loss_list = [files[i] for i in range(len(file_list)) if not file_list[i]]
209
+ print(f"成功:{len(file_list) - len(loss_list)},失败:{len(loss_list)},耗时:{dt:.2f}ms")
210
+ return file_list, loss_list
211
+
212
+
186
213
  def write_data(filename, content_list, split=",", mode='w'):
187
214
  """保存list[list[]]的数据到txt文件
188
215
  :param filename:文件名
@@ -565,8 +592,7 @@ def copy_dir(src, dst, sub=False, exclude=[]):
565
592
  if isExclude: break
566
593
  if isExclude: continue
567
594
  dest_path = os.path.join(dst, os.path.relpath(root, src))
568
- if not os.path.exists(dest_path):
569
- os.makedirs(dest_path)
595
+ os.makedirs(dest_path, exist_ok=True)
570
596
  for filename in files:
571
597
  copy_file(
572
598
  os.path.join(root, filename),
@@ -582,8 +608,7 @@ def move_dir(src, dst, sub=False):
582
608
  if sub: dst = os.path.join(dst, os.path.basename(src))
583
609
  for root, dirs, files in os.walk(src, topdown=False):
584
610
  dest_path = os.path.join(dst, os.path.relpath(root, src))
585
- if not os.path.exists(dest_path):
586
- os.makedirs(dest_path)
611
+ os.makedirs(dest_path, exist_ok=True)
587
612
  for filename in files:
588
613
  move_file(
589
614
  os.path.join(root, filename),
@@ -595,8 +620,7 @@ def move_file(srcfile, dstfile):
595
620
  """ 移动文件或重命名"""
596
621
  if os.path.exists(srcfile) and os.path.isfile(srcfile):
597
622
  fpath, fname = os.path.split(dstfile) # 分离文件名和路径
598
- if not os.path.exists(fpath):
599
- os.makedirs(fpath) # 创建路径
623
+ os.makedirs(fpath, exist_ok=True) # 创建路径
600
624
  shutil.move(srcfile, dstfile)
601
625
  # print("copy %s -> %s"%( srcfile,dstfile))
602
626
  # time.sleep(1 / 1000.)
@@ -615,8 +639,7 @@ def copy_file(srcfile, dstfile):
615
639
  print("%s not exist!" % (srcfile))
616
640
  else:
617
641
  fpath, fname = os.path.split(dstfile) # 分离文件名和路径
618
- if not os.path.exists(fpath):
619
- os.makedirs(fpath) # 创建路径
642
+ os.makedirs(fpath, exist_ok=True) # 创建路径
620
643
  shutil.copyfile(srcfile, dstfile) # 复制文件
621
644
  # print("copy %s -> %s"%( srcfile,dstfile))
622
645
  # time.sleep(1 / 1000.)
@@ -627,8 +650,7 @@ def copy_file_to_dir(srcfile, des_dir):
627
650
  print("%s not exist!" % (srcfile))
628
651
  else:
629
652
  fpath, fname = os.path.split(srcfile) # 分离文件名和路径
630
- if not os.path.exists(des_dir):
631
- os.makedirs(des_dir) # 创建路径
653
+ os.makedirs(des_dir, exist_ok=True) # 创建路径
632
654
  dstfile = os.path.join(des_dir, fname)
633
655
  shutil.copyfile(srcfile, dstfile) # 复制文件
634
656
 
@@ -638,8 +660,7 @@ def move_file_to_dir(srcfile, des_dir):
638
660
  print("%s not exist!" % (srcfile))
639
661
  else:
640
662
  fpath, fname = os.path.split(srcfile) # 分离文件名和路径
641
- if not os.path.exists(des_dir):
642
- os.makedirs(des_dir) # 创建路径
663
+ os.makedirs(des_dir, exist_ok=True) # 创建路径
643
664
  dstfile = os.path.join(des_dir, fname)
644
665
  # shutil.copyfile(srcfile, dstfile) # 复制文件
645
666
  move_file(srcfile, dstfile) # 复制文件
@@ -653,22 +674,6 @@ def move_file_list(file_list, dst_dir):
653
674
  [move_file_to_dir(file, dst_dir) for file in file_list]
654
675
 
655
676
 
656
- def merge_dir(src, dst, sub, merge_same):
657
- src_dir = os.path.join(src, sub)
658
- dst_dir = os.path.join(dst, sub)
659
-
660
- if not os.path.exists(src_dir):
661
- print("\nno src path:{}".format(src))
662
- return
663
- if not os.path.exists(dst_dir):
664
- os.makedirs(dst_dir)
665
- elif not merge_same:
666
- t = get_time()
667
- dst_dir = os.path.join(dst, sub + "_{}".format(t))
668
- print("have save sub:{}".format(dst_dir))
669
- copy_dir(src_dir, dst_dir)
670
-
671
-
672
677
  def create_dir(parent_dir, dir1=None, filename=None):
673
678
  """
674
679
  create directory
@@ -681,8 +686,7 @@ def create_dir(parent_dir, dir1=None, filename=None):
681
686
  if dir1:
682
687
  out_path = os.path.join(parent_dir, dir1)
683
688
  if not out_path: return out_path
684
- if not os.path.exists(out_path):
685
- os.makedirs(out_path)
689
+ os.makedirs(out_path, exist_ok=True)
686
690
  if filename:
687
691
  out_path = os.path.join(out_path, filename)
688
692
  return out_path
@@ -700,7 +704,7 @@ def create_file_path(filename):
700
704
  return out_path
701
705
 
702
706
 
703
- def get_sub_paths(input_dir):
707
+ def get_sub_paths(input_dir, abspath=False):
704
708
  """
705
709
  当前路径下所有子目录
706
710
  :param input_dir:
@@ -714,6 +718,7 @@ def get_sub_paths(input_dir):
714
718
  # print(dirs) # 当前路径下所有子目录
715
719
  # print(files) # 当前路径下所有非目录子文件
716
720
  sub_list.sort()
721
+ if abspath: sub_list = [os.path.join(input_dir, p) for p in sub_list]
717
722
  return sub_list
718
723
 
719
724
 
@@ -1373,6 +1378,10 @@ def copy_move_voc_dataset(data_file, data_root=None, out_root=None, file_map={},
1373
1378
 
1374
1379
 
1375
1380
  if __name__ == '__main__':
1376
- dir = "/home/dm/nasdata/dataset-dmai/handwriting/word-class/trainval/unknown"
1377
- file_list, label_list = get_files_labels(dir)
1378
- print(label_list)
1381
+ from pybaseutils import time_utils
1382
+
1383
+ path = "/home/PKing/Downloads/tmp"
1384
+ file_list = get_files_list(path, postfix=["*.json"])
1385
+ with time_utils.Performance():
1386
+ file_data, loss_list = load_json_files(file_list, max_workers=1) # 12433.96ms
1387
+ print(len(file_data))
@@ -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 = "我"
@@ -0,0 +1,230 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ # --------------------------------------------------------
4
+ # @Author : Pan
5
+ # @E-mail : 390737991@qq.com
6
+ # @Date : 2019-12-31 09:11:25
7
+ # --------------------------------------------------------
8
+ """
9
+ import os
10
+ import time
11
+ import requests
12
+ import json
13
+ from pybaseutils import log_utils, text_utils, json_utils, thread_utils
14
+
15
+ logger = log_utils.get_logger()
16
+
17
+
18
+ def post(url, params=None, timeout=6, max_retries=1, **kwargs):
19
+ """
20
+ :param url: 请求URL
21
+ :param params: 请求参数
22
+ :param timeout: 设置超时
23
+ :return:
24
+ """
25
+ result = None
26
+ counts = 0
27
+ while counts < max_retries:
28
+ try:
29
+ t1 = time.time()
30
+ # r = requests.get(url, params=params, timeout=timeout,**kwargs)
31
+ r = requests.post(url, json=params, timeout=timeout, **kwargs)
32
+ t2 = time.time()
33
+ elapsed = (t2 - t1) * 1000
34
+ code = r.status_code
35
+ if code == 200:
36
+ logger.info(f'code={code}, url={url}, elapsed:{elapsed:3.3f}ms')
37
+ result = r.json()
38
+ break
39
+ else:
40
+ r.raise_for_status() # 如果响应状态码不是200,抛出异常
41
+ except Exception as e:
42
+ counts += 1
43
+ logger.error(f'Error msg:{e}, url={url}, try to retry times={counts}/{max_retries}')
44
+ time.sleep(0.1)
45
+ return result
46
+
47
+
48
+ def get(url, params=None, timeout=6, max_retries=1, **kwargs):
49
+ """
50
+ :param url: 请求URL
51
+ :param params: 请求参数
52
+ :param timeout: 设置超时
53
+ :return:
54
+ """
55
+ result = None
56
+ counts = 0
57
+ log = kwargs.pop("log", True)
58
+ while counts < max_retries:
59
+ try:
60
+ t1 = time.time()
61
+ r = requests.get(url, params=params, timeout=timeout, **kwargs)
62
+ # r = requests.post(url, json=params, timeout=timeout, **kwargs)
63
+ t2 = time.time()
64
+ elapsed = (t2 - t1) * 1000
65
+ code = r.status_code
66
+ if code == 200:
67
+ if log: logger.info(f'code={code}, url={url}, elapsed:{elapsed:3.3f}ms')
68
+ result = r.json()
69
+ break
70
+ else:
71
+ r.raise_for_status() # 如果响应状态码不是200,抛出异常
72
+ except Exception as e:
73
+ counts += 1
74
+ logger.error(f'Error msg:{e}, url={url}, try to retry times={counts}/{max_retries}')
75
+ time.sleep(0.1)
76
+ return result
77
+
78
+
79
+ def get_url_files(url, prefix="", postfix=None, basename=False, timeout=30):
80
+ """
81
+ 获得文件服务器中文件列表
82
+ :param url: http URL地址等
83
+ :param prefix: http URL地址等
84
+ :param postfix: None或者[]表示所有文件
85
+ :param basename: 返回的列表是文件名(True),还是文件的完整路径(False)
86
+ :return:
87
+ """
88
+ from bs4 import BeautifulSoup
89
+ try:
90
+ if url.endswith("/"): url = url[:-1]
91
+ # 设置超时和重试
92
+ r = requests.get(url, timeout=timeout, auth=("admin", "admin"))
93
+ r.raise_for_status()
94
+ # 解析目录列表
95
+ soup = BeautifulSoup(r.text, 'html.parser')
96
+ file_list = [a['href'] for a in soup.select('a[href]')]
97
+ # 过滤并拼接完整URL
98
+ file_list = text_utils.find_match_texts(file_list, pattern=[prefix], org=True) if prefix else file_list
99
+ file_list = text_utils.find_match_texts(file_list, pattern=postfix, org=True) if postfix else file_list
100
+ file_list.sort()
101
+ file_list = file_list if basename else [f"{url}/{f}" for f in file_list]
102
+ return file_list
103
+ except Exception as e:
104
+ print(f"请求失败: {str(e)}")
105
+ return []
106
+
107
+
108
+ def download_file(url, out, timeout=30, max_retries=1, log=False):
109
+ """
110
+ 根据url下载文件
111
+ :param url: 文件URL
112
+ :param out: 输出保存目录
113
+ :param log: 是否打印LOG信息
114
+ :return:
115
+ """
116
+ try:
117
+ os.makedirs(out, exist_ok=True)
118
+ name = url.split('/')[-1]
119
+ path = os.path.join(out, name)
120
+ data = get(url, params=None, timeout=timeout, max_retries=max_retries, log=False)
121
+ assert data
122
+ if name.endswith("json"):
123
+ json_utils.save_json(path, data)
124
+ else:
125
+ with open(path, 'w', encoding='utf-8') as f:
126
+ f.write(data)
127
+ if log: print(f"下载成功: {url} --> {path}")
128
+ return path
129
+ except Exception as e:
130
+ if log: print(f"下载失败: {url}")
131
+ return None
132
+
133
+
134
+ def download_files(urls: list, out, max_workers=8, timeout=30, max_retries=1):
135
+ """
136
+ :param urls: 文件URL列表
137
+ :param out: 下载保持目录
138
+ :param max_workers:
139
+ :param timeout:
140
+ :param max_retries:
141
+ :return: 返回下载成功的本地文件列表file_list
142
+ """
143
+ pool = thread_utils.ThreadPool(max_workers=max_workers)
144
+ inputs = [(url, out, timeout, max_retries) for url in urls]
145
+ print("----" * 10)
146
+ print(f"启动{max_workers}个线程下载{len(urls)}个文件,请等待....")
147
+ t0 = time.time()
148
+ file_list = pool.task_maps(func=download_file, inputs=inputs)
149
+ t1 = time.time()
150
+ dt = (t1 - t0) * 1000
151
+ # 下载失败的url列表loss_list
152
+ loss_list = [urls[i] for i in range(len(file_list)) if not file_list[i]]
153
+ print(f"成功:{len(file_list) - len(loss_list)},失败:{len(loss_list)},耗时:{dt:.2f}ms")
154
+ return file_list, loss_list
155
+
156
+
157
+ def read_url_file(url, timeout=30, max_retries=1):
158
+ """
159
+ 根据url读取文件
160
+ :param url: 文件URL
161
+ :param timeout:
162
+ :param max_retries:
163
+ :return:
164
+ """
165
+ try:
166
+ data = get(url, params=None, timeout=timeout, max_retries=max_retries, log=False)
167
+ return data
168
+ except Exception as e:
169
+ print(f"读取失败: {url}")
170
+ return None
171
+
172
+
173
+ def read_url_files(urls: list, max_workers=8, timeout=30, max_retries=1):
174
+ """
175
+ 根据url读取文件
176
+ :param urls: 文件urls列表
177
+ :param max_workers: 开启线程数目
178
+ :param timeout:
179
+ :param max_retries:
180
+ :return: 返回读取成功的文件数据file_list
181
+ """
182
+ pool = thread_utils.ThreadPool(max_workers=max_workers)
183
+ inputs = [(url, timeout, max_retries) for url in urls]
184
+ print("----" * 10)
185
+ print(f"启动{max_workers}个线程读取{len(urls)}个文件,请等待....")
186
+ t0 = time.time()
187
+ file_list = pool.task_maps(func=read_url_file, inputs=inputs)
188
+ t1 = time.time()
189
+ dt = (t1 - t0) * 1000
190
+ # 读取失败的url列表loss_list
191
+ loss_list = [urls[i] for i in range(len(file_list)) if not file_list[i]]
192
+ print(f"成功:{len(file_list) - len(loss_list)},失败:{len(loss_list)},耗时:{dt:.2f}ms")
193
+ return file_list, loss_list
194
+
195
+
196
+ def tojson(data: dict, keys: list):
197
+ """
198
+ 指定需要反序列的数据
199
+ :param data:
200
+ :param keys:
201
+ :return:
202
+ """
203
+ if isinstance(data, dict):
204
+ for k, v in data.items():
205
+ if k in keys:
206
+ try:
207
+ data[k] = json.loads(v)
208
+ except Exception as e:
209
+ print(e)
210
+ else:
211
+ data[k] = tojson(v, keys=keys)
212
+ elif isinstance(data, list):
213
+ for i in range(len(data)):
214
+ data[i] = tojson(data[i], keys=keys)
215
+ return data
216
+
217
+
218
+ if __name__ == '__main__':
219
+ urls = [
220
+ "http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-12.json",
221
+ "http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-13.json",
222
+ "http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-17.json",
223
+ ]
224
+ out = "/home/PKing/Downloads/tmp"
225
+ url = 'https://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m911dzow-17cu'
226
+ urls = get_url_files(url, postfix=["*.json"])
227
+ file_list1, loss_list1 = download_files(urls, out=out, max_retries=1)
228
+ file_list2, loss_list2 = read_url_files(urls, max_retries=1)
229
+ print(loss_list1)
230
+ print(loss_list2)
@@ -2862,6 +2862,32 @@ def get_image_block(image, grid=[3, 3], same=False):
2862
2862
  return image_block
2863
2863
 
2864
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
+ ar = (5, 20)
2875
+ h, w = image.shape[:2]
2876
+ boxes = np.asarray(boxes, dtype=np.int32)
2877
+ boxes = extend_xyxy(boxes, scale=scale, valid_range=(0, 0, w, h))
2878
+ for box in boxes:
2879
+ x1, y1, x2, y2 = box
2880
+ roi = image[y1:y2, x1:x2]
2881
+ size = [(x2 - x1) // radius, (y2 - y1) // radius]
2882
+ size[0] = max(min(size[0], ar[1]), ar[0])
2883
+ size[1] = max(min(size[1], ar[1]), ar[0])
2884
+ img = cv2.resize(roi, tuple(size))
2885
+ # img = cv2.resize(roi, (radius, radius))
2886
+ img = cv2.resize(img, (x2 - x1, y2 - y1), interpolation=cv2.INTER_NEAREST)
2887
+ image[y1:y2, x1:x2] = img
2888
+ return image
2889
+
2890
+
2865
2891
  def image_composite(image: np.ndarray, alpha: np.ndarray, bg_img=(219, 142, 67)):
2866
2892
  """
2867
2893
  图像融合:合成图 = 前景*alpha+背景*(1-alpha)