pybaseutils 2.2.22__tar.gz → 2.2.25__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/PKG-INFO +4 -4
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/README.md +2 -2
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.2.25/pybaseutils/converter/prelabelme.py +115 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/coords_utils.py +28 -19
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/corner_utils.py +25 -6
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/video_utils.py +10 -22
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/base_dataset.py +4 -11
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/data_resample.py +2 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_image_folder.py +4 -4
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_image_text.py +53 -32
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_labelme.py +7 -9
- pybaseutils-2.2.25/pybaseutils/dataloader/parser_labelme_crop.py +141 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_voc.py +1 -2
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_yolo.py +1 -2
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/file_utils.py +65 -30
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/font_style/__init__.py +1 -1
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/geometry_tools.py +5 -7
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/http_utils.py +47 -21
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/image_utils.py +50 -8
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/json_utils.py +9 -28
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/log.py +24 -14
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/numpy_utils.py +84 -33
- pybaseutils-2.2.25/pybaseutils/pandas_utils.py +258 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/human_pose.py +3 -4
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/text_utils.py +35 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/time_utils.py +39 -21
- pybaseutils-2.2.25/pybaseutils/web/app_gradio_image.py +147 -0
- pybaseutils-2.2.25/pybaseutils/web/demo.py +35 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/PKG-INFO +4 -4
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/SOURCES.txt +9 -3
- pybaseutils-2.2.25/test_py/WebCrawler/search_baidu.py +55 -0
- pybaseutils-2.2.25/test_py/WebCrawler/search_biying.py +55 -0
- pybaseutils-2.2.25/test_py/aije/demo_labelme_crop.py +211 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/AffectNet.py +1 -1
- pybaseutils-2.2.25/test_py/demo1.py +41 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo2.py +7 -7
- pybaseutils-2.2.25/test_py/demo_for_annular_to_rect.py +53 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_gif_video.py +6 -6
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_lableme_vis.py +8 -3
- pybaseutils-2.2.25/test_py/demo_prelabelme.py +57 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_rename.py +2 -2
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_standard_video .py +6 -6
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_video.py +5 -4
- pybaseutils-2.2.25/test_py/gradio_app.py +165 -0
- pybaseutils-2.2.25/test_py/gradio_app_v2.py +28 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/demo01.py +20 -4
- pybaseutils-2.2.25/test_py/milvus_demo/demo02.py +67 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/milvus_client.py +57 -29
- pybaseutils-2.2.22/pybaseutils/pandas_utils.py +0 -112
- pybaseutils-2.2.22/pybaseutils/web/app_flask_image.py +0 -94
- pybaseutils-2.2.22/pybaseutils/web/demo.py +0 -13
- pybaseutils-2.2.22/test_py/WebCrawler/search_image.py +0 -78
- pybaseutils-2.2.22/test_py/WebCrawler/search_image_for_baidu.py +0 -74
- pybaseutils-2.2.22/test_py/aije/demo_labelme_crop.py +0 -122
- pybaseutils-2.2.22/test_py/demo1.py +0 -29
- pybaseutils-2.2.22/test_py/milvus_demo/demo02.py +0 -44
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/LICENCE +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/setup.cfg +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/setup.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/main.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/class_names.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/date_demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo3.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/performance.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/base.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/component.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/main.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/registry/register.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.2.22 → pybaseutils-2.2.25}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.25
|
|
4
4
|
Summary: pybaseutils
|
|
5
5
|
Home-page: https://github.com/PanJinquan/base-utils
|
|
6
6
|
Author: PanJinquan
|
|
@@ -41,9 +41,9 @@ pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
|
41
41
|
(有延时,可能不是最新版本)
|
|
42
42
|
- 安装方法2:pip install –upgrade -i https://pypi.org/simple
|
|
43
43
|
pybaseutils (从pypi源下载最新版本)
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
- 设置默认的镜像源:pip config set global.index-url
|
|
45
|
+
https://pypi.tuna.tsinghua.edu.cn/simple)
|
|
46
|
+
- 超时异常:pip –default-timeout=1000000000
|
|
47
47
|
|
|
48
48
|
一些问题修复说明
|
|
49
49
|
----------------
|
|
@@ -20,8 +20,8 @@ pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
|
20
20
|
|
|
21
21
|
- 安装方法1:pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils (有延时,可能不是最新版本)
|
|
22
22
|
- 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
- 设置默认的镜像源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple)
|
|
24
|
+
- 超时异常:pip --default-timeout=1000000000
|
|
25
25
|
|
|
26
26
|
## 一些问题修复说明
|
|
27
27
|
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-04-29 09:13:09
|
|
7
|
+
# @Brief :
|
|
8
|
+
# --------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
import os
|
|
11
|
+
import cv2
|
|
12
|
+
from tqdm import tqdm
|
|
13
|
+
from pybaseutils.converter import build_labelme
|
|
14
|
+
from pybaseutils import http_utils, base64_utils, file_utils, image_utils
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class PreLabelme(object):
|
|
18
|
+
"""
|
|
19
|
+
调用API接口进行预标注,并保持为Labelme数据格式
|
|
20
|
+
接口必须返回字段:
|
|
21
|
+
boxes 必选
|
|
22
|
+
label 必选
|
|
23
|
+
score 可选
|
|
24
|
+
names 可选
|
|
25
|
+
segms 可选
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, url, headers=None, timeout=6, max_retries=1):
|
|
29
|
+
"""
|
|
30
|
+
:param url:
|
|
31
|
+
"""
|
|
32
|
+
self.url = url
|
|
33
|
+
self.headers = headers
|
|
34
|
+
self.timeout = timeout
|
|
35
|
+
self.max_retries = max_retries
|
|
36
|
+
|
|
37
|
+
def request(self, params, **kwargs):
|
|
38
|
+
"""
|
|
39
|
+
:param params:
|
|
40
|
+
:return: boxes,label,names,segms,,score
|
|
41
|
+
"""
|
|
42
|
+
params.update(kwargs)
|
|
43
|
+
params = base64_utils.serialization(params)
|
|
44
|
+
result = http_utils.post(self.url, params=params, headers=self.headers,
|
|
45
|
+
timeout=self.timeout, max_retries=self.max_retries)
|
|
46
|
+
result = base64_utils.deserialization(result)
|
|
47
|
+
return result
|
|
48
|
+
|
|
49
|
+
def draw_result(self, image, result: dict, vis=True, delay=0):
|
|
50
|
+
"""
|
|
51
|
+
:param image: BGR image
|
|
52
|
+
:param boxes:<np.ndarray>: (num_boxes, 4), box=[xmin,ymin,xmax,ymax]
|
|
53
|
+
:param score:<np.ndarray>: (num_boxes,)
|
|
54
|
+
:param label:<np.ndarray>: (num_boxes,)
|
|
55
|
+
:return:
|
|
56
|
+
"""
|
|
57
|
+
color = (255, 0, 0)
|
|
58
|
+
boxes = result.get("boxes", [])
|
|
59
|
+
score = result.get("score", [])
|
|
60
|
+
landm = result.get("landm", [])
|
|
61
|
+
segms = result.get("segms", [])
|
|
62
|
+
label = result.get("label", [])
|
|
63
|
+
names = result.get("names", [])
|
|
64
|
+
if not names: names = label
|
|
65
|
+
texts = ["{} {:3.3f}".format(n, s) for n, s in zip(names, score)]
|
|
66
|
+
image = image_utils.draw_image_bboxes_text(image, boxes, texts, color=color, thickness=2,
|
|
67
|
+
fontScale=0.8, drawType="ch")
|
|
68
|
+
image = image_utils.draw_landmark(image, landm, radius=2, fontScale=1.0, color=color)
|
|
69
|
+
if vis: image_utils.cv_show_image("image", image, delay=delay)
|
|
70
|
+
return image
|
|
71
|
+
|
|
72
|
+
def detect_image_dir(self, image_dir, vis=True):
|
|
73
|
+
"""
|
|
74
|
+
:param image_dir: directory or image file path
|
|
75
|
+
:param vis:<bool>
|
|
76
|
+
:return:
|
|
77
|
+
"""
|
|
78
|
+
image_list = file_utils.get_files_lists(image_dir)
|
|
79
|
+
for image_file in tqdm(image_list):
|
|
80
|
+
image = cv2.imread(image_file)
|
|
81
|
+
result = self.request(params={"image": image})
|
|
82
|
+
if vis: image = self.draw_result(image, result)
|
|
83
|
+
|
|
84
|
+
def prelabel_labelme(self, image_dir, clsss_dict={}, vis=True):
|
|
85
|
+
"""
|
|
86
|
+
进行预标注,并输出labelme数据格式
|
|
87
|
+
:param image_dir: directory or image file path
|
|
88
|
+
:param vis:<bool>
|
|
89
|
+
:return:
|
|
90
|
+
"""
|
|
91
|
+
image_list = file_utils.get_files_lists(image_dir)
|
|
92
|
+
for image_file in tqdm(image_list):
|
|
93
|
+
image = cv2.imread(image_file)
|
|
94
|
+
if image is None: continue
|
|
95
|
+
h, w = image.shape[:2]
|
|
96
|
+
result = self.request(params={"image": image})
|
|
97
|
+
image_name = os.path.basename(image_file)
|
|
98
|
+
json_file = file_utils.change_postfix(image_file, postfix=".json")
|
|
99
|
+
boxes = result.get("boxes", [])
|
|
100
|
+
segms = result.get("segms", [])
|
|
101
|
+
label = result.get("label", [])
|
|
102
|
+
names = [clsss_dict[l] for l in label] if clsss_dict else result.get("names", [])
|
|
103
|
+
result['names'] = names
|
|
104
|
+
points = image_utils.boxes2polygons(boxes)
|
|
105
|
+
build_labelme.maker_labelme(json_file, points, names, image_name, image_size=(w, h), image_bs64=None)
|
|
106
|
+
if vis: image = self.draw_result(image, result)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
if __name__ == '__main__':
|
|
110
|
+
# url = 'http://192.168.68.102:5000/detect'
|
|
111
|
+
url = 'http://0.0.0.0:5000/detect'
|
|
112
|
+
image_dir = "/media/PKing/新加卷1/个人文件/video/video/frame"
|
|
113
|
+
s = PreLabelme(url=url)
|
|
114
|
+
s.prelabel_labelme(image_dir=image_dir, vis=False)
|
|
115
|
+
# s.detect_image_dir(image_dir=image_dir)
|
|
@@ -23,6 +23,7 @@ def clip_xyxy(xyxy: np.ndarray, valid_range):
|
|
|
23
23
|
:return:
|
|
24
24
|
"""
|
|
25
25
|
if len(xyxy) == 0: return xyxy
|
|
26
|
+
if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
|
|
26
27
|
xmin, ymin, xmax, ymax = valid_range
|
|
27
28
|
xyxy[:, [0, 2]] = np.clip(xyxy[:, [0, 2]], xmin, xmax)
|
|
28
29
|
xyxy[:, [1, 3]] = np.clip(xyxy[:, [1, 3]], ymin, ymax)
|
|
@@ -105,7 +106,7 @@ def cxcywh2xyxy(cxcywh: np.ndarray, width=None, height=None, normalized=False):
|
|
|
105
106
|
def extend_xyxy(xyxy: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False, use_max=True):
|
|
106
107
|
"""
|
|
107
108
|
:param bboxes: [[xmin, ymin, xmax, ymax]]
|
|
108
|
-
:param scale: [sx,sy]==>(W,H)
|
|
109
|
+
:param scale: [sx,sy]==>(W,H),(sx1,sy1,sx2,sy2),1.0表示不缩放,<1.0表示缩小倍数,>1.0表示扩大倍数
|
|
109
110
|
:param valid_range:有效范围(xmin,ymin,xmax,ymax)
|
|
110
111
|
:param fixed: 长宽是否按照相同大小扩展
|
|
111
112
|
当长宽比相差比较大,直接scale会导致短边扩展不明显,
|
|
@@ -114,22 +115,30 @@ def extend_xyxy(xyxy: np.ndarray, scale=[1.0, 1.0], valid_range=[], fixed=False,
|
|
|
114
115
|
"""
|
|
115
116
|
if len(xyxy) == 0 or len(scale) == 0: return xyxy
|
|
116
117
|
if not isinstance(xyxy, np.ndarray): xyxy = np.asarray(xyxy)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
118
|
+
if len(scale) == 2:
|
|
119
|
+
cxcywh = xyxy.copy()
|
|
120
|
+
if fixed:
|
|
121
|
+
cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
|
|
122
|
+
cxcywh[:, 1] = (xyxy[:, 3] + xyxy[:, 1]) / 2 # cy
|
|
123
|
+
dw = (xyxy[:, 2] - xyxy[:, 0]) * (scale[0] - 1)
|
|
124
|
+
dh = (xyxy[:, 3] - xyxy[:, 1]) * (scale[1] - 1)
|
|
125
|
+
dp = np.vstack((dw, dh))
|
|
126
|
+
dp = np.max(dp, axis=0) if use_max else np.min(dp, axis=0)
|
|
127
|
+
cxcywh[:, 2] = (xyxy[:, 2] - xyxy[:, 0]) + dp # w
|
|
128
|
+
cxcywh[:, 3] = (xyxy[:, 3] - xyxy[:, 1]) + dp # h
|
|
129
|
+
else:
|
|
130
|
+
cxcywh[:, 0] = (xyxy[:, 2] + xyxy[:, 0]) / 2 # cx
|
|
131
|
+
cxcywh[:, 1] = (xyxy[:, 3] + xyxy[:, 1]) / 2 # cy
|
|
132
|
+
cxcywh[:, 2] = (xyxy[:, 2] - xyxy[:, 0]) * scale[0] # w
|
|
133
|
+
cxcywh[:, 3] = (xyxy[:, 3] - xyxy[:, 1]) * scale[1] # h
|
|
134
|
+
dxyxy = cxcywh2xyxy(cxcywh, width=None, height=None, normalized=False)
|
|
135
|
+
elif len(scale) == 4:
|
|
136
|
+
xywh = xyxy2xywh(xyxy)
|
|
137
|
+
xyxy[:, 0] = xyxy[:, 0] + xywh[:, 2] * (1 - scale[0])
|
|
138
|
+
xyxy[:, 1] = xyxy[:, 1] + xywh[:, 3] * (1 - scale[1])
|
|
139
|
+
xyxy[:, 2] = xyxy[:, 2] - xywh[:, 2] * (1 - scale[2])
|
|
140
|
+
xyxy[:, 3] = xyxy[:, 3] - xywh[:, 3] * (1 - scale[3])
|
|
141
|
+
dxyxy = xyxy
|
|
133
142
|
if valid_range: dxyxy = clip_xyxy(dxyxy, valid_range=valid_range)
|
|
134
143
|
return dxyxy
|
|
135
144
|
|
|
@@ -205,8 +214,8 @@ def get_square_boxes(boxes, use_max=True, use_mean=False, baseline=-1):
|
|
|
205
214
|
"""
|
|
206
215
|
将boxes转换为正方形的boxes
|
|
207
216
|
:param boxes:
|
|
208
|
-
:param use_max: 是否按照每个box(w,h)最大值(True)/最小值(False)进行转换(默认)
|
|
209
|
-
:param use_mean: 是否按照每个box(w,h)平均值进行转换(优先级比
|
|
217
|
+
:param use_max: 是否按照每个box(w,h)最大值(True)/最小值(False)进行转换(默认),可以保证目标裁剪完整
|
|
218
|
+
:param use_mean: 是否按照每个box(w,h)平均值进行转换(优先级比use_max高),但当目标长宽比比较大时,可能出现目标裁剪不完整的问题
|
|
210
219
|
:param baseline: 当baseline>0,表示正方形最小边长
|
|
211
220
|
:return:
|
|
212
221
|
"""
|
|
@@ -76,7 +76,7 @@ def get_target_points(src_pts: np.ndarray):
|
|
|
76
76
|
return dst_pts
|
|
77
77
|
|
|
78
78
|
|
|
79
|
-
def
|
|
79
|
+
def get_order_points_index(src_pts):
|
|
80
80
|
"""
|
|
81
81
|
对4个点按顺时针方向进行排序:[top-left, top-right, bottom-right, bottom-left]
|
|
82
82
|
top-left :对应y+x之和的最小点
|
|
@@ -91,13 +91,32 @@ def get_order_points(src_pts):
|
|
|
91
91
|
:param src_pts: pts_dst [top-left, top-right, bottom-right, bottom-left]
|
|
92
92
|
:return:
|
|
93
93
|
"""
|
|
94
|
-
dst_pts = np.zeros(shape=(4, 2), dtype=np.float32)
|
|
95
94
|
s = src_pts.sum(axis=1)
|
|
96
|
-
dst_pts[0] = src_pts[np.argmin(s)]
|
|
97
|
-
dst_pts[2] = src_pts[np.argmax(s)]
|
|
98
95
|
d = np.diff(src_pts, axis=1)
|
|
99
|
-
|
|
100
|
-
|
|
96
|
+
i0 = np.argmin(s)
|
|
97
|
+
i2 = np.argmax(s)
|
|
98
|
+
i1 = np.argmin(d)
|
|
99
|
+
i3 = np.argmax(d)
|
|
100
|
+
return [i0, i1, i2, i3]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def get_order_points(src_pts):
|
|
104
|
+
"""
|
|
105
|
+
对4个点按顺时针方向进行排序:[top-left, top-right, bottom-right, bottom-left]
|
|
106
|
+
top-left :对应y+x之和的最小点
|
|
107
|
+
bottom-right:对应y+x之和的最大点
|
|
108
|
+
top-right :对应y-x之差的最小点
|
|
109
|
+
bottom-left :对应y-x之差的最大点
|
|
110
|
+
0(top-left)----(w10)----1(top-right)
|
|
111
|
+
| |
|
|
112
|
+
(h30) (h21)
|
|
113
|
+
| |
|
|
114
|
+
3(bottom-left)--(w23)---2(bottom-right)
|
|
115
|
+
:param src_pts: pts_dst [top-left, top-right, bottom-right, bottom-left]
|
|
116
|
+
:return:
|
|
117
|
+
"""
|
|
118
|
+
index = get_order_points_index(src_pts)
|
|
119
|
+
dst_pts = src_pts[index]
|
|
101
120
|
return dst_pts
|
|
102
121
|
|
|
103
122
|
|
|
@@ -61,7 +61,7 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, use_pil=False, f
|
|
|
61
61
|
image_utils.frames2gif_by_imageio(frames, gif_file=gif_file, fps=fps, loop=0)
|
|
62
62
|
|
|
63
63
|
|
|
64
|
-
def video2frames(video_file, out_dir=None, func=None, interval=1, vis=True, delay=10):
|
|
64
|
+
def video2frames(video_file, out_dir=None, func=None, interval=1, start=0, end=-1, vis=True, delay=10):
|
|
65
65
|
"""
|
|
66
66
|
视频抽帧图像
|
|
67
67
|
:param video_file: 视频文件
|
|
@@ -73,26 +73,14 @@ def video2frames(video_file, out_dir=None, func=None, interval=1, vis=True, dela
|
|
|
73
73
|
"""
|
|
74
74
|
name = os.path.basename(video_file).split(".")[0]
|
|
75
75
|
if not out_dir: out_dir = os.path.join(os.path.dirname(video_file), name)
|
|
76
|
-
video_cap =
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
85
|
-
isSuccess, frame = video_cap.read()
|
|
86
|
-
if not isSuccess or 0 < num_frames < count: break
|
|
87
|
-
if func:
|
|
88
|
-
frame = func(frame)
|
|
89
|
-
if vis:
|
|
90
|
-
image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
|
|
91
|
-
frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
|
|
92
|
-
cv2.imwrite(frame_file, frame)
|
|
93
|
-
count += 1
|
|
94
|
-
video_cap.release()
|
|
95
|
-
cv2.destroyAllWindows()
|
|
76
|
+
video_cap = video_iterator(video_file, save_video=None, interval=interval, start=start, end=end)
|
|
77
|
+
for data_info in video_cap:
|
|
78
|
+
frame = data_info["frame"]
|
|
79
|
+
count = data_info["count"]
|
|
80
|
+
if func: frame = func(frame)
|
|
81
|
+
if vis: image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
|
|
82
|
+
frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
|
|
83
|
+
cv2.imwrite(frame_file, frame)
|
|
96
84
|
|
|
97
85
|
|
|
98
86
|
def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True):
|
|
@@ -297,7 +285,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
|
|
|
297
285
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
298
286
|
start = int(kwargs.get("start", 0) * fps)
|
|
299
287
|
end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
|
|
300
|
-
end = min(end, num_frames) # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
288
|
+
end = min(end, num_frames) if end > 0 else num_frames # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
301
289
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
302
290
|
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
303
291
|
count = 0
|
|
@@ -78,7 +78,7 @@ class Dataset(object):
|
|
|
78
78
|
else:
|
|
79
79
|
class_dict = None
|
|
80
80
|
if class_dict:
|
|
81
|
-
class_dict = json_utils.
|
|
81
|
+
# class_dict = json_utils.dict_sort(class_dict, reverse=False)
|
|
82
82
|
class_name = {}
|
|
83
83
|
for n, i in class_dict.items():
|
|
84
84
|
class_name[i] = "{},{}".format(class_name[i], n) if i in class_name else n
|
|
@@ -129,23 +129,16 @@ class Dataset(object):
|
|
|
129
129
|
return Dataset.read_file(filename, split=split)
|
|
130
130
|
|
|
131
131
|
@staticmethod
|
|
132
|
-
def get_file_list(dir_root, postfix=['*.jpg'], basename=True):
|
|
132
|
+
def get_file_list(dir_root, postfix=['*.jpg'], sub=False, basename=True):
|
|
133
133
|
"""
|
|
134
134
|
获得文件列表
|
|
135
135
|
:param dir_root: 图片文件目录
|
|
136
136
|
:param postfix: 后缀名,可是多个如,['*.jpg','*.png']
|
|
137
|
+
:param sub: 是否去除根路径
|
|
137
138
|
:param basename: 返回的列表是文件名(True),还是文件的完整路径(False)
|
|
138
139
|
:return:
|
|
139
140
|
"""
|
|
140
|
-
file_list =
|
|
141
|
-
for format in postfix:
|
|
142
|
-
format = os.path.join(dir_root, format)
|
|
143
|
-
image_list = glob.glob(format)
|
|
144
|
-
if image_list:
|
|
145
|
-
file_list += image_list
|
|
146
|
-
file_list = sorted(file_list)
|
|
147
|
-
if basename:
|
|
148
|
-
file_list = [os.path.basename(f).split(".")[0] for f in file_list]
|
|
141
|
+
file_list = file_utils.get_files_list(dir_root, prefix="", postfix=postfix, sub=sub, basename=basename)
|
|
149
142
|
return file_list
|
|
150
143
|
|
|
151
144
|
@staticmethod
|
|
@@ -178,6 +178,8 @@ class DataResample(object):
|
|
|
178
178
|
class_count[label] += 1
|
|
179
179
|
except Exception as e:
|
|
180
180
|
class_count[label] = 1
|
|
181
|
+
from pybaseutils import json_utils
|
|
182
|
+
class_count = json_utils.dict_sort(class_count,use_key=True)
|
|
181
183
|
return class_count
|
|
182
184
|
|
|
183
185
|
@staticmethod
|
|
@@ -50,7 +50,7 @@ class FolderDataset(parser_image_text.TextDataset):
|
|
|
50
50
|
保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,,ymax]
|
|
51
51
|
:param data_file:
|
|
52
52
|
:param data_root:
|
|
53
|
-
:return: item_list [{"file"
|
|
53
|
+
:return: item_list [{"file","label","name","bbox"}],bbox非必须
|
|
54
54
|
"""
|
|
55
55
|
if isinstance(data_file, str): data_file = [data_file]
|
|
56
56
|
item_list = []
|
|
@@ -61,7 +61,7 @@ class FolderDataset(parser_image_text.TextDataset):
|
|
|
61
61
|
print("loading data from:{},have {},label:{}".format(dir, len(paths), len(set(labels))))
|
|
62
62
|
# TODO # 避免多个数据集的相同的label
|
|
63
63
|
if use_sub: labels = [os.path.join(str(i), l) for l in labels]
|
|
64
|
-
data = [{"file": p, "label": l} for p, l in zip(paths, labels)]
|
|
64
|
+
data = [{"file": p, "label": l, 'name': l} for p, l in zip(paths, labels)]
|
|
65
65
|
item_list += data
|
|
66
66
|
return item_list
|
|
67
67
|
|
|
@@ -70,7 +70,7 @@ if __name__ == '__main__':
|
|
|
70
70
|
from pybaseutils import image_utils
|
|
71
71
|
from torchvision import transforms
|
|
72
72
|
|
|
73
|
-
image_dir = ['/home/PKing/nasdata/release/infrastructure/DMClassification/data/dataset/
|
|
73
|
+
image_dir = ['/home/PKing/nasdata/release/infrastructure/DMClassification/data/dataset/test']
|
|
74
74
|
class_name = []
|
|
75
75
|
input_size = [224, 224]
|
|
76
76
|
rgb_mean = [0., 0., 0.]
|
|
@@ -84,7 +84,7 @@ if __name__ == '__main__':
|
|
|
84
84
|
transform=transform,
|
|
85
85
|
shuffle=True,
|
|
86
86
|
class_name=class_name,
|
|
87
|
-
resample=
|
|
87
|
+
resample=False,
|
|
88
88
|
disp=True)
|
|
89
89
|
for i in range(len(dataset)):
|
|
90
90
|
data_info = dataset.__getitem__(i)
|
|
@@ -13,7 +13,7 @@ sys.path.append(os.getcwd())
|
|
|
13
13
|
import PIL.Image as Image
|
|
14
14
|
import numpy as np
|
|
15
15
|
import random
|
|
16
|
-
import
|
|
16
|
+
import time
|
|
17
17
|
import cv2
|
|
18
18
|
from tqdm import tqdm
|
|
19
19
|
from pybaseutils.dataloader.base_dataset import Dataset, ConcatDataset
|
|
@@ -36,17 +36,26 @@ class TextDataset(Dataset):
|
|
|
36
36
|
:param phase:
|
|
37
37
|
:param disp:
|
|
38
38
|
:param check:
|
|
39
|
-
:param kwargs:
|
|
39
|
+
:param kwargs: log: print or log.info
|
|
40
|
+
use_max,
|
|
41
|
+
use_mean,
|
|
42
|
+
crop_scale,
|
|
43
|
+
resample,
|
|
44
|
+
save_info,
|
|
45
|
+
resample_interval
|
|
40
46
|
"""
|
|
41
47
|
self.data_file = data_file
|
|
42
48
|
self.data_root = data_root
|
|
43
49
|
self.use_rgb = use_rgb
|
|
44
50
|
self.transform = transform
|
|
45
51
|
self.phase = phase
|
|
52
|
+
self.train = self.phase.lower() == "train"
|
|
46
53
|
self.shuffle = shuffle
|
|
47
54
|
self.check = check
|
|
48
55
|
self.kwargs = kwargs
|
|
56
|
+
self.log = kwargs.get('log', print) if kwargs.get('log', print) else print
|
|
49
57
|
self.label_index = kwargs.get("label_index", "label") # 类别字段key
|
|
58
|
+
self.crop_scale = kwargs.pop("crop_scale", []) # TODO bbox缩放系数
|
|
50
59
|
self.class_name, self.class_dict = self.parser_classes(class_name)
|
|
51
60
|
self.item_list = self.parser_dataset(data_file, data_root=data_root, label_index=self.label_index,
|
|
52
61
|
shuffle=shuffle, check=check)
|
|
@@ -64,16 +73,19 @@ class TextDataset(Dataset):
|
|
|
64
73
|
self.classes = list(self.class_dict.values())
|
|
65
74
|
self.num_classes = max(self.classes) + 1
|
|
66
75
|
self.num_samples = len(self.item_list)
|
|
67
|
-
self.
|
|
76
|
+
self.t0 = time.time()
|
|
77
|
+
self.resample_interval = kwargs.get('resample_interval', 60) # TODO 重采样间隔,低于该时间的不进行重采集,避免频繁采样
|
|
78
|
+
if self.log: self.info(save_info=kwargs.get("save_info", ""))
|
|
68
79
|
|
|
69
80
|
def info(self, save_info=""):
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
81
|
+
self.log("----------------------- {} DATASET INFO -----------------------".format(self.phase.upper()))
|
|
82
|
+
self.log("Dataset kwargs :{}".format(self.kwargs))
|
|
83
|
+
self.log("Dataset num_samples :{}".format(len(self.item_list)))
|
|
84
|
+
self.log("Dataset num_classes :{}".format(self.num_classes))
|
|
85
|
+
self.log("Dataset class_name :{}".format(self.class_name))
|
|
86
|
+
self.log("Dataset class_dict :{}".format(self.class_dict))
|
|
87
|
+
self.log("Dataset class_count :{}".format(self.class_count))
|
|
88
|
+
self.log("Dataset resample :{}".format(self.resample))
|
|
77
89
|
if save_info:
|
|
78
90
|
if not os.path.exists(save_info): os.makedirs(save_info)
|
|
79
91
|
m = np.mean(list(self.class_count.values()))
|
|
@@ -85,8 +97,8 @@ class TextDataset(Dataset):
|
|
|
85
97
|
file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_count.json"), self.class_count)
|
|
86
98
|
file_utils.write_list_data(os.path.join(save_info, f"{self.phase}_class_name.txt"), self.class_name)
|
|
87
99
|
file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_lack.json"), class_lack)
|
|
88
|
-
|
|
89
|
-
|
|
100
|
+
self.log("loss_labels: {}".format(class_lack))
|
|
101
|
+
self.log("------------------------------------------------------------------")
|
|
90
102
|
|
|
91
103
|
def parser_dataset(self, data_file, data_root="", label_index="label", shuffle=False, check=False):
|
|
92
104
|
"""
|
|
@@ -101,6 +113,7 @@ class TextDataset(Dataset):
|
|
|
101
113
|
data_list = self.load_dataset(data_file, data_root=data_root)
|
|
102
114
|
if not self.class_name:
|
|
103
115
|
self.class_name = list(set([d[label_index] for d in data_list]))
|
|
116
|
+
self.class_name = sorted(self.class_name)
|
|
104
117
|
self.class_name, self.class_dict = self.parser_classes(self.class_name)
|
|
105
118
|
item_list = []
|
|
106
119
|
for data in data_list:
|
|
@@ -118,10 +131,10 @@ class TextDataset(Dataset):
|
|
|
118
131
|
|
|
119
132
|
def load_dataset(self, data_file, data_root="", **kwargs):
|
|
120
133
|
"""
|
|
121
|
-
保存格式:[path,
|
|
134
|
+
txt保存格式:[path,name] 或者 [path,name,xmin,ymin,xmax,ymax]
|
|
122
135
|
:param data_file:
|
|
123
136
|
:param data_root:
|
|
124
|
-
:return: item_list [{"file"
|
|
137
|
+
:return: item_list [{"file","label","name","bbox"}],bbox非必须
|
|
125
138
|
"""
|
|
126
139
|
if isinstance(data_file, str): data_file = [data_file]
|
|
127
140
|
item_list = []
|
|
@@ -130,10 +143,9 @@ class TextDataset(Dataset):
|
|
|
130
143
|
content = file_utils.read_data(file, split=",")
|
|
131
144
|
data = []
|
|
132
145
|
for line in content:
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
data.append({"file": os.path.join(root, line[0]), "label": line[1], "bbox": line[2:]})
|
|
146
|
+
item = {"file": os.path.join(root, line[0]), "label": line[1], 'name': line[1]}
|
|
147
|
+
if len(line) == 6: item['bbox'] = line[2:] # (xmin,ymin,xmax,ymax)
|
|
148
|
+
data.append(item)
|
|
137
149
|
print("loading data from:{},have {}".format(file, len(data)))
|
|
138
150
|
item_list += data
|
|
139
151
|
return item_list
|
|
@@ -157,33 +169,41 @@ class TextDataset(Dataset):
|
|
|
157
169
|
def __getitem__(self, index):
|
|
158
170
|
"""
|
|
159
171
|
:param index:
|
|
160
|
-
:return: {"image"
|
|
172
|
+
:return: {"image","label","name"}
|
|
161
173
|
"""
|
|
162
174
|
item = self.item_list[index]
|
|
163
|
-
file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
|
|
164
|
-
name = self.class_name[label]
|
|
175
|
+
file, label, name, bbox = item["file"], item[self.label_index], item['name'], item.get("bbox", [])
|
|
165
176
|
image = self.read_image(file, use_rgb=self.use_rgb)
|
|
166
|
-
image = self.crop_image(image, bbox=bbox, **self.kwargs)
|
|
177
|
+
image = self.crop_image(image, bbox=bbox, crop_scale=self.crop_scale, **self.kwargs)
|
|
167
178
|
if self.transform:
|
|
168
|
-
image = Image.fromarray(image)
|
|
169
|
-
image = self.transform(image)
|
|
179
|
+
image = self.transform(Image.fromarray(image))
|
|
170
180
|
if image is None:
|
|
171
181
|
index = int(random.uniform(0, self.num_samples))
|
|
172
182
|
return self.__getitem__(index)
|
|
173
183
|
return dict(image=image, label=label, file=file, name=name)
|
|
174
184
|
|
|
175
185
|
def __len__(self):
|
|
176
|
-
|
|
186
|
+
self.t1 = time.time() # seconds
|
|
187
|
+
dt = (self.t1 - self.t0)
|
|
188
|
+
if dt > self.resample_interval and self.resample: # 如果时间间隔太小则不进行重采样
|
|
189
|
+
print(f"resample {self.phase} dataset")
|
|
177
190
|
self.item_list = self.data_resample.update(True)
|
|
191
|
+
self.t0 = self.t1
|
|
178
192
|
return len(self.item_list)
|
|
179
193
|
|
|
180
|
-
def crop_image(self, image, bbox, **kwargs):
|
|
181
|
-
"""
|
|
194
|
+
def crop_image(self, image, bbox, crop_scale=[], use_max=False, use_mean=True, **kwargs):
|
|
195
|
+
"""
|
|
196
|
+
裁剪图片
|
|
197
|
+
:param image:
|
|
198
|
+
:param bbox:
|
|
199
|
+
:param kwargs: use_max,use_mean,crop_scale
|
|
200
|
+
use_max: 是否按照每个box(w,h)最大值(True)/最小值(False)进行转换(默认),可以保证目标裁剪完整
|
|
201
|
+
use_mean: 是否按照每个box(w,h)平均值进行转换(优先级比use_max高),但当目标长宽比比较大时,可能出现目标裁剪不完整的问题
|
|
202
|
+
:return:
|
|
203
|
+
"""
|
|
182
204
|
if len(bbox) == 0: return image
|
|
183
|
-
boxes = image_utils.get_square_boxes(boxes=[bbox],
|
|
184
|
-
|
|
185
|
-
use_mean=kwargs.get("use_mean", True))
|
|
186
|
-
boxes = image_utils.extend_xyxy(boxes, scale=kwargs.get("crop_scale", []))
|
|
205
|
+
boxes = image_utils.get_square_boxes(boxes=[bbox], use_max=use_max, use_mean=use_mean)
|
|
206
|
+
boxes = image_utils.extend_xyxy(boxes, scale=crop_scale)
|
|
187
207
|
image = image_utils.get_boxes_crop(image, boxes)[0]
|
|
188
208
|
return image
|
|
189
209
|
|
|
@@ -236,6 +256,7 @@ class TextDataset(Dataset):
|
|
|
236
256
|
for item in item_list:
|
|
237
257
|
label = item[label_index]
|
|
238
258
|
count[label] = count[label] + 1 if label in count else 1
|
|
259
|
+
count = json_utils.dict_sort(count, use_key=True)
|
|
239
260
|
if class_name: count = {class_name[k]: v for k, v in count.items()}
|
|
240
261
|
return count
|
|
241
262
|
|
|
@@ -245,7 +266,7 @@ if __name__ == '__main__':
|
|
|
245
266
|
from torchvision import transforms
|
|
246
267
|
|
|
247
268
|
data_files = [
|
|
248
|
-
'/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-images-v2/
|
|
269
|
+
'/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing/anti-spoofing-images-v2/test.txt',
|
|
249
270
|
]
|
|
250
271
|
class_name = None
|
|
251
272
|
input_size = [112, 112]
|
|
@@ -94,8 +94,7 @@ class LabelMeDataset(Dataset):
|
|
|
94
94
|
:return:
|
|
95
95
|
"""
|
|
96
96
|
image_file = os.path.join(image_dir, image_name)
|
|
97
|
-
img_postfix =
|
|
98
|
-
image_id = image_name[:-len(img_postfix) - 1]
|
|
97
|
+
image_id, img_postfix = file_utils.split_postfix(image_file)
|
|
99
98
|
anno_file = os.path.join(anno_dir, "{}.json".format(image_id))
|
|
100
99
|
return image_file, anno_file, image_name
|
|
101
100
|
|
|
@@ -150,11 +149,11 @@ class LabelMeDataset(Dataset):
|
|
|
150
149
|
if not image_dir:
|
|
151
150
|
image_dir = self.search_path(data_root, ["images", "JPEGImages"])
|
|
152
151
|
if image_dir and not image_ids:
|
|
153
|
-
image_ids = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, basename=False)
|
|
154
|
-
|
|
152
|
+
image_ids = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
|
|
153
|
+
if not anno_dir: anno_dir = image_dir
|
|
155
154
|
elif anno_dir and not image_ids:
|
|
156
|
-
image_ids = self.get_file_list(anno_dir, postfix=
|
|
157
|
-
|
|
155
|
+
image_ids = self.get_file_list(anno_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
|
|
156
|
+
if not image_dir: image_dir = anno_dir
|
|
158
157
|
assert isinstance(anno_dir, str) and os.path.exists(anno_dir), "no anno_dir :{}".format(anno_dir)
|
|
159
158
|
assert isinstance(image_dir, str) and os.path.exists(image_dir), "no image_dir:{}".format(image_dir)
|
|
160
159
|
assert len(image_ids) > 0, f"image_ids is empty,image_dir={image_dir},anno_dir={anno_dir}"
|
|
@@ -330,7 +329,7 @@ class LabelMeDataset(Dataset):
|
|
|
330
329
|
width = annotation.get('imageWidth', -1)
|
|
331
330
|
height = annotation.get('imageHeight', -1)
|
|
332
331
|
except:
|
|
333
|
-
print("illegal annotation:{}".format(anno_file))
|
|
332
|
+
# print("illegal annotation:{}".format(anno_file))
|
|
334
333
|
annos = []
|
|
335
334
|
width = -1
|
|
336
335
|
height = -1
|
|
@@ -487,8 +486,7 @@ def show_target_image(image, boxes, labels, points, keypoints=[], color=(), thic
|
|
|
487
486
|
if __name__ == "__main__":
|
|
488
487
|
from pybaseutils.converter import build_labelme
|
|
489
488
|
|
|
490
|
-
anno_dir = "/home/PKing/
|
|
491
|
-
# anno_dir = "/home/PKing/Downloads/冲击试验/sample/images"
|
|
489
|
+
anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/train-v2/01-核相操作/dataset-v01/images"
|
|
492
490
|
names = None
|
|
493
491
|
dataset = LabelMeDatasets(filename=None,
|
|
494
492
|
data_root=None,
|