pybaseutils 2.2.21__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.21 → pybaseutils-2.2.22}/PKG-INFO +1 -1
  2. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/__init__.py +1 -1
  3. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_coco.py +1 -1
  4. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_labelme.py +4 -4
  5. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/concat_coco.py +3 -3
  6. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/video_utils.py +2 -0
  7. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_text.py +3 -3
  8. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/file_utils.py +44 -36
  9. pybaseutils-2.2.22/pybaseutils/http_utils.py +230 -0
  10. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/image_utils.py +5 -2
  11. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/json_utils.py +54 -23
  12. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/log_utils.py +1 -1
  13. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/class_report.py +1 -1
  14. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pandas_utils.py +33 -29
  15. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/thread_utils.py +7 -1
  16. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/PKG-INFO +1 -1
  17. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/SOURCES.txt +1 -0
  18. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/build_service.py +1 -1
  19. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_crop.py +2 -2
  20. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/FL3D_dataset.py +1 -1
  21. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/handpose2coco.py +1 -1
  22. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/insects_for_aichallenger.py +1 -1
  23. pybaseutils-2.2.22/test_py/demo1.py +29 -0
  24. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo2.py +2 -0
  25. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_lableme_vis.py +1 -1
  26. pybaseutils-2.2.22/test_py/demo_mosaic.py +71 -0
  27. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_rename.py +2 -2
  28. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/test_fr/idcardocr.py +1 -1
  29. pybaseutils-2.2.21/pybaseutils/http_utils.py +0 -90
  30. pybaseutils-2.2.21/test_py/demo1.py +0 -14
  31. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/LICENCE +0 -0
  32. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/README.md +0 -0
  33. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/__init__.py +0 -0
  34. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/audio_utils.py +0 -0
  35. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/pyaudio_utils.py +0 -0
  36. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/vad_utils.py +0 -0
  37. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/base64_utils.py +0 -0
  38. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/batch_utils.py +0 -0
  39. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/build_utils/__init__.py +0 -0
  40. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/build_utils/cython_utils.py +0 -0
  41. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
  42. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/__init__.py +0 -0
  43. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/kmean.py +0 -0
  44. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/maxmin_distance.py +0 -0
  45. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/similarity.py +0 -0
  46. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/color_utils.py +0 -0
  47. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/config_utils.py +0 -0
  48. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/__init__.py +0 -0
  49. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_cvat.py +0 -0
  50. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_voc.py +0 -0
  51. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2labelme.py +0 -0
  52. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2voc.py +0 -0
  53. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
  54. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2coco.py +0 -0
  55. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
  56. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2voc.py +0 -0
  57. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
  58. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2coco.py +0 -0
  59. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2labelme.py +0 -0
  60. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2voc.py +0 -0
  61. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2yolo.py +0 -0
  62. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_yolo2voc.py +0 -0
  63. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/coords_utils.py +0 -0
  64. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/__init__.py +0 -0
  65. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/corner_utils.py +0 -0
  66. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/monitor.py +0 -0
  67. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/mouse_utils.py +0 -0
  68. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/nms_utils.py +0 -0
  69. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/__init__.py +0 -0
  70. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/balanced_classes.py +0 -0
  71. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_coco.py +0 -0
  72. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_dataset.py +0 -0
  73. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/data_resample.py +0 -0
  74. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_det.py +0 -0
  75. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
  76. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
  77. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_folder.py +0 -0
  78. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_labelme.py +0 -0
  79. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_voc.py +0 -0
  80. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_yolo.py +0 -0
  81. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
  82. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/QueueTable.py +0 -0
  83. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/__init__.py +0 -0
  84. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/demo.py +0 -0
  85. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/kalman_filter.py +0 -0
  86. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/mean_filter.py +0 -0
  87. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/motion_filter.py +0 -0
  88. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/pose_filter.py +0 -0
  89. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/font_style/__init__.py +0 -0
  90. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/font_utils.py +0 -0
  91. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/geometry_tools.py +0 -0
  92. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/heatmap_utils.py +0 -0
  93. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/log.py +0 -0
  94. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/__init__.py +0 -0
  95. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/accuracy.py +0 -0
  96. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/average_meter.py +0 -0
  97. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_pr.py +0 -0
  98. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_roc.py +0 -0
  99. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/numpy_utils.py +0 -0
  100. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/plot_utils.py +0 -0
  101. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/__init__.py +0 -0
  102. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/bones_utils.py +0 -0
  103. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/human_pose.py +0 -0
  104. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/pose_utils.py +0 -0
  105. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pycpp/__init__.py +0 -0
  106. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pycpp/demo.py +0 -0
  107. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pycpp/main.py +0 -0
  108. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/server/__init__.py +0 -0
  109. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/server/apm_server.py +0 -0
  110. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/setup_config.py +0 -0
  111. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/singleton_utils.py +0 -0
  112. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/text_utils.py +0 -0
  113. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/time_utils.py +0 -0
  114. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils.py +0 -0
  115. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils2.py +0 -0
  116. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/QueueTable.py +0 -0
  117. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/__init__.py +0 -0
  118. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/demo.py +0 -0
  119. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/kalman_filter.py +0 -0
  120. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/mean_filter.py +0 -0
  121. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/motion_filter.py +0 -0
  122. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/pose_filter.py +0 -0
  123. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/__init__.py +0 -0
  124. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/affine_transform.py +0 -0
  125. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/augment_utils.py +0 -0
  126. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/face_alignment.py +0 -0
  127. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/transform_utils.py +0 -0
  128. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/__init__.py +0 -0
  129. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/app_flask_image.py +0 -0
  130. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/app_stweb_image.py +0 -0
  131. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/app_webio_image.py +0 -0
  132. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/demo.py +0 -0
  133. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/word_utils.py +0 -0
  134. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/worker.py +0 -0
  135. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/yaml_utils.py +0 -0
  136. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/dependency_links.txt +0 -0
  137. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/not-zip-safe +0 -0
  138. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/top_level.txt +0 -0
  139. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/setup.cfg +0 -0
  140. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/setup.py +0 -0
  141. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/Image_enhance/__init__.py +0 -0
  142. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/Image_enhance/dmeo01.py +0 -0
  143. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/WebCrawler/__init__.py +0 -0
  144. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image.py +0 -0
  145. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
  146. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/__init__.py +0 -0
  147. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/__init__.py +0 -0
  148. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/action_dataset.py +0 -0
  149. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/build_cython.py +0 -0
  150. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/build_pyarmor.py +0 -0
  151. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/convert_cvat2labelme.py +0 -0
  152. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2coco.py +0 -0
  153. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2voc.py +0 -0
  154. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/copy_move.py +0 -0
  155. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_shock.py +0 -0
  156. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_video_aije.py +0 -0
  157. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_voc_crop.py +0 -0
  158. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_voc_vis.py +0 -0
  159. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/get_pair_data.py +0 -0
  160. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/video_convertor.py +0 -0
  161. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/__init__.py +0 -0
  162. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/demo.py +0 -0
  163. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/main.py +0 -0
  164. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/main_read.py +0 -0
  165. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/segment.py +0 -0
  166. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
  167. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/speechbrain_demo.py +0 -0
  168. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio_demo1.py +0 -0
  169. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/camera/__init__.py +0 -0
  170. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/camera/demo.py +0 -0
  171. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/captcha/__init__.py +0 -0
  172. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/captcha/demo.py +0 -0
  173. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/class_attribute.py +0 -0
  174. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/class_names.py +0 -0
  175. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/AffectNet.py +0 -0
  176. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/AsianMovie.py +0 -0
  177. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/BITVehicle2voc.py +0 -0
  178. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/BSTLD2voc.py +0 -0
  179. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/CCPD.py +0 -0
  180. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/CCPD2voc.py +0 -0
  181. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/FreiHAND2coco.py +0 -0
  182. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/MTFL2voc.py +0 -0
  183. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/TT100K.py +0 -0
  184. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/WaterMeters1.py +0 -0
  185. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/WaterMeters2.py +0 -0
  186. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/__init__.py +0 -0
  187. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/concat_coco.py +0 -0
  188. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_coco2voc.py +0 -0
  189. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_cvat2labelme.py +0 -0
  190. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_gesture2hand.py +0 -0
  191. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2coco.py +0 -0
  192. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2cvat.py +0 -0
  193. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2voc.py +0 -0
  194. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_voc2labelme.py +0 -0
  195. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/fatigue_driving.py +0 -0
  196. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/fdd_dataset.py +0 -0
  197. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/get_pair_data.py +0 -0
  198. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/tt100k_utils.py +0 -0
  199. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/ua_detrac2voc.py +0 -0
  200. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/ucf101_dataset.py +0 -0
  201. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/voc_sbd2labelme.py +0 -0
  202. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/__init__.py +0 -0
  203. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/build_cython.py +0 -0
  204. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/build_pyarmor.py +0 -0
  205. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/cryptography_demo.py +0 -0
  206. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/fun_sum.py +0 -0
  207. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/main.py +0 -0
  208. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/model_des_enctypt.py +0 -0
  209. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/model_enctypt.py +0 -0
  210. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/date_dataset.py +0 -0
  211. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/date_demo.py +0 -0
  212. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/datedataset_bk.py +0 -0
  213. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo3.py +0 -0
  214. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_async_await1.py +0 -0
  215. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_async_await2.py +0 -0
  216. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_coco_vis.py +0 -0
  217. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_copy_files.py +0 -0
  218. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_copy_files_for_voc.py +0 -0
  219. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_ffmpy.py +0 -0
  220. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_for_pair_file.py +0 -0
  221. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_for_polygon.py +0 -0
  222. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_for_trt.py +0 -0
  223. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_get_file_label.py +0 -0
  224. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_get_file_list.py +0 -0
  225. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_gif.py +0 -0
  226. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_gif_video.py +0 -0
  227. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_image_crop.py +0 -0
  228. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_kpts.py +0 -0
  229. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_labelme.py +0 -0
  230. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_labelme_crop.py +0 -0
  231. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_metrics.py +0 -0
  232. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_mouse.py +0 -0
  233. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_nii.py +0 -0
  234. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_pandas.py +0 -0
  235. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_plot.py +0 -0
  236. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_standard_image .py +0 -0
  237. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_standard_video .py +0 -0
  238. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_taichi.py +0 -0
  239. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_video.py +0 -0
  240. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_video_crop.py +0 -0
  241. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_voc_crop.py +0 -0
  242. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_voc_vis.py +0 -0
  243. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_word_similar.py +0 -0
  244. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_worker1.py +0 -0
  245. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_worker2.py +0 -0
  246. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/__init__.py +0 -0
  247. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/demo.py +0 -0
  248. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/detect_face_person.py +0 -0
  249. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/predet_labelme.py +0 -0
  250. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/edit_distance/__init__.py +0 -0
  251. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/edit_distance/demo.py +0 -0
  252. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/edit_distance/text_matching.py +0 -0
  253. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/__init__.py +0 -0
  254. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/app.py +0 -0
  255. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/utils/__init__.py +0 -0
  256. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/utils/utils.py +0 -0
  257. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/get_file_list.py +0 -0
  258. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/__init__.py +0 -0
  259. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v1.py +0 -0
  260. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v2.py +0 -0
  261. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v3.py +0 -0
  262. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/kafka_worker.py +0 -0
  263. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/men_tracemalloc.py +0 -0
  264. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/__init__.py +0 -0
  265. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/demo01.py +0 -0
  266. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/demo02.py +0 -0
  267. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/hello_milvus.py +0 -0
  268. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/milvus_client.py +0 -0
  269. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/performance.py +0 -0
  270. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/pose/__init__.py +0 -0
  271. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/pose/human_pose.py +0 -0
  272. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/redis_py/__init__.py +0 -0
  273. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/redis_py/knn_search.py +0 -0
  274. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/redis_py/redis_client.py +0 -0
  275. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/__init__.py +0 -0
  276. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/base.py +0 -0
  277. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/component.py +0 -0
  278. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/main.py +0 -0
  279. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/register.py +0 -0
  280. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/GRU.py +0 -0
  281. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/TCN.py +0 -0
  282. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/__init__.py +0 -0
  283. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/demo.py +0 -0
  284. {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/test_fr/__init__.py +0 -0
  285. {pybaseutils-2.2.21 → 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.21
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.21'
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"]
@@ -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
@@ -1374,6 +1378,10 @@ def copy_move_voc_dataset(data_file, data_root=None, out_root=None, file_map={},
1374
1378
 
1375
1379
 
1376
1380
  if __name__ == '__main__':
1377
- dir = "/home/dm/nasdata/dataset-dmai/handwriting/word-class/trainval/unknown"
1378
- file_list, label_list = get_files_labels(dir)
1379
- 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))
@@ -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)
@@ -2871,14 +2871,17 @@ def apply_mosaic(image, boxes, radius=8, scale=[1.0, 1.0]):
2871
2871
  :param scale: 人脸框扩大范围
