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.
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/PKG-INFO +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_coco.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_labelme.py +4 -4
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/concat_coco.py +3 -3
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/video_utils.py +2 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_text.py +3 -3
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/file_utils.py +44 -36
- pybaseutils-2.2.22/pybaseutils/http_utils.py +230 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/image_utils.py +5 -2
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/json_utils.py +54 -23
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/log_utils.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/class_report.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pandas_utils.py +33 -29
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/thread_utils.py +7 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/SOURCES.txt +1 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/build_service.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_crop.py +2 -2
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/FL3D_dataset.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/handpose2coco.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/insects_for_aichallenger.py +1 -1
- pybaseutils-2.2.22/test_py/demo1.py +29 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo2.py +2 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_lableme_vis.py +1 -1
- pybaseutils-2.2.22/test_py/demo_mosaic.py +71 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_rename.py +2 -2
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/test_fr/idcardocr.py +1 -1
- pybaseutils-2.2.21/pybaseutils/http_utils.py +0 -90
- pybaseutils-2.2.21/test_py/demo1.py +0 -14
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/LICENCE +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/README.md +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/log.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/app_flask_image.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/setup.cfg +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/setup.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/class_names.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/date_demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo3.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_video.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/performance.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/base.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/component.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/registry/register.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.22}/test_py/test_fr/demo11.py +0 -0
|
@@ -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.
|
|
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.
|
|
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.
|
|
63
|
+
data_info = json_utils.load_json(anno_file)
|
|
64
64
|
data_info["imageData"] = None
|
|
65
|
-
json_utils.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
85
|
-
file_utils.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
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 = (
|
|
2881
|
-
|
|
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(
|
|
42
|
+
def formatting(data):
|
|
35
43
|
"""格式化json数据"""
|
|
36
|
-
info = json.dumps(
|
|
44
|
+
info = json.dumps(data, indent=1, separators=(', ', ': '), ensure_ascii=False)
|
|
37
45
|
return info
|
|
38
46
|
|
|
39
47
|
|
|
40
|
-
def get_keys_vaules(
|
|
48
|
+
def get_keys_vaules(data, func=None):
|
|
41
49
|
"""
|
|
42
50
|
遍历json数据并获得所有value的key路径
|
|
43
|
-
:param
|
|
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(
|
|
77
|
+
recursion(data, key=None, sub=[])
|
|
70
78
|
return keys, values
|
|
71
79
|
|
|
72
80
|
|
|
73
|
-
def get_value(
|
|
81
|
+
def get_value(data, key, default=None):
|
|
74
82
|
"""根据key路径获得对应的值"""
|
|
75
|
-
value = toolz.get_in(key,
|
|
83
|
+
value = toolz.get_in(key, data, default=default)
|
|
76
84
|
return value
|
|
77
85
|
|
|
78
86
|
|
|
79
|
-
def get_values(
|
|
87
|
+
def get_values(data, keys):
|
|
80
88
|
"""根据keys路径获得对应的值"""
|
|
81
|
-
values = [toolz.get_in(k,
|
|
89
|
+
values = [toolz.get_in(k, data) for k in keys]
|
|
82
90
|
return values
|
|
83
91
|
|
|
84
92
|
|
|
85
|
-
def set_values(
|
|
93
|
+
def set_values(data, keys, values):
|
|
86
94
|
"""根据keys路径设置对应的值"""
|
|
87
95
|
for k, v in zip(keys, values):
|
|
88
|
-
|
|
96
|
+
data = toolz_assoc_in(data, keys=k, value=v)
|
|
89
97
|
# data = toolz.assoc_in(data, keys=k, value=v)
|
|
90
|
-
return
|
|
98
|
+
return data
|
|
91
99
|
|
|
92
100
|
|
|
93
|
-
def set_value(
|
|
101
|
+
def set_value(data, key, value):
|
|
94
102
|
"""根据keys路径设置对应的值"""
|
|
95
103
|
# content = toolz_assoc_in(content, keys=key, value=value)
|
|
96
|
-
|
|
97
|
-
return
|
|
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(
|
|
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],
|
|
138
|
+
curObj = toolz.get_in(cur_keys + [k], data)
|
|
108
139
|
if curObj == None:
|
|
109
|
-
print("发现非法参数:obj:{}, keys:{}".format(toolz.get_in(cur_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,
|
|
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,
|
|
117
|
-
return
|
|
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(
|
|
150
|
+
return toolz.assoc_in(data, cur_keys, value)
|
|
120
151
|
|
|
121
152
|
|
|
122
153
|
if __name__ == "__main__":
|