pybaseutils 2.2.9__tar.gz → 2.2.10__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.9 → pybaseutils-2.2.10}/PKG-INFO +1 -1
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.2.10/pybaseutils/http_utils.py +90 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/image_utils.py +27 -21
- pybaseutils-2.2.10/pybaseutils/log_utils.py +64 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/text_utils.py +1 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils.egg-info/SOURCES.txt +1 -1
- pybaseutils-2.2.10/test_py/demo3.py +98 -0
- pybaseutils-2.2.9/pybaseutils/log_utils.py +0 -191
- pybaseutils-2.2.9/pybaseutils/logger.py +0 -62
- pybaseutils-2.2.9/test_py/demo3.py +0 -16
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/LICENCE +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/README.md +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/file_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/log.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/setup.cfg +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/setup.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/audio/main.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/camera/main.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/class_names.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo1.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo2.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_video.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/flask_demo/func.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/flask_demo/server.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/performance.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/registry/base.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/registry/component.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/registry/main.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/registry/register.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.2.9 → pybaseutils-2.2.10}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# -*- coding:utf-8 -*-
|
|
2
|
+
import logging
|
|
3
|
+
import time
|
|
4
|
+
import requests
|
|
5
|
+
import json
|
|
6
|
+
from pybaseutils import log_utils
|
|
7
|
+
|
|
8
|
+
logger = log_utils.get_logger()
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def post(url, params, timeout=6, max_retries=1, **kwargs):
|
|
12
|
+
"""
|
|
13
|
+
:param url: 请求URL
|
|
14
|
+
:param params: 请求参数
|
|
15
|
+
:param timeout: 设置超时
|
|
16
|
+
:return:
|
|
17
|
+
"""
|
|
18
|
+
result = None
|
|
19
|
+
counts = 0
|
|
20
|
+
while counts < max_retries:
|
|
21
|
+
try:
|
|
22
|
+
t1 = time.time()
|
|
23
|
+
# r = requests.get(url, params=params, timeout=timeout,**kwargs)
|
|
24
|
+
r = requests.post(url, json=params, timeout=timeout, **kwargs)
|
|
25
|
+
t2 = time.time()
|
|
26
|
+
elapsed = (t2 - t1) * 1000
|
|
27
|
+
code = r.status_code
|
|
28
|
+
if code == 200:
|
|
29
|
+
logger.info(f'code={code}, url={url}, elapsed:{elapsed:3.3f}ms')
|
|
30
|
+
result = r.json()
|
|
31
|
+
break
|
|
32
|
+
else:
|
|
33
|
+
r.raise_for_status() # 如果响应状态码不是200,抛出异常
|
|
34
|
+
except Exception as e:
|
|
35
|
+
counts += 1
|
|
36
|
+
logger.error(f'Error msg:{e}, try to retry times={counts}/{max_retries}')
|
|
37
|
+
time.sleep(0.1)
|
|
38
|
+
return result
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def get(url, params, timeout=6, max_retries=1, **kwargs):
|
|
42
|
+
"""
|
|
43
|
+
:param url: 请求URL
|
|
44
|
+
:param params: 请求参数
|
|
45
|
+
:param timeout: 设置超时
|
|
46
|
+
:return:
|
|
47
|
+
"""
|
|
48
|
+
result = None
|
|
49
|
+
counts = 0
|
|
50
|
+
while counts < max_retries:
|
|
51
|
+
try:
|
|
52
|
+
t1 = time.time()
|
|
53
|
+
r = requests.get(url, params=params, timeout=timeout, **kwargs)
|
|
54
|
+
# r = requests.post(url, json=params, timeout=timeout, **kwargs)
|
|
55
|
+
t2 = time.time()
|
|
56
|
+
elapsed = (t2 - t1) * 1000
|
|
57
|
+
code = r.status_code
|
|
58
|
+
if code == 200:
|
|
59
|
+
logger.info(f'code={code}, url={url}, elapsed:{elapsed:3.3f}ms')
|
|
60
|
+
result = r.json()
|
|
61
|
+
break
|
|
62
|
+
else:
|
|
63
|
+
r.raise_for_status() # 如果响应状态码不是200,抛出异常
|
|
64
|
+
except Exception as e:
|
|
65
|
+
counts += 1
|
|
66
|
+
logger.error(f'Error msg:{e}, try to retry times={counts}/{max_retries}')
|
|
67
|
+
time.sleep(0.1)
|
|
68
|
+
return result
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def tojson(data: dict, keys: list):
|
|
72
|
+
"""
|
|
73
|
+
指定需要反序列的数据
|
|
74
|
+
:param data:
|
|
75
|
+
:param keys:
|
|
76
|
+
:return:
|
|
77
|
+
"""
|
|
78
|
+
if isinstance(data, dict):
|
|
79
|
+
for k, v in data.items():
|
|
80
|
+
if k in keys:
|
|
81
|
+
try:
|
|
82
|
+
data[k] = json.loads(v)
|
|
83
|
+
except Exception as e:
|
|
84
|
+
print(e)
|
|
85
|
+
else:
|
|
86
|
+
data[k] = tojson(v, keys=keys)
|
|
87
|
+
elif isinstance(data, list):
|
|
88
|
+
for i in range(len(data)):
|
|
89
|
+
data[i] = tojson(data[i], keys=keys)
|
|
90
|
+
return data
|
|
@@ -166,25 +166,6 @@ def check_point(point):
|
|
|
166
166
|
return r
|
|
167
167
|
|
|
168
168
|
|
|
169
|
-
def transpose(data):
|
|
170
|
-
data = data.transpose(2, 0, 1) # HWC->CHW
|
|
171
|
-
return data
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
def untranspose(data):
|
|
175
|
-
if len(data.shape) == 3:
|
|
176
|
-
data = data.transpose(1, 2, 0).copy() # 通道由[c,h,w]->[h,w,c]
|
|
177
|
-
else:
|
|
178
|
-
data = data.transpose(1, 0).copy()
|
|
179
|
-
return data
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def swap_image(image):
|
|
183
|
-
# image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
|
|
184
|
-
image = image[:, :, ::-1] # RGB->BGR
|
|
185
|
-
return image
|
|
186
|
-
|
|
187
|
-
|
|
188
169
|
def show_batch_image(title, batch_images, index=0):
|
|
189
170
|
'''
|
|
190
171
|
批量显示图片
|
|
@@ -332,6 +313,31 @@ def get_prewhiten_image(x):
|
|
|
332
313
|
return y
|
|
333
314
|
|
|
334
315
|
|
|
316
|
+
def transpose(data):
|
|
317
|
+
data = data.transpose(2, 0, 1) # HWC->CHW
|
|
318
|
+
return data
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
image_hwc2chw = transpose
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def untranspose(data):
|
|
325
|
+
if len(data.shape) == 3:
|
|
326
|
+
data = data.transpose(1, 2, 0).copy() # 通道由[c,h,w]->[h,w,c]
|
|
327
|
+
else:
|
|
328
|
+
data = data.transpose(1, 0).copy()
|
|
329
|
+
return data
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
image_chw2hwc = untranspose
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def swap_image(image):
|
|
336
|
+
# image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
|
|
337
|
+
image = image[:, :, ::-1] # RGB->BGR
|
|
338
|
+
return image
|
|
339
|
+
|
|
340
|
+
|
|
335
341
|
def image_normalize(image, mean=None, std=None):
|
|
336
342
|
'''
|
|
337
343
|
正则化,归一化
|
|
@@ -357,9 +363,9 @@ def image_normalize(image, mean=None, std=None):
|
|
|
357
363
|
|
|
358
364
|
def image_unnormalize(image, mean=None, std=None):
|
|
359
365
|
"""
|
|
360
|
-
|
|
366
|
+
反归一化
|
|
361
367
|
image = image/255.0
|
|
362
|
-
image[channel] =
|
|
368
|
+
image[channel] = image[channel] * std[channel]+ mean[channel])
|
|
363
369
|
:param image: numpy image
|
|
364
370
|
:param mean: [0.5,0.5,0.5]
|
|
365
371
|
:param std: [0.5,0.5,0.5]
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : PKing
|
|
4
|
+
@E-mail :
|
|
5
|
+
@Date : 2024-12-10 22:22:58
|
|
6
|
+
@Brief :
|
|
7
|
+
"""
|
|
8
|
+
import os
|
|
9
|
+
import sys
|
|
10
|
+
import logging
|
|
11
|
+
from logging.handlers import TimedRotatingFileHandler
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_logger(name='APPLOG', level="info", logfile=None, is_main_process=True):
|
|
15
|
+
"""
|
|
16
|
+
:param name:
|
|
17
|
+
:param logfile:
|
|
18
|
+
:param level: CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET
|
|
19
|
+
:return:
|
|
20
|
+
"""
|
|
21
|
+
# 创建logger对象
|
|
22
|
+
if is_main_process:
|
|
23
|
+
logger = logging.getLogger(name)
|
|
24
|
+
# 如果logger已经有,则不添加
|
|
25
|
+
if logger.handlers: return logger
|
|
26
|
+
logger.setLevel(level.upper())
|
|
27
|
+
# 创建格式化器
|
|
28
|
+
formatter = logging.Formatter(
|
|
29
|
+
fmt="%(asctime)s|%(levelname)6s|%(filename)20s|%(funcName)20s|Line%(lineno)4s|%(message)s",
|
|
30
|
+
datefmt="%Y-%m-%d %H:%M:%S"
|
|
31
|
+
)
|
|
32
|
+
# 创建控制台处理器
|
|
33
|
+
console_handler = logging.StreamHandler(sys.stdout)
|
|
34
|
+
console_handler.setFormatter(formatter)
|
|
35
|
+
logger.addHandler(console_handler)
|
|
36
|
+
|
|
37
|
+
# 创建日志目录
|
|
38
|
+
if logfile:
|
|
39
|
+
os.makedirs(os.path.dirname(logfile), exist_ok=True)
|
|
40
|
+
# 创建文件处理器(按时间轮转)
|
|
41
|
+
file_handler = TimedRotatingFileHandler(
|
|
42
|
+
logfile,
|
|
43
|
+
when='midnight', # 每天午夜切换新文件
|
|
44
|
+
interval=1, # 间隔为1天
|
|
45
|
+
backupCount=30, # 保留30天的日志文件
|
|
46
|
+
encoding='utf-8'
|
|
47
|
+
)
|
|
48
|
+
file_handler.setFormatter(formatter)
|
|
49
|
+
logger.addHandler(file_handler)
|
|
50
|
+
else:
|
|
51
|
+
logger = logging.getLogger(name)
|
|
52
|
+
logger.setLevel("warning")
|
|
53
|
+
return logger
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == '__main__':
|
|
57
|
+
logger = get_logger(name='APPLOG', level="debug", logfile="./log.log")
|
|
58
|
+
# 测试日志输出
|
|
59
|
+
logger.debug('-----------------')
|
|
60
|
+
logger.debug('这是一条调试信息')
|
|
61
|
+
logger.info('这是一条信息')
|
|
62
|
+
logger.warning('这是一条警告')
|
|
63
|
+
logger.error('这是一条错误信息')
|
|
64
|
+
logger.critical('这是一条严重错误信息')
|
|
@@ -11,11 +11,11 @@ pybaseutils/file_utils.py
|
|
|
11
11
|
pybaseutils/font_utils.py
|
|
12
12
|
pybaseutils/geometry_tools.py
|
|
13
13
|
pybaseutils/heatmap_utils.py
|
|
14
|
+
pybaseutils/http_utils.py
|
|
14
15
|
pybaseutils/image_utils.py
|
|
15
16
|
pybaseutils/json_utils.py
|
|
16
17
|
pybaseutils/log.py
|
|
17
18
|
pybaseutils/log_utils.py
|
|
18
|
-
pybaseutils/logger.py
|
|
19
19
|
pybaseutils/numpy_utils.py
|
|
20
20
|
pybaseutils/pandas_utils.py
|
|
21
21
|
pybaseutils/plot_utils.py
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : panjq
|
|
4
|
+
@E-mail : pan_jinquan@163.com
|
|
5
|
+
@Date : 2022-08-30 09:45:44
|
|
6
|
+
@Brief :
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import numpy as np
|
|
11
|
+
import cv2
|
|
12
|
+
from tqdm import tqdm
|
|
13
|
+
from pybaseutils import image_utils, file_utils
|
|
14
|
+
from pybaseutils.converter import build_voc
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def save_voc_dataset(bboxes, labels, image_file, image_shape, out_xml_dir):
|
|
18
|
+
"""
|
|
19
|
+
保存VOC数据集
|
|
20
|
+
:param bboxes:
|
|
21
|
+
:param labels:
|
|
22
|
+
:param image_file:
|
|
23
|
+
:param image_shape:
|
|
24
|
+
:param out_xml_dir:
|
|
25
|
+
:return:
|
|
26
|
+
"""
|
|
27
|
+
basename = os.path.basename(image_file)
|
|
28
|
+
image_id = basename.split(".")[0]
|
|
29
|
+
objects = []
|
|
30
|
+
for box, name in zip(bboxes, labels):
|
|
31
|
+
objects.append({"name": name, "bndbox": box})
|
|
32
|
+
xml_path = file_utils.create_dir(out_xml_dir, None, "{}.xml".format(image_id))
|
|
33
|
+
build_voc.write_voc_xml_objects(basename, image_shape, objects, xml_path)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def save_crop_dataset(image, bboxes, labels, image_file, crop_root):
|
|
37
|
+
"""
|
|
38
|
+
裁剪检测区域
|
|
39
|
+
:param image:
|
|
40
|
+
:param bboxes:
|
|
41
|
+
:param labels:
|
|
42
|
+
:param image_file:
|
|
43
|
+
:param crop_root:
|
|
44
|
+
:return:
|
|
45
|
+
"""
|
|
46
|
+
basename = os.path.basename(image_file)
|
|
47
|
+
image_id = basename.split(".")[0]
|
|
48
|
+
crops = image_utils.get_bboxes_image(image, bboxes, size=None)
|
|
49
|
+
for i, (img, label) in enumerate(zip(crops, labels)):
|
|
50
|
+
file = file_utils.create_dir(crop_root, label, "{}_{:0=3d}.jpg".format(image_id, i))
|
|
51
|
+
cv2.imwrite(file, img)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def convert_HaGRID_dataset(data_root, vis=True):
|
|
55
|
+
"""
|
|
56
|
+
将HaGRID转换为VOC和分类数据集
|
|
57
|
+
:param data_root: HaGRID数据集个根目录
|
|
58
|
+
:param vis: 是否可视化效果
|
|
59
|
+
:return:
|
|
60
|
+
"""
|
|
61
|
+
sub_list = file_utils.get_sub_paths(data_root)
|
|
62
|
+
class_names = []
|
|
63
|
+
for sub in sub_list:
|
|
64
|
+
anno_file = os.path.join(data_root, sub, "{}.json".format(sub))
|
|
65
|
+
annotation = file_utils.read_json_data(anno_file)
|
|
66
|
+
image_list = file_utils.get_images_list(os.path.join(data_root, sub, "JPEGImages"))
|
|
67
|
+
print("process:{},nums:{}".format(anno_file, len(image_list)))
|
|
68
|
+
# 保存VOC格式的xml文件
|
|
69
|
+
out_xml_dir = os.path.join(data_root, sub, "Annotations")
|
|
70
|
+
# 裁剪并保存标注框区域的图片
|
|
71
|
+
out_crop_dir = os.path.join(data_root, sub, "Classification")
|
|
72
|
+
for image_file in tqdm(image_list):
|
|
73
|
+
basename = os.path.basename(image_file)
|
|
74
|
+
image_id = basename.split(".")[0]
|
|
75
|
+
image = cv2.imread(image_file)
|
|
76
|
+
anno = annotation[image_id]
|
|
77
|
+
h, w = image.shape[:2]
|
|
78
|
+
# [top left X pos, top left Y pos, width, height]
|
|
79
|
+
bboxes = image_utils.rects2bboxes(anno['bboxes'])
|
|
80
|
+
bboxes = np.asarray(bboxes) * [w, h, w, h]
|
|
81
|
+
labels = anno['labels']
|
|
82
|
+
class_names += labels
|
|
83
|
+
image_shape = image.shape
|
|
84
|
+
assert len(bboxes) == len(labels)
|
|
85
|
+
if out_xml_dir:
|
|
86
|
+
save_voc_dataset(bboxes, labels, image_file, image_shape, out_xml_dir)
|
|
87
|
+
if out_crop_dir:
|
|
88
|
+
save_crop_dataset(image, bboxes, labels, image_file, out_crop_dir)
|
|
89
|
+
if vis:
|
|
90
|
+
image = image_utils.draw_image_bboxes_text(image, bboxes, labels, color=(255, 0, 0))
|
|
91
|
+
image_utils.cv_show_image("image", image, use_rgb=False)
|
|
92
|
+
class_names = set(class_names)
|
|
93
|
+
print(class_names)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
if __name__ == "__main__":
|
|
97
|
+
data_root = "path/to/gesture/HaGRID/trainval"
|
|
98
|
+
convert_HaGRID_dataset(data_root, vis=True)
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
"""
|
|
3
|
-
# --------------------------------------------------------
|
|
4
|
-
# @Author : Pan
|
|
5
|
-
# @Date : 2019-9-20 13:18:34
|
|
6
|
-
# --------------------------------------------------------
|
|
7
|
-
"""
|
|
8
|
-
import os
|
|
9
|
-
import datetime
|
|
10
|
-
import logging
|
|
11
|
-
import threading
|
|
12
|
-
import re
|
|
13
|
-
import time
|
|
14
|
-
from logging.handlers import TimedRotatingFileHandler
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# from memory_profiler import profile
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def singleton(cls):
|
|
21
|
-
_instance_lock = threading.Lock()
|
|
22
|
-
instances = {}
|
|
23
|
-
|
|
24
|
-
def _singleton(*args, **kwargs):
|
|
25
|
-
with _instance_lock:
|
|
26
|
-
if cls not in instances:
|
|
27
|
-
instances[cls] = cls(*args, **kwargs)
|
|
28
|
-
return instances[cls]
|
|
29
|
-
|
|
30
|
-
return _singleton
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
@singleton # 使用singleton,会出现loger的level失效的问题
|
|
34
|
-
class CustomLogger(logging.Logger):
|
|
35
|
-
def __init__(self, name="LOG", level="debug"):
|
|
36
|
-
"""
|
|
37
|
-
Initialize the logger with a name and an optional level.
|
|
38
|
-
Args:
|
|
39
|
-
name:
|
|
40
|
-
level: debug,info,warning,critical,fatal
|
|
41
|
-
"""
|
|
42
|
-
super().__init__(name)
|
|
43
|
-
# super(CustomLogger, self).__init__(name)
|
|
44
|
-
self.setLevel(level=level)
|
|
45
|
-
|
|
46
|
-
@staticmethod
|
|
47
|
-
def levels(level):
|
|
48
|
-
if level == 'debug':
|
|
49
|
-
return logging.DEBUG
|
|
50
|
-
if level == 'info':
|
|
51
|
-
return logging.INFO
|
|
52
|
-
if level == 'warning':
|
|
53
|
-
return logging.WARN
|
|
54
|
-
if level == 'critical':
|
|
55
|
-
return logging.CRITICAL
|
|
56
|
-
if level == 'fatal':
|
|
57
|
-
return logging.FATAL
|
|
58
|
-
return logging.DEBUG
|
|
59
|
-
|
|
60
|
-
def setLevel(self, level):
|
|
61
|
-
"""
|
|
62
|
-
Args:
|
|
63
|
-
level: debug,info,warning,critical,fatal
|
|
64
|
-
Returns:
|
|
65
|
-
"""
|
|
66
|
-
level = self.levels(level)
|
|
67
|
-
super().setLevel(level)
|
|
68
|
-
|
|
69
|
-
@staticmethod
|
|
70
|
-
def set_format(handler, format):
|
|
71
|
-
# handler.suffix = "%Y%m%d"
|
|
72
|
-
if format:
|
|
73
|
-
logFormatter = logging.Formatter("%(asctime)s %(filename)s %(funcName)s %(levelname)s: %(message)s",
|
|
74
|
-
"%Y-%m-%d %H:%M:%S")
|
|
75
|
-
else:
|
|
76
|
-
logFormatter = logging.Formatter("%(levelname)s: %(message)s")
|
|
77
|
-
handler.setFormatter(logFormatter)
|
|
78
|
-
|
|
79
|
-
def show_batch_tensor(self, title, batch_imgs, index=0):
|
|
80
|
-
pass
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
class FileHandler(TimedRotatingFileHandler):
|
|
84
|
-
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False,
|
|
85
|
-
atTime=None):
|
|
86
|
-
logging.handlers.BaseRotatingHandler.__init__(self, filename, 'a', encoding, delay)
|
|
87
|
-
self.when = when.upper()
|
|
88
|
-
self.backupCount = backupCount
|
|
89
|
-
self.utc = utc
|
|
90
|
-
self.atTime = atTime
|
|
91
|
-
if self.when == 'S':
|
|
92
|
-
self.interval = 1 # one second
|
|
93
|
-
self.suffix = "%Y-%m-%d_%H-%M-%S"
|
|
94
|
-
self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$"
|
|
95
|
-
elif self.when == 'M':
|
|
96
|
-
self.interval = 60 # one minute
|
|
97
|
-
self.suffix = "%Y-%m-%d_%H-%M"
|
|
98
|
-
self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$"
|
|
99
|
-
elif self.when == 'H':
|
|
100
|
-
self.interval = 60 * 60 # one hour
|
|
101
|
-
self.suffix = "%Y-%m-%d_%H"
|
|
102
|
-
self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$"
|
|
103
|
-
elif self.when == 'D' or self.when == 'MIDNIGHT':
|
|
104
|
-
self.interval = 60 * 60 * 24 # one day
|
|
105
|
-
self.suffix = "%Y-%m-%d"
|
|
106
|
-
self.extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"
|
|
107
|
-
elif self.when.startswith('W'):
|
|
108
|
-
self.interval = 60 * 60 * 24 * 7 # one week
|
|
109
|
-
if len(self.when) != 2:
|
|
110
|
-
raise ValueError("You must specify a day for weekly rollover from 0 to 6 (0 is Monday): %s" % self.when)
|
|
111
|
-
if self.when[1] < '0' or self.when[1] > '6':
|
|
112
|
-
raise ValueError("Invalid day specified for weekly rollover: %s" % self.when)
|
|
113
|
-
self.dayOfWeek = int(self.when[1])
|
|
114
|
-
self.suffix = "%Y-%m-%d"
|
|
115
|
-
self.extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"
|
|
116
|
-
elif self.when == 'Y':
|
|
117
|
-
self.interval = 60 * 60 * 24 * 365 # one yes
|
|
118
|
-
self.suffix = "%Y-%m-%d"
|
|
119
|
-
self.extMatch = r"^\d{4}-\d{2}-\d{2}(\.\w+)?$"
|
|
120
|
-
else:
|
|
121
|
-
raise ValueError("Invalid rollover interval specified: %s" % self.when)
|
|
122
|
-
|
|
123
|
-
self.extMatch = re.compile(self.extMatch, re.ASCII)
|
|
124
|
-
self.interval = self.interval * interval # multiply by units requested
|
|
125
|
-
# The following line added because the filename passed in could be a
|
|
126
|
-
# path object (see Issue #27493), but self.baseFilename will be a string
|
|
127
|
-
filename = self.baseFilename
|
|
128
|
-
if os.path.exists(filename):
|
|
129
|
-
t = os.stat(filename)[logging.handlers.ST_MTIME]
|
|
130
|
-
else:
|
|
131
|
-
t = int(time.time())
|
|
132
|
-
self.rolloverAt = self.computeRollover(t)
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
def set_logger(name="LOG", level="debug", logfile=None, format=False, is_main_process=True):
|
|
136
|
-
"""
|
|
137
|
-
logger = set_logging(name="LOG", level="debug", logfile="log.txt", format=False)
|
|
138
|
-
url:https://cuiqingcai.com/6080.html
|
|
139
|
-
level级别:debug>info>warning>error>critical
|
|
140
|
-
:param level: 设置log输出级别
|
|
141
|
-
:param logfile: log保存路径,如果为None,则在控制台打印log
|
|
142
|
-
:param is_main_process: 是否是主进程
|
|
143
|
-
:return:
|
|
144
|
-
"""
|
|
145
|
-
if not is_main_process:
|
|
146
|
-
level = "fatal"
|
|
147
|
-
logfile = None
|
|
148
|
-
# logger = logging.getLogger(name)
|
|
149
|
-
logger = CustomLogger(name, level=level)
|
|
150
|
-
if logfile and os.path.exists(logfile):
|
|
151
|
-
os.remove(logfile)
|
|
152
|
-
# define a FileHandler write messages to file
|
|
153
|
-
if logfile:
|
|
154
|
-
# filehandler = logging.handlers.RotatingFileHandler(filename="./log.txt")
|
|
155
|
-
# filehandler = TimedRotatingFileHandler(logfile, when="midnight", interval=1)
|
|
156
|
-
filehandler = FileHandler(logfile, when="Y", interval=1)
|
|
157
|
-
logger.set_format(filehandler, format)
|
|
158
|
-
logger.addHandler(filehandler)
|
|
159
|
-
|
|
160
|
-
# define a StreamHandler print messages to console
|
|
161
|
-
console = logging.StreamHandler()
|
|
162
|
-
logger.set_format(console, format)
|
|
163
|
-
logger.addHandler(console)
|
|
164
|
-
return logger
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
def print_args(args):
|
|
168
|
-
logger = get_logger()
|
|
169
|
-
logger.info("---" * 10)
|
|
170
|
-
args = args.__dict__
|
|
171
|
-
for k, v in args.items():
|
|
172
|
-
# print("{}: {}".format(k, v))
|
|
173
|
-
logger.info("{}: {}".format(k, v))
|
|
174
|
-
logger.info("---" * 10)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
def get_logger(name="LOG", level="debug"):
|
|
178
|
-
logger = CustomLogger(name)
|
|
179
|
-
# if logger.isEnabledFor(CustomLogger.levels(level)):
|
|
180
|
-
# logger = CustomLogger(name, level=level)
|
|
181
|
-
return logger
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
if __name__ == '__main__':
|
|
185
|
-
logger = set_logger(logfile=None, level="debug")
|
|
186
|
-
logger1 = get_logger()
|
|
187
|
-
logger1.info("---" * 20)
|
|
188
|
-
logger1.debug("work_space:{}".format("work_dir"))
|
|
189
|
-
logger1.info("work_space:{}".format("work_dir"))
|
|
190
|
-
logger1.error("work_space:{}".format("work_dir"))
|
|
191
|
-
logger1.fatal("work_space:{}".format("work_dir"))
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import logging
|
|
3
|
-
import threading
|
|
4
|
-
import sys
|
|
5
|
-
import time
|
|
6
|
-
|
|
7
|
-
local = threading.local()
|
|
8
|
-
operateid_key = "operateid"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def set_operate_id(val):
|
|
12
|
-
local.__setattr__(operateid_key, val)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
class ThreadLocalFormatter(logging.Formatter):
|
|
16
|
-
|
|
17
|
-
def format(self, record):
|
|
18
|
-
msg = super(ThreadLocalFormatter, self).format(record)
|
|
19
|
-
try:
|
|
20
|
-
opid = local.__getattribute__(operateid_key)
|
|
21
|
-
msg = opid + " " + msg
|
|
22
|
-
except Exception:
|
|
23
|
-
pass
|
|
24
|
-
|
|
25
|
-
return msg
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
log_level = os.getenv("LOG_LEVEL", "info").upper()
|
|
29
|
-
# LOG_FORMAT = "%(asctime)s %(levelname)s - %(filename)s[:%(lineno)d] - %(message)s"
|
|
30
|
-
LOG_FORMAT = "%(asctime)s %(levelname)s %(message)s"
|
|
31
|
-
logging.Formatter.default_msec_format = '%s.%03d'
|
|
32
|
-
logging.Formatter.default_time_format = '%Y-%m-%dT%H:%M:%S'
|
|
33
|
-
|
|
34
|
-
stream_handler = logging.StreamHandler()
|
|
35
|
-
stream_handler.setFormatter(ThreadLocalFormatter(fmt=LOG_FORMAT))
|
|
36
|
-
# 直接设置datefmt毫秒时间戳无效 有疑问请查看logging.Formatter代码 不推荐使用handlers配置
|
|
37
|
-
# logging.basicConfig(level=log_level, format=LOG_FORMAT, handlers=[stream_handler])
|
|
38
|
-
logging.basicConfig(level=log_level, format=LOG_FORMAT)
|
|
39
|
-
|
|
40
|
-
# 重置handlers
|
|
41
|
-
for h in logging.root.handlers:
|
|
42
|
-
logging.root.removeHandler(h)
|
|
43
|
-
logging.root.addHandler(stream_handler)
|
|
44
|
-
|
|
45
|
-
log = logging.getLogger("EP")
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def run_time_decorator(title=""):
|
|
49
|
-
def decorator(func):
|
|
50
|
-
def wrapper(*args, **kwargs):
|
|
51
|
-
# torch.cuda.synchronize()
|
|
52
|
-
t0 = time.time()
|
|
53
|
-
result = func(*args, **kwargs)
|
|
54
|
-
# torch.cuda.synchronize()
|
|
55
|
-
t1 = time.time()
|
|
56
|
-
# print("{} call {} elapsed: {}ms ".format(title, func.__name__, (t1 - t0) * 1000))
|
|
57
|
-
log.info("{}\t call {} \t elapsed:{:4.3f}ms \t".format(title, func.__name__, (t1 - t0) * 1000))
|
|
58
|
-
return result
|
|
59
|
-
|
|
60
|
-
return wrapper
|
|
61
|
-
|
|
62
|
-
return decorator
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# -*-coding: utf-8 -*-
|
|
2
|
-
"""
|
|
3
|
-
@Author : PKing
|
|
4
|
-
@E-mail : 390737991@qq.com
|
|
5
|
-
@Date : 2022-12-31 11:37:30
|
|
6
|
-
@Brief :
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
import numpy as np
|
|
10
|
-
import xmltodict
|
|
11
|
-
from pybaseutils import image_utils
|
|
12
|
-
import cv2
|
|
13
|
-
|
|
14
|
-
if __name__ == '__main__':
|
|
15
|
-
"""
|
|
16
|
-
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|