2872
2872
  :return:
2873
2873
  """
2874
+ ar = (5, 20)
2874
2875
  h, w = image.shape[:2]
2875
2876
  boxes = np.asarray(boxes, dtype=np.int32)
2876
2877
  boxes = extend_xyxy(boxes, scale=scale, valid_range=(0, 0, w, h))
2877
2878
  for box in boxes:
2878
2879
  x1, y1, x2, y2 = box
2879
2880
  roi = image[y1:y2, x1:x2]
2880
- size = (max((x2 - x1) // radius, 5), max((y2 - y1) // radius, 5))
2881
- img = cv2.resize(roi, size)
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))
2882
2885
  # img = cv2.resize(roi, (radius, radius))
2883
2886
  img = cv2.resize(img, (x2 - x1, y2 - y1), interpolation=cv2.INTER_NEAREST)
2884
2887
  image[y1:y2, x1:x2] = img
@@ -9,7 +9,7 @@ import os
9
9
  import toolz
10
10
  import json
11
11
  import numbers
12
- from pybaseutils.file_utils import read_json_data, write_json_path
12
+ from pybaseutils.file_utils import load_json, read_json_data, save_json, write_json_path
13
13
  from typing import List, Tuple, Dict
14
14
 
15
15
 
@@ -20,6 +20,14 @@ class Dict2Obj(object):
20
20
  self.__dict__.update(args)
21
21
 
22
22
 
23
+ def str2dict(data: str):
24
+ try:
25
+ return json.loads(data)
26
+ except Exception as e:
27
+ print(e)
28
+ return None
29
+
30
+
23
31
  def dict_sort_by_value(data: Dict, reverse=False):
24
32
  """
