pybaseutils 2.4.3__tar.gz → 2.4.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/PKG-INFO +1 -1
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base/list_queue.py +19 -6
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base64_utils.py +19 -11
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_labelme.py +7 -3
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_yolo2labelme.py +2 -1
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/coords_utils.py +7 -3
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/video_utils.py +147 -44
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/base_dataset.py +3 -3
- pybaseutils-2.4.5/pybaseutils/dataloader/parser_labelme_line.py +254 -0
- pybaseutils-2.4.5/pybaseutils/dataloader/parser_video_folder.py +158 -0
- pybaseutils-2.4.5/pybaseutils/dataloader/parser_video_text.py +153 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_yolo.py +10 -14
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/file_utils.py +53 -34
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/font_style/__init__.py +2 -2
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/geometry_tools.py +1 -0
- pybaseutils-2.4.5/pybaseutils/heatmap_utils.py +252 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/http_utils.py +2 -2
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/image_utils.py +143 -6
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/thread_utils.py +36 -12
- pybaseutils-2.4.5/pybaseutils/transforms/build_transform.py +52 -0
- pybaseutils-2.4.3/pybaseutils/transforms/augment_utils.py → pybaseutils-2.4.5/pybaseutils/transforms/imgaug_utils.py +91 -13
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/SOURCES.txt +13 -3
- pybaseutils-2.4.5/test_py/aije/demo_labelme_crop_ailt.py +124 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_video_aije.py +2 -3
- pybaseutils-2.4.5/test_py/aije/mask_image.py +48 -0
- pybaseutils-2.4.5/test_py/converter/convert_yolo2labelme.py +23 -0
- pybaseutils-2.4.5/test_py/converter/fall_dataset.py +145 -0
- pybaseutils-2.4.5/test_py/converter/parking_rois_gopro.py +43 -0
- pybaseutils-2.4.5/test_py/demo1.py +21 -0
- pybaseutils-2.4.5/test_py/demo2.py +29 -0
- pybaseutils-2.4.5/test_py/demo4.py +77 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_polygon.py +1 -1
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_get_file_label.py +11 -10
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_lableme_vis.py +6 -9
- pybaseutils-2.4.5/test_py/demo_letterbox.py +43 -0
- pybaseutils-2.4.3/test_py/demo_video.py → pybaseutils-2.4.5/test_py/demo_video2frame.py +4 -4
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_voc_vis.py +1 -1
- pybaseutils-2.4.3/pybaseutils/heatmap_utils.py +0 -190
- pybaseutils-2.4.3/test_py/demo1.py +0 -9
- pybaseutils-2.4.3/test_py/demo2.py +0 -76
- pybaseutils-2.4.3/test_py/demo4.py +0 -19
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/LICENCE +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/README.md +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/setup.cfg +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/setup.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/copy_move.py +0 -0
- /pybaseutils-2.4.3/test_py/aije/demo_labelme_crop.py → /pybaseutils-2.4.5/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/performance.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.3 → pybaseutils-2.4.5}/test_py/web_socket/chat_service.py +0 -0
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"""
|
|
10
10
|
import math
|
|
11
11
|
import queue
|
|
12
|
+
import time
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
class Queue():
|
|
@@ -46,7 +47,10 @@ class Queue():
|
|
|
46
47
|
:param timeout: 超时时间
|
|
47
48
|
:return: 弹出的队列数据
|
|
48
49
|
"""
|
|
49
|
-
|
|
50
|
+
try:
|
|
51
|
+
out = self.queue.get(block=block, timeout=timeout)
|
|
52
|
+
except:
|
|
53
|
+
out = None
|
|
50
54
|
return out
|
|
51
55
|
|
|
52
56
|
def pop_items(self, nums=1, block=True, timeout=None):
|
|
@@ -57,7 +61,10 @@ class Queue():
|
|
|
57
61
|
:param timeout: 超时时间
|
|
58
62
|
:return: 弹出的队列数据
|
|
59
63
|
"""
|
|
60
|
-
items = [
|
|
64
|
+
items = []
|
|
65
|
+
for i in range(nums):
|
|
66
|
+
item = self.pop(block=block, timeout=timeout)
|
|
67
|
+
if item: items.append(item)
|
|
61
68
|
return items
|
|
62
69
|
|
|
63
70
|
def get(self, index=0):
|
|
@@ -93,12 +100,18 @@ class Queue():
|
|
|
93
100
|
获取队列的窗口数据
|
|
94
101
|
:param winsize: 窗口大小
|
|
95
102
|
:param overlap: 窗口重叠率
|
|
103
|
+
:param block: 是否阻塞等待
|
|
104
|
+
:param timeout: 超时时间
|
|
96
105
|
:return: 队列窗口数据
|
|
97
106
|
"""
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
107
|
+
while self.qsize() < winsize and block: # 等待队列数据足够
|
|
108
|
+
time.sleep(0.05)
|
|
109
|
+
if self.qsize() >= winsize:
|
|
110
|
+
size = int(winsize * overlap)
|
|
111
|
+
data1 = self.pop_items(nums=winsize - size, block=block, timeout=timeout)
|
|
112
|
+
data2 = self.get_items(nums=size)
|
|
113
|
+
return data1 + data2
|
|
114
|
+
return []
|
|
102
115
|
|
|
103
116
|
|
|
104
117
|
if __name__ == '__main__':
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
"""
|
|
10
10
|
import sys
|
|
11
11
|
import os
|
|
12
|
+
|
|
13
|
+
import PIL.Image as Image
|
|
12
14
|
import cv2
|
|
13
15
|
import base64
|
|
14
16
|
import numpy as np
|
|
@@ -64,8 +66,8 @@ def image2base64(image: np.ndarray, prefix=IMG_PREFIX, use_rgb=False) -> str:
|
|
|
64
66
|
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
|
|
65
67
|
ext = prefix.split("/")
|
|
66
68
|
# ext = "." + ext[1] if len(ext) == 2 else ".png" # TODO libpng error: bad parameters to zlib
|
|
67
|
-
ext = "." + ext[1] if len(ext) == 2 else ".jpg"
|
|
68
|
-
img = cv2.imencode(
|
|
69
|
+
# ext = "." + ext[1] if len(ext) == 2 else ".jpg"
|
|
70
|
+
img = cv2.imencode('.jpg', img)[1]
|
|
69
71
|
bs64 = prefix + base64.b64encode(img).decode()
|
|
70
72
|
return bs64
|
|
71
73
|
|
|
@@ -77,7 +79,7 @@ def file2base64(file, prefix=IMG_PREFIX) -> str:
|
|
|
77
79
|
:param prefix: base64字符串前缀,用于表识字符串的类型
|
|
78
80
|
:return:base64字符串
|
|
79
81
|
"""
|
|
80
|
-
bs64 = prefix + base64.b64encode(open(file, 'rb').read()).decode()
|
|
82
|
+
bs64 = prefix + base64.b64encode(open(file, 'rb').read()).decode("utf-8")
|
|
81
83
|
return bs64
|
|
82
84
|
|
|
83
85
|
|
|
@@ -105,6 +107,8 @@ def array2base64(data: Any, prefix=IMG_PREFIX, use_rgb=False) -> Any:
|
|
|
105
107
|
"""
|
|
106
108
|
if isinstance(data, np.ndarray) and data.dtype == np.uint8:
|
|
107
109
|
return image2base64(data, prefix=prefix, use_rgb=use_rgb)
|
|
110
|
+
elif isinstance(data, Image.Image):
|
|
111
|
+
return image2base64(np.asarray(data), prefix=prefix, use_rgb=use_rgb)
|
|
108
112
|
elif isinstance(data, np.ndarray):
|
|
109
113
|
return data.tolist()
|
|
110
114
|
elif isinstance(data, np.integer):
|
|
@@ -122,22 +126,25 @@ def array2base64(data: Any, prefix=IMG_PREFIX, use_rgb=False) -> Any:
|
|
|
122
126
|
return data
|
|
123
127
|
|
|
124
128
|
|
|
125
|
-
def base642array(data: Any, prefix=IMG_PREFIX, use_rgb=False) -> Any:
|
|
129
|
+
def base642array(data: Any, prefix=IMG_PREFIX, use_rgb=False, img_type="numpy") -> Any:
|
|
126
130
|
"""
|
|
127
131
|
反序列化:将输入数据含有base64字符串都解码为图像数据(ndarray)
|
|
128
132
|
:param data: 输入数据
|
|
129
133
|
:param prefix: base64字符串前缀,用于表识字符串的类型
|
|
130
134
|
:param use_rgb: True:输入image是RGB的图像, False:输入image是BGR格式的图像
|
|
135
|
+
:param img_type: numpy:返回numpy图像, pil:返回PIL图像
|
|
131
136
|
:return:
|
|
132
137
|
"""
|
|
133
138
|
if isinstance(data, str) and prefix == data[0:len(prefix)]:
|
|
134
|
-
|
|
139
|
+
data = base642image(data, prefix=prefix, use_rgb=use_rgb) # numpy image
|
|
140
|
+
if img_type == "pil": data = Image.fromarray(data)
|
|
141
|
+
return data
|
|
135
142
|
elif isinstance(data, list):
|
|
136
143
|
for i in range(len(data)):
|
|
137
|
-
data[i] = base642array(data[i], prefix=prefix, use_rgb=use_rgb)
|
|
144
|
+
data[i] = base642array(data[i], prefix=prefix, use_rgb=use_rgb, img_type=img_type)
|
|
138
145
|
elif isinstance(data, dict):
|
|
139
146
|
for k, v in data.items():
|
|
140
|
-
data[k] = base642array(v, prefix=prefix, use_rgb=use_rgb)
|
|
147
|
+
data[k] = base642array(v, prefix=prefix, use_rgb=use_rgb, img_type=img_type)
|
|
141
148
|
return data
|
|
142
149
|
|
|
143
150
|
|
|
@@ -147,13 +154,14 @@ if __name__ == "__main__":
|
|
|
147
154
|
from pybaseutils import file_utils, image_utils
|
|
148
155
|
|
|
149
156
|
image_dir = "/home/PKing/Downloads/image"
|
|
150
|
-
image_dir = "/media/PKing/dev1/SDK/base-utils/data/labelme/JPEGImages"
|
|
151
157
|
image_list = file_utils.get_images_list(image_dir)
|
|
152
158
|
for image_file in image_list:
|
|
153
159
|
print(image_file)
|
|
154
160
|
src = image_utils.read_image(image_file, use_rgb=True)
|
|
155
|
-
|
|
156
|
-
|
|
161
|
+
image_base64 = image2base64(src, prefix="data:image/jpeg;base64,", )
|
|
162
|
+
img = Image.fromarray(src)
|
|
163
|
+
data = {"image": img, "file": image_file}
|
|
157
164
|
data = serialization(data)
|
|
158
165
|
data = deserialization(data)
|
|
159
|
-
|
|
166
|
+
dst = data["image"]
|
|
167
|
+
image_utils.show_image("src", src, delay=0)
|
|
@@ -12,7 +12,7 @@ from tqdm import tqdm
|
|
|
12
12
|
from pybaseutils import image_utils, file_utils, json_utils
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def save_labelme(out_root, image_file, points, names, class_dict, group=None, image=None, prefix="",
|
|
15
|
+
def save_labelme(out_root, image_file, points, names, class_dict={}, group=None, image=None, prefix="",
|
|
16
16
|
index=0, vis=False, delay=0):
|
|
17
17
|
"""
|
|
18
18
|
:param out_root: 输出根目录
|
|
@@ -39,15 +39,19 @@ def save_labelme(out_root, image_file, points, names, class_dict, group=None, im
|
|
|
39
39
|
image_id, postfix = file_utils.split_postfix(image_name)
|
|
40
40
|
if prefix:
|
|
41
41
|
flag_ = file_utils.get_time(format="p") if index < 0 else f"{index:0=5d}"
|
|
42
|
-
image_name = f"{prefix}_{flag_}.
|
|
42
|
+
image_name = f"{prefix}_{flag_}.jpg"
|
|
43
43
|
image_id, postfix = file_utils.split_postfix(image_name)
|
|
44
44
|
json_file = file_utils.create_dir(out_root, "images", f"{image_id}.json")
|
|
45
45
|
file_path = file_utils.create_dir(out_root, "images", f"{image_name}")
|
|
46
46
|
maker_labelme(json_file, points, names, image_name, group=group, image_size=(w, h), image_bs64=None)
|
|
47
|
-
|
|
47
|
+
if isinstance(image, np.ndarray):
|
|
48
|
+
cv2.imwrite(file_path, image)
|
|
49
|
+
else:
|
|
50
|
+
file_utils.copy_file(image_file, file_path)
|
|
48
51
|
if len(points) == 0:
|
|
49
52
|
print("points is empty,file={}".format(file_path))
|
|
50
53
|
|
|
54
|
+
|
|
51
55
|
def maker_labelme(json_file, points, labels, image_name, image_size, group=None, image_bs64=None, keypoints=[]):
|
|
52
56
|
"""
|
|
53
57
|
制作label数据格式
|
|
@@ -73,6 +73,7 @@ def convert_yolo2labelme(data_root,
|
|
|
73
73
|
class_name=None,
|
|
74
74
|
class_dict={},
|
|
75
75
|
task="",
|
|
76
|
+
check=False,
|
|
76
77
|
prefix="",
|
|
77
78
|
max_num=-1,
|
|
78
79
|
vis=True,
|
|
@@ -93,7 +94,7 @@ def convert_yolo2labelme(data_root,
|
|
|
93
94
|
image_dir=None,
|
|
94
95
|
class_name=class_name,
|
|
95
96
|
task=task,
|
|
96
|
-
check=
|
|
97
|
+
check=check,
|
|
97
98
|
phase="val",
|
|
98
99
|
shuffle=False)
|
|
99
100
|
print("have num:{}".format(len(dataset)))
|
|
@@ -198,8 +198,8 @@ def shrink_polygon_pyclipper(polygon, ratio):
|
|
|
198
198
|
使用Polygon库计算多边形区域的周长和面积,使用pyclipper库进行shrink
|
|
199
199
|
https://blog.csdn.net/shyjhyp11/article/details/126396170
|
|
200
200
|
https://www.cnblogs.com/01black-white/p/15292193.html
|
|
201
|
-
:param polygon:
|
|
202
|
-
:param ratio:
|
|
201
|
+
:param polygon: (n,2)
|
|
202
|
+
:param ratio: 缩放的比例,如果大于1是放大,小于1是缩小
|
|
203
203
|
:return:
|
|
204
204
|
"""
|
|
205
205
|
from shapely.geometry import Polygon
|
|
@@ -219,6 +219,9 @@ def shrink_polygon_pyclipper(polygon, ratio):
|
|
|
219
219
|
return shrinked
|
|
220
220
|
|
|
221
221
|
|
|
222
|
+
extend_polygon = shrink_polygon_pyclipper
|
|
223
|
+
|
|
224
|
+
|
|
222
225
|
def get_square_boxes(boxes, use_max=True, use_mean=False, baseline=-1):
|
|
223
226
|
"""
|
|
224
227
|
将boxes转换为正方形的boxes
|
|
@@ -499,7 +502,8 @@ def demo_for_augment():
|
|
|
499
502
|
for i in range(1000):
|
|
500
503
|
boxes = extend_xyxy(boxes, scale=[1.2, 1.2])
|
|
501
504
|
dst_image, dst_label, dst_boxes = augment(image, boxes.copy(), labels.copy())
|
|
502
|
-
image = show_targets_image("detd", image, dst_label, dst_boxes, center2bboxes=True, untranspose=False,
|
|
505
|
+
image = show_targets_image("detd", image, dst_label, dst_boxes, center2bboxes=True, untranspose=False,
|
|
506
|
+
waitKey=0)
|
|
503
507
|
|
|
504
508
|
|
|
505
509
|
if __name__ == "__main__":
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
"""
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-12-12 14:23:50
|
|
7
|
+
# @Brief :
|
|
8
|
+
# --------------------------------------------------------
|
|
7
9
|
"""
|
|
8
10
|
import os
|
|
9
11
|
import cv2
|
|
10
12
|
import numpy as np
|
|
13
|
+
import math
|
|
11
14
|
from typing import Callable
|
|
12
15
|
from tqdm import tqdm
|
|
13
16
|
from pybaseutils import image_utils, file_utils
|
|
@@ -40,7 +43,7 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, fps=-1, use_pil=
|
|
|
40
43
|
name = os.path.basename(video_file).split(".")[0]
|
|
41
44
|
if not gif_file: gif_file = os.path.join(os.path.dirname(video_file), name + ".gif")
|
|
42
45
|
if not os.path.exists(gif_file): file_utils.create_file_path(gif_file)
|
|
43
|
-
width, height, num_frames, _fps = get_video_info(video_file)
|
|
46
|
+
width, height, num_frames, _fps = get_video_info(video_file, **kwargs)
|
|
44
47
|
video_cap = video_iterator(video_file, save_video=None, interval=interval, **kwargs)
|
|
45
48
|
frames = []
|
|
46
49
|
for data_info in video_cap:
|
|
@@ -56,29 +59,98 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, fps=-1, use_pil=
|
|
|
56
59
|
image_utils.frames2gif_by_imageio(frames, gif_file=gif_file, fps=fps, loop=0)
|
|
57
60
|
|
|
58
61
|
|
|
59
|
-
def
|
|
62
|
+
def get_video_sampling(freq, time, fps, random=False):
|
|
60
63
|
"""
|
|
64
|
+
获得抽帧时间点和索引
|
|
65
|
+
:param freq: 抽帧频率
|
|
66
|
+
:param time: time: 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
67
|
+
:param fps: 视频帧率FPS
|
|
68
|
+
:param random: 是否随机抽帧(在每一秒内随机抽freq帧)
|
|
69
|
+
:return:
|
|
70
|
+
"""
|
|
71
|
+
if freq <= 0: freq = fps
|
|
72
|
+
if random:
|
|
73
|
+
times = []
|
|
74
|
+
tange = np.arange(time[0], math.ceil(time[1]) + 1e-6, 1)
|
|
75
|
+
for i in range(len(tange) - 1):
|
|
76
|
+
t = np.random.uniform(tange[i], tange[i + 1], size=freq)
|
|
77
|
+
t = np.sort(t)
|
|
78
|
+
times.append(t)
|
|
79
|
+
times = np.concatenate(times)
|
|
80
|
+
# times = np.sort(np.random.uniform(time[0], time[1], size=freq))
|
|
81
|
+
else:
|
|
82
|
+
times = np.arange(time[0], time[1], 1 / freq)
|
|
83
|
+
index = times * fps
|
|
84
|
+
index = index.astype(int)
|
|
85
|
+
return times, index
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def load_video(video_file, time=(0, -1), freq=0, size=(), use_rgb=False, random=False, **kwargs):
|
|
89
|
+
"""
|
|
90
|
+
加载视频文件,返回视频抽帧图像数据列表
|
|
91
|
+
:param video_file:
|
|
92
|
+
:param time: 设置时间范围,默认值为(0, -1),表示播放所有视频帧
|
|
93
|
+
:param freq: 抽帧频率,默认值为视频帧率FPS
|
|
94
|
+
:param size: 帧图像大小,默认值为视频原始大小
|
|
95
|
+
:param use_rgb:
|
|
96
|
+
:param kwargs:
|
|
97
|
+
:return:
|
|
98
|
+
"""
|
|
99
|
+
time = list(time)
|
|
100
|
+
video_cap = get_video_capture(video_file)
|
|
101
|
+
width, height, numFrames, fps = get_video_info(video_cap, **kwargs)
|
|
102
|
+
if time[1] < 0: time[1] = numFrames / fps
|
|
103
|
+
video_time, video_index = get_video_sampling(freq, time, fps, random=random)
|
|
104
|
+
frames = []
|
|
105
|
+
for t, count in zip(video_time, video_index):
|
|
106
|
+
video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
107
|
+
ret, frame = video_cap.read()
|
|
108
|
+
if not ret: break
|
|
109
|
+
if size: frame = image_utils.resize_image(frame, size=size)
|
|
110
|
+
if use_rgb: frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
|
111
|
+
h, w = frame.shape[:2]
|
|
112
|
+
data_info = {"count": count, "time": t, "frame": frame, "w": w, "h": h, "fps": fps}
|
|
113
|
+
frames.append(data_info)
|
|
114
|
+
video_cap.release()
|
|
115
|
+
return frames
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def video2frames(video_file, out_dir=None, task: Callable = None, interval=1, size=(), freq=0,
|
|
119
|
+
vis=False, delay=10, **kwargs):
|
|
120
|
+
"""
|
|
121
|
+
video_iterator(video_file: int | str, save_video: str or int = None, interval=1, size=(), freq=0,
|
|
122
|
+
task: Callable = None, vis=False, **kwargs):
|
|
61
123
|
视频抽帧图像
|
|
62
124
|
:param video_file: 视频文件
|
|
63
|
-
:param out_dir:
|
|
64
|
-
|
|
125
|
+
:param out_dir: 保存抽帧图像的目录,os.path.join(os.path.dirname(video_file), name)
|
|
126
|
+
当out_dir为None时,返回抽帧图像数据列表
|
|
127
|
+
:param task: 回调函数,对每一帧图像进行处理
|
|
65
128
|
:param interval: 保存间隔
|
|
66
129
|
:param vis: 是否可视化显示
|
|
67
130
|
:return:
|
|
68
131
|
"""
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
132
|
+
video_cap = video_iterator(video_file, save_video=None, interval=interval, size=size, freq=freq, **kwargs)
|
|
133
|
+
filename = None
|
|
134
|
+
if out_dir:
|
|
135
|
+
name = os.path.basename(video_file).split(".")[0]
|
|
136
|
+
# out_dir = os.path.join(os.path.dirname(video_file), name)
|
|
137
|
+
prefix = kwargs.get("prefix", "")
|
|
138
|
+
filename = "{}_{}".format(prefix, name) if prefix else name
|
|
139
|
+
frames = []
|
|
72
140
|
for data_info in video_cap:
|
|
73
141
|
frame = data_info["frame"]
|
|
74
142
|
count = data_info["count"]
|
|
75
|
-
if
|
|
143
|
+
if task: frame = task(frame)
|
|
76
144
|
if vis: image_utils.cv_show_image("frame", frame, use_rgb=False, delay=delay)
|
|
77
|
-
|
|
78
|
-
|
|
145
|
+
if filename:
|
|
146
|
+
frame_file = os.path.join(out_dir, "{}_{:0=5d}.jpg".format(filename, count))
|
|
147
|
+
cv2.imwrite(frame_file, frame)
|
|
148
|
+
data_info["file"] = frame_file
|
|
149
|
+
frames.append(data_info)
|
|
150
|
+
return frames
|
|
79
151
|
|
|
80
152
|
|
|
81
|
-
def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True):
|
|
153
|
+
def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True, **kwargs):
|
|
82
154
|
"""
|
|
83
155
|
视频抽帧图像
|
|
84
156
|
:param video_file: 视频文件
|
|
@@ -92,10 +164,11 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
|
|
|
92
164
|
name = os.path.basename(video_file).split(".")[0]
|
|
93
165
|
if not out_dir: out_dir = os.path.join(os.path.dirname(video_file), name)
|
|
94
166
|
video_cap = get_video_capture(video_file)
|
|
95
|
-
width, height, num_frames, fps = get_video_info(video_cap)
|
|
167
|
+
width, height, num_frames, fps = get_video_info(video_cap, **kwargs)
|
|
96
168
|
if not os.path.exists(out_dir): os.makedirs(out_dir)
|
|
97
169
|
count = 0
|
|
98
170
|
last_frame = None
|
|
171
|
+
frame_files = []
|
|
99
172
|
while True:
|
|
100
173
|
if count % interval == 0:
|
|
101
174
|
# 设置抽帧的位置
|
|
@@ -110,6 +183,7 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
|
|
|
110
183
|
frame_file = os.path.join(out_dir, "{}_{:0=4d}.jpg".format(name, count))
|
|
111
184
|
last_frame = curr_frame.copy()
|
|
112
185
|
cv2.imwrite(frame_file, curr_frame)
|
|
186
|
+
frame_files.append(frame_file)
|
|
113
187
|
if vis:
|
|
114
188
|
text = "TH={},diff={:3.3f}".format(thresh, diff)
|
|
115
189
|
image = image_utils.draw_text(curr_frame, point=(10, 70), color=(0, 255, 0),
|
|
@@ -118,6 +192,7 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
|
|
|
118
192
|
count += 1
|
|
119
193
|
video_cap.release()
|
|
120
194
|
cv2.destroyAllWindows()
|
|
195
|
+
return frame_files
|
|
121
196
|
|
|
122
197
|
|
|
123
198
|
def frames2video(image_dir, video_file=None, func=None, size=None, postfix=["*.png", "*.jpg"], interval=1, fps=30,
|
|
@@ -160,7 +235,7 @@ def frames2video(image_dir, video_file=None, func=None, size=None, postfix=["*.p
|
|
|
160
235
|
cv2.destroyAllWindows()
|
|
161
236
|
|
|
162
237
|
|
|
163
|
-
def video2video(video_file: int or str, save_video: str or int, interval=1, task: Callable = None,
|
|
238
|
+
def video2video(video_file: int or str, save_video: str or int, interval=1, size=(), freq=0, task: Callable = None,
|
|
164
239
|
vis=True, **kwargs):
|
|
165
240
|
"""
|
|
166
241
|
转换视频格式
|
|
@@ -169,13 +244,14 @@ def video2video(video_file: int or str, save_video: str or int, interval=1, task
|
|
|
169
244
|
:param interval: 间隔
|
|
170
245
|
:return:
|
|
171
246
|
"""
|
|
172
|
-
video_capture(video_file=video_file, save_video=save_video, interval=interval,
|
|
247
|
+
video_capture(video_file=video_file, save_video=save_video, interval=interval, size=size, freq=freq, task=task,
|
|
248
|
+
vis=vis, **kwargs)
|
|
173
249
|
|
|
174
250
|
|
|
175
251
|
convert_video_format = video2video
|
|
176
252
|
|
|
177
253
|
|
|
178
|
-
def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True, delay=20):
|
|
254
|
+
def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True, delay=20, **kwargs):
|
|
179
255
|
"""
|
|
180
256
|
转换视频格式
|
|
181
257
|
:param video_file: *.avi,*.mp4,...
|
|
@@ -185,7 +261,7 @@ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True,
|
|
|
185
261
|
:return:
|
|
186
262
|
"""
|
|
187
263
|
video_cap = get_video_capture(video_file)
|
|
188
|
-
width, height, num_frames, fps = get_video_info(video_cap)
|
|
264
|
+
width, height, num_frames, fps = get_video_info(video_cap, **kwargs)
|
|
189
265
|
frame = np.zeros(shape=(height, width), dtype=np.uint8)
|
|
190
266
|
frame = image_utils.resize_image(frame, size=size)
|
|
191
267
|
height, width = frame.shape[:2]
|
|
@@ -207,8 +283,8 @@ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True,
|
|
|
207
283
|
video_writer.release()
|
|
208
284
|
|
|
209
285
|
|
|
210
|
-
def video_capture(video_file: int or str, save_video: str or int = None, interval=1,
|
|
211
|
-
vis=True, **kwargs):
|
|
286
|
+
def video_capture(video_file: int or str, save_video: str or int = None, interval=1, size=(), freq=0,
|
|
287
|
+
task: Callable = None, vis=True, **kwargs):
|
|
212
288
|
"""
|
|
213
289
|
读取摄像头或者视频流
|
|
214
290
|
:param video_file: String 视频文件,如*.avi,*.mp4,...
|
|
@@ -223,16 +299,22 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
223
299
|
:return:
|
|
224
300
|
"""
|
|
225
301
|
video_file = file_utils.str2number(video_file)
|
|
226
|
-
if isinstance(video_file, str)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
end =
|
|
302
|
+
if isinstance(video_file, str) and os.path.isfile(video_file):
|
|
303
|
+
assert os.path.exists(video_file), f"video_file={video_file}"
|
|
304
|
+
video_cap = image_utils.get_video_capture(video_file, fps=None)
|
|
305
|
+
w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
|
|
306
|
+
time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
307
|
+
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置index[0],结束播放位置index[1]
|
|
308
|
+
start, end = 0, -1
|
|
309
|
+
if time and fps > 0:
|
|
310
|
+
start, end = int(time[0] * fps), int(time[1] * fps)
|
|
311
|
+
elif clip:
|
|
312
|
+
start, end = int(clip[0]), int(clip[1])
|
|
313
|
+
end = min(end, num_frames) if end > 0 else num_frames # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
233
314
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
234
315
|
interval = int(fps / freq) if freq > 0 else interval
|
|
235
316
|
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
317
|
+
save_fps = kwargs.get("save_fps", save_fps)
|
|
236
318
|
count = 0
|
|
237
319
|
video_writer = None
|
|
238
320
|
while True:
|
|
@@ -242,6 +324,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
242
324
|
# if isinstance(video_file, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
243
325
|
# ret, frame = video_cap.read()
|
|
244
326
|
if not ret or 0 < end < count or frame is None: break
|
|
327
|
+
if size: frame = image_utils.resize_image(frame, size=size)
|
|
245
328
|
if task: frame = task(frame, **kwargs)
|
|
246
329
|
h, w = frame.shape[:2]
|
|
247
330
|
if vis: image_utils.cv_show_image(kwargs.get("title", "video"), frame, delay=kwargs.get("delay", 10))
|
|
@@ -255,13 +338,13 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
255
338
|
video_writer.release()
|
|
256
339
|
|
|
257
340
|
|
|
258
|
-
def video_iterator(video_file: int
|
|
341
|
+
def video_iterator(video_file: int | str, save_video: str or int = None, interval=1, size=(), freq=0,
|
|
259
342
|
task: Callable = None, vis=False, **kwargs):
|
|
260
343
|
"""
|
|
261
344
|
读取摄像头或者视频流迭代器
|
|
262
345
|
Usage:
|
|
263
346
|
from pybaseutils.cvutils import video_utils
|
|
264
|
-
video_cap = video_utils.video_iterator(video_file, save_video,
|
|
347
|
+
video_cap = video_utils.video_iterator(video_file, save_video, time=(4, 10))
|
|
265
348
|
for data_info in video_cap:
|
|
266
349
|
frame = data_info["frame"]
|
|
267
350
|
...
|
|
@@ -275,43 +358,61 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
|
|
|
275
358
|
:param kwargs:回调函数输入参数,
|
|
276
359
|
delay: 控制显示延时,默认10S
|
|
277
360
|
title: 控制显示窗口名,默认video
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
speed:
|
|
361
|
+
time: 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
362
|
+
clip: 开始播放位置index[0],结束播放位置index[1]
|
|
363
|
+
speed: 保存视频的播放速度,默认是播放帧率
|
|
364
|
+
save_fps: 保存视频的帧率,默认是播放帧率
|
|
281
365
|
:return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
|
|
366
|
+
当输入是视频文件时,返回视频偏移量time和duration都是播放时间,单位S,差异不大
|
|
367
|
+
当输入是摄像头时, 返回视频偏移量time是视频播放时间,duration是根据count计算的播放的时间
|
|
282
368
|
"""
|
|
283
369
|
video_file = file_utils.str2number(video_file)
|
|
284
|
-
if isinstance(video_file, str)
|
|
370
|
+
if isinstance(video_file, str) and os.path.isfile(video_file):
|
|
371
|
+
assert os.path.exists(video_file), f"video_file={video_file}"
|
|
285
372
|
video_cap = image_utils.get_video_capture(video_file, fps=None)
|
|
286
|
-
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
287
|
-
|
|
288
|
-
|
|
373
|
+
w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
|
|
374
|
+
time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
375
|
+
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置index[0],结束播放位置index[1]
|
|
376
|
+
start, end = 0, -1
|
|
377
|
+
if time and fps > 0:
|
|
378
|
+
start, end = int(time[0] * fps), int(time[1] * fps)
|
|
379
|
+
elif clip:
|
|
380
|
+
start, end = int(clip[0]), int(clip[1])
|
|
289
381
|
end = min(end, num_frames) if end > 0 else num_frames # TODO 当num_frames<0时,使用0<end<count继续播放
|
|
290
382
|
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
291
383
|
interval = int(fps / freq) if freq > 0 else interval
|
|
292
384
|
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
385
|
+
save_fps = kwargs.get("save_fps", save_fps)
|
|
293
386
|
count = 0
|
|
294
387
|
video_writer = None
|
|
295
388
|
use_fast = kwargs.get("use_fast", False)
|
|
296
389
|
data_info = {}
|
|
390
|
+
t0 = -1
|
|
297
391
|
while True:
|
|
298
392
|
ret, frame = (False, None) if use_fast else video_cap.read()
|
|
393
|
+
t = video_cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
|
|
394
|
+
if t0 < 0 < t: t0 = t
|
|
395
|
+
if t0 > 0: t = t - t0 # 获得视频偏移量毫秒为单位
|
|
396
|
+
finish = 0 < end <= (count + interval)
|
|
299
397
|
if count % interval == 0 and count >= start:
|
|
300
398
|
# TODO 设置抽帧的位置,但某些格式视频容易出现问题
|
|
301
399
|
if use_fast and isinstance(video_file, str):
|
|
302
400
|
video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
303
401
|
ret, frame = video_cap.read()
|
|
304
|
-
if not ret or 0 < end
|
|
402
|
+
if not ret or 0 < end <= count or frame is None: break
|
|
305
403
|
if size: frame = image_utils.resize_image(frame, size=size)
|
|
306
404
|
if task: frame = task(frame, **kwargs)
|
|
307
|
-
|
|
308
|
-
|
|
405
|
+
h, w = frame.shape[:2]
|
|
406
|
+
d = round(count / fps, 3) # TODO 通过fps计算播放时间
|
|
407
|
+
t = round(t, 3) # 通过视频偏移量计算播放时间
|
|
408
|
+
data_info = {"count": count, "time": t, "frame": frame, "w": w, "h": h, "fps": fps,
|
|
409
|
+
"finish": finish, 'duration': d}
|
|
309
410
|
# TODO 返回data_info
|
|
310
411
|
yield data_info
|
|
311
412
|
frame = data_info["frame"]
|
|
312
|
-
h, w = frame.shape[:2]
|
|
313
413
|
if vis: image_utils.cv_show_image(kwargs.get("title", "video"), frame, delay=kwargs.get("delay", 10))
|
|
314
414
|
if save_video:
|
|
415
|
+
h, w = frame.shape[:2]
|
|
315
416
|
if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
|
|
316
417
|
video_writer.write(frame)
|
|
317
418
|
count += 1
|
|
@@ -340,10 +441,12 @@ def rotation_task(frame, **kwargs):
|
|
|
340
441
|
|
|
341
442
|
|
|
342
443
|
if __name__ == "__main__":
|
|
343
|
-
video_file = "/home/dm/nasdata/release/CSDN/双目测距Demo视频(Python).MP4"
|
|
444
|
+
# video_file = "/home/dm/nasdata/release/CSDN/双目测距Demo视频(Python).MP4"
|
|
344
445
|
# video_file = "/home/dm/视频/双目测距Demo视频(Python).mp4"
|
|
345
446
|
# dst_file = "/home/dm/视频/双目测距Demo视频(Python)1.mp4"
|
|
346
447
|
# video2frames(video_file, interval=10, vis=True)
|
|
347
448
|
# frames2video(image_dir, interval=1, vis=True)
|
|
348
|
-
video2gif(video_file, interval=15, func=resize_task, fps=3, use_pil=False, vis=True)
|
|
449
|
+
# video2gif(video_file, interval=15, func=resize_task, fps=3, use_pil=False, vis=True)
|
|
349
450
|
# video2video(video_file, dst_file, vis=True)
|
|
451
|
+
video_file = "/home/PKing/Videos/aije-data/检查绝缘棒.mp4"
|
|
452
|
+
load_video(video_file, time=(0, -1), freq=2, size=(), use_rgb=False)
|
|
@@ -329,7 +329,7 @@ def cat_targets(objs: list, keys=[], out_info={}):
|
|
|
329
329
|
return out_info
|
|
330
330
|
|
|
331
331
|
|
|
332
|
-
def get_targets(obj_info: dict, targets=[], key='
|
|
332
|
+
def get_targets(obj_info: dict, targets=[], key='names', keys=[]):
|
|
333
333
|
"""
|
|
334
334
|
从obj_info查找符合条件的目标,支持正则表达式
|
|
335
335
|
:param obj_info:
|
|
@@ -338,9 +338,9 @@ def get_targets(obj_info: dict, targets=[], key='label', keys=[]):
|
|
|
338
338
|
:param keys: 用于指定返回的keys
|
|
339
339
|
:return:
|
|
340
340
|
"""
|
|
341
|
-
|
|
341
|
+
output = {k: [] for k in keys}
|
|
342
|
+
if not obj_info: return output
|
|
342
343
|
label = obj_info[key]
|
|
343
|
-
output = {}
|
|
344
344
|
for i in range(len(label)):
|
|
345
345
|
matches = text_utils.find_match_texts(texts=[label[i]], pattern=targets, org=True)
|
|
346
346
|
if len(matches) == 0: continue
|