pybaseutils 2.2.20__tar.gz → 2.2.22__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/PKG-INFO +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_coco.py +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_labelme.py +4 -4
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/concat_coco.py +3 -3
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/video_utils.py +2 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_text.py +3 -3
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/file_utils.py +50 -41
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/font_style/__init__.py +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/font_utils.py +19 -5
- pybaseutils-2.2.22/pybaseutils/http_utils.py +230 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/image_utils.py +26 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/json_utils.py +54 -23
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/log_utils.py +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/class_report.py +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pandas_utils.py +33 -29
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/thread_utils.py +7 -1
- pybaseutils-2.2.22/pybaseutils/web/demo.py +13 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/SOURCES.txt +2 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/build_service.py +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_crop.py +50 -14
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_video_aije.py +3 -2
- pybaseutils-2.2.20/test_py/demo1.py → pybaseutils-2.2.22/test_py/audio_demo1.py +2 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/FL3D_dataset.py +1 -1
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/handpose2coco.py +1 -1
- {pybaseutils-2.2.20 → 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.20 → pybaseutils-2.2.22}/test_py/demo2.py +2 -0
- {pybaseutils-2.2.20 → 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.20 → pybaseutils-2.2.22}/test_py/demo_rename.py +2 -2
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/test_fr/idcardocr.py +1 -1
- pybaseutils-2.2.20/pybaseutils/http_utils.py +0 -90
- pybaseutils-2.2.20/pybaseutils/web/demo.py +0 -85
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/LICENCE +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/README.md +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/log.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/app_flask_image.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/setup.cfg +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/setup.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/main.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/class_names.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/date_demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo3.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_video.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/performance.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/base.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/component.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/main.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/registry/register.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.2.20 → pybaseutils-2.2.22}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.2.20 → 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"]
|
|
@@ -107,14 +107,14 @@ def combine_flags(flags: list, use_time=True, info=True):
|
|
|
107
107
|
return out_flags
|
|
108
108
|
|
|
109
109
|
|
|
110
|
-
def write_file(file, data):
|
|
110
|
+
def write_file(file, data, mode='wb'):
|
|
111
111
|
"""写二进制数据"""
|
|
112
|
-
with open(file,
|
|
112
|
+
with open(file, mode) as f: f.write(data)
|
|
113
113
|
|
|
114
114
|
|
|
115
|
-
def read_file(file):
|
|
115
|
+
def read_file(file, mode='rb'):
|
|
116
116
|
"""读取二进制数据"""
|
|
117
|
-
with open(file,
|
|
117
|
+
with open(file, mode) as f: key = f.read()
|
|
118
118
|
return key
|
|
119
119
|
|
|
120
120
|
|
|
@@ -161,7 +161,7 @@ def parser_classes(class_name):
|
|
|
161
161
|
return class_name, class_dict
|
|
162
162
|
|
|
163
163
|
|
|
164
|
-
def
|
|
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
|
|
@@ -700,7 +704,7 @@ def create_file_path(filename):
|
|
|
700
704
|
return out_path
|
|
701
705
|
|
|
702
706
|
|
|
703
|
-
def get_sub_paths(input_dir):
|
|
707
|
+
def get_sub_paths(input_dir, abspath=False):
|
|
704
708
|
"""
|
|
705
709
|
当前路径下所有子目录
|
|
706
710
|
:param input_dir:
|
|
@@ -714,6 +718,7 @@ def get_sub_paths(input_dir):
|
|
|
714
718
|
# print(dirs) # 当前路径下所有子目录
|
|
715
719
|
# print(files) # 当前路径下所有非目录子文件
|
|
716
720
|
sub_list.sort()
|
|
721
|
+
if abspath: sub_list = [os.path.join(input_dir, p) for p in sub_list]
|
|
717
722
|
return sub_list
|
|
718
723
|
|
|
719
724
|
|
|
@@ -1373,6 +1378,10 @@ def copy_move_voc_dataset(data_file, data_root=None, out_root=None, file_map={},
|
|
|
1373
1378
|
|
|
1374
1379
|
|
|
1375
1380
|
if __name__ == '__main__':
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
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))
|
|
@@ -58,9 +58,6 @@ class FontType(object):
|
|
|
58
58
|
return self.font_type
|
|
59
59
|
|
|
60
60
|
|
|
61
|
-
# font_type = FontType()
|
|
62
|
-
|
|
63
|
-
|
|
64
61
|
def get_font_type(size, font=""):
|
|
65
62
|
"""
|
|
66
63
|
Windows字体路径 : /usr/share/fonts/楷体.ttf
|
|
@@ -101,8 +98,7 @@ def draw_image_text(image, point, text, style="楷体", size=20, color=(255, 255
|
|
|
101
98
|
font = ImageFont.truetype(style, size=size, encoding="utf-8")
|
|
102
99
|
else:
|
|
103
100
|
# simhei.ttf 是字体,你如果没有字体,需要下载
|
|
104
|
-
|
|
105
|
-
font = font_type.get_font_type()
|
|
101
|
+
font = get_font_type(size=size)
|
|
106
102
|
draw.text(point, text, fill=color, font=font)
|
|
107
103
|
image = np.asarray(image)
|
|
108
104
|
return image
|
|
@@ -211,6 +207,24 @@ def get_font_char(font_file, only_chinese=False):
|
|
|
211
207
|
return fonts
|
|
212
208
|
|
|
213
209
|
|
|
210
|
+
def set_pyplot_font(font="simhei"):
|
|
211
|
+
"""
|
|
212
|
+
设置 seaborn,matplotlib等默认字体
|
|
213
|
+
:param font: 字体路径或者名称,或者使用默认的,SimHei
|
|
214
|
+
:return:
|
|
215
|
+
"""
|
|
216
|
+
import seaborn
|
|
217
|
+
import matplotlib.pyplot as plt
|
|
218
|
+
import matplotlib.font_manager as fm
|
|
219
|
+
font_file = font if os.path.isfile(font) else FONT_TABLES[font]
|
|
220
|
+
font = os.path.basename(font_file).split(".")[0]
|
|
221
|
+
fm.fontManager.addfont(font_file)
|
|
222
|
+
plt.rcParams['font.sans-serif'] = [font]
|
|
223
|
+
plt.rcParams['axes.unicode_minus'] = False
|
|
224
|
+
seaborn.set_theme(font=font) # 增加一行代码, 设置 seaborn 使用的字体文件
|
|
225
|
+
return font_file
|
|
226
|
+
|
|
227
|
+
|
|
214
228
|
def draw_font_example():
|
|
215
229
|
size = 512
|
|
216
230
|
string = "我"
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail : 390737991@qq.com
|
|
6
|
+
# @Date : 2019-12-31 09:11:25
|
|
7
|
+
# --------------------------------------------------------
|
|
8
|
+
"""
|
|
9
|
+
import os
|
|
10
|
+
import time
|
|
11
|
+
import requests
|
|
12
|
+
import json
|
|
13
|
+
from pybaseutils import log_utils, text_utils, json_utils, thread_utils
|
|
14
|
+
|
|
15
|
+
logger = log_utils.get_logger()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def post(url, params=None, timeout=6, max_retries=1, **kwargs):
|
|
19
|
+
"""
|
|
20
|
+
:param url: 请求URL
|
|
21
|
+
:param params: 请求参数
|
|
22
|
+
:param timeout: 设置超时
|
|
23
|
+
:return:
|
|
24
|
+
"""
|
|
25
|
+
result = None
|
|
26
|
+
counts = 0
|
|
27
|
+
while counts < max_retries:
|
|
28
|
+
try:
|
|
29
|
+
t1 = time.time()
|
|
30
|
+
# r = requests.get(url, params=params, timeout=timeout,**kwargs)
|
|
31
|
+
r = requests.post(url, json=params, timeout=timeout, **kwargs)
|
|
32
|
+
t2 = time.time()
|
|
33
|
+
elapsed = (t2 - t1) * 1000
|
|
34
|
+
code = r.status_code
|
|
35
|
+
if code == 200:
|
|
36
|
+
logger.info(f'code={code}, url={url}, elapsed:{elapsed:3.3f}ms')
|
|
37
|
+
result = r.json()
|
|
38
|
+
break
|
|
39
|
+
else:
|
|
40
|
+
r.raise_for_status() # 如果响应状态码不是200,抛出异常
|
|
41
|
+
except Exception as e:
|
|
42
|
+
counts += 1
|
|
43
|
+
logger.error(f'Error msg:{e}, url={url}, try to retry times={counts}/{max_retries}')
|
|
44
|
+
time.sleep(0.1)
|
|
45
|
+
return result
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get(url, params=None, timeout=6, max_retries=1, **kwargs):
|
|
49
|
+
"""
|
|
50
|
+
:param url: 请求URL
|
|
51
|
+
:param params: 请求参数
|
|
52
|
+
:param timeout: 设置超时
|
|
53
|
+
:return:
|
|
54
|
+
"""
|
|
55
|
+
result = None
|
|
56
|
+
counts = 0
|
|
57
|
+
log = kwargs.pop("log", True)
|
|
58
|
+
while counts < max_retries:
|
|
59
|
+
try:
|
|
60
|
+
t1 = time.time()
|
|
61
|
+
r = requests.get(url, params=params, timeout=timeout, **kwargs)
|
|
62
|
+
# r = requests.post(url, json=params, timeout=timeout, **kwargs)
|
|
63
|
+
t2 = time.time()
|
|
64
|
+
elapsed = (t2 - t1) * 1000
|
|
65
|
+
code = r.status_code
|
|
66
|
+
if code == 200:
|
|
67
|
+
if log: logger.info(f'code={code}, url={url}, elapsed:{elapsed:3.3f}ms')
|
|
68
|
+
result = r.json()
|
|
69
|
+
break
|
|
70
|
+
else:
|
|
71
|
+
r.raise_for_status() # 如果响应状态码不是200,抛出异常
|
|
72
|
+
except Exception as e:
|
|
73
|
+
counts += 1
|
|
74
|
+
logger.error(f'Error msg:{e}, url={url}, try to retry times={counts}/{max_retries}')
|
|
75
|
+
time.sleep(0.1)
|
|
76
|
+
return result
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def get_url_files(url, prefix="", postfix=None, basename=False, timeout=30):
|
|
80
|
+
"""
|
|
81
|
+
获得文件服务器中文件列表
|
|
82
|
+
:param url: http URL地址等
|
|
83
|
+
:param prefix: http URL地址等
|
|
84
|
+
:param postfix: None或者[]表示所有文件
|
|
85
|
+
:param basename: 返回的列表是文件名(True),还是文件的完整路径(False)
|
|
86
|
+
:return:
|
|
87
|
+
"""
|
|
88
|
+
from bs4 import BeautifulSoup
|
|
89
|
+
try:
|
|
90
|
+
if url.endswith("/"): url = url[:-1]
|
|
91
|
+
# 设置超时和重试
|
|
92
|
+
r = requests.get(url, timeout=timeout, auth=("admin", "admin"))
|
|
93
|
+
r.raise_for_status()
|
|
94
|
+
# 解析目录列表
|
|
95
|
+
soup = BeautifulSoup(r.text, 'html.parser')
|
|
96
|
+
file_list = [a['href'] for a in soup.select('a[href]')]
|
|
97
|
+
# 过滤并拼接完整URL
|
|
98
|
+
file_list = text_utils.find_match_texts(file_list, pattern=[prefix], org=True) if prefix else file_list
|
|
99
|
+
file_list = text_utils.find_match_texts(file_list, pattern=postfix, org=True) if postfix else file_list
|
|
100
|
+
file_list.sort()
|
|
101
|
+
file_list = file_list if basename else [f"{url}/{f}" for f in file_list]
|
|
102
|
+
return file_list
|
|
103
|
+
except Exception as e:
|
|
104
|
+
print(f"请求失败: {str(e)}")
|
|
105
|
+
return []
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def download_file(url, out, timeout=30, max_retries=1, log=False):
|
|
109
|
+
"""
|
|
110
|
+
根据url下载文件
|
|
111
|
+
:param url: 文件URL
|
|
112
|
+
:param out: 输出保存目录
|
|
113
|
+
:param log: 是否打印LOG信息
|
|
114
|
+
:return:
|
|
115
|
+
"""
|
|
116
|
+
try:
|
|
117
|
+
os.makedirs(out, exist_ok=True)
|
|
118
|
+
name = url.split('/')[-1]
|
|
119
|
+
path = os.path.join(out, name)
|
|
120
|
+
data = get(url, params=None, timeout=timeout, max_retries=max_retries, log=False)
|
|
121
|
+
assert data
|
|
122
|
+
if name.endswith("json"):
|
|
123
|
+
json_utils.save_json(path, data)
|
|
124
|
+
else:
|
|
125
|
+
with open(path, 'w', encoding='utf-8') as f:
|
|
126
|
+
f.write(data)
|
|
127
|
+
if log: print(f"下载成功: {url} --> {path}")
|
|
128
|
+
return path
|
|
129
|
+
except Exception as e:
|
|
130
|
+
if log: print(f"下载失败: {url}")
|
|
131
|
+
return None
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def download_files(urls: list, out, max_workers=8, timeout=30, max_retries=1):
|
|
135
|
+
"""
|
|
136
|
+
:param urls: 文件URL列表
|
|
137
|
+
:param out: 下载保持目录
|
|
138
|
+
:param max_workers:
|
|
139
|
+
:param timeout:
|
|
140
|
+
:param max_retries:
|
|
141
|
+
:return: 返回下载成功的本地文件列表file_list
|
|
142
|
+
"""
|
|
143
|
+
pool = thread_utils.ThreadPool(max_workers=max_workers)
|
|
144
|
+
inputs = [(url, out, timeout, max_retries) for url in urls]
|
|
145
|
+
print("----" * 10)
|
|
146
|
+
print(f"启动{max_workers}个线程下载{len(urls)}个文件,请等待....")
|
|
147
|
+
t0 = time.time()
|
|
148
|
+
file_list = pool.task_maps(func=download_file, inputs=inputs)
|
|
149
|
+
t1 = time.time()
|
|
150
|
+
dt = (t1 - t0) * 1000
|
|
151
|
+
# 下载失败的url列表loss_list
|
|
152
|
+
loss_list = [urls[i] for i in range(len(file_list)) if not file_list[i]]
|
|
153
|
+
print(f"成功:{len(file_list) - len(loss_list)},失败:{len(loss_list)},耗时:{dt:.2f}ms")
|
|
154
|
+
return file_list, loss_list
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def read_url_file(url, timeout=30, max_retries=1):
|
|
158
|
+
"""
|
|
159
|
+
根据url读取文件
|
|
160
|
+
:param url: 文件URL
|
|
161
|
+
:param timeout:
|
|
162
|
+
:param max_retries:
|
|
163
|
+
:return:
|
|
164
|
+
"""
|
|
165
|
+
try:
|
|
166
|
+
data = get(url, params=None, timeout=timeout, max_retries=max_retries, log=False)
|
|
167
|
+
return data
|
|
168
|
+
except Exception as e:
|
|
169
|
+
print(f"读取失败: {url}")
|
|
170
|
+
return None
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def read_url_files(urls: list, max_workers=8, timeout=30, max_retries=1):
|
|
174
|
+
"""
|
|
175
|
+
根据url读取文件
|
|
176
|
+
:param urls: 文件urls列表
|
|
177
|
+
:param max_workers: 开启线程数目
|
|
178
|
+
:param timeout:
|
|
179
|
+
:param max_retries:
|
|
180
|
+
:return: 返回读取成功的文件数据file_list
|
|
181
|
+
"""
|
|
182
|
+
pool = thread_utils.ThreadPool(max_workers=max_workers)
|
|
183
|
+
inputs = [(url, timeout, max_retries) for url in urls]
|
|
184
|
+
print("----" * 10)
|
|
185
|
+
print(f"启动{max_workers}个线程读取{len(urls)}个文件,请等待....")
|
|
186
|
+
t0 = time.time()
|
|
187
|
+
file_list = pool.task_maps(func=read_url_file, inputs=inputs)
|
|
188
|
+
t1 = time.time()
|
|
189
|
+
dt = (t1 - t0) * 1000
|
|
190
|
+
# 读取失败的url列表loss_list
|
|
191
|
+
loss_list = [urls[i] for i in range(len(file_list)) if not file_list[i]]
|
|
192
|
+
print(f"成功:{len(file_list) - len(loss_list)},失败:{len(loss_list)},耗时:{dt:.2f}ms")
|
|
193
|
+
return file_list, loss_list
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def tojson(data: dict, keys: list):
|
|
197
|
+
"""
|
|
198
|
+
指定需要反序列的数据
|
|
199
|
+
:param data:
|
|
200
|
+
:param keys:
|
|
201
|
+
:return:
|
|
202
|
+
"""
|
|
203
|
+
if isinstance(data, dict):
|
|
204
|
+
for k, v in data.items():
|
|
205
|
+
if k in keys:
|
|
206
|
+
try:
|
|
207
|
+
data[k] = json.loads(v)
|
|
208
|
+
except Exception as e:
|
|
209
|
+
print(e)
|
|
210
|
+
else:
|
|
211
|
+
data[k] = tojson(v, keys=keys)
|
|
212
|
+
elif isinstance(data, list):
|
|
213
|
+
for i in range(len(data)):
|
|
214
|
+
data[i] = tojson(data[i], keys=keys)
|
|
215
|
+
return data
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
if __name__ == '__main__':
|
|
219
|
+
urls = [
|
|
220
|
+
"http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-12.json",
|
|
221
|
+
"http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-13.json",
|
|
222
|
+
"http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-17.json",
|
|
223
|
+
]
|
|
224
|
+
out = "/home/PKing/Downloads/tmp"
|
|
225
|
+
url = 'https://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m911dzow-17cu'
|
|
226
|
+
urls = get_url_files(url, postfix=["*.json"])
|
|
227
|
+
file_list1, loss_list1 = download_files(urls, out=out, max_retries=1)
|
|
228
|
+
file_list2, loss_list2 = read_url_files(urls, max_retries=1)
|
|
229
|
+
print(loss_list1)
|
|
230
|
+
print(loss_list2)
|
|
@@ -2862,6 +2862,32 @@ def get_image_block(image, grid=[3, 3], same=False):
|
|
|
2862
2862
|
return image_block
|
|
2863
2863
|
|
|
2864
2864
|
|
|
2865
|
+
def apply_mosaic(image, boxes, radius=8, scale=[1.0, 1.0]):
|
|
2866
|
+
"""
|
|
2867
|
+
马赛克
|
|
2868
|
+
:param image: BGR image
|
|
2869
|
+
:param boxes: 人脸框(xmin,ymin,xmax,ymax)
|
|
2870
|
+
:param radius: 马赛克强度
|
|
2871
|
+
:param scale: 人脸框扩大范围
|
|
2872
|
+
:return:
|
|
2873
|
+
"""
|
|
2874
|
+
ar = (5, 20)
|
|
2875
|
+
h, w = image.shape[:2]
|
|
2876
|
+
boxes = np.asarray(boxes, dtype=np.int32)
|
|
2877
|
+
boxes = extend_xyxy(boxes, scale=scale, valid_range=(0, 0, w, h))
|
|
2878
|
+
for box in boxes:
|
|
2879
|
+
x1, y1, x2, y2 = box
|
|
2880
|
+
roi = image[y1:y2, x1:x2]
|
|
2881
|
+
size = [(x2 - x1) // radius, (y2 - y1) // radius]
|
|
2882
|
+
size[0] = max(min(size[0], ar[1]), ar[0])
|
|
2883
|
+
size[1] = max(min(size[1], ar[1]), ar[0])
|
|
2884
|
+
img = cv2.resize(roi, tuple(size))
|
|
2885
|
+
# img = cv2.resize(roi, (radius, radius))
|
|
2886
|
+
img = cv2.resize(img, (x2 - x1, y2 - y1), interpolation=cv2.INTER_NEAREST)
|
|
2887
|
+
image[y1:y2, x1:x2] = img
|
|
2888
|
+
return image
|
|
2889
|
+
|
|
2890
|
+
|
|
2865
2891
|
def image_composite(image: np.ndarray, alpha: np.ndarray, bg_img=(219, 142, 67)):
|
|
2866
2892
|
"""
|
|
2867
2893
|
图像融合:合成图 = 前景*alpha+背景*(1-alpha)
|