25
33
  按照字典的value值排序
@@ -31,16 +39,16 @@ def dict_sort_by_value(data: Dict, reverse=False):
31
39
  return dst
32
40
 
33
41
 
34
- def formatting(content):
42
+ def formatting(data):
35
43
  """格式化json数据"""
36
- info = json.dumps(content, indent=1, separators=(', ', ': '), ensure_ascii=False)
44
+ info = json.dumps(data, indent=1, separators=(', ', ': '), ensure_ascii=False)
37
45
  return info
38
46
 
39
47
 
40
- def get_keys_vaules(content, func=None):
48
+ def get_keys_vaules(data, func=None):
41
49
  """
42
50
  遍历json数据并获得所有value的key路径
43
- :param content:
51
+ :param data:
44
52
  :param func: 过滤条件函数func(k,v),默认为None,表示获取有的,获得所有value的key路径,一些常用的过滤方法:
45
53
  过滤所有文件:func = lambda k,v: isinstance(v, str) and os.path.isfile(v) and os.path.exists(v)
46
54
  过滤所有字符串:func = lambda k,v: isinstance(v, str)
@@ -66,57 +74,80 @@ def get_keys_vaules(content, func=None):
66
74
 
67
75
  keys = []
68
76
  values = []
69
- recursion(content, key=None, sub=[])
77
+ recursion(data, key=None, sub=[])
70
78
  return keys, values
71
79
 
72
80
 
73
- def get_value(content, key, default=None):
81
+ def get_value(data, key, default=None):
74
82
  """根据key路径获得对应的值"""
75
- value = toolz.get_in(key, content, default=default)
83
+ value = toolz.get_in(key, data, default=default)
76
84
  return value
77
85
 
78
86
 
79
- def get_values(content, keys):
87
+ def get_values(data, keys):
80
88
  """根据keys路径获得对应的值"""
81
- values = [toolz.get_in(k, content) for k in keys]
89
+ values = [toolz.get_in(k, data) for k in keys]
82
90
  return values
83
91
 
84
92
 
85
- def set_values(content, keys, values):
93
+ def set_values(data, keys, values):
86
94
  """根据keys路径设置对应的值"""
87
95
  for k, v in zip(keys, values):
88
- content = toolz_assoc_in(content, keys=k, value=v)
96
+ data = toolz_assoc_in(data, keys=k, value=v)
89
97
  # data = toolz.assoc_in(data, keys=k, value=v)
90
- return content
98
+ return data
91
99
 
92
100
 
93
- def set_value(content, key, value):
101
+ def set_value(data, key, value):
94
102
  """根据keys路径设置对应的值"""
95
103
  # content = toolz_assoc_in(content, keys=key, value=value)
96
- content = toolz.assoc_in(content, keys=key, value=value)
97
- return content
104
+ data = toolz.assoc_in(data, keys=key, value=value)
105
+ return data
106
+
107
+
108
+ def del_key(data: dict, key: list):
109
+ """
110
+ 安全删除嵌套字典的深层键
111
+ :param data:
112
+ :param key:
113
+ :return:
114
+ """
115
+ out = data
116
+ for k in key[:-1]:
117
+ if not isinstance(out, dict) or k not in out:
118
+ return None
119
+ out = out[k]
120
+ return out.pop(key[-1], None)
121
+
122
+
123
+ def del_keys(data: dict, keys: list):
124
+ out = []
125
+ for key in keys:
126
+ v = del_key(data, key)
127
+ out.append(v)
128
+ return out
98
129
 
99
130
 
100
- def toolz_assoc_in(content, keys, value):
131
+ def toolz_assoc_in(data, keys, value):
101
132
  """toolz_assoc_in用来代替toolz.assoc_in"""
102
133
  cur_keys = []
103
134
  for i, k in enumerate(keys):
104
135
  if isinstance(k, str):
105
136
  cur_keys.append(k)
106
137
  elif isinstance(k, int):
107
- curObj = toolz.get_in(cur_keys + [k], content)
138
+ curObj = toolz.get_in(cur_keys + [k], data)
108
139
  if curObj == None:
109
- print("发现非法参数:obj:{}, keys:{}".format(toolz.get_in(cur_keys, content), keys))
140
+ print("发现非法参数:obj:{}, keys:{}".format(toolz.get_in(cur_keys, data), keys))
110
141
  raise Exception("给定路径非法")
111
142
  newKeys = keys[i + 1:]
112
143
  if len(newKeys) == 0:
113
- toolz.get_in(cur_keys, content)[k] = value
144
+ toolz.get_in(cur_keys, data)[k] = value
114
145
  else:
115
146
  newValue = toolz_assoc_in(curObj, newKeys, value)
116
- toolz.get_in(cur_keys, content)[k] = newValue
117
- return content
147
+ toolz.get_in(cur_keys, data)[k] = newValue
148
+ return data
118
149
  if len(cur_keys) == len(keys):
119
- return toolz.assoc_in(content, cur_keys, value)
150
+ return toolz.assoc_in(data, cur_keys, value)
120
151
 
121
152
 
122
153
  if __name__ == "__main__":