pybaseutils 2.5.0__tar.gz → 2.5.2__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.5.0 → pybaseutils-2.5.2}/PKG-INFO +1 -1
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/build_coco.py +10 -12
- pybaseutils-2.5.2/pybaseutils/converter/convert_labelme2coco.py +122 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_labelme.py +5 -1
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dict_uils.py +1 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dict_utils.py +8 -5
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/geometry_tools.py +43 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/image_utils.py +69 -36
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pose/bones_utils.py +8 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils.egg-info/SOURCES.txt +1 -0
- pybaseutils-2.5.2/test_py/converter/convert_labelme2coco.py +48 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_coco_vis.py +9 -8
- pybaseutils-2.5.0/pybaseutils/converter/convert_labelme2coco.py +0 -195
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/LICENCE +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/README.md +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cvutils/camera.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cvutils/frame_record.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/file_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/log.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/nets_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/setup.cfg +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/setup.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/WebCrawler/download_pdf.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_labelme_class_counts.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_labelme_crop_aicq.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio/main.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/camera.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/class_names.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/car_accident.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_gesture2hand.py +0 -0
- /pybaseutils-2.5.0/test_py/converter/convert_labelme2coco.py → /pybaseutils-2.5.2/test_py/converter/convert_labelme2coco_pen.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/date_demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo1.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo2.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo3.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo4.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_video_segm.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/model_process.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/performance.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/qrcode/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/registry/base.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/registry/component.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/registry/main.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/registry/register.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/test_camera.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.5.0 → pybaseutils-2.5.2}/test_py/web_socket/chat_service.py +0 -0
|
@@ -211,6 +211,7 @@ class COCOBuilder():
|
|
|
211
211
|
keypoints[1::3] = np.clip(keypoints[1::3], 1, height - 1)
|
|
212
212
|
:return:
|
|
213
213
|
"""
|
|
214
|
+
if isinstance(keypoints, np.ndarray): keypoints = keypoints.tolist()
|
|
214
215
|
self.annotation_id += 1
|
|
215
216
|
annotation_item = dict()
|
|
216
217
|
annotation_item['segmentation'] = seg
|
|
@@ -274,24 +275,21 @@ class COCOBuilder():
|
|
|
274
275
|
if area < min_area: segs, area = [], []
|
|
275
276
|
return segs, area
|
|
276
277
|
|
|
277
|
-
def addObjects(self, filename, objects: dict, width, height,
|
|
278
|
+
def addObjects(self, filename, objects: dict, width, height, ignore_tiny=False):
|
|
278
279
|
"""
|
|
279
280
|
:param filename: os.path.basename(filename)
|
|
280
281
|
:param objects:
|
|
281
|
-
boxes
|
|
282
|
-
labels
|
|
283
|
-
contours
|
|
284
|
-
keypoints
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
v = 1 : 标注了但是图像中不可见(例如遮挡)
|
|
290
|
-
v = 2 : 标注了并图像可见
|
|
282
|
+
boxes [[xmin,ymin,xmax,ymax],[xmin,ymin,xmax,ymax],...]
|
|
283
|
+
labels [目标1,目标2,...]
|
|
284
|
+
contours [目标1[seg1,seg2,...],目标2[seg1,seg2,...],...]
|
|
285
|
+
keypoints [目标1[x1, y1, v1,x2, y2, v2,...],目标1[x1, y1, v1,x2, y2, v2,...],...]
|
|
286
|
+
其中x,y为Keypoint的坐标,v为可见标志
|
|
287
|
+
v = 0 : 未标注点
|
|
288
|
+
v = 1 : 标注了但是图像中不可见(例如遮挡)
|
|
289
|
+
v = 2 : 标注了并图像可见
|
|
291
290
|
实际预测时,不要求预测每个关节点的可见性
|
|
292
291
|
:param width:
|
|
293
292
|
:param height:
|
|
294
|
-
:param num_joints:
|
|
295
293
|
:param ignore_tiny: 是否去除segment很细小的目标
|
|
296
294
|
:return:
|
|
297
295
|
"""
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Project:
|
|
5
|
+
# @Author : panjq
|
|
6
|
+
# @Date : 2020-02-12 18:28:16
|
|
7
|
+
# @url :
|
|
8
|
+
# --------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import sys
|
|
13
|
+
import os
|
|
14
|
+
import numpy as np
|
|
15
|
+
import json
|
|
16
|
+
import cv2
|
|
17
|
+
import time
|
|
18
|
+
from tqdm import tqdm
|
|
19
|
+
from pybaseutils.dataloader import parser_labelme
|
|
20
|
+
from pybaseutils.converter import build_coco
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class Labelme2COCO(build_coco.COCOBuilder):
|
|
24
|
+
"""Convert Labelme to COCO dataset format"""
|
|
25
|
+
|
|
26
|
+
def __init__(self, anno_dir, image_dir, class_name=[], init_id=None, use_kpt=False, kpt_names=[],
|
|
27
|
+
kpt_shape=[]):
|
|
28
|
+
"""
|
|
29
|
+
:param anno_dir:
|
|
30
|
+
:param image_dir:
|
|
31
|
+
:param class_name:
|
|
32
|
+
:param init_id:
|
|
33
|
+
:param use_kpt:
|
|
34
|
+
:param kpt_names: 关键点名称列表,
|
|
35
|
+
当kpt_names.ndim=1时,要求所有类别且所有目标的关键点名称必须一致
|
|
36
|
+
当kpt_names.ndim=2时,仅要求相同类别目标的关键点名称必须一致,且len(kpt_names)==len(self.class_name)
|
|
37
|
+
:param kpt_shape: 关键点的维度,默认是(17, 3),对于coco-person,有17个关键点,3表示(x,y,v))
|
|
38
|
+
"""
|
|
39
|
+
super(Labelme2COCO, self).__init__(init_id=init_id)
|
|
40
|
+
print(anno_dir)
|
|
41
|
+
print(image_dir)
|
|
42
|
+
self.anno_dir = anno_dir
|
|
43
|
+
self.image_dir = image_dir
|
|
44
|
+
self.kpt_names = kpt_names
|
|
45
|
+
self.kpt_shape = kpt_shape
|
|
46
|
+
self.labelme = parser_labelme.LabelMeDataset(anno_dir=anno_dir,
|
|
47
|
+
image_dir=image_dir,
|
|
48
|
+
class_name=class_name,
|
|
49
|
+
check_kpt=True,
|
|
50
|
+
use_kpt=use_kpt,
|
|
51
|
+
kpt_names=kpt_names,
|
|
52
|
+
kpt_shape=kpt_shape,
|
|
53
|
+
use_rgb=False,
|
|
54
|
+
shuffle=False,
|
|
55
|
+
check=False
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def build_instances_dataset(self, save_file, ):
|
|
59
|
+
"""
|
|
60
|
+
构建COCO的目标检测和实例分割数据集
|
|
61
|
+
:param save_file: 输出COCO格式的文件
|
|
62
|
+
:return:
|
|
63
|
+
"""
|
|
64
|
+
for index in tqdm(range(len(self.labelme))):
|
|
65
|
+
data_info = self.labelme.__getitem__(index)
|
|
66
|
+
contours = [[c] for c in data_info["points"]]
|
|
67
|
+
info = {"boxes": data_info["boxes"], "labels": data_info["names"],
|
|
68
|
+
"contours": contours}
|
|
69
|
+
width, height = data_info["size"]
|
|
70
|
+
filename = data_info["image_file"]
|
|
71
|
+
self.addObjects(filename, info, width, height, num_joints=0)
|
|
72
|
+
build_coco.COCOTools.check_coco(self.coco)
|
|
73
|
+
self.save_coco(save_file)
|
|
74
|
+
|
|
75
|
+
def build_keypoints_dataset(self, save_file, skeleton=[]):
|
|
76
|
+
"""
|
|
77
|
+
构建COCO的目标检测和实例分割数据集
|
|
78
|
+
:param save_file: 输出COCO格式的文件
|
|
79
|
+
:return:
|
|
80
|
+
"""
|
|
81
|
+
for index in tqdm(range(len(self.labelme))):
|
|
82
|
+
data_info = self.labelme.__getitem__(index)
|
|
83
|
+
contours = [[c] for c in data_info["points"]]
|
|
84
|
+
keypoints = [c.reshape(-1) for c in data_info["keypoints"]]
|
|
85
|
+
info = {"boxes": data_info["boxes"], "labels": data_info["names"],
|
|
86
|
+
"contours": contours, "keypoints": keypoints}
|
|
87
|
+
width, height = data_info["size"]
|
|
88
|
+
filename = data_info["image_file"]
|
|
89
|
+
self.addObjects(filename, info, width, height)
|
|
90
|
+
# 设置关键点的名称和skeleton
|
|
91
|
+
self.set_keypoints_category(kps_name=self.kpt_names[0], skeleton=skeleton, cat_id=0)
|
|
92
|
+
build_coco.COCOTools.check_coco(self.coco)
|
|
93
|
+
self.save_coco(save_file)
|
|
94
|
+
|
|
95
|
+
def save_coco(self, json_file):
|
|
96
|
+
"""保存COCO数据集"""
|
|
97
|
+
super(Labelme2COCO, self).save_coco(json_file)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def demo():
|
|
101
|
+
class_name = ["person"]
|
|
102
|
+
kpt_names = [["p0", "p1", "p2", "p3", "p4"]]
|
|
103
|
+
skeleton = [[0, 2], [2, 1], [2, 3], [3, 4]]
|
|
104
|
+
kpt_shape = [5, 3]
|
|
105
|
+
anno_dir = "/media/PKing/dev2/SDK/base-utils/data/labelme/images"
|
|
106
|
+
coco_ins_file = os.path.join(os.path.dirname(anno_dir), "coco_ins.json")
|
|
107
|
+
coco_kps_file = os.path.join(os.path.dirname(anno_dir), "coco_kps.json")
|
|
108
|
+
build = Labelme2COCO(image_dir=anno_dir,
|
|
109
|
+
anno_dir=anno_dir,
|
|
110
|
+
class_name=class_name,
|
|
111
|
+
use_kpt=True,
|
|
112
|
+
kpt_names=kpt_names,
|
|
113
|
+
kpt_shape=kpt_shape
|
|
114
|
+
)
|
|
115
|
+
# TODO 构建关键点检测数据集
|
|
116
|
+
build.build_keypoints_dataset(coco_kps_file, skeleton=skeleton)
|
|
117
|
+
# TODO 构建实例分割数据集
|
|
118
|
+
# build.build_instances_dataset(coco_ins_file)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
if __name__ == '__main__':
|
|
122
|
+
demo()
|
|
@@ -53,6 +53,10 @@ class LabelMeDataset(Dataset):
|
|
|
53
53
|
:param check: 当class_name=None且check=True,将自动获取所有class
|
|
54
54
|
:param check_kpt: True会检查关键点的完整性,图像中仅当所有目标都标注和对应的关键点(无漏标注),才返回数据
|
|
55
55
|
False不会检查关键点的完整性,,图像中只要标注的目标和对应的关键点(漏标注),会返回数据
|
|
56
|
+
:param kpt_names: 关键点名称列表,
|
|
57
|
+
当kpt_names.ndim=1时,要求所有类别且所有目标的关键点名称必须一致
|
|
58
|
+
当kpt_names.ndim=2时,仅要求相同类别目标的关键点名称必须一致,且len(kpt_names)==len(self.class_name)
|
|
59
|
+
:param kpt_shape: 关键点的维度,默认是(17, 3),对于coco-person,有17个关键点,3表示(x,y,v)
|
|
56
60
|
:param min_points: 当标注的轮廓点的个数小于min_points,会被剔除;负数不剔除
|
|
57
61
|
:param kwargs: read_image: 是否读取图片,否则image=None
|
|
58
62
|
"""
|
|
@@ -619,9 +623,9 @@ def example_for_keypoints():
|
|
|
619
623
|
image_dir=None,
|
|
620
624
|
class_name=class_name,
|
|
621
625
|
use_kpt=True,
|
|
626
|
+
check_kpt=True,
|
|
622
627
|
kpt_names=kpt_names,
|
|
623
628
|
kpt_shape=kpt_shape,
|
|
624
|
-
check_kpt=False,
|
|
625
629
|
check=False,
|
|
626
630
|
phase="val",
|
|
627
631
|
shuffle=False)
|
|
@@ -14,8 +14,9 @@ from collections import defaultdict
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class Objects(object):
|
|
17
|
-
def __init__(self, boxes, label, score, names=[], size=[],
|
|
18
|
-
|
|
17
|
+
def __init__(self, boxes, label, score, names=[], size=[],
|
|
18
|
+
segms=[], masks=None, keypt=[], value=[],
|
|
19
|
+
traid=[], trace: defaultdict = None, color=[], image=None, file=""):
|
|
19
20
|
self.boxes = boxes # 目标框(xmin,ymin,xmax,ymax)
|
|
20
21
|
self.score = score # 目标框置信度
|
|
21
22
|
self.label = label # 目标框类别
|
|
@@ -25,12 +26,14 @@ class Objects(object):
|
|
|
25
26
|
self.masks = masks # 目标轮廓掩码
|
|
26
27
|
self.segms = segms # 目标轮廓[np.shape(n,2)]
|
|
27
28
|
self.traid = traid # 轨迹ID
|
|
28
|
-
self.trace = trace #
|
|
29
|
+
self.trace = trace # 轨迹的历史数据
|
|
30
|
+
self.value = value # 一些数值
|
|
31
|
+
self.depth = None # 深度图
|
|
32
|
+
self.dists = [] # 深度值(segms/boxes区域)
|
|
29
33
|
self.color = [(255, 0, 0)] * len(boxes) # 目标框颜色
|
|
34
|
+
self.metas = defaultdict() # 其他信息
|
|
30
35
|
self.size = size # 原始图像大小
|
|
31
36
|
self.file = file # 文件路径
|
|
32
|
-
self.depth = None # 深度图
|
|
33
|
-
self.metas = defaultdict() # 其他信息
|
|
34
37
|
|
|
35
38
|
def update(self, **kwargs):
|
|
36
39
|
"""更新属性值"""
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
# @Brief :
|
|
8
8
|
# --------------------------------------------------------
|
|
9
9
|
"""
|
|
10
|
+
import math
|
|
10
11
|
import numpy as np
|
|
11
12
|
from scipy.spatial.distance import cdist
|
|
12
13
|
|
|
@@ -221,6 +222,48 @@ def compute_vector_angle(a, b, minangle=True):
|
|
|
221
222
|
return angle
|
|
222
223
|
|
|
223
224
|
|
|
225
|
+
def image2math_coord(pts, height=None):
|
|
226
|
+
"""
|
|
227
|
+
将图像坐标系(x 向右,y 向下)转换为数学坐标系(x 向右,y 向上)笛卡尔坐标系。
|
|
228
|
+
:param pts: 形如 (N, 2) 的数组/列表,图像坐标点
|
|
229
|
+
:param height: 可选,图像高度。给出时按 (x, height - y) 翻转,
|
|
230
|
+
结果仍落在图像矩形范围内;不给出时按 (x, -y) 翻转。
|
|
231
|
+
:return: (N, 2) 的 numpy 数组,数学坐标点
|
|
232
|
+
"""
|
|
233
|
+
pts = np.asarray(pts, dtype=float)
|
|
234
|
+
if pts.ndim != 2 or pts.shape[1] != 2: raise ValueError("pts 必须是形如 (N, 2) 的数组")
|
|
235
|
+
out = pts.copy()
|
|
236
|
+
if height is None:
|
|
237
|
+
out[:, 1] = -out[:, 1] # y 取反,原点不变
|
|
238
|
+
else:
|
|
239
|
+
out[:, 1] = height - out[:, 1] # 以图像底边为 y=0
|
|
240
|
+
return out
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def get_vector_angle(v1, v2, clockwise=True):
|
|
244
|
+
"""
|
|
245
|
+
坐标系约定: 标准的数学坐标系(x 轴向右,y 轴向上)
|
|
246
|
+
计算从向量 v1 旋转到向量 v2 的角度。
|
|
247
|
+
:param v1: 形如 (x, y) 的元组/列表,表示平面向量
|
|
248
|
+
:param v2: 形如 (x, y) 的元组/列表,表示平面向量
|
|
249
|
+
:param clockwise: True 顺时针角度,False 逆时针角度
|
|
250
|
+
:return: 角度(度),范围 [0, 360)
|
|
251
|
+
注意: 0 和 360 是同一个方向,函数统一返回 0
|
|
252
|
+
"""
|
|
253
|
+
x1, y1 = v1
|
|
254
|
+
x2, y2 = v2
|
|
255
|
+
# 零向量无法定义方向
|
|
256
|
+
if (x1 == 0 and y1 == 0) or (x2 == 0 and y2 == 0): return 0
|
|
257
|
+
dot = x1 * x2 + y1 * y2 # 点积
|
|
258
|
+
cross = x1 * y2 - y1 * x2 # 叉积(z 分量)
|
|
259
|
+
# 叉积 > 0 表示 v2 在 v1 的逆时针方向
|
|
260
|
+
# 顺时针:用 -cross;逆时针:用 +cross
|
|
261
|
+
signed_cross = -cross if clockwise else cross
|
|
262
|
+
angle = math.degrees(math.atan2(signed_cross, dot))
|
|
263
|
+
# 把 (-180, 180] 映射到 [0, 360)
|
|
264
|
+
return angle % 360
|
|
265
|
+
|
|
266
|
+
|
|
224
267
|
def line_test():
|
|
225
268
|
'''
|
|
226
269
|
angle: 56.789092174788685
|
|
@@ -1440,12 +1440,14 @@ def show_landmark(title, image, landmarks, vis_id=False, delay=0):
|
|
|
1440
1440
|
return image
|
|
1441
1441
|
|
|
1442
1442
|
|
|
1443
|
-
def draw_points_texts(image, points, texts=None, color=(255, 0, 0), thickness=0, fontScale=0,
|
|
1443
|
+
def draw_points_texts(image, points, texts=None, color=(255, 0, 0), thickness=0, fontScale=0, vis_pt=True,
|
|
1444
|
+
drawType="simple"):
|
|
1444
1445
|
"""
|
|
1445
1446
|
:param image:
|
|
1446
1447
|
:param points:
|
|
1447
1448
|
:param texts:
|
|
1448
1449
|
:param color:
|
|
1450
|
+
:param vis_pt: 是否绘制点
|
|
1449
1451
|
:param drawType: custom or simple
|
|
1450
1452
|
:return:
|
|
1451
1453
|
"""
|
|
@@ -1457,7 +1459,7 @@ def draw_points_texts(image, points, texts=None, color=(255, 0, 0), thickness=0,
|
|
|
1457
1459
|
point = (int(point[0]), int(point[1]))
|
|
1458
1460
|
c = color[index]
|
|
1459
1461
|
text = str(text)
|
|
1460
|
-
cv2.circle(image, point, thickness * 3, tuple(c), -1, lineType=cv2.LINE_AA)
|
|
1462
|
+
if vis_pt: cv2.circle(image, point, thickness * 3, tuple(c), -1, lineType=cv2.LINE_AA)
|
|
1461
1463
|
if text: draw_text(image, point, text, color=c, fontScale=fontScale, thickness=thickness, drawType=drawType)
|
|
1462
1464
|
return image
|
|
1463
1465
|
|
|
@@ -1539,7 +1541,7 @@ def draw_bbox_text_ch(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
|
1539
1541
|
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,避免断裂
|
|
1540
1542
|
cv2.rectangle(image, bg1, bg2, color, -1) # 绘制底纹
|
|
1541
1543
|
if len(bbox) == 4: cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness) # 绘制bbox
|
|
1542
|
-
text_loc = (text_loc[0], int(text_loc[1] * 1.0))
|
|
1544
|
+
text_loc = (text_loc[0], int(text_loc[1] * 1.0)) # 调整字体位置
|
|
1543
1545
|
cv2_putText(image, str(text), text_loc, color=(255, 255, 255), fontScale=fontScale, thickness=abs(thickness))
|
|
1544
1546
|
return image
|
|
1545
1547
|
|
|
@@ -1558,7 +1560,7 @@ def draw_bbox_text_en(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
|
1558
1560
|
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,避免断裂
|
|
1559
1561
|
cv2.rectangle(image, bg1, bg2, color, -1) # 绘制底纹
|
|
1560
1562
|
if len(bbox) == 4: cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness) # 绘制bbox
|
|
1561
|
-
text_loc = (text_loc[0], int(text_loc[1] * 0.95))
|
|
1563
|
+
# text_loc = (text_loc[0], int(text_loc[1] * 0.95)) # 调整字体位置
|
|
1562
1564
|
cv2.putText(image, str(text), (text_loc[0], text_loc[1]), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
|
|
1563
1565
|
fontScale=fontScale, color=(255, 255, 255), thickness=abs(thickness))
|
|
1564
1566
|
return image
|
|
@@ -1627,6 +1629,7 @@ def get_font_type(size, font=""):
|
|
|
1627
1629
|
|
|
1628
1630
|
|
|
1629
1631
|
def cv2_putText(img, text, point, fontFace=None, fontScale=0.8, color=(255, 0, 0), thickness=None):
|
|
1632
|
+
if not text: return img
|
|
1630
1633
|
# cv2.putText(img, str(text), point, fontFace, fontScale, color=color, thickness=thickness)
|
|
1631
1634
|
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1632
1635
|
pilimg = Image.fromarray(img) # Image.fromarray()将数组类型转成图片格式,与np.array()相反
|
|
@@ -1636,15 +1639,19 @@ def cv2_putText(img, text, point, fontFace=None, fontScale=0.8, color=(255, 0, 0
|
|
|
1636
1639
|
font = get_font_type(size=size)
|
|
1637
1640
|
draw.text(point, text, color, font)
|
|
1638
1641
|
img[:] = np.asarray(pilimg)
|
|
1642
|
+
return img
|
|
1639
1643
|
|
|
1640
1644
|
|
|
1641
|
-
def draw_key_point_in_image(image, key_points, pointline=[], boxes=[], colors=None,
|
|
1645
|
+
def draw_key_point_in_image(image, key_points, pointline=[], boxes=[], colors=None,
|
|
1646
|
+
vis_id=False, vis_pt=True, thickness=2):
|
|
1642
1647
|
"""
|
|
1643
1648
|
:param image:
|
|
1644
1649
|
:param key_points: list(ndarray(19,2)) or ndarray(n_person,19,2)
|
|
1645
1650
|
:param pointline: `auto`->pointline = circle_line(len(points), iscircle=True)
|
|
1646
1651
|
:param boxes: 目标框
|
|
1647
1652
|
:param colors: 每个点的颜色
|
|
1653
|
+
:param vis_id: 是否绘制ID
|
|
1654
|
+
:param vis_pt: 是否绘制点
|
|
1648
1655
|
:return:
|
|
1649
1656
|
"""
|
|
1650
1657
|
nums = max(len(key_points), len(boxes))
|
|
@@ -1657,22 +1664,35 @@ def draw_key_point_in_image(image, key_points, pointline=[], boxes=[], colors=No
|
|
|
1657
1664
|
# 可视化(x,y,v)的v
|
|
1658
1665
|
# if vis_id and len(points[0]) == 3: texts = [f"{t}[{int(points[i][2])}]" for i, t in enumerate(texts)]
|
|
1659
1666
|
image = draw_image_points_lines(image, points, pointline, circle_color=color, line_color=color,
|
|
1660
|
-
texts=texts, thickness=thickness)
|
|
1667
|
+
texts=texts, thickness=thickness, vis_pt=vis_pt)
|
|
1661
1668
|
if len(boxes) > 0:
|
|
1662
1669
|
image = draw_image_boxes(image, boxes=[boxes[i]], color=color, thickness=thickness)
|
|
1663
1670
|
return image
|
|
1664
1671
|
|
|
1665
1672
|
|
|
1666
|
-
def draw_key_point_arrowed_in_image(image, key_points, pointline=[],
|
|
1673
|
+
def draw_key_point_arrowed_in_image(image, key_points, pointline=[], boxes=[], colors=None,
|
|
1674
|
+
vis_id=False, vis_pt=True, thickness=2):
|
|
1667
1675
|
"""
|
|
1668
1676
|
:param key_points: list(ndarray(19,2)) or ndarray(n_person,19,2)
|
|
1669
1677
|
:param image:
|
|
1670
1678
|
:param pointline:[[start-->end]]
|
|
1679
|
+
:param vis_id: 是否绘制ID
|
|
1680
|
+
:param vis_pt: 是否绘制点
|
|
1671
1681
|
:return:
|
|
1672
1682
|
"""
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1683
|
+
nums = max(len(key_points), len(boxes))
|
|
1684
|
+
for i in range(nums):
|
|
1685
|
+
color = color_table[(i + 1) % 20] if not colors else colors
|
|
1686
|
+
if len(key_points) > 0:
|
|
1687
|
+
points = key_points[i]
|
|
1688
|
+
if points is None or len(points) == 0: continue
|
|
1689
|
+
texts = list(range(len(points))) if vis_id else [""] * len(points)
|
|
1690
|
+
# 可视化(x,y,v)的v
|
|
1691
|
+
# if vis_id and len(points[0]) == 3: texts = [f"{t}[{int(points[i][2])}]" for i, t in enumerate(texts)]
|
|
1692
|
+
image = draw_image_points_arrowed_lines(image, points, pointline, circle_color=color, line_color=color,
|
|
1693
|
+
texts=texts, thickness=thickness, vis_pt=vis_pt)
|
|
1694
|
+
if len(boxes) > 0:
|
|
1695
|
+
image = draw_image_boxes(image, boxes=[boxes[i]], color=color, thickness=thickness)
|
|
1676
1696
|
return image
|
|
1677
1697
|
|
|
1678
1698
|
|
|
@@ -1683,7 +1703,8 @@ def draw_image_points_lines(image,
|
|
|
1683
1703
|
fontScale=0.8,
|
|
1684
1704
|
circle_color=(255, 0, 0),
|
|
1685
1705
|
line_color=(0, 0, 255),
|
|
1686
|
-
thickness=2
|
|
1706
|
+
thickness=2,
|
|
1707
|
+
vis_pt=True):
|
|
1687
1708
|
"""
|
|
1688
1709
|
在图像中画点和连接线
|
|
1689
1710
|
:param image:
|
|
@@ -1691,6 +1712,7 @@ def draw_image_points_lines(image,
|
|
|
1691
1712
|
:param pointline: `auto`->pointline = circle_line(len(points), iscircle=True)
|
|
1692
1713
|
:param color:
|
|
1693
1714
|
:param texts:
|
|
1715
|
+
:param vis_pt: 是否绘制点
|
|
1694
1716
|
:param drawType: simple or custom
|
|
1695
1717
|
:param check:
|
|
1696
1718
|
:return:
|
|
@@ -1700,19 +1722,25 @@ def draw_image_points_lines(image,
|
|
|
1700
1722
|
texts = list(range(len(points)))
|
|
1701
1723
|
draw_image_lines(image, points, pointline, color=line_color, thickness=thickness)
|
|
1702
1724
|
thickness_ = max(int(thickness * 1), 1)
|
|
1703
|
-
image =
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1725
|
+
image = draw_points_texts(image, points,
|
|
1726
|
+
texts=texts,
|
|
1727
|
+
color=circle_color,
|
|
1728
|
+
fontScale=fontScale,
|
|
1729
|
+
thickness=thickness_,
|
|
1730
|
+
vis_pt=vis_pt,
|
|
1731
|
+
drawType="simple")
|
|
1709
1732
|
return image
|
|
1710
1733
|
|
|
1711
1734
|
|
|
1712
|
-
def draw_image_points_arrowed_lines(image,
|
|
1735
|
+
def draw_image_points_arrowed_lines(image,
|
|
1736
|
+
points,
|
|
1713
1737
|
pointline=[],
|
|
1714
1738
|
texts=None,
|
|
1715
|
-
|
|
1739
|
+
fontScale=0.8,
|
|
1740
|
+
circle_color=(255, 0, 0),
|
|
1741
|
+
line_color=(0, 0, 255),
|
|
1742
|
+
thickness=2,
|
|
1743
|
+
vis_pt=True,
|
|
1716
1744
|
reverse=False):
|
|
1717
1745
|
"""
|
|
1718
1746
|
在图像中画点箭头线
|
|
@@ -1721,16 +1749,23 @@ def draw_image_points_arrowed_lines(image, points,
|
|
|
1721
1749
|
:param pointline: `auto`->pointline = circle_line(len(points), iscircle=True)
|
|
1722
1750
|
:param color:
|
|
1723
1751
|
:param texts:
|
|
1752
|
+
:param vis_pt: 是否绘制点
|
|
1724
1753
|
:param drawType: simple or custom
|
|
1725
1754
|
:param check:
|
|
1726
1755
|
:return:
|
|
1727
1756
|
"""
|
|
1728
1757
|
points = np.asarray(points, dtype=np.int32)
|
|
1729
|
-
thickness = 2
|
|
1730
1758
|
if texts is None:
|
|
1731
1759
|
texts = list(range(len(points)))
|
|
1732
|
-
|
|
1733
|
-
|
|
1760
|
+
draw_image_arrowed_lines(image, points, pointline, color=line_color, thickness=thickness, reverse=reverse)
|
|
1761
|
+
thickness_ = max(int(thickness * 1), 1)
|
|
1762
|
+
image = draw_points_texts(image, points,
|
|
1763
|
+
texts=texts,
|
|
1764
|
+
color=circle_color,
|
|
1765
|
+
fontScale=fontScale,
|
|
1766
|
+
thickness=thickness_,
|
|
1767
|
+
vis_pt=vis_pt,
|
|
1768
|
+
drawType="simple")
|
|
1734
1769
|
return image
|
|
1735
1770
|
|
|
1736
1771
|
|
|
@@ -1755,7 +1790,7 @@ def arrowed_line(image, pt1, pt2, color, arrow_length=20, **kwargs):
|
|
|
1755
1790
|
"""
|
|
1756
1791
|
cv2.arrowedLine 的 tipLength 参数是相对于线段总长的比例,这导致箭头大小会随着线段长度变化
|
|
1757
1792
|
使用fixed_arrowedLine可以修复这个问题
|
|
1758
|
-
|
|
1793
|
+
绘制一条带有固定长度箭头的线段(pt1-->pt2)。
|
|
1759
1794
|
:param image: 目标图像
|
|
1760
1795
|
:param pt1: 箭尾/起点坐标 (x1, y1)
|
|
1761
1796
|
:param pt2: 箭头/终点坐标 (x2, y2)
|
|
@@ -1780,24 +1815,22 @@ def arrowed_line(image, pt1, pt2, color, arrow_length=20, **kwargs):
|
|
|
1780
1815
|
return image
|
|
1781
1816
|
|
|
1782
1817
|
|
|
1783
|
-
def draw_image_arrowed_lines(image,
|
|
1784
|
-
|
|
1785
|
-
pointline=[],
|
|
1786
|
-
color=(0, 0, 255),
|
|
1787
|
-
thickness=2,
|
|
1788
|
-
reverse=False):
|
|
1789
|
-
points = np.asarray(points, dtype=np.int32)
|
|
1790
|
-
if pointline == "auto":
|
|
1818
|
+
def draw_image_arrowed_lines(image, points, pointline=[], color=(0, 0, 255), thickness=2, reverse=False):
|
|
1819
|
+
if pointline == "auto" or pointline == []:
|
|
1791
1820
|
pointline = circle_line(len(points), iscircle=True)
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1821
|
+
if isinstance(color[0], numbers.Number): color = [color] * len(points)
|
|
1822
|
+
for index in pointline:
|
|
1823
|
+
if not index: continue
|
|
1824
|
+
point1 = tuple(points[index[0]])
|
|
1825
|
+
point2 = tuple(points[index[1]])
|
|
1795
1826
|
if (not check_point(point1)) or (not check_point(point2)):
|
|
1796
1827
|
continue
|
|
1828
|
+
point1 = (int(point1[0]), int(point1[1]))
|
|
1829
|
+
point2 = (int(point2[0]), int(point2[1]))
|
|
1797
1830
|
if reverse:
|
|
1798
|
-
|
|
1831
|
+
arrowed_line(image, point2, point1, color=color[index[1]], thickness=thickness)
|
|
1799
1832
|
else:
|
|
1800
|
-
|
|
1833
|
+
arrowed_line(image, point1, point2, color=color[index[1]], thickness=thickness)
|
|
1801
1834
|
return image
|
|
1802
1835
|
|
|
1803
1836
|
|
|
@@ -57,6 +57,14 @@ BONES = {
|
|
|
57
57
|
[0, 127, 255], [102, 0, 102], [153, 0, 153], [178, 0, 204], [255, 0, 255]],
|
|
58
58
|
"describe": "手部关键点信息"
|
|
59
59
|
},
|
|
60
|
+
"pressure_meter": {
|
|
61
|
+
"skeleton": [[2, 0], [2, 1], [2, 3]],
|
|
62
|
+
"keypoint": [],
|
|
63
|
+
"num_joints": 4,
|
|
64
|
+
"names": {},
|
|
65
|
+
"colors": [[255, 0, 0], [255, 0, 0], [0, 255, 0], [0, 255, 0]],
|
|
66
|
+
"describe": "压力计"
|
|
67
|
+
},
|
|
60
68
|
"points": {
|
|
61
69
|
"skeleton": [[]],
|
|
62
70
|
"keypoint": [],
|
|
@@ -259,6 +259,7 @@ test_py/converter/convert_coco2voc.py
|
|
|
259
259
|
test_py/converter/convert_cvat2labelme.py
|
|
260
260
|
test_py/converter/convert_gesture2hand.py
|
|
261
261
|
test_py/converter/convert_labelme2coco.py
|
|
262
|
+
test_py/converter/convert_labelme2coco_pen.py
|
|
262
263
|
test_py/converter/convert_labelme2cvat.py
|
|
263
264
|
test_py/converter/convert_labelme2labelme.py
|
|
264
265
|
test_py/converter/convert_labelme2voc.py
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : Pan
|
|
4
|
+
@E-mail : 390737991@qq.com
|
|
5
|
+
@Date : 2022-10-12 16:21:55
|
|
6
|
+
@Brief :
|
|
7
|
+
"""
|
|
8
|
+
import sys
|
|
9
|
+
import os
|
|
10
|
+
|
|
11
|
+
sys.path.insert(0, os.getcwd())
|
|
12
|
+
import cv2
|
|
13
|
+
import argparse
|
|
14
|
+
import sys
|
|
15
|
+
import os
|
|
16
|
+
import numpy as np
|
|
17
|
+
import json
|
|
18
|
+
import cv2
|
|
19
|
+
import time
|
|
20
|
+
from tqdm import tqdm
|
|
21
|
+
from pybaseutils import file_utils, json_utils, image_utils
|
|
22
|
+
from pybaseutils.dataloader import parser_labelme
|
|
23
|
+
from pybaseutils.converter import convert_labelme2coco
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def demo():
|
|
27
|
+
class_name = ["pressure_meter"]
|
|
28
|
+
kpt_names = [ [ "range_start", "range_end",'pointer_start', 'pointer_end', ] ]
|
|
29
|
+
skeleton = [[2, 0], [2, 1], [2, 3]]
|
|
30
|
+
kpt_shape = [4, 3]
|
|
31
|
+
anno_dir = "/home/PKing/nasdata/tmp/tmp/pressure_meter/dataset-v1/train/images"
|
|
32
|
+
coco_ins_file = os.path.join(os.path.dirname(anno_dir), "coco_ins.json")
|
|
33
|
+
coco_kps_file = os.path.join(os.path.dirname(anno_dir), "coco_kps.json")
|
|
34
|
+
build = convert_labelme2coco.Labelme2COCO(image_dir=anno_dir,
|
|
35
|
+
anno_dir=anno_dir,
|
|
36
|
+
class_name=class_name,
|
|
37
|
+
use_kpt=True,
|
|
38
|
+
kpt_names=kpt_names,
|
|
39
|
+
kpt_shape=kpt_shape
|
|
40
|
+
)
|
|
41
|
+
# TODO 构建关键点检测数据集
|
|
42
|
+
build.build_keypoints_dataset(coco_kps_file, skeleton=skeleton)
|
|
43
|
+
# TODO 构建实例分割数据集
|
|
44
|
+
# build.build_instances_dataset(coco_ins_file)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
if __name__ == '__main__':
|
|
48
|
+
demo()
|
|
@@ -36,6 +36,7 @@ def demo_vis_CocoInstances():
|
|
|
36
36
|
|
|
37
37
|
# anno_file = "../data/coco/coco_ins.json"
|
|
38
38
|
anno_file = "/home/PKing/Downloads/labeled_trainval/SSLAD-2D/labeled/val/instance_val.json"
|
|
39
|
+
anno_file = "/media/PKing/dev2/SDK/base-utils/data/labelme/coco_ins.json"
|
|
39
40
|
class_name = None
|
|
40
41
|
dataset = parser_coco_ins.CocoInstances(anno_file=[anno_file], image_dir="", decode=True,
|
|
41
42
|
class_name=class_name, use_rgb=False, shuffle=True)
|
|
@@ -54,11 +55,11 @@ def demo_vis_CocoKeypoints():
|
|
|
54
55
|
# anno_file = "/home/PKing/nasdata/dataset/tmp/hand-pose/HandPose-v2/train/train_anno.json"
|
|
55
56
|
# class_name = ['hand']
|
|
56
57
|
# anno_file = "/home/PKing/nasdata/dataset/tmp/pen/dataset-pen2/train/coco_kps.json"
|
|
57
|
-
anno_file = "/
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
anno_file = "/media/PKing/dev2/SDK/base-utils/data/labelme/coco_kps.json"
|
|
59
|
+
class_name = ["person"]
|
|
60
|
+
|
|
61
|
+
anno_file = "/home/PKing/nasdata/tmp/tmp/pressure_meter/dataset-v1/train/coco_kps.json"
|
|
62
|
+
class_name = ["pressure_meter"]
|
|
62
63
|
dataset = parser_coco_kps.CocoKeypoints(anno_file, image_dir="", class_name=class_name, shuffle=True)
|
|
63
64
|
bones = dataset.bones
|
|
64
65
|
for i in range(len(dataset)):
|
|
@@ -66,7 +67,7 @@ def demo_vis_CocoKeypoints():
|
|
|
66
67
|
data = dataset.__getitem__(i)
|
|
67
68
|
image, boxes, labels, keypoints = data['image'], data["boxes"], data["labels"], data["keypoints"]
|
|
68
69
|
h, w = image.shape[:2]
|
|
69
|
-
kpts = [s / (w, h) for s in keypoints] if len(keypoints) > 0 else []
|
|
70
|
+
kpts = [s / (w, h, 1) for s in keypoints] if len(keypoints) > 0 else []
|
|
70
71
|
kpts = np.asarray(kpts)
|
|
71
72
|
keypoints = np.asarray(keypoints)
|
|
72
73
|
print("i={},image_file={}".format(i, data['image_file']))
|
|
@@ -90,6 +91,6 @@ def demo_vis_CocoDetections():
|
|
|
90
91
|
|
|
91
92
|
|
|
92
93
|
if __name__ == "__main__":
|
|
93
|
-
demo_vis_CocoDetections()
|
|
94
|
+
# demo_vis_CocoDetections()
|
|
94
95
|
# demo_vis_CocoInstances()
|
|
95
|
-
|
|
96
|
+
demo_vis_CocoKeypoints()
|