pybaseutils 2.0.2__tar.gz → 2.0.5__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.0.2 → pybaseutils-2.0.5}/PKG-INFO +1 -1
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_cvat2labelme.py +7 -4
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2yolo.py +3 -3
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_yolo2voc.py +1 -1
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/coords_utils.py +12 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/video_utils.py +2 -2
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_coco_det.py +5 -3
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_coco_ins.py +3 -2
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_coco_kps.py +6 -4
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_yolo.py +31 -8
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/file_utils.py +3 -3
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/image_utils.py +44 -5
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/plot_roc.py +57 -5
- pybaseutils-2.0.5/pybaseutils/transforms/augment_utils.py +127 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/SOURCES.txt +8 -1
- pybaseutils-2.0.5/test_py/aije/action_dataset.py +86 -0
- pybaseutils-2.0.5/test_py/aije/build_pyarmor.py +34 -0
- pybaseutils-2.0.5/test_py/aije/build_service.py +61 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_voc_crop.py +7 -7
- pybaseutils-2.0.5/test_py/aije/video_convertor.py +27 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_cvat2labelme.py +4 -3
- pybaseutils-2.0.5/test_py/converter/get_pair_data.py +58 -0
- pybaseutils-2.0.5/test_py/converter/ucf101_dataset.py +36 -0
- pybaseutils-2.0.5/test_py/cython_build/build_cython.py +27 -0
- pybaseutils-2.0.5/test_py/demo1.py +54 -0
- pybaseutils-2.0.5/test_py/demo2.py +29 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_coco_vis.py +12 -5
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_lableme_vis.py +1 -1
- pybaseutils-2.0.2/test_py/aije/video_demo.py +0 -47
- pybaseutils-2.0.2/test_py/demo1.py +0 -84
- pybaseutils-2.0.2/test_py/demo2.py +0 -25
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/LICENCE +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/README.md +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/log.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/logger.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/setup.cfg +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/setup.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.0.2/test_py/cython_build → pybaseutils-2.0.5/test_py/aije}/build_cython.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_labelme_crop.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/main.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/class_names.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo3.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_video.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/edit_distance/text_utils.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/flask_demo/func.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/flask_demo/server.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/performance.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/base.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/component.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/main.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/registry/register.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.0.2 → pybaseutils-2.0.5}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -38,14 +38,15 @@ def parser_annotations(xml_file):
|
|
|
38
38
|
return filename, annos, width, height
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
def convert_cvat2labelme(anno_dir, image_dir="", vis=False):
|
|
41
|
+
def convert_cvat2labelme(anno_dir, image_dir="", out_dir="", thickness=1, fontScale=1.0, vis=False):
|
|
42
42
|
"""
|
|
43
43
|
将CVAT标注格式(LabelMe 3.0)转换labelme通用格式
|
|
44
|
-
:param anno_dir:
|
|
44
|
+
:param anno_dir: 标注文件目录,默认输出json文件与anno_dir同目录
|
|
45
45
|
:param image_dir: 图片文件目录
|
|
46
46
|
:param vis:
|
|
47
47
|
:return:
|
|
48
48
|
"""
|
|
49
|
+
if not out_dir: out_dir = os.path.join(os.path.dirname(anno_dir), "json")
|
|
49
50
|
xml_list = file_utils.get_files_lists(anno_dir, postfix=["*.xml"])
|
|
50
51
|
for xml_file in tqdm(xml_list):
|
|
51
52
|
image_name, annos, w, h = parser_annotations(xml_file)
|
|
@@ -56,13 +57,15 @@ def convert_cvat2labelme(anno_dir, image_dir="", vis=False):
|
|
|
56
57
|
continue
|
|
57
58
|
if image_dir or vis:
|
|
58
59
|
image_file = os.path.join(image_dir, image_name)
|
|
60
|
+
print(image_file, "labels:{}".format(labels))
|
|
59
61
|
image = cv2.imread(image_file)
|
|
60
62
|
h, w = image.shape[:2]
|
|
61
63
|
if vis:
|
|
62
|
-
image = image_utils.draw_image_contours(image, points, texts=labels
|
|
64
|
+
image = image_utils.draw_image_contours(image, points, texts=labels, thickness=thickness,
|
|
65
|
+
fontScale=fontScale)
|
|
63
66
|
image_utils.cv_show_image("det", image)
|
|
64
67
|
image_id = image_name.split(".")[0]
|
|
65
|
-
json_file = os.path.join(
|
|
68
|
+
json_file = os.path.join(out_dir, f"{image_id}.json")
|
|
66
69
|
build_labelme.maker_labelme(json_file, points, labels, image_name, image_size=[w, h], image_bs64=None)
|
|
67
70
|
|
|
68
71
|
|
|
@@ -80,7 +80,7 @@ def convert_voc2yolo_file(filename, out_text_dir, out_image_dir=None, class_name
|
|
|
80
80
|
format = "jpg"
|
|
81
81
|
newname = "{}.{}".format(image_id, format)
|
|
82
82
|
text_path = file_utils.create_dir(out_text_dir, None, "{}.txt".format(image_id))
|
|
83
|
-
labels = np.asarray(labels).astype(np.
|
|
83
|
+
labels = np.asarray(labels).astype(np.int32).reshape(-1)
|
|
84
84
|
contents = create_yolo_dets(bboxes, labels, width=w, height=h)
|
|
85
85
|
file_utils.write_data(text_path, contents)
|
|
86
86
|
if out_image_dir:
|
|
@@ -131,7 +131,7 @@ def convert_voc2yolo(data_root, out_text_dir, out_image_dir=None, class_name=Non
|
|
|
131
131
|
format = "jpg"
|
|
132
132
|
newname = "{}.{}".format(image_id, format)
|
|
133
133
|
text_path = file_utils.create_dir(out_text_dir, None, "{}.txt".format(image_id))
|
|
134
|
-
labels = np.asarray(labels).astype(np.
|
|
134
|
+
labels = np.asarray(labels).astype(np.int32).reshape(-1)
|
|
135
135
|
contents = create_yolo_dets(bboxes, labels, width=w, height=h)
|
|
136
136
|
file_utils.write_data(text_path, contents, split=" ")
|
|
137
137
|
if out_image_dir:
|
|
@@ -183,7 +183,7 @@ def convert_voc2yolo_segment(data_root, out_text_dir, out_image_dir=None, class_
|
|
|
183
183
|
format = "jpg"
|
|
184
184
|
newname = "{}.{}".format(image_id, format)
|
|
185
185
|
text_path = file_utils.create_dir(out_text_dir, None, "{}.txt".format(image_id))
|
|
186
|
-
labels = np.asarray(labels).astype(np.
|
|
186
|
+
labels = np.asarray(labels).astype(np.int32).reshape(-1)
|
|
187
187
|
contents = create_yolo_segs(bboxes, labels, width=w, height=h)
|
|
188
188
|
file_utils.write_data(text_path, contents, split=" ")
|
|
189
189
|
if out_image_dir:
|
|
@@ -50,7 +50,7 @@ def convert_yolo2voc(filename, out_xml_dir=None, out_image_dir=None, class_name=
|
|
|
50
50
|
format = "jpg"
|
|
51
51
|
newname = "{}.{}".format(image_id, format)
|
|
52
52
|
xml_path = file_utils.create_dir(out_xml_dir, None, "{}.xml".format(image_id))
|
|
53
|
-
labels = np.asarray(labels).astype(np.
|
|
53
|
+
labels = np.asarray(labels).astype(np.int32).reshape(-1)
|
|
54
54
|
objects = build_voc.create_objects(bboxes, labels, keypoints=None, class_name=class_name)
|
|
55
55
|
build_voc.write_voc_xml_objects(newname, image_shape, objects, xml_path)
|
|
56
56
|
if out_image_dir:
|
|
@@ -19,6 +19,7 @@ def clip_xyxy(xyxy: np.ndarray, valid_range):
|
|
|
19
19
|
:param valid_range:有效范围(xmin,ymin,xmax,ymax)
|
|
20
20
|
:return:
|
|
21
21
|
"""
|
|
22
|
+
if len(xyxy) == 0: return xyxy
|
|
22
23
|
xmin, ymin, xmax, ymax = valid_range
|
|
23
24
|
xyxy[:, [0, 2]] = np.clip(xyxy[:, [0, 2]], xmin, xmax)
|
|
24
25
|
xyxy[:, [1, 3]] = np.clip(xyxy[:, [1, 3]], ymin, ymax)
|
|
@@ -33,6 +34,7 @@ def clip_cxcywh_minmax(cxcywh, wh_thresh, use_max=True):
|
|
|
33
34
|
:param use_max: True:最大值限制, False: 最小值限制
|
|
34
35
|
:return:
|
|
35
36
|
"""
|
|
37
|
+
if len(cxcywh) == 0: return cxcywh
|
|
36
38
|
if isinstance(wh_thresh, numbers.Number): wh_thresh = [wh_thresh, wh_thresh]
|
|
37
39
|
if not isinstance(cxcywh, np.ndarray): cxcywh = np.asarray(cxcywh)
|
|
38
40
|
centers = cxcywh.copy()
|
|
@@ -51,6 +53,7 @@ def clip_cxcywh_minmax(cxcywh, wh_thresh, use_max=True):
|
|
|
51
53
|
|
|
52
54
|
def xyxy2xywh(xyxy: np.ndarray):
|
|
53
55
|
"""(xmin,ymin,xmax,ymax)==>(xmin,ymin,w,h)"""
|
|
56
|
+
if len(xyxy) == 0: return xyxy
|
|
54
57
|
if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
|
|
55
58
|
xywh = xyxy.copy()
|
|
56
59
|
xywh[:, 2] = xywh[:, 2] - xywh[:, 0] # w=xmax-xmin
|
|
@@ -60,6 +63,7 @@ def xyxy2xywh(xyxy: np.ndarray):
|
|
|
60
63
|
|
|
61
64
|
def xywh2xyxy(xywh: np.ndarray):
|
|
62
65
|
"""(xmin,ymin,w,h)==>(xmin,ymin,xmax,ymax)"""
|
|
66
|
+
if len(xywh) == 0: return xywh
|
|
63
67
|
if not isinstance(xywh, np.ndarray): xywh = np.asarray(xywh)
|
|
64
68
|
xyxy = xywh.copy()
|
|
65
69
|
xyxy[:, 2] = xyxy[:, 0] + xyxy[:, 2] # xmax=xmin+w
|
|
@@ -69,6 +73,7 @@ def xywh2xyxy(xywh: np.ndarray):
|
|
|
69
73
|
|
|
70
74
|
def xyxy2cxcywh(xyxy: np.ndarray, width=None, height=None, normalized=False):
|
|
71
75
|
"""(xmin, ymin, xmax, ymax)==>(cx,cy,w,h)"""
|
|
76
|
+
if len(xyxy) == 0: return xyxy
|
|
72
77
|
if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
|
|
73
78
|
cxcywh = xyxy.copy()
|
|
74
79
|
cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
|
|
@@ -82,6 +87,7 @@ def xyxy2cxcywh(xyxy: np.ndarray, width=None, height=None, normalized=False):
|
|
|
82
87
|
|
|
83
88
|
def cxcywh2xyxy(cxcywh: np.ndarray, width=None, height=None, normalized=False):
|
|
84
89
|
"""(cx,cy,w,h)==>xmin, ymin, xmax, ymax)"""
|
|
90
|
+
if len(cxcywh) == 0: return cxcywh
|
|
85
91
|
if not isinstance(cxcywh, np.ndarray): cxcywh = np.asarray(cxcywh)
|
|
86
92
|
xyxy = cxcywh.copy()
|
|
87
93
|
xyxy[:, 0] = cxcywh[:, 0] - cxcywh[:, 2] / 2 # top left x
|
|
@@ -103,6 +109,7 @@ def extend_xyxy(xyxy: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False,
|
|
|
103
109
|
使用fixed的长宽会按照相同大小扩展
|
|
104
110
|
:return:
|
|
105
111
|
"""
|
|
112
|
+
if len(xyxy) == 0: return xyxy
|
|
106
113
|
if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
|
|
107
114
|
cxcywh = xyxy.copy()
|
|
108
115
|
if fixed:
|
|
@@ -130,6 +137,7 @@ def extend_xywh(xywh: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False,
|
|
|
130
137
|
:param scale: [sx,sy]==>(W,H)
|
|
131
138
|
:return:
|
|
132
139
|
"""
|
|
140
|
+
if len(xywh) == 0: return xywh
|
|
133
141
|
if not isinstance(xywh, np.ndarray): xywh = np.asarray(xywh)
|
|
134
142
|
xyxy = xywh2xyxy(xywh)
|
|
135
143
|
xyxy = extend_xyxy(xyxy, scale, valid_range=valid_range, fixed=fixed, use_max=use_max)
|
|
@@ -148,6 +156,7 @@ def extend_xyxy_similar_square(xyxy, use_max=True, weight=1.0, valid_range=[]):
|
|
|
148
156
|
:param valid_range:有效范围(xmin,ymin,xmax,ymax)
|
|
149
157
|
:return:
|
|
150
158
|
"""
|
|
159
|
+
if len(xyxy) == 0: return xyxy
|
|
151
160
|
if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
|
|
152
161
|
center = xyxy2cxcywh(xyxy)
|
|
153
162
|
if use_max:
|
|
@@ -162,6 +171,7 @@ def extend_xyxy_similar_square(xyxy, use_max=True, weight=1.0, valid_range=[]):
|
|
|
162
171
|
if valid_range: _boxes = clip_xyxy(_boxes, valid_range=valid_range)
|
|
163
172
|
return _boxes
|
|
164
173
|
|
|
174
|
+
|
|
165
175
|
def shrink_polygon_pyclipper(polygon, ratio):
|
|
166
176
|
"""
|
|
167
177
|
使用Polygon库计算多边形区域的周长和面积,使用pyclipper库进行shrink
|
|
@@ -196,6 +206,7 @@ def get_square_boxes(boxes, use_max=True, baseline=-1):
|
|
|
196
206
|
:param baseline: 当baseline>0,表示正方形最小边长
|
|
197
207
|
:return:
|
|
198
208
|
"""
|
|
209
|
+
if len(boxes) == 0: return boxes
|
|
199
210
|
if not isinstance(boxes, np.ndarray): boxes = np.asarray(boxes)
|
|
200
211
|
center = xyxy2cxcywh(boxes)
|
|
201
212
|
if use_max:
|
|
@@ -222,6 +233,7 @@ def get_square_rects(rects, use_max=True, baseline=-1):
|
|
|
222
233
|
:param baseline: 当baseline>0,表示正方形最小边长
|
|
223
234
|
:return:
|
|
224
235
|
"""
|
|
236
|
+
if len(rects) == 0: return rects
|
|
225
237
|
boxes = xywh2xyxy(rects)
|
|
226
238
|
boxes = get_square_boxes(boxes, use_max=use_max, baseline=baseline)
|
|
227
239
|
rects = xyxy2xywh(boxes)
|
|
@@ -241,7 +241,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
241
241
|
video_cap = image_utils.get_video_capture(video_file)
|
|
242
242
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
243
243
|
start = int(kwargs.get("start", 0) * fps)
|
|
244
|
-
end = int(kwargs.get("end", num_frames / fps) * fps)
|
|
244
|
+
end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
|
|
245
245
|
end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
246
246
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
247
247
|
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
@@ -293,7 +293,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
|
|
|
293
293
|
video_cap = image_utils.get_video_capture(video_file)
|
|
294
294
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
295
295
|
start = int(kwargs.get("start", 0) * fps)
|
|
296
|
-
end = int(kwargs.get("end", num_frames / fps) * fps)
|
|
296
|
+
end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
|
|
297
297
|
end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
298
298
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
299
299
|
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
@@ -53,9 +53,9 @@ class CocoDetection(CocoDataset):
|
|
|
53
53
|
|
|
54
54
|
def __getitem__(self, index):
|
|
55
55
|
image_id = self.image_ids[index]
|
|
56
|
-
|
|
56
|
+
anns_info, file_info = self.get_object_annotations(image_id)
|
|
57
57
|
image, width, height, image_file = self.get_object_image(file_info)
|
|
58
|
-
boxes, labels = self.get_object_detection(
|
|
58
|
+
boxes, labels = self.get_object_detection(anns_info)
|
|
59
59
|
if self.transform and len(boxes) > 0:
|
|
60
60
|
image, boxes, labels = self.transform(image, boxes, labels)
|
|
61
61
|
num_boxes = len(boxes)
|
|
@@ -65,7 +65,9 @@ class CocoDetection(CocoDataset):
|
|
|
65
65
|
if num_boxes == 0:
|
|
66
66
|
index = int(random.uniform(0, len(self)))
|
|
67
67
|
return self.__getitem__(index)
|
|
68
|
-
data = {"image": image, "
|
|
68
|
+
data = {"image": image, "boxes": boxes, "labels": labels,
|
|
69
|
+
"segs": [], "mask": [], "keypoints": [], "target": target,
|
|
70
|
+
"image_id": image_id, "annotations": anns_info, "file_info": file_info,
|
|
69
71
|
"image_file": image_file, "size": [width, height], "class_name": self.class_name}
|
|
70
72
|
return data
|
|
71
73
|
|
|
@@ -40,7 +40,8 @@ class CocoInstance(CocoDataset):
|
|
|
40
40
|
anns_info, file_info = self.get_object_annotations(image_id)
|
|
41
41
|
image, width, height, image_file = self.get_object_image(file_info)
|
|
42
42
|
boxes, labels, mask, segs = self.get_object_instance(anns_info, h=height, w=width, decode=self.decode)
|
|
43
|
-
data = {"
|
|
43
|
+
data = {"image": image, "boxes": boxes, "labels": labels,
|
|
44
|
+
"segs": segs, "mask": mask, "keypoints": [], "target": [],
|
|
44
45
|
"image_id": image_id, "annotations": anns_info, "file_info": file_info,
|
|
45
46
|
"image_file": image_file, "size": [width, height], "class_name": self.class_name}
|
|
46
47
|
return data
|
|
@@ -103,7 +104,7 @@ def show_target_image(image, mask, boxes, labels, points=[], class_name=[], thic
|
|
|
103
104
|
color_image, color_mask = color_utils.draw_image_mask_color(image, mask)
|
|
104
105
|
color_image = image_utils.draw_image_bboxes_labels(color_image, boxes, labels, class_name=class_name,
|
|
105
106
|
thickness=thickness, fontScale=fontScale, drawType="chinese")
|
|
106
|
-
if len(points)>0:
|
|
107
|
+
if len(points) > 0:
|
|
107
108
|
color_mask = image_utils.draw_image_contours(color_mask, contours=points)
|
|
108
109
|
color_image = image_utils.draw_image_contours(color_image, contours=points)
|
|
109
110
|
vis_image = image_utils.image_hstack([image, mask, color_image, color_mask])
|
|
@@ -32,6 +32,7 @@ class CocoKeypoint(base_coco.CocoDataset):
|
|
|
32
32
|
target_transform=target_transform, use_rgb=use_rgb,
|
|
33
33
|
shuffle=shuffle, decode=decode, **kwargs)
|
|
34
34
|
if not class_name: class_name = [self.class_name[1]]
|
|
35
|
+
if isinstance(class_name, dict): class_name = list(class_name.keys())
|
|
35
36
|
self.kps_info = self.load_keypoints_info(target=class_name)
|
|
36
37
|
self.num_joints = num_joints
|
|
37
38
|
if class_name[0] in BONES:
|
|
@@ -70,9 +71,10 @@ class CocoKeypoint(base_coco.CocoDataset):
|
|
|
70
71
|
anns_info, file_info = self.get_object_annotations(image_id)
|
|
71
72
|
image, width, height, image_file = self.get_object_image(file_info)
|
|
72
73
|
boxes, labels, keypoints = self.get_keypoint_info(anns_info, self.num_joints)
|
|
73
|
-
data = {"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
74
|
+
data = {"image": image, "boxes": boxes, "labels": labels,
|
|
75
|
+
"segs": [], "mask": [], "keypoints": keypoints, "target": [],
|
|
76
|
+
"image_id": image_id, "annotations": anns_info, "file_info": file_info,
|
|
77
|
+
"image_file": image_file, "size": [width, height], "class_name": self.class_name}
|
|
76
78
|
return data
|
|
77
79
|
|
|
78
80
|
|
|
@@ -116,7 +118,7 @@ def CocoKeypoints(anno_file=None,
|
|
|
116
118
|
return datasets
|
|
117
119
|
|
|
118
120
|
|
|
119
|
-
def show_target_image(image, keypoints, boxes, skeleton, colors=None,thickness=2, vis_id=False, use_rgb=True):
|
|
121
|
+
def show_target_image(image, keypoints, boxes, skeleton, colors=None, thickness=2, vis_id=False, use_rgb=True):
|
|
120
122
|
image = image_utils.draw_key_point_in_image(image,
|
|
121
123
|
keypoints,
|
|
122
124
|
pointline=skeleton,
|
|
@@ -217,13 +217,13 @@ class YOLODataset(Dataset):
|
|
|
217
217
|
image = self.read_image(image_file, use_rgb=self.use_rgb)
|
|
218
218
|
shape = image.shape
|
|
219
219
|
annotation = self.load_annotations(anno_file)
|
|
220
|
-
boxes, labels, points = self.
|
|
220
|
+
boxes, labels, points = self.parser_annotation_segs(annotation, shape, self.class_dict)
|
|
221
221
|
data = {"image": image, "boxes": boxes, "labels": labels, "points": points,
|
|
222
222
|
"image_file": image_file, "anno_file": anno_file}
|
|
223
223
|
return data
|
|
224
224
|
|
|
225
225
|
@staticmethod
|
|
226
|
-
def
|
|
226
|
+
def parser_annotation_boxes(annotation: dict, shape, class_dict):
|
|
227
227
|
"""
|
|
228
228
|
:param annotation: labelme标注的数据
|
|
229
229
|
:param class_dict: label映射
|
|
@@ -249,6 +249,28 @@ class YOLODataset(Dataset):
|
|
|
249
249
|
bboxes = image_utils.points2bbox(points)
|
|
250
250
|
return bboxes, labels, points
|
|
251
251
|
|
|
252
|
+
@staticmethod
|
|
253
|
+
def parser_annotation_segs(annotation: dict, shape, class_dict):
|
|
254
|
+
"""
|
|
255
|
+
:param annotation: labelme标注的数据
|
|
256
|
+
:param class_dict: label映射
|
|
257
|
+
:param shape: 图片shape(H,W,C),可进行坐标点的维度检查,避免越界
|
|
258
|
+
:return:
|
|
259
|
+
"""
|
|
260
|
+
# dim=5,annotation is [class_index, cx, cy, w, h]
|
|
261
|
+
# dim=9,annotation is [class_index, x1, y1, x2, y2, x3, y3, x4, y4],四个角点
|
|
262
|
+
h, w = shape[:2]
|
|
263
|
+
bboxes, labels, points = [], [], []
|
|
264
|
+
for anno in annotation:
|
|
265
|
+
label = anno[0]
|
|
266
|
+
polys = np.asarray(anno[1:]).reshape(-1, 2)
|
|
267
|
+
polys = polys * [w, h]
|
|
268
|
+
boxes = image_utils.polygons2boxes([polys])[0]
|
|
269
|
+
labels.append(label)
|
|
270
|
+
points.append(polys)
|
|
271
|
+
bboxes.append(boxes)
|
|
272
|
+
return bboxes, labels, points
|
|
273
|
+
|
|
252
274
|
def index2id(self, index):
|
|
253
275
|
"""
|
|
254
276
|
:param index: int or str
|
|
@@ -319,16 +341,17 @@ def show_target_image(image, bboxes, labels, points=[], class_name=None, use_rgb
|
|
|
319
341
|
:param use_rgb:
|
|
320
342
|
:return:
|
|
321
343
|
"""
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
image_utils.
|
|
344
|
+
dst = image.copy()
|
|
345
|
+
dst = image_utils.draw_image_contours(dst, contours=points, alpha=0.1, thickness=1)
|
|
346
|
+
dst = image_utils.image_hstack([image, dst])
|
|
347
|
+
image_utils.cv_show_image("det", dst, use_rgb=use_rgb)
|
|
325
348
|
|
|
326
349
|
|
|
327
350
|
if __name__ == "__main__":
|
|
328
351
|
# filename = "/home/dm/nasdata/dataset/csdn/helmet/helmet-dataset-v2/train.txt"
|
|
329
352
|
# filename = "/home/dm/nasdata/dataset/csdn/helmet/helmet-asian/total.txt"
|
|
330
353
|
# filename = "/home/dm/nasdata/dataset/csdn/helmet/helmet-asian/total.txt"
|
|
331
|
-
filename = "/home/PKing/
|
|
354
|
+
filename = "/home/PKing/nasdata/tmp/tmp/medical/肾结石CT/valid/sample.txt"
|
|
332
355
|
dataset = YOLODataset(filename=filename,
|
|
333
356
|
data_root=None,
|
|
334
357
|
anno_dir=None,
|
|
@@ -341,8 +364,8 @@ if __name__ == "__main__":
|
|
|
341
364
|
for i in range(len(dataset)):
|
|
342
365
|
print(i) # i=20
|
|
343
366
|
data = dataset.__getitem__(i)
|
|
344
|
-
image, bboxes, labels = data["image"], data["
|
|
345
|
-
points = data["
|
|
367
|
+
image, bboxes, labels = data["image"], data["boxes"], data["labels"]
|
|
368
|
+
points = data["points"]
|
|
346
369
|
h, w = image.shape[:2]
|
|
347
370
|
image_file = data["image_file"]
|
|
348
371
|
show_target_image(image, bboxes, labels, points=points)
|
|
@@ -550,15 +550,15 @@ def move_dir(src, dst, sub=False):
|
|
|
550
550
|
|
|
551
551
|
def move_file(srcfile, dstfile):
|
|
552
552
|
""" 移动文件或重命名"""
|
|
553
|
-
if
|
|
554
|
-
print("%s not exist!" % (srcfile))
|
|
555
|
-
else:
|
|
553
|
+
if os.path.exists(srcfile) and os.path.isfile(srcfile):
|
|
556
554
|
fpath, fname = os.path.split(dstfile) # 分离文件名和路径
|
|
557
555
|
if not os.path.exists(fpath):
|
|
558
556
|
os.makedirs(fpath) # 创建路径
|
|
559
557
|
shutil.move(srcfile, dstfile)
|
|
560
558
|
# print("copy %s -> %s"%( srcfile,dstfile))
|
|
561
559
|
# time.sleep(1 / 1000.)
|
|
560
|
+
else:
|
|
561
|
+
print("%s not exist!" % (srcfile))
|
|
562
562
|
|
|
563
563
|
|
|
564
564
|
def copy_file(srcfile, dstfile):
|
|
@@ -1905,7 +1905,7 @@ def get_box_crop(image, box):
|
|
|
1905
1905
|
return roi
|
|
1906
1906
|
|
|
1907
1907
|
|
|
1908
|
-
get_bbox_crop =get_box_crop
|
|
1908
|
+
get_bbox_crop = get_box_crop
|
|
1909
1909
|
|
|
1910
1910
|
|
|
1911
1911
|
def get_bboxes_crop(image, bboxes):
|
|
@@ -2438,7 +2438,8 @@ def pointPolygonTest(point, contour, measureDist=False):
|
|
|
2438
2438
|
return dist
|
|
2439
2439
|
|
|
2440
2440
|
|
|
2441
|
-
def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), alpha=0.5, thickness=
|
|
2441
|
+
def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), alpha=0.5, thickness=1, fontScale=0.8,
|
|
2442
|
+
drawType="ch"):
|
|
2442
2443
|
"""
|
|
2443
2444
|
参考:draw_image_mask_color
|
|
2444
2445
|
:param image:
|
|
@@ -2459,13 +2460,51 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
|
|
|
2459
2460
|
bgimg = image.copy()
|
|
2460
2461
|
bgimg = cv2.fillPoly(bgimg, p, color=c)
|
|
2461
2462
|
image = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
|
|
2462
|
-
if t: image = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness,
|
|
2463
|
+
if t: image = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness,
|
|
2464
|
+
fontScale=fontScale, drawType=drawType)
|
|
2463
2465
|
return image
|
|
2464
2466
|
|
|
2465
2467
|
|
|
2466
2468
|
draw_image_mask_color = color_utils.draw_image_mask_color
|
|
2467
2469
|
|
|
2468
2470
|
|
|
2471
|
+
def draw_mask_contours(contours: List[np.ndarray], size, value=255):
|
|
2472
|
+
"""
|
|
2473
|
+
参考:draw_image_mask_color
|
|
2474
|
+
:param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
|
|
2475
|
+
:return:
|
|
2476
|
+
"""
|
|
2477
|
+
mask = np.zeros(shape=(size[1], size[0]), dtype=np.uint8)
|
|
2478
|
+
for i in range(0, len(contours)):
|
|
2479
|
+
p = np.asarray(contours[i], dtype=np.int32)
|
|
2480
|
+
if len(p.shape) == 2: p = [p]
|
|
2481
|
+
mask[:] = cv2.drawContours(mask, p, contourIdx=-1, color=value, thickness=-1)
|
|
2482
|
+
return mask
|
|
2483
|
+
|
|
2484
|
+
|
|
2485
|
+
def contours_interpolation(contours, n=1000):
|
|
2486
|
+
"""
|
|
2487
|
+
对图像轮廓或者对直线进行线性差值,来源于ultralytics/utils/ops.py
|
|
2488
|
+
轮廓插值,线性插值,直线插值
|
|
2489
|
+
Inputs a list of contours (n,2) and returns a list of contours (n,2) up-sampled to n points each.
|
|
2490
|
+
|
|
2491
|
+
Args:
|
|
2492
|
+
contours (list): a list of (n,2) arrays, where n is the number of points in the segment.
|
|
2493
|
+
n (int): number of points to resample the segment to. Defaults to 1000
|
|
2494
|
+
|
|
2495
|
+
Returns:
|
|
2496
|
+
contours (list): the resampled contours.
|
|
2497
|
+
"""
|
|
2498
|
+
for i, s in enumerate(contours):
|
|
2499
|
+
s = np.concatenate((s, s[0:1, :]), axis=0)
|
|
2500
|
+
x = np.linspace(0, len(s) - 1, n)
|
|
2501
|
+
xp = np.arange(len(s))
|
|
2502
|
+
contours[i] = (
|
|
2503
|
+
np.concatenate([np.interp(x, xp, s[:, i]) for i in range(2)], dtype=np.float32).reshape(2, -1).T
|
|
2504
|
+
) # segment xy
|
|
2505
|
+
return contours
|
|
2506
|
+
|
|
2507
|
+
|
|
2469
2508
|
def get_mask_boundrect_cv(mask, binarize=False, shift=0):
|
|
2470
2509
|
"""
|
|
2471
2510
|
获得mask的最大外接矩形框(其速度比get_mask_boundrect快2倍左右)
|
|
@@ -2903,7 +2942,7 @@ def get_video_capture(video, width=None, height=None, fps=None):
|
|
|
2903
2942
|
return video_cap
|
|
2904
2943
|
|
|
2905
2944
|
|
|
2906
|
-
def get_video_info(video_cap: cv2.VideoCapture):
|
|
2945
|
+
def get_video_info(video_cap: cv2.VideoCapture, vis=True):
|
|
2907
2946
|
"""
|
|
2908
2947
|
获得视频的基础信息
|
|
2909
2948
|
:param video_cap:视频对象
|
|
@@ -2913,7 +2952,7 @@ def get_video_info(video_cap: cv2.VideoCapture):
|
|
|
2913
2952
|
height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
2914
2953
|
num_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
2915
2954
|
fps = int(video_cap.get(cv2.CAP_PROP_FPS))
|
|
2916
|
-
print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
|
|
2955
|
+
if vis: print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
|
|
2917
2956
|
return width, height, num_frames, fps
|
|
2918
2957
|
|
|
2919
2958
|
|
|
@@ -39,9 +39,9 @@ def plot_roc_curve(true_labels, pred_scores, vis=True):
|
|
|
39
39
|
# 绘制ROC曲线
|
|
40
40
|
if vis:
|
|
41
41
|
plt_roc_curve([fpr], [tpr], [roc_auc], names=[""])
|
|
42
|
-
print("FPR :{}".format(fpr))
|
|
43
|
-
print("TPR :{}".format(tpr))
|
|
44
|
-
print("Threshold :{}".format(threshold))
|
|
42
|
+
# print("FPR :{}".format(fpr))
|
|
43
|
+
# print("TPR :{}".format(tpr))
|
|
44
|
+
# print("Threshold :{}".format(threshold))
|
|
45
45
|
print("AUC(ROC) :{}".format(roc_auc))
|
|
46
46
|
print("best_threshold:{} ".format(threshold[optimal_index]))
|
|
47
47
|
return fpr, tpr, roc_auc, threshold, optimal_index
|
|
@@ -134,8 +134,60 @@ def custom_roc_curve(y_true, y_score):
|
|
|
134
134
|
plt.show()
|
|
135
135
|
|
|
136
136
|
|
|
137
|
+
def get_best_accuracy(true_labels, pred_scores, threshold=(0, 1.0, 0.05), vis=False):
|
|
138
|
+
"""
|
|
139
|
+
计算最佳准确率和阈值
|
|
140
|
+
:param true_labels:
|
|
141
|
+
:param pred_scores:
|
|
142
|
+
:param vis:
|
|
143
|
+
:return: best_acc, best_th
|
|
144
|
+
"""
|
|
145
|
+
true_labels, pred_scores = np.asarray(true_labels), np.asarray(pred_scores)
|
|
146
|
+
threshold = np.arange(threshold[0], threshold[1], threshold[2])
|
|
147
|
+
acc_list = []
|
|
148
|
+
for th in threshold:
|
|
149
|
+
pred_labels = np.asarray(pred_scores > th, dtype=np.int32)
|
|
150
|
+
acc = metrics.accuracy_score(y_true=true_labels, y_pred=pred_labels)
|
|
151
|
+
acc_list.append(acc)
|
|
152
|
+
index = np.argmax(acc_list)
|
|
153
|
+
best_th = threshold[index]
|
|
154
|
+
best_acc = acc_list[index]
|
|
155
|
+
if vis:
|
|
156
|
+
print("best threshold :{}".format(best_th))
|
|
157
|
+
print("best Accuracy :{}".format(best_acc))
|
|
158
|
+
plt_curve(X=threshold, Y=acc_list, xtitle="threshold", ytitle="Accuracy", title="", grid=True)
|
|
159
|
+
return best_acc, best_th
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def plt_curve(X, Y, xtitle="", ytitle="", title="", grid=True):
|
|
163
|
+
"""
|
|
164
|
+
绘制PR-threshold曲线
|
|
165
|
+
:param X: Precision
|
|
166
|
+
:param recall: Recall
|
|
167
|
+
:param Y
|
|
168
|
+
:param title:曲线名称
|
|
169
|
+
:return:
|
|
170
|
+
"""
|
|
171
|
+
lw = 2
|
|
172
|
+
plt.figure(figsize=(10, 10))
|
|
173
|
+
colors = ["b", "r", "c", "m", "g", "y", "k", "w"]
|
|
174
|
+
plt.plot(X, Y, color=colors[0], lw=lw, label=ytitle)
|
|
175
|
+
plt.xlim([0.0, 1.05])
|
|
176
|
+
plt.ylim([0.0, 1.05])
|
|
177
|
+
# 设置横纵坐标的名称以及对应字体格式
|
|
178
|
+
font = {'weight': 'normal', 'size': 20}
|
|
179
|
+
plt.xlabel(xtitle, font)
|
|
180
|
+
plt.ylabel('', font)
|
|
181
|
+
plt.title(title, font)
|
|
182
|
+
plt.legend(loc="lower right") # "upper right"
|
|
183
|
+
# plt.legend(loc="upper right")#"upper right"
|
|
184
|
+
plt.grid(grid) # 显示网格;
|
|
185
|
+
plt.show()
|
|
186
|
+
|
|
187
|
+
|
|
137
188
|
if __name__ == "__main__":
|
|
138
189
|
true_labels = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] # 真实类别
|
|
139
|
-
pred_scores = [0.1, 0.
|
|
190
|
+
pred_scores = [0.1, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] # 预测类别分数
|
|
140
191
|
# pred_scores = [0.11, 0.21, 0.71, 0.31, 0.41, 0.51, 0.21, 0.71, 0.81, 0.91] # 预测类别分数
|
|
141
|
-
plot_roc_curve(true_labels, pred_scores)
|
|
192
|
+
# plot_roc_curve(true_labels, pred_scores)
|
|
193
|
+
print(get_best_accuracy(true_labels, pred_scores, vis=True))
|