pybaseutils 2.0.1__tar.gz → 2.0.4__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.1 → pybaseutils-2.0.4}/PKG-INFO +1 -1
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_cvat2labelme.py +2 -2
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/coords_utils.py +12 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/video_utils.py +8 -28
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_coco_det.py +5 -3
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_coco_ins.py +3 -2
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_coco_kps.py +6 -4
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_yolo.py +31 -8
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/file_utils.py +3 -3
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/image_utils.py +23 -4
- pybaseutils-2.0.4/pybaseutils/transforms/augment_utils.py +127 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/SOURCES.txt +5 -0
- pybaseutils-2.0.4/test_py/aije/build_pyarmor.py +34 -0
- pybaseutils-2.0.4/test_py/aije/build_service.py +61 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_cvat2labelme.py +3 -3
- pybaseutils-2.0.4/test_py/converter/ucf101_dataset.py +36 -0
- pybaseutils-2.0.4/test_py/cython_build/build_cython.py +27 -0
- pybaseutils-2.0.4/test_py/demo1.py +45 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_coco_vis.py +12 -5
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_lableme_vis.py +1 -1
- pybaseutils-2.0.1/test_py/demo1.py +0 -81
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/LICENCE +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/README.md +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/log.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/logger.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/setup.cfg +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/setup.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.0.1/test_py/cython_build → pybaseutils-2.0.4/test_py/aije}/build_cython.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_labelme_crop.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/aije/video_demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/main.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/class_names.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo2.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo3.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_video.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/edit_distance/text_utils.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/flask_demo/func.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/flask_demo/server.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/performance.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/base.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/component.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/main.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/registry/register.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.0.1 → pybaseutils-2.0.4}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -38,7 +38,7 @@ 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="", thickness=1, fontScale=1.0, vis=False):
|
|
42
42
|
"""
|
|
43
43
|
将CVAT标注格式(LabelMe 3.0)转换labelme通用格式
|
|
44
44
|
:param anno_dir: 标注文件目录,输出json文件与anno_dir同目录
|
|
@@ -59,7 +59,7 @@ def convert_cvat2labelme(anno_dir, image_dir="", vis=False):
|
|
|
59
59
|
image = cv2.imread(image_file)
|
|
60
60
|
h, w = image.shape[:2]
|
|
61
61
|
if vis:
|
|
62
|
-
image = image_utils.draw_image_contours(image, points, texts=labels)
|
|
62
|
+
image = image_utils.draw_image_contours(image, points, texts=labels, thickness=thickness, fontScale=fontScale)
|
|
63
63
|
image_utils.cv_show_image("det", image)
|
|
64
64
|
image_id = image_name.split(".")[0]
|
|
65
65
|
json_file = os.path.join(anno_dir, f"{image_id}.json")
|
|
@@ -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)
|
|
@@ -177,11 +177,8 @@ def frames2video(image_dir, video_file=None, func=None, size=None, postfix=["*.p
|
|
|
177
177
|
cv2.destroyAllWindows()
|
|
178
178
|
|
|
179
179
|
|
|
180
|
-
def
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
def video2video(video_file, save_video, task=None, start=0, interval=1, vis=True, delay=20):
|
|
180
|
+
def video2video(video_file: int or str, save_video: str or int, interval=1, task: Callable = None,
|
|
181
|
+
vis=True, **kwargs):
|
|
185
182
|
"""
|
|
186
183
|
转换视频格式
|
|
187
184
|
:param video_file: *.avi,*.mp4,...
|
|
@@ -189,27 +186,10 @@ def video2video(video_file, save_video, task=None, start=0, interval=1, vis=True
|
|
|
189
186
|
:param interval: 间隔
|
|
190
187
|
:return:
|
|
191
188
|
"""
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
# freq = int(fps / detect_freq)
|
|
197
|
-
count = start
|
|
198
|
-
while True:
|
|
199
|
-
# if count % interval == 0:
|
|
200
|
-
if count % interval == 0 and count > 0:
|
|
201
|
-
# 设置抽帧的位置
|
|
202
|
-
video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
203
|
-
isSuccess, frame = video_cap.read()
|
|
204
|
-
if not isSuccess or 0 < num_frames < count: break
|
|
205
|
-
if task: frame = task(frame, count=count)
|
|
206
|
-
height, width = frame.shape[:2]
|
|
207
|
-
if not video_writer: video_writer = get_video_writer(save_video, width, height, fps)
|
|
208
|
-
if vis: image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
|
|
209
|
-
video_writer.write(frame)
|
|
210
|
-
count += 1
|
|
211
|
-
video_cap.release()
|
|
212
|
-
video_writer.release()
|
|
189
|
+
video_capture(video_file=video_file, save_video=save_video, interval=interval, task=task, vis=vis, **kwargs)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
convert_video_format = video2video
|
|
213
193
|
|
|
214
194
|
|
|
215
195
|
def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True, delay=20):
|
|
@@ -261,7 +241,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
261
241
|
video_cap = image_utils.get_video_capture(video_file)
|
|
262
242
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
263
243
|
start = int(kwargs.get("start", 0) * fps)
|
|
264
|
-
end = int(kwargs.get("end", num_frames / fps) * fps)
|
|
244
|
+
end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
|
|
265
245
|
end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
266
246
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
267
247
|
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
@@ -313,7 +293,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
|
|
|
313
293
|
video_cap = image_utils.get_video_capture(video_file)
|
|
314
294
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
315
295
|
start = int(kwargs.get("start", 0) * fps)
|
|
316
|
-
end = int(kwargs.get("end", num_frames / fps) * fps)
|
|
296
|
+
end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
|
|
317
297
|
end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
318
298
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
319
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,6 +1905,9 @@ def get_box_crop(image, box):
|
|
|
1905
1905
|
return roi
|
|
1906
1906
|
|
|
1907
1907
|
|
|
1908
|
+
get_bbox_crop = get_box_crop
|
|
1909
|
+
|
|
1910
|
+
|
|
1908
1911
|
def get_bboxes_crop(image, bboxes):
|
|
1909
1912
|
"""
|
|
1910
1913
|
已经废弃,使用get_boxes_crop代替
|
|
@@ -2435,7 +2438,8 @@ def pointPolygonTest(point, contour, measureDist=False):
|
|
|
2435
2438
|
return dist
|
|
2436
2439
|
|
|
2437
2440
|
|
|
2438
|
-
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"):
|
|
2439
2443
|
"""
|
|
2440
2444
|
参考:draw_image_mask_color
|
|
2441
2445
|
:param image:
|
|
@@ -2456,13 +2460,28 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
|
|
|
2456
2460
|
bgimg = image.copy()
|
|
2457
2461
|
bgimg = cv2.fillPoly(bgimg, p, color=c)
|
|
2458
2462
|
image = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
|
|
2459
|
-
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)
|
|
2460
2465
|
return image
|
|
2461
2466
|
|
|
2462
2467
|
|
|
2463
2468
|
draw_image_mask_color = color_utils.draw_image_mask_color
|
|
2464
2469
|
|
|
2465
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
|
+
|
|
2466
2485
|
def get_mask_boundrect_cv(mask, binarize=False, shift=0):
|
|
2467
2486
|
"""
|
|
2468
2487
|
获得mask的最大外接矩形框(其速度比get_mask_boundrect快2倍左右)
|
|
@@ -2900,7 +2919,7 @@ def get_video_capture(video, width=None, height=None, fps=None):
|
|
|
2900
2919
|
return video_cap
|
|
2901
2920
|
|
|
2902
2921
|
|
|
2903
|
-
def get_video_info(video_cap: cv2.VideoCapture):
|
|
2922
|
+
def get_video_info(video_cap: cv2.VideoCapture, vis=True):
|
|
2904
2923
|
"""
|
|
2905
2924
|
获得视频的基础信息
|
|
2906
2925
|
:param video_cap:视频对象
|
|
@@ -2910,7 +2929,7 @@ def get_video_info(video_cap: cv2.VideoCapture):
|
|
|
2910
2929
|
height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
2911
2930
|
num_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
2912
2931
|
fps = int(video_cap.get(cv2.CAP_PROP_FPS))
|
|
2913
|
-
print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
|
|
2932
|
+
if vis: print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
|
|
2914
2933
|
return width, height, num_frames, fps
|
|
2915
2934
|
|
|
2916
2935
|
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : PKing
|
|
4
|
+
@E-mail :
|
|
5
|
+
@Date : 2024-07-25 08:33:57
|
|
6
|
+
@Brief : https://imgaug.readthedocs.io/en/latest/index.html
|
|
7
|
+
"""
|
|
8
|
+
import os
|
|
9
|
+
import cv2
|
|
10
|
+
import numpy as np
|
|
11
|
+
from typing import List, Tuple
|
|
12
|
+
from imgaug import augmenters as iaa
|
|
13
|
+
from pybaseutils import file_utils, image_utils
|
|
14
|
+
from imgaug.augmentables.segmaps import SegmentationMapsOnImage
|
|
15
|
+
from imgaug.augmentables.kps import KeypointsOnImage
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class Compose(object):
|
|
19
|
+
def __init__(self, transforms: List = [], fixed=True):
|
|
20
|
+
"""
|
|
21
|
+
:param transforms:
|
|
22
|
+
:param fixed: images的图片是否使用相同的增强方式
|
|
23
|
+
"""
|
|
24
|
+
self.fixed = fixed
|
|
25
|
+
self.transforms = transforms if transforms else []
|
|
26
|
+
self.aug = iaa.Sequential(children=self.transforms, random_order=False, seed=2004)
|
|
27
|
+
|
|
28
|
+
def __call__(self, image=None, images=None, **kwargs):
|
|
29
|
+
"""
|
|
30
|
+
kwargs = ["image","images", "heatmaps", "segmentation_maps",
|
|
31
|
+
"keypoints", "bounding_boxes", "polygons",
|
|
32
|
+
"line_strings"]
|
|
33
|
+
:param kwargs:
|
|
34
|
+
:return:
|
|
35
|
+
"""
|
|
36
|
+
if isinstance(images, list) and len(images) > 0:
|
|
37
|
+
if self.fixed:
|
|
38
|
+
aug = self.aug.to_deterministic()
|
|
39
|
+
images = [aug(image=images[i], **kwargs) for i in range(len(images))]
|
|
40
|
+
else:
|
|
41
|
+
images = self.aug(images=images, **kwargs)
|
|
42
|
+
return images
|
|
43
|
+
if isinstance(image, np.ndarray):
|
|
44
|
+
image = self.aug(image=image, **kwargs)
|
|
45
|
+
return image
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def augment_example(input_size=(224, 224)):
|
|
49
|
+
transforms = [
|
|
50
|
+
iaa.Resize({"width": int(input_size[0] * 1.2), "height": "keep-aspect-ratio"}),
|
|
51
|
+
iaa.Fliplr(0.5), # 以75%的概率水平翻转图像
|
|
52
|
+
iaa.LinearContrast((0.75, 1.5)), # 加强或减弱图像的对比度
|
|
53
|
+
iaa.ContrastNormalization((0.8, 1.2)), # 随机调整对比度
|
|
54
|
+
iaa.Multiply((0.8, 1.2), per_channel=0.2), # 亮度变化
|
|
55
|
+
iaa.Affine(scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
|
|
56
|
+
translate_percent={"x": (-0.1, 0.1), "y": (-0.1, 0.1)},
|
|
57
|
+
rotate=(-5, 5),
|
|
58
|
+
shear=(-8, 8)
|
|
59
|
+
),
|
|
60
|
+
iaa.Crop(percent=(0, 0.1)),
|
|
61
|
+
iaa.Resize({"width": input_size[0], "height": input_size[1]}),
|
|
62
|
+
# 以50%的概率对图像进行小的高斯模糊增强
|
|
63
|
+
# iaa.Sometimes(0.5, iaa.GaussianBlur(sigma=(0, 0.5))),
|
|
64
|
+
#
|
|
65
|
+
# # 添加高斯噪声
|
|
66
|
+
# iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05 * 255), per_channel=0.5),
|
|
67
|
+
# # 使部分图像变亮,部分变暗
|
|
68
|
+
# # 对图像进行仿射变换
|
|
69
|
+
# iaa.PadToFixedSize(width=100, height=100),
|
|
70
|
+
# iaa.CropToFixedSize(width=100, height=100),
|
|
71
|
+
# iaa.CropToFixedSize(width=size[0], height=size[1]),
|
|
72
|
+
# iaa.Resize({"width": int(size[0]), "height": "keep-aspect-ratio"}),
|
|
73
|
+
# iaa.PadToFixedSize(width=size[0], height=size[1]),
|
|
74
|
+
# iaa.CenterPadToFixedSize(width=size[0], height=size[1]),
|
|
75
|
+
]
|
|
76
|
+
return transforms
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def demo_for_image():
|
|
80
|
+
# image = cv2.rotate(image, rotateCode=cv2.ROTATE_90_CLOCKWISE)
|
|
81
|
+
transforms = augment_example()
|
|
82
|
+
augment = Compose(transforms=transforms, fixed=True)
|
|
83
|
+
for i in range(100):
|
|
84
|
+
image_path = "../../data/test.png"
|
|
85
|
+
image = image_utils.read_image(image_path)
|
|
86
|
+
images = [image.copy(), image.copy()]
|
|
87
|
+
images = augment(images=images)
|
|
88
|
+
[print(img.shape) for img in images]
|
|
89
|
+
result = image_utils.image_hstack(images)
|
|
90
|
+
image_utils.cv_show_image("image", image, delay=5)
|
|
91
|
+
image_utils.cv_show_image("result", result)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def demo_for_segment():
|
|
95
|
+
transforms = augment_example()
|
|
96
|
+
augment = Compose(transforms=transforms, fixed=True)
|
|
97
|
+
for i in range(100):
|
|
98
|
+
image = image_utils.read_image("../../data/test.png")
|
|
99
|
+
mask = image_utils.read_image("../../data/mask.png")
|
|
100
|
+
mask = image_utils.get_image_mask(mask)
|
|
101
|
+
auimg, segimg = augment(image=image, segmentation_maps=SegmentationMapsOnImage(mask, shape=mask.shape))
|
|
102
|
+
mask = np.asarray(segimg.arr[:, :, 0], dtype=np.uint8)
|
|
103
|
+
color_image, color_mask = image_utils.draw_image_mask_color(auimg, mask)
|
|
104
|
+
result = image_utils.image_hstack([image, color_image, mask])
|
|
105
|
+
image_utils.cv_show_image("image", result)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def demo_for_keypoint():
|
|
109
|
+
transforms = augment_example()
|
|
110
|
+
augment = Compose(transforms=transforms, fixed=True)
|
|
111
|
+
for i in range(100):
|
|
112
|
+
image = image_utils.read_image("../../data/test.png")
|
|
113
|
+
mask = image_utils.read_image("../../data/mask.png")
|
|
114
|
+
mask = image_utils.get_image_mask(mask)
|
|
115
|
+
contours = image_utils.find_mask_contours(mask)
|
|
116
|
+
auimg, contours = augment(image=image, keypoints=contours)
|
|
117
|
+
h, w = auimg.shape[:2]
|
|
118
|
+
mask = image_utils.draw_mask_contours(contours, size=(w, h))
|
|
119
|
+
color_image = image_utils.draw_image_contours(auimg, contours)
|
|
120
|
+
result = image_utils.image_hstack([image, color_image, mask])
|
|
121
|
+
image_utils.cv_show_image("image", result)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
if __name__ == "__main__":
|
|
125
|
+
# demo_for_image()
|
|
126
|
+
# demo_for_segment()
|
|
127
|
+
demo_for_keypoint()
|
|
@@ -108,6 +108,7 @@ pybaseutils/tracking/motion_filter.py
|
|
|
108
108
|
pybaseutils/tracking/pose_filter.py
|
|
109
109
|
pybaseutils/transforms/__init__.py
|
|
110
110
|
pybaseutils/transforms/affine_transform.py
|
|
111
|
+
pybaseutils/transforms/augment_utils.py
|
|
111
112
|
pybaseutils/transforms/face_alignment.py
|
|
112
113
|
pybaseutils/transforms/transform_utils.py
|
|
113
114
|
test_py/__init__.py
|
|
@@ -154,6 +155,9 @@ test_py/WebCrawler/__init__.py
|
|
|
154
155
|
test_py/WebCrawler/search_image.py
|
|
155
156
|
test_py/WebCrawler/search_image_for_baidu.py
|
|
156
157
|
test_py/aije/__init__.py
|
|
158
|
+
test_py/aije/build_cython.py
|
|
159
|
+
test_py/aije/build_pyarmor.py
|
|
160
|
+
test_py/aije/build_service.py
|
|
157
161
|
test_py/aije/convert_labelme2coco.py
|
|
158
162
|
test_py/aije/convert_labelme2voc.py
|
|
159
163
|
test_py/aije/copy_move.py
|
|
@@ -198,6 +202,7 @@ test_py/converter/handpose2coco.py
|
|
|
198
202
|
test_py/converter/insects_for_aichallenger.py
|
|
199
203
|
test_py/converter/tt100k_utils.py
|
|
200
204
|
test_py/converter/ua_detrac2voc.py
|
|
205
|
+
test_py/converter/ucf101_dataset.py
|
|
201
206
|
test_py/converter/voc_sbd2labelme.py
|
|
202
207
|
test_py/cython_build/__init__.py
|
|
203
208
|
test_py/cython_build/build_cython.py
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : PKing
|
|
4
|
+
@E-mail :
|
|
5
|
+
@Date : 2023-09-20 14:35:22
|
|
6
|
+
@Brief : pip install pyarmor==7.7.4
|
|
7
|
+
https://pyarmor.readthedocs.io/en/v5.4.0/project.html#managing-obfuscated-scripts-with-project
|
|
8
|
+
https://pyarmor.readthedocs.io/en/v7.3.0/project.html#project-configuration-file
|
|
9
|
+
https://docs.python.org/2/distutils/sourcedist.html#commands (Commands)
|
|
10
|
+
https://baijiahao.baidu.com/s?id=1775756280786745996&wfr=spider&for=pc
|
|
11
|
+
https://www.jianshu.com/p/c1d3d79e3545/
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import os
|
|
15
|
+
from pybaseutils import file_utils
|
|
16
|
+
from pybaseutils.build_utils import pyarmor_utils
|
|
17
|
+
|
|
18
|
+
IGNORE_DIRS = ['.git', '.idea', 'docs', 'build', 'dist']
|
|
19
|
+
|
|
20
|
+
if __name__ == '__main__':
|
|
21
|
+
root = os.path.dirname(__file__)
|
|
22
|
+
build = os.path.join(root, "build")
|
|
23
|
+
entry = "app/main.py"
|
|
24
|
+
manifest = "global-include *.py," \
|
|
25
|
+
"exclude test/*.py," \
|
|
26
|
+
"prune app/infercore/human_detector/yolov5/utils," \
|
|
27
|
+
"prune app/infercore/human_pose/hrnet/yolov5/utils," \
|
|
28
|
+
"prune app/infercore/equipment_detector/yolov5/utils," \
|
|
29
|
+
"prune app/infercore/equipment_detector/yolov8/ultralytics," \
|
|
30
|
+
"prune app/infercore/base," \
|
|
31
|
+
"prune app/infercore/modules," \
|
|
32
|
+
"exclude app/infercore/modules/indoor_component.py," \
|
|
33
|
+
"exclude app/infercore/modules/outdoor_component.py,"
|
|
34
|
+
pyarmor_utils.build_pyarmor_project(root, entry, build, manifest=manifest, exclude_dirs=IGNORE_DIRS)
|