pybaseutils 2.2.21__tar.gz → 2.2.24__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.21 → pybaseutils-2.2.24}/PKG-INFO +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_coco.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_labelme.py +4 -4
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/concat_coco.py +3 -3
- pybaseutils-2.2.24/pybaseutils/converter/prelabelme.py +115 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/coords_utils.py +26 -17
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/corner_utils.py +25 -6
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/video_utils.py +12 -22
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/base_dataset.py +3 -10
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_image_text.py +14 -7
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_labelme.py +6 -7
- pybaseutils-2.2.24/pybaseutils/dataloader/parser_labelme_crop.py +136 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/file_utils.py +48 -40
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/font_style/__init__.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/geometry_tools.py +5 -7
- pybaseutils-2.2.24/pybaseutils/http_utils.py +256 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/image_utils.py +46 -6
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/json_utils.py +54 -23
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/log.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/log_utils.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/class_report.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/numpy_utils.py +30 -5
- pybaseutils-2.2.24/pybaseutils/pandas_utils.py +112 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/text_utils.py +35 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/thread_utils.py +7 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/SOURCES.txt +7 -2
- pybaseutils-2.2.24/test_py/WebCrawler/search_baidu.py +55 -0
- pybaseutils-2.2.24/test_py/WebCrawler/search_biying.py +55 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/build_service.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_labelme_crop.py +38 -3
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/FL3D_dataset.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/handpose2coco.py +1 -1
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/insects_for_aichallenger.py +1 -1
- pybaseutils-2.2.24/test_py/demo1.py +28 -0
- pybaseutils-2.2.24/test_py/demo2.py +26 -0
- pybaseutils-2.2.24/test_py/demo_for_annular_to_rect.py +53 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_lableme_vis.py +1 -1
- pybaseutils-2.2.24/test_py/demo_mosaic.py +71 -0
- pybaseutils-2.2.24/test_py/demo_prelabelme.py +57 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_rename.py +2 -2
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_standard_video .py +6 -6
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_video.py +5 -4
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/demo01.py +20 -4
- pybaseutils-2.2.24/test_py/milvus_demo/demo02.py +67 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/milvus_client.py +57 -29
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/test_fr/idcardocr.py +1 -1
- pybaseutils-2.2.21/pybaseutils/http_utils.py +0 -90
- pybaseutils-2.2.21/pybaseutils/pandas_utils.py +0 -108
- pybaseutils-2.2.21/test_py/WebCrawler/search_image.py +0 -78
- pybaseutils-2.2.21/test_py/WebCrawler/search_image_for_baidu.py +0 -74
- pybaseutils-2.2.21/test_py/demo1.py +0 -14
- pybaseutils-2.2.21/test_py/demo2.py +0 -24
- pybaseutils-2.2.21/test_py/milvus_demo/demo02.py +0 -44
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/LICENCE +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/README.md +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/app_flask_image.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/setup.cfg +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/setup.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/class_names.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/date_demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo3.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/performance.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/base.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/component.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/main.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/registry/register.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.2.21 → pybaseutils-2.2.24}/test_py/test_fr/demo11.py +0 -0
|
@@ -120,7 +120,7 @@ class COCOBuilder():
|
|
|
120
120
|
|
|
121
121
|
def save_coco(self, json_file):
|
|
122
122
|
file_utils.create_file_path(json_file)
|
|
123
|
-
file_utils.
|
|
123
|
+
file_utils.save_json(json_file, self.coco)
|
|
124
124
|
print("save file:{}".format(json_file))
|
|
125
125
|
|
|
126
126
|
def set_keypoints_category(self, kps_name=[], skeleton=[], cat_id=0):
|
|
@@ -48,7 +48,7 @@ def maker_labelme(json_file, points, labels, image_name, image_size, image_bs64=
|
|
|
48
48
|
"imageWidth": image_size[0]
|
|
49
49
|
}
|
|
50
50
|
if os.path.exists(image_name): file_utils.copy_file_to_dir(image_name, os.path.dirname(json_file))
|
|
51
|
-
file_utils.
|
|
51
|
+
file_utils.save_json(json_file, data)
|
|
52
52
|
return data
|
|
53
53
|
|
|
54
54
|
|
|
@@ -60,9 +60,9 @@ def del_labelme_imagedata(anno_dir):
|
|
|
60
60
|
"""
|
|
61
61
|
file_list = file_utils.get_files_lists(anno_dir, postfix=["*.json"])
|
|
62
62
|
for anno_file in tqdm(file_list):
|
|
63
|
-
data_info = json_utils.
|
|
63
|
+
data_info = json_utils.load_json(anno_file)
|
|
64
64
|
data_info["imageData"] = None
|
|
65
|
-
json_utils.
|
|
65
|
+
json_utils.save_json(anno_file, data_info)
|
|
66
66
|
|
|
67
67
|
|
|
68
68
|
def copy_labelme_files(image_dir, anno_dir, out_root):
|
|
@@ -77,7 +77,7 @@ def copy_labelme_files(image_dir, anno_dir, out_root):
|
|
|
77
77
|
out_images = file_utils.create_dir(out_root, "images")
|
|
78
78
|
out_json = file_utils.create_dir(out_root, "json")
|
|
79
79
|
for json_file in tqdm(json_list):
|
|
80
|
-
json_data = json_utils.
|
|
80
|
+
json_data = json_utils.load_json(json_file)
|
|
81
81
|
image_name = json_data['imagePath']
|
|
82
82
|
shapes = json_data.get('shapes', [])
|
|
83
83
|
image_file = os.path.join(image_dir, image_name)
|
|
@@ -103,14 +103,14 @@ class ConcatCoco(object):
|
|
|
103
103
|
"""
|
|
104
104
|
if isinstance(file_dict, dict):
|
|
105
105
|
for dirname, file in file_dict.items():
|
|
106
|
-
coco = file_utils.
|
|
106
|
+
coco = file_utils.load_json(file)
|
|
107
107
|
self.add_categories(copy.deepcopy(coco["categories"]))
|
|
108
108
|
self.add_images(copy.deepcopy(coco["images"]), dirname)
|
|
109
109
|
self.add_annotations(copy.deepcopy(coco["annotations"]),
|
|
110
110
|
copy.deepcopy(coco["categories"]))
|
|
111
111
|
elif isinstance(file_dict, list):
|
|
112
112
|
for file in file_dict:
|
|
113
|
-
coco = file_utils.
|
|
113
|
+
coco = file_utils.load_json(file)
|
|
114
114
|
self.add_categories(copy.deepcopy(coco["categories"]))
|
|
115
115
|
self.add_images(copy.deepcopy(coco["images"]), dirname=None)
|
|
116
116
|
self.add_annotations(copy.deepcopy(coco["annotations"]),
|
|
@@ -120,7 +120,7 @@ class ConcatCoco(object):
|
|
|
120
120
|
|
|
121
121
|
def save_coco(self, json_file):
|
|
122
122
|
file_utils.create_file_path(json_file)
|
|
123
|
-
file_utils.
|
|
123
|
+
file_utils.save_json(json_file, self.coco)
|
|
124
124
|
print("save file:{}".format(json_file))
|
|
125
125
|
|
|
126
126
|
|
|
@@ -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
|
|
|
@@ -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):
|
|
@@ -238,6 +226,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
238
226
|
title: 控制显示窗口名
|
|
239
227
|
:return:
|
|
240
228
|
"""
|
|
229
|
+
assert os.path.exists(video_file), f"video_file={video_file}"
|
|
241
230
|
video_cap = image_utils.get_video_capture(video_file)
|
|
242
231
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
243
232
|
start = int(kwargs.get("start", 0) * fps)
|
|
@@ -291,11 +280,12 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
|
|
|
291
280
|
speed: 播放速度
|
|
292
281
|
:return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
|
|
293
282
|
"""
|
|
283
|
+
assert os.path.exists(video_file), f"video_file={video_file}"
|
|
294
284
|
video_cap = image_utils.get_video_capture(video_file)
|
|
295
285
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
296
286
|
start = int(kwargs.get("start", 0) * fps)
|
|
297
287
|
end = int(kwargs.get("end", num_frames / fps) * fps) if fps > 0 else 0
|
|
298
|
-
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继续播放
|
|
299
289
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
300
290
|
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
301
291
|
count = 0
|
|
@@ -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
|
|
@@ -47,6 +47,7 @@ class TextDataset(Dataset):
|
|
|
47
47
|
self.check = check
|
|
48
48
|
self.kwargs = kwargs
|
|
49
49
|
self.label_index = kwargs.get("label_index", "label") # 类别字段key
|
|
50
|
+
self.crop_scale = kwargs.get("crop_scale", []) # TODO bbox缩放系数
|
|
50
51
|
self.class_name, self.class_dict = self.parser_classes(class_name)
|
|
51
52
|
self.item_list = self.parser_dataset(data_file, data_root=data_root, label_index=self.label_index,
|
|
52
53
|
shuffle=shuffle, check=check)
|
|
@@ -68,6 +69,7 @@ class TextDataset(Dataset):
|
|
|
68
69
|
|
|
69
70
|
def info(self, save_info=""):
|
|
70
71
|
print("----------------------- {} DATASET INFO -----------------------".format(self.phase.upper()))
|
|
72
|
+
print("Dataset kwargs :{}".format(self.kwargs))
|
|
71
73
|
print("Dataset num_samples :{}".format(len(self.item_list)))
|
|
72
74
|
print("Dataset num_classes :{}".format(self.num_classes))
|
|
73
75
|
print("Dataset class_name :{}".format(self.class_name))
|
|
@@ -81,10 +83,10 @@ class TextDataset(Dataset):
|
|
|
81
83
|
class_lack = sorted(class_lack.items(), key=lambda x: x[1], reverse=True)
|
|
82
84
|
class_lack = {n[0]: n[1] for n in class_lack}
|
|
83
85
|
class_lack.update({"mean": m})
|
|
84
|
-
file_utils.
|
|
85
|
-
file_utils.
|
|
86
|
+
file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_dict.json"), self.class_dict)
|
|
87
|
+
file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_count.json"), self.class_count)
|
|
86
88
|
file_utils.write_list_data(os.path.join(save_info, f"{self.phase}_class_name.txt"), self.class_name)
|
|
87
|
-
file_utils.
|
|
89
|
+
file_utils.save_json(os.path.join(save_info, f"{self.phase}_class_lack.json"), class_lack)
|
|
88
90
|
print("loss_labels: {}".format(class_lack))
|
|
89
91
|
print("------------------------------------------------------------------")
|
|
90
92
|
|
|
@@ -163,10 +165,9 @@ class TextDataset(Dataset):
|
|
|
163
165
|
file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
|
|
164
166
|
name = self.class_name[label]
|
|
165
167
|
image = self.read_image(file, use_rgb=self.use_rgb)
|
|
166
|
-
image = self.crop_image(image, bbox=bbox, **self.kwargs)
|
|
168
|
+
image = self.crop_image(image, bbox=bbox, **self.kwargs)
|
|
167
169
|
if self.transform:
|
|
168
|
-
image = Image.fromarray(image)
|
|
169
|
-
image = self.transform(image)
|
|
170
|
+
image = self.transform(Image.fromarray(image))
|
|
170
171
|
if image is None:
|
|
171
172
|
index = int(random.uniform(0, self.num_samples))
|
|
172
173
|
return self.__getitem__(index)
|
|
@@ -178,7 +179,13 @@ class TextDataset(Dataset):
|
|
|
178
179
|
return len(self.item_list)
|
|
179
180
|
|
|
180
181
|
def crop_image(self, image, bbox, **kwargs):
|
|
181
|
-
"""
|
|
182
|
+
"""
|
|
183
|
+
裁剪图片
|
|
184
|
+
:param image:
|
|
185
|
+
:param bbox:
|
|
186
|
+
:param kwargs: use_max,use_mean,crop_scale
|
|
187
|
+
:return:
|
|
188
|
+
"""
|
|
182
189
|
if len(bbox) == 0: return image
|
|
183
190
|
boxes = image_utils.get_square_boxes(boxes=[bbox],
|
|
184
191
|
use_max=kwargs.get("use_max", False),
|
|
@@ -150,11 +150,11 @@ class LabelMeDataset(Dataset):
|
|
|
150
150
|
if not image_dir:
|
|
151
151
|
image_dir = self.search_path(data_root, ["images", "JPEGImages"])
|
|
152
152
|
if image_dir and not image_ids:
|
|
153
|
-
image_ids = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, basename=False)
|
|
154
|
-
|
|
153
|
+
image_ids = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
|
|
154
|
+
if not anno_dir: anno_dir = image_dir
|
|
155
155
|
elif anno_dir and not image_ids:
|
|
156
|
-
image_ids = self.get_file_list(anno_dir, postfix=
|
|
157
|
-
|
|
156
|
+
image_ids = self.get_file_list(anno_dir, postfix=file_utils.IMG_POSTFIX, sub=True, basename=False)
|
|
157
|
+
if not image_dir: image_dir = anno_dir
|
|
158
158
|
assert isinstance(anno_dir, str) and os.path.exists(anno_dir), "no anno_dir :{}".format(anno_dir)
|
|
159
159
|
assert isinstance(image_dir, str) and os.path.exists(image_dir), "no image_dir:{}".format(image_dir)
|
|
160
160
|
assert len(image_ids) > 0, f"image_ids is empty,image_dir={image_dir},anno_dir={anno_dir}"
|
|
@@ -330,7 +330,7 @@ class LabelMeDataset(Dataset):
|
|
|
330
330
|
width = annotation.get('imageWidth', -1)
|
|
331
331
|
height = annotation.get('imageHeight', -1)
|
|
332
332
|
except:
|
|
333
|
-
print("illegal annotation:{}".format(anno_file))
|
|
333
|
+
# print("illegal annotation:{}".format(anno_file))
|
|
334
334
|
annos = []
|
|
335
335
|
width = -1
|
|
336
336
|
height = -1
|
|
@@ -487,8 +487,7 @@ def show_target_image(image, boxes, labels, points, keypoints=[], color=(), thic
|
|
|
487
487
|
if __name__ == "__main__":
|
|
488
488
|
from pybaseutils.converter import build_labelme
|
|
489
489
|
|
|
490
|
-
anno_dir = "/home/PKing/
|
|
491
|
-
# anno_dir = "/home/PKing/Downloads/冲击试验/sample/images"
|
|
490
|
+
anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/train-v2/01-核相操作/dataset-v01/images"
|
|
492
491
|
names = None
|
|
493
492
|
dataset = LabelMeDatasets(filename=None,
|
|
494
493
|
data_root=None,
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : panjq
|
|
5
|
+
# @Date : 2020-9-20 13:18:34
|
|
6
|
+
# --------------------------------------------------------
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
import PIL.Image as Image
|
|
11
|
+
import numpy as np
|
|
12
|
+
import random
|
|
13
|
+
import cv2
|
|
14
|
+
import torch
|
|
15
|
+
import copy
|
|
16
|
+
from tqdm import tqdm
|
|
17
|
+
from typing import Dict, List
|
|
18
|
+
from pybaseutils import image_utils, file_utils
|
|
19
|
+
from pybaseutils.dataloader import parser_labelme, parser_image_text
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class LabelmeDataset(parser_image_text.TextDataset):
|
|
23
|
+
"""加载Labelme数据并进行裁剪,图片和json文件都保存在images目录下"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, filename, class_name=None, transform=None, use_rgb=False, shuffle=False,
|
|
26
|
+
phase="test", disp=False, check=False, **kwargs):
|
|
27
|
+
"""
|
|
28
|
+
:param filename:
|
|
29
|
+
:param class_name:
|
|
30
|
+
:param transform:
|
|
31
|
+
:param use_rgb:
|
|
32
|
+
:param shuffle:
|
|
33
|
+
:param phase:
|
|
34
|
+
:param disp:
|
|
35
|
+
:param check:
|
|
36
|
+
:param kwargs: use_max,use_mean,crop_scale
|
|
37
|
+
"""
|
|
38
|
+
self.dataset = None
|
|
39
|
+
super(LabelmeDataset, self).__init__(data_file=filename,
|
|
40
|
+
data_root=None,
|
|
41
|
+
class_name=class_name,
|
|
42
|
+
transform=transform,
|
|
43
|
+
shuffle=shuffle,
|
|
44
|
+
use_rgb=use_rgb,
|
|
45
|
+
phase=phase,
|
|
46
|
+
disp=disp,
|
|
47
|
+
check=check,
|
|
48
|
+
label_index="label",
|
|
49
|
+
**kwargs)
|
|
50
|
+
print("LabelmeDataset have images:{},have samples:{}".format(len(self.item_list), self.num_samples))
|
|
51
|
+
|
|
52
|
+
def parser_dataset(self, data_file, **kwargs):
|
|
53
|
+
"""
|
|
54
|
+
获得Labelme所有目标信息
|
|
55
|
+
:param dataset:
|
|
56
|
+
:return:
|
|
57
|
+
"""
|
|
58
|
+
self.dataset = parser_labelme.LabelMeDatasets(filename=None,
|
|
59
|
+
data_root=None,
|
|
60
|
+
anno_dir=data_file,
|
|
61
|
+
image_dir=None,
|
|
62
|
+
class_name=self.class_name,
|
|
63
|
+
check=False,
|
|
64
|
+
phase=self.phase,
|
|
65
|
+
use_rgb=self.use_rgb,
|
|
66
|
+
shuffle=self.shuffle,
|
|
67
|
+
read_image=False)
|
|
68
|
+
print("Please wait, it's in checking")
|
|
69
|
+
item_list = []
|
|
70
|
+
for index in tqdm(range(len(self.dataset))):
|
|
71
|
+
info = self.dataset.__getitem__(index)
|
|
72
|
+
file, boxes = info["image_file"], info.get("boxes", [])
|
|
73
|
+
for i in range(len(boxes)):
|
|
74
|
+
if len(boxes[i]) == 0: continue
|
|
75
|
+
item_list.append(dict(file=file,
|
|
76
|
+
bbox=boxes[i],
|
|
77
|
+
label=info["labels"][i],
|
|
78
|
+
name=info["names"][i],
|
|
79
|
+
point=info["points"][i],
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
assert len(item_list) > 0, f"item_list is empty, check your data_file is ={data_file}"
|
|
83
|
+
return item_list
|
|
84
|
+
|
|
85
|
+
def __getitem__(self, index):
|
|
86
|
+
"""
|
|
87
|
+
:param index:
|
|
88
|
+
:return: {"image": image, "label": label}
|
|
89
|
+
"""
|
|
90
|
+
item: dict = copy.deepcopy(self.item_list[index]) # TODO Fix a bug: 避免修改原始数据
|
|
91
|
+
file, bbox = item["file"], item.get("bbox", [])
|
|
92
|
+
image = self.read_image(file, use_rgb=self.use_rgb)
|
|
93
|
+
image = self.crop_image(image, bbox=bbox, **self.kwargs)
|
|
94
|
+
if self.transform:
|
|
95
|
+
image = self.transform(Image.fromarray(image))
|
|
96
|
+
if image is None:
|
|
97
|
+
index = int(random.uniform(0, len(self)))
|
|
98
|
+
return self.__getitem__(index)
|
|
99
|
+
return dict(file=file, image=image, label=item["label"], name=item["name"])
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if __name__ == '__main__':
|
|
103
|
+
from torchvision import transforms
|
|
104
|
+
|
|
105
|
+
filename = "/home/PKing/nasdata/tmp/tmp/RealFakeFace/face-gesture/dataset-v3/image"
|
|
106
|
+
# filename = "/home/PKing/nasdata/tmp/tmp/RealFakeFace/living/dataset-v2/image"
|
|
107
|
+
batch_size = 1
|
|
108
|
+
crop_scale = (1.2, 1.2)
|
|
109
|
+
input_size = [224, 224]
|
|
110
|
+
rgb_mean = [0., 0., 0.]
|
|
111
|
+
rgb_std = [1.0, 1.0, 1.0]
|
|
112
|
+
class_name = ["face", "闭眼", "张嘴", "低头", "侧脸"]
|
|
113
|
+
transform = transforms.Compose([
|
|
114
|
+
transforms.Resize(input_size),
|
|
115
|
+
transforms.ToTensor(),
|
|
116
|
+
transforms.Normalize(mean=rgb_mean, std=rgb_std),
|
|
117
|
+
])
|
|
118
|
+
|
|
119
|
+
dataset = LabelmeDataset(filename=filename,
|
|
120
|
+
transform=transform,
|
|
121
|
+
resample=True,
|
|
122
|
+
shuffle=False,
|
|
123
|
+
class_name=class_name,
|
|
124
|
+
use_rgb=False,
|
|
125
|
+
disp=True,
|
|
126
|
+
crop_scale=crop_scale,
|
|
127
|
+
vis=False)
|
|
128
|
+
for i in range(len(dataset)):
|
|
129
|
+
data_info = dataset.__getitem__(i)
|
|
130
|
+
file = data_info["file"]
|
|
131
|
+
image, label, name = data_info["image"], data_info["label"], data_info["name"]
|
|
132
|
+
image = np.asarray(image).transpose(1, 2, 0) # 通道由[c,h,w]->[h,w,c]
|
|
133
|
+
image = np.asarray(image * 255, dtype=np.uint8)
|
|
134
|
+
label = np.asarray(label, dtype=np.int32)
|
|
135
|
+
print("{},image.shape:{},label:{},name:{}".format(file, image.shape, label, name))
|
|
136
|
+
image_utils.cv_show_image("image", image)
|