pybaseutils 2.4.5__tar.gz → 2.4.7__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.5 → pybaseutils-2.4.7}/PKG-INFO +1 -1
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.4.7/pybaseutils/base/producer_consumer.py +138 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/video_utils.py +9 -4
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_video_folder.py +7 -4
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_video_text.py +11 -7
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/image_utils.py +46 -15
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/class_report.py +28 -18
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/thread_utils.py +7 -3
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/SOURCES.txt +3 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_labelme_crop_ailt.py +2 -1
- pybaseutils-2.4.7/test_py/demo2.py +50 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_video2frame.py +2 -1
- pybaseutils-2.4.7/test_py/qrcode/__init__.py +9 -0
- pybaseutils-2.4.7/test_py/qrcode/demo.py +100 -0
- pybaseutils-2.4.5/test_py/demo2.py +0 -29
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/LICENCE +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/README.md +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/file_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/setup.cfg +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/setup.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo1.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo4.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/performance.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.5 → pybaseutils-2.4.7}/test_py/web_socket/chat_service.py +0 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-10-29 16:52:22
|
|
7
|
+
# @Brief :
|
|
8
|
+
# --------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
import os
|
|
11
|
+
import numpy as np
|
|
12
|
+
import time
|
|
13
|
+
import threading
|
|
14
|
+
from typing import List, Dict, Callable
|
|
15
|
+
from pybaseutils import thread_utils, file_utils, image_utils, base64_utils
|
|
16
|
+
from pybaseutils.cvutils import video_utils
|
|
17
|
+
from pybaseutils.base import list_queue
|
|
18
|
+
|
|
19
|
+
thread_lock = threading.Lock()
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ProducerConsumer:
|
|
23
|
+
def __init__(self, winsize=3, overlap=0.0, max_workers=2, **kwargs) -> None:
|
|
24
|
+
"""
|
|
25
|
+
:param winsize:
|
|
26
|
+
:param overlap:
|
|
27
|
+
:param max_workers:
|
|
28
|
+
:param kwargs:
|
|
29
|
+
"""
|
|
30
|
+
self.tag = self.__class__.__name__
|
|
31
|
+
self.winsize = winsize
|
|
32
|
+
self.overlap = overlap
|
|
33
|
+
self.max_workers = max_workers
|
|
34
|
+
self.kwargs = kwargs
|
|
35
|
+
self.producer = list_queue.Queue(maxsize=self.winsize) # 生产者
|
|
36
|
+
self.consumer = list_queue.Queue(maxsize=self.winsize) # 消费者
|
|
37
|
+
self.producer_end = False # 生产者是否结束
|
|
38
|
+
self.consumer_end = False # 消费者是否结束
|
|
39
|
+
|
|
40
|
+
def stop_producer(self):
|
|
41
|
+
"""
|
|
42
|
+
停止生产者线程
|
|
43
|
+
:return:
|
|
44
|
+
"""
|
|
45
|
+
self.producer_end = True
|
|
46
|
+
|
|
47
|
+
def stop_consumer(self):
|
|
48
|
+
"""
|
|
49
|
+
停止消费者线程
|
|
50
|
+
:return:
|
|
51
|
+
"""
|
|
52
|
+
self.consumer_end = True
|
|
53
|
+
|
|
54
|
+
def task(self, data: List, *args, **kwargs):
|
|
55
|
+
"""
|
|
56
|
+
任务函数,处理输入数据
|
|
57
|
+
:param data: 输入数据
|
|
58
|
+
:return: 处理结果
|
|
59
|
+
"""
|
|
60
|
+
print(f"args ={args},kwargs={kwargs}")
|
|
61
|
+
time.sleep(5)
|
|
62
|
+
result = "收到消息:" + file_utils.get_time(format="s")
|
|
63
|
+
return result
|
|
64
|
+
|
|
65
|
+
def task_consumer(self, task, *args, **kwargs):
|
|
66
|
+
"""消费者任务"""
|
|
67
|
+
print(f"start consumer thread")
|
|
68
|
+
self.consumer_end = False
|
|
69
|
+
pool = thread_utils.ThreadPool(max_workers=self.max_workers)
|
|
70
|
+
future = []
|
|
71
|
+
while True:
|
|
72
|
+
winsize = self.producer.qsize() if self.producer_end else self.winsize
|
|
73
|
+
while self.producer.qsize() >= winsize and len(future) < self.max_workers:
|
|
74
|
+
data = self.producer.get_window(winsize=winsize, overlap=self.overlap, block=False) # 提取窗口数据
|
|
75
|
+
f = pool.submit(task, data, args, **kwargs)
|
|
76
|
+
future.append(f)
|
|
77
|
+
print(f"producer={self.producer.qsize()} consumer={self.consumer.qsize()} "
|
|
78
|
+
f"winsize={winsize} future={len(future)}")
|
|
79
|
+
if not future: time.sleep(0.1)
|
|
80
|
+
tmp = []
|
|
81
|
+
for f in future:
|
|
82
|
+
try:
|
|
83
|
+
self.consumer.put(f.result(timeout=0.1))
|
|
84
|
+
except Exception as e:
|
|
85
|
+
tmp.append(f)
|
|
86
|
+
future = tmp
|
|
87
|
+
# 生产者队列空,且停止发送数据(pend=True)
|
|
88
|
+
if len(future) == 0 and self.producer_end and self.producer.qsize() == 0:
|
|
89
|
+
print(f"finish consumer thread")
|
|
90
|
+
break
|
|
91
|
+
self.consumer_end = True # 消费者停止处理数据
|
|
92
|
+
|
|
93
|
+
def start_consumer(self, task: Callable, *args, **kwargs):
|
|
94
|
+
"""启动消费者线程
|
|
95
|
+
:param task: 任务函数
|
|
96
|
+
:param args: 任务函数参数
|
|
97
|
+
:param kwargs: 任务函数参数
|
|
98
|
+
:return:
|
|
99
|
+
"""
|
|
100
|
+
thread = threading.Thread(target=self.task_consumer, args=args, kwargs={"task": task, **kwargs})
|
|
101
|
+
thread.daemon = True
|
|
102
|
+
thread.start()
|
|
103
|
+
|
|
104
|
+
def example(self, video, realtime=False, freq=2, vis=True):
|
|
105
|
+
"""
|
|
106
|
+
:param video: 视频文件路径或者摄像头ID
|
|
107
|
+
:param realtime: 是否实时处理视频帧,实时处理会丢弃很多视频帧,非实时会处理所有视频帧,但视频播放会很卡顿
|
|
108
|
+
:param freq:
|
|
109
|
+
:return:
|
|
110
|
+
"""
|
|
111
|
+
# TODO 打开视频文件或摄像头
|
|
112
|
+
w, h, num_frames, fps = image_utils.get_video_info(video)
|
|
113
|
+
interval = int(fps / freq) if fps > 0 else 1
|
|
114
|
+
video_cap = video_utils.video_iterator(video, save_video=None)
|
|
115
|
+
self.start_consumer(task=self.task, param1="123", param2="456") # 启动消费者线程
|
|
116
|
+
# TODO 主线程处理视频帧
|
|
117
|
+
for data_info in video_cap:
|
|
118
|
+
image = data_info["frame"][:, :, ::-1] # BGR to RGB
|
|
119
|
+
image = image_utils.resize_image(image, size=(None, 640))
|
|
120
|
+
data_info["frame"] = image
|
|
121
|
+
# TODO 视频抽帧,放入生产者队列,非实时处理会阻塞,实时处理会丢弃旧的视频帧
|
|
122
|
+
if data_info['count'] % interval == 0:
|
|
123
|
+
# data_info['text'] = text
|
|
124
|
+
# data_info['freq'] = freq
|
|
125
|
+
self.producer.put(data_info, block=not realtime)
|
|
126
|
+
if vis: image_utils.show_image("image", image, delay=20)
|
|
127
|
+
if data_info["finish"]: self.stop_producer() # 标记生产者是否结束
|
|
128
|
+
while self.consumer.qsize() > 0 or (self.producer_end and not self.consumer_end):
|
|
129
|
+
result = self.consumer.pop(block=False, timeout=0.005)
|
|
130
|
+
if result: print(result)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
if __name__ == '__main__':
|
|
134
|
+
# video_file = "/home/PKing/nasdata/Project/LLM/MLLM-Factory/data/video2.mp4"
|
|
135
|
+
video_file = "/home/PKing/Videos/aije-data/检查绝缘手套-nodate-35s.mp4"
|
|
136
|
+
freq = 2
|
|
137
|
+
infer = ProducerConsumer(winsize=freq * 3, max_workers=1)
|
|
138
|
+
result = infer.example(video=video_file, freq=2)
|
|
@@ -61,12 +61,12 @@ def video2gif(video_file, gif_file=None, func=None, interval=1, fps=-1, use_pil=
|
|
|
61
61
|
|
|
62
62
|
def get_video_sampling(freq, time, fps, random=False):
|
|
63
63
|
"""
|
|
64
|
-
|
|
64
|
+
根据抽帧频率和时间范围,获得抽帧时间点和索引
|
|
65
65
|
:param freq: 抽帧频率
|
|
66
66
|
:param time: time: 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
67
67
|
:param fps: 视频帧率FPS
|
|
68
68
|
:param random: 是否随机抽帧(在每一秒内随机抽freq帧)
|
|
69
|
-
:return:
|
|
69
|
+
:return: times,index
|
|
70
70
|
"""
|
|
71
71
|
if freq <= 0: freq = fps
|
|
72
72
|
if random:
|
|
@@ -79,7 +79,8 @@ def get_video_sampling(freq, time, fps, random=False):
|
|
|
79
79
|
times = np.concatenate(times)
|
|
80
80
|
# times = np.sort(np.random.uniform(time[0], time[1], size=freq))
|
|
81
81
|
else:
|
|
82
|
-
times = np.arange(time[0], time[1], 1 / freq)
|
|
82
|
+
times = np.arange(time[0], time[1], 1 / freq) # (
|
|
83
|
+
# 开始时间, 结束时间, 抽帧时间间隔)
|
|
83
84
|
index = times * fps
|
|
84
85
|
index = index.astype(int)
|
|
85
86
|
return times, index
|
|
@@ -338,7 +339,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
338
339
|
video_writer.release()
|
|
339
340
|
|
|
340
341
|
|
|
341
|
-
def video_iterator(video_file
|
|
342
|
+
def video_iterator(video_file, save_video: str or int = None, interval=1, size=(), freq=0,
|
|
342
343
|
task: Callable = None, vis=False, **kwargs):
|
|
343
344
|
"""
|
|
344
345
|
读取摄像头或者视频流迭代器
|
|
@@ -450,3 +451,7 @@ if __name__ == "__main__":
|
|
|
450
451
|
# video2video(video_file, dst_file, vis=True)
|
|
451
452
|
video_file = "/home/PKing/Videos/aije-data/检查绝缘棒.mp4"
|
|
452
453
|
load_video(video_file, time=(0, -1), freq=2, size=(), use_rgb=False)
|
|
454
|
+
|
|
455
|
+
times, index = get_video_sampling(freq=4, time=(0, 4), fps=20, random=False)
|
|
456
|
+
print(times)
|
|
457
|
+
print(index)
|
|
@@ -99,7 +99,6 @@ class VideoFolderDataset(parser_image_folder.FolderDataset):
|
|
|
99
99
|
:param video_file:
|
|
100
100
|
:param size:
|
|
101
101
|
:param use_rgb:
|
|
102
|
-
:param duration: 最大时长
|
|
103
102
|
:param freq: 抽帧频率
|
|
104
103
|
:param use_cut:
|
|
105
104
|
:return:
|
|
@@ -108,7 +107,10 @@ class VideoFolderDataset(parser_image_folder.FolderDataset):
|
|
|
108
107
|
width, height, numFrames, fps = video_utils.get_video_info(video_cap, disp=False)
|
|
109
108
|
time = (0, numFrames / fps)
|
|
110
109
|
video_time, video_idx = video_utils.get_video_sampling(self.freq, time, fps, random=shuffle)
|
|
111
|
-
#
|
|
110
|
+
# TODO 居中裁剪
|
|
111
|
+
clip = (int(len(video_idx) / 2 - self.seq_len / 2), int(len(video_idx) / 2 + self.seq_len / 2))
|
|
112
|
+
clip = (max(clip[0], 0), min(clip[1], len(video_idx)))
|
|
113
|
+
video_idx = video_idx[clip[0]:clip[1]]
|
|
112
114
|
frames = []
|
|
113
115
|
for count in video_idx:
|
|
114
116
|
video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
@@ -120,9 +122,10 @@ class VideoFolderDataset(parser_image_folder.FolderDataset):
|
|
|
120
122
|
if len(frames) < 3: return [] # 帧太少,无效视频
|
|
121
123
|
if len(frames) < self.seq_len:
|
|
122
124
|
pad = self.seq_len - len(frames)
|
|
123
|
-
images = [frames[-1]
|
|
125
|
+
images = [frames[-1]] * pad
|
|
124
126
|
frames += images
|
|
125
|
-
frames = frames[:self.seq_len]
|
|
127
|
+
frames = frames[0:self.seq_len]
|
|
128
|
+
assert len(frames) == self.seq_len, "frames size error:{}".format(len(frames))
|
|
126
129
|
return frames
|
|
127
130
|
|
|
128
131
|
|
|
@@ -94,7 +94,6 @@ class VideoTextDataset(parser_image_text.TextDataset):
|
|
|
94
94
|
:param video_file:
|
|
95
95
|
:param size:
|
|
96
96
|
:param use_rgb:
|
|
97
|
-
:param duration: 最大时长
|
|
98
97
|
:param freq: 抽帧频率
|
|
99
98
|
:param use_cut:
|
|
100
99
|
:return:
|
|
@@ -103,7 +102,10 @@ class VideoTextDataset(parser_image_text.TextDataset):
|
|
|
103
102
|
width, height, numFrames, fps = video_utils.get_video_info(video_cap, disp=False)
|
|
104
103
|
time = (0, numFrames / fps)
|
|
105
104
|
video_time, video_idx = video_utils.get_video_sampling(self.freq, time, fps, random=shuffle)
|
|
106
|
-
#
|
|
105
|
+
# TODO 居中裁剪
|
|
106
|
+
clip = (int(len(video_idx) / 2 - self.seq_len / 2), int(len(video_idx) / 2 + self.seq_len / 2))
|
|
107
|
+
clip = (max(clip[0], 0), min(clip[1], len(video_idx)))
|
|
108
|
+
video_idx = video_idx[clip[0]:clip[1]]
|
|
107
109
|
frames = []
|
|
108
110
|
for count in video_idx:
|
|
109
111
|
video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
@@ -115,9 +117,10 @@ class VideoTextDataset(parser_image_text.TextDataset):
|
|
|
115
117
|
if len(frames) < 3: return [] # 帧太少,无效视频
|
|
116
118
|
if len(frames) < self.seq_len:
|
|
117
119
|
pad = self.seq_len - len(frames)
|
|
118
|
-
images = [frames[-1]
|
|
120
|
+
images = [frames[-1]] * pad
|
|
119
121
|
frames += images
|
|
120
|
-
frames = frames[:self.seq_len]
|
|
122
|
+
frames = frames[0:self.seq_len]
|
|
123
|
+
assert len(frames) == self.seq_len, "frames size error:{}".format(len(frames))
|
|
121
124
|
return frames
|
|
122
125
|
|
|
123
126
|
|
|
@@ -126,10 +129,11 @@ if __name__ == '__main__':
|
|
|
126
129
|
from classifier.dataset import build_dataset
|
|
127
130
|
from pybaseutils import image_utils
|
|
128
131
|
|
|
129
|
-
data_file = ["/home/PKing/nasdata/tmp/UCF101/UCF101/
|
|
132
|
+
data_file = ["/home/PKing/nasdata/tmp/UCF101/UCF101/val.txt"]
|
|
130
133
|
batch_size = 1
|
|
131
134
|
input_size = [224, 224]
|
|
132
|
-
trans_type = "train_video"
|
|
135
|
+
# trans_type = "train_video"
|
|
136
|
+
trans_type = "test_video"
|
|
133
137
|
transform = build_transform.image_transform(input_size=input_size, trans_type=trans_type)
|
|
134
138
|
cfg = {"duration": 5, "freq": 2}
|
|
135
139
|
class_name = ["ApplyEyeMakeup", "ApplyLipstick", "Archery"]
|
|
@@ -143,7 +147,7 @@ if __name__ == '__main__':
|
|
|
143
147
|
cfg=cfg,
|
|
144
148
|
disp=True)
|
|
145
149
|
for i in range(len(dataset)):
|
|
146
|
-
data = dataset.__getitem__(
|
|
150
|
+
data = dataset.__getitem__(0)
|
|
147
151
|
video_file, image, label = data["file"], data["image"], data["label"]
|
|
148
152
|
image = image.transpose((1, 2, 3, 0))
|
|
149
153
|
image = np.asarray((image * 0.5 + 0.5) * 255, dtype=np.uint8)
|
|
@@ -719,26 +719,40 @@ def resize_image_clip(image, clip_max=1920, interpolation=cv2.INTER_LINEAR):
|
|
|
719
719
|
return image
|
|
720
720
|
|
|
721
721
|
|
|
722
|
+
def autosize(size, dsize):
|
|
723
|
+
"""
|
|
724
|
+
自动调整图像大小
|
|
725
|
+
:param size : 原始图像大小 (width, height) image.shape[:2][::-1] or image.size
|
|
726
|
+
:param dsize: 目标图像大小 (width, height)
|
|
727
|
+
:return: 调整后的图像大小 (width, height)
|
|
728
|
+
"""
|
|
729
|
+
if not dsize: return size
|
|
730
|
+
dsize = (dsize, dsize) if isinstance(dsize, numbers.Number) else dsize
|
|
731
|
+
dw, dh = dsize
|
|
732
|
+
sw, sh = size
|
|
733
|
+
if (dh is None) and (dw is None): # 错误写法:resize_height and resize_width is None
|
|
734
|
+
return None
|
|
735
|
+
if dh is None:
|
|
736
|
+
dh = int(sh * dw / sw)
|
|
737
|
+
elif dw is None:
|
|
738
|
+
dw = int(sw * dh / sh)
|
|
739
|
+
dsize = (int(dw), int(dh))
|
|
740
|
+
return dsize
|
|
741
|
+
|
|
742
|
+
|
|
722
743
|
def resize_image(image, size: Tuple, interpolation=cv2.INTER_LINEAR):
|
|
723
744
|
"""
|
|
724
745
|
tf.image.resize_images(images,size),images=[batch, height, width, channels],size=(new_height, new_width)
|
|
725
746
|
cv2.resize(image, dsize=(width, height)),与image.shape相反
|
|
726
747
|
images[50,10]与image.shape的原理相同,它表示的是image=(y=50,x=10)
|
|
727
748
|
:param image:
|
|
728
|
-
:param size: (width,height)
|
|
749
|
+
:param size: (width,height) image.shape[:2][::-1] or image.size
|
|
729
750
|
:return:
|
|
730
751
|
"""
|
|
731
752
|
if not size: return image
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
if (dh is None) and (dw is None): # 错误写法:resize_height and resize_width is None
|
|
736
|
-
return image
|
|
737
|
-
if dh is None:
|
|
738
|
-
dh = int(sh * dw / sw)
|
|
739
|
-
elif dw is None:
|
|
740
|
-
dw = int(sw * dh / sh)
|
|
741
|
-
image = cv2.resize(image, dsize=(int(dw), int(dh)), interpolation=interpolation)
|
|
753
|
+
ssize = image.shape[:2][::-1]
|
|
754
|
+
dsize = autosize(ssize, size)
|
|
755
|
+
if size and dsize: image = cv2.resize(image, dsize=dsize, interpolation=interpolation)
|
|
742
756
|
return image
|
|
743
757
|
|
|
744
758
|
|
|
@@ -2410,6 +2424,23 @@ def boxes2polygons(boxes: np.ndarray or List[np.ndarray]):
|
|
|
2410
2424
|
return polygons
|
|
2411
2425
|
|
|
2412
2426
|
|
|
2427
|
+
def get_point_circle_contour(points, r, nums=16):
|
|
2428
|
+
"""
|
|
2429
|
+
以给定的中心坐标和半径生成圆的轮廓点
|
|
2430
|
+
:param points: (n_points, 2),圆的中心坐标 (x, y)
|
|
2431
|
+
:param r: 圆的半径
|
|
2432
|
+
:param nums: 轮廓点的数量
|
|
2433
|
+
:return: 圆的轮廓点坐标数组 (n_points,nums, 2)
|
|
2434
|
+
"""
|
|
2435
|
+
if len(points) == 0: return points
|
|
2436
|
+
if not isinstance(points, np.ndarray): points = np.asarray(points)
|
|
2437
|
+
theta = np.linspace(0, 2 * np.pi, nums, endpoint=False)
|
|
2438
|
+
x_contour = points[:, 0:1] + r * np.cos(theta)
|
|
2439
|
+
y_contour = points[:, 1:2] + r * np.sin(theta)
|
|
2440
|
+
output = np.concatenate((x_contour[:, :, None], y_contour[:, :, None]), axis=2)
|
|
2441
|
+
return output
|
|
2442
|
+
|
|
2443
|
+
|
|
2413
2444
|
def get_mask_iou(mask1, mask2, binarize=True, iom=False):
|
|
2414
2445
|
"""
|
|
2415
2446
|
计算IOU=交集(A,B)/并集(A,B)
|
|
@@ -2659,7 +2690,7 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
|
|
|
2659
2690
|
:param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
|
|
2660
2691
|
:param texts:轮廓文本
|
|
2661
2692
|
:param color:绘制轮廓的颜色
|
|
2662
|
-
:param alpha:绘制颜色的透明度
|
|
2693
|
+
:param alpha:绘制颜色的透明度 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
|
|
2663
2694
|
:param thickness:轮廓线宽
|
|
2664
2695
|
:return:
|
|
2665
2696
|
"""
|
|
@@ -3131,7 +3162,7 @@ def image_composite(image: np.ndarray, alpha: np.ndarray, bg_img=(219, 142, 67))
|
|
|
3131
3162
|
https://blog.csdn.net/guduruyu/article/details/71439733
|
|
3132
3163
|
更有效的C++实现: https://www.aiuai.cn/aifarm1237.html
|
|
3133
3164
|
:param image: RGB图像(uint8)
|
|
3134
|
-
:param alpha: 单通道的alpha图像(uint8)
|
|
3165
|
+
:param alpha: 单通道的alpha图像(uint8), 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
|
|
3135
3166
|
:param bg_img: 背景图像,可以是任意的分辨率图像,也可以指定指定纯色的背景
|
|
3136
3167
|
:return: 返回与背景合成的图像
|
|
3137
3168
|
"""
|
|
@@ -3268,10 +3299,10 @@ def get_video_capture(video, width=None, height=None, fps=None):
|
|
|
3268
3299
|
return video_cap
|
|
3269
3300
|
|
|
3270
3301
|
|
|
3271
|
-
def get_video_info(video_cap
|
|
3302
|
+
def get_video_info(video_cap, disp=True, **kwargs):
|
|
3272
3303
|
"""
|
|
3273
3304
|
获得视频的基础信息
|
|
3274
|
-
:param video_cap:视频对象 或者视频文件路径
|
|
3305
|
+
:param video_cap:视频对象 或者视频文件路径 int | str | cv2.VideoCapture
|
|
3275
3306
|
:param disp: 是否显示视频信息
|
|
3276
3307
|
:return:
|
|
3277
3308
|
"""
|
|
@@ -64,12 +64,13 @@ def get_confusion_matrix(true_labels, pred_labels, target_names=None, filename=N
|
|
|
64
64
|
return conf_matrix
|
|
65
65
|
|
|
66
66
|
|
|
67
|
-
def
|
|
67
|
+
def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
|
|
68
|
+
output_dict=False, matrix=False, plot=False):
|
|
68
69
|
"""
|
|
69
70
|
true_labels = [0, 1, 2, 3, 4, 1] # Y
|
|
70
71
|
pred_labels = [0, 1, 1, 2, 2, 1] # X
|
|
71
72
|
target_names = ["A", "B", "C", "D", "E"]
|
|
72
|
-
out_result =
|
|
73
|
+
out_result = get_metrics_report(true_labels, pred_labels, target_names=target_names, output_dict=False)
|
|
73
74
|
宏平均(macro avg)和微平均(micro avg)
|
|
74
75
|
如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异
|
|
75
76
|
如果每个class的样本数量差异很大,而且你想:
|
|
@@ -77,21 +78,24 @@ def get_classification_report(true_labels, pred_labels, labels=None, target_name
|
|
|
77
78
|
更注重样本量少的class:使用宏平均,若宏平均比微平均小,应检查样本量少的class
|
|
78
79
|
:param true_labels:
|
|
79
80
|
:param pred_labels:
|
|
80
|
-
:param labels:
|
|
81
81
|
:param target_names:
|
|
82
|
+
:param labels:
|
|
82
83
|
:param output_dict:
|
|
84
|
+
:param matrix: 是否绘制混淆矩阵
|
|
83
85
|
:return:
|
|
84
86
|
"""
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
# if target_names is None:
|
|
88
|
+
# target_names = list(set(pred_labels) | set(true_labels))
|
|
89
|
+
# else:
|
|
90
|
+
# true_labels = [target_names[int(i)] for i in true_labels]
|
|
91
|
+
# pred_labels = [target_names[int(i)] for i in pred_labels]
|
|
89
92
|
result = metrics.classification_report(true_labels,
|
|
90
93
|
pred_labels,
|
|
91
94
|
labels=labels,
|
|
92
95
|
digits=4,
|
|
93
96
|
target_names=target_names,
|
|
94
|
-
output_dict=output_dict
|
|
97
|
+
output_dict=output_dict,
|
|
98
|
+
zero_division=0)
|
|
95
99
|
if output_dict:
|
|
96
100
|
macro_avg = result["macro avg"]
|
|
97
101
|
accuracy = result["accuracy"]
|
|
@@ -99,12 +103,18 @@ def get_classification_report(true_labels, pred_labels, labels=None, target_name
|
|
|
99
103
|
out_result = {"macro_avg": macro_avg, "accuracy": accuracy, "weighted_avg": weighted_avg}
|
|
100
104
|
# pdf=pd.DataFrame.from_dict(result)
|
|
101
105
|
# save_csv("classification_report.csv", pdf)
|
|
102
|
-
|
|
103
106
|
else:
|
|
104
107
|
out_result = result
|
|
108
|
+
if matrix:
|
|
109
|
+
conf_matrix = get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
|
|
110
|
+
normalization=True, plot=plot, title="Confusion Matrix")
|
|
111
|
+
# out_result["confusion_matrix"] = conf_matrix
|
|
105
112
|
return out_result
|
|
106
113
|
|
|
107
114
|
|
|
115
|
+
get_classification_report = get_metrics_report
|
|
116
|
+
|
|
117
|
+
|
|
108
118
|
def create_dir(parent_dir, dir1=None, filename=None):
|
|
109
119
|
"""
|
|
110
120
|
create directory
|
|
@@ -136,13 +146,13 @@ def create_file_path(filename):
|
|
|
136
146
|
|
|
137
147
|
|
|
138
148
|
if __name__ == "__main__":
|
|
139
|
-
true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
|
|
140
|
-
pred_labels = [1, 1, 2, 2, 2, 1, 0] # X
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
target_names = ["A0", "B1", "C2", "D3"]
|
|
144
|
-
|
|
145
|
-
|
|
149
|
+
# true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
|
|
150
|
+
# pred_labels = [1, 1, 2, 2, 2, 1, 0] # X
|
|
151
|
+
true_labels = ["A", "B", "A", "B"]
|
|
152
|
+
pred_labels = ["A", "B", "A", "B"]
|
|
153
|
+
# target_names = ["A0", "B1", "C2", "D3"]
|
|
154
|
+
target_names = None
|
|
155
|
+
confuse_file = "./confuse.csv"
|
|
156
|
+
out_result = get_classification_report(true_labels, pred_labels, target_names=target_names, output_dict=False,
|
|
157
|
+
matrix=True, plot=True)
|
|
146
158
|
print(out_result)
|
|
147
|
-
get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
|
|
148
|
-
normalization=False, filename=confuse_file, plot=True, title="Confusion Matrix")
|
|
@@ -151,7 +151,10 @@ class ThreadPool(object):
|
|
|
151
151
|
"""
|
|
152
152
|
递交线程任务
|
|
153
153
|
pool=thread_utils.ThreadPool(max_workers=1)
|
|
154
|
-
pool.submit(func, args=(参数1,参数2,参数3,...))
|
|
154
|
+
future = pool.submit(func, args=(参数1,参数2,参数3,...))
|
|
155
|
+
print(future.done()) # 是否完成
|
|
156
|
+
result = future.result() # 等待线程任务完成,获取结果
|
|
157
|
+
print(future.done()) # 是否完成
|
|
155
158
|
:param func:
|
|
156
159
|
:param args:
|
|
157
160
|
:param kwargs:
|
|
@@ -250,13 +253,14 @@ def performanceThreadPool():
|
|
|
250
253
|
pool = ThreadPool(max_workers=2)
|
|
251
254
|
future = pool.submit(consumer, "1.jpg", "2.jpg")
|
|
252
255
|
future = pool.submit(consumer, "1.jpg", "2.jpg")
|
|
253
|
-
future = pool.submit(consumer, "1.jpg", "2.jpg")
|
|
256
|
+
# future = pool.submit(consumer, "1.jpg", "2.jpg")
|
|
254
257
|
print(future.done())
|
|
255
|
-
result = future.result()
|
|
258
|
+
result = future.result() # 等待线程任务完成,获取结果
|
|
256
259
|
print(future.done())
|
|
257
260
|
print("result:{}".format(result))
|
|
258
261
|
time.sleep(1)
|
|
259
262
|
|
|
263
|
+
|
|
260
264
|
def performanceThreadPool2():
|
|
261
265
|
from pybaseutils import time_utils
|
|
262
266
|
pool = ThreadPool(max_workers=2)
|
|
@@ -43,6 +43,7 @@ pybaseutils/audio/vad_utils.py
|
|
|
43
43
|
pybaseutils/base/__init__.py
|
|
44
44
|
pybaseutils/base/dict_queue.py
|
|
45
45
|
pybaseutils/base/list_queue.py
|
|
46
|
+
pybaseutils/base/producer_consumer.py
|
|
46
47
|
pybaseutils/build_utils/__init__.py
|
|
47
48
|
pybaseutils/build_utils/cython_utils.py
|
|
48
49
|
pybaseutils/build_utils/pyarmor_utils.py
|
|
@@ -293,6 +294,8 @@ test_py/milvus_demo/hello_milvus.py
|
|
|
293
294
|
test_py/milvus_demo/milvus_client.py
|
|
294
295
|
test_py/pose/__init__.py
|
|
295
296
|
test_py/pose/human_pose.py
|
|
297
|
+
test_py/qrcode/__init__.py
|
|
298
|
+
test_py/qrcode/demo.py
|
|
296
299
|
test_py/redis_py/__init__.py
|
|
297
300
|
test_py/redis_py/knn_search.py
|
|
298
301
|
test_py/redis_py/redis_client.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -99,11 +99,12 @@ if __name__ == '__main__':
|
|
|
99
99
|
"""
|
|
100
100
|
对labelme的数据目标进行裁剪,用于制作分类数据集
|
|
101
101
|
"""
|
|
102
|
+
# TODO 蓝色长条标签和鞋套是否相似
|
|
102
103
|
target_name = ['身穿工作服', '未穿工作服',
|
|
103
104
|
'绝缘鞋', '脚穿绝缘鞋', '长筒靴', '脚穿长筒靴', '其他鞋', '脚穿其他鞋', '脚穿鞋套',
|
|
104
105
|
'手', '绝缘手套', '手穿绝缘手套', '棉纱手套', '手穿棉纱手套', '其他手套', '手穿其他手套',
|
|
105
106
|
'胶枪灯', '胶枪灯红色', '胶枪灯绿色',
|
|
106
|
-
'PDA', 'PDA*', '手与*接触','电视柜台面'
|
|
107
|
+
'PDA', 'PDA*', '手与*接触', '电视柜台面'
|
|
107
108
|
]
|
|
108
109
|
# '*长条标签'
|
|
109
110
|
datasets = [
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : PKing
|
|
4
|
+
@E-mail : 390737991@qq.com
|
|
5
|
+
@Date : 2022-12-31 11:37:30
|
|
6
|
+
@Brief : https://blog.csdn.net/qdPython/article/details/121381363
|
|
7
|
+
"""
|
|
8
|
+
import os
|
|
9
|
+
import cv2
|
|
10
|
+
import random
|
|
11
|
+
import types
|
|
12
|
+
import torch
|
|
13
|
+
import numbers
|
|
14
|
+
from typing import List, Tuple, Dict
|
|
15
|
+
import numpy as np
|
|
16
|
+
from typing import Callable
|
|
17
|
+
from PIL import Image
|
|
18
|
+
from pybaseutils import image_utils, file_utils, text_utils, pandas_utils, json_utils, base64_utils
|
|
19
|
+
import numpy as np
|
|
20
|
+
import cv2
|
|
21
|
+
import math
|
|
22
|
+
|
|
23
|
+
import threading
|
|
24
|
+
import time
|
|
25
|
+
|
|
26
|
+
import numpy as np
|
|
27
|
+
|
|
28
|
+
from test_py.aije.示例代码.MobileNetV2 import output
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def cal_contour_mean(image, contours):
|
|
32
|
+
"""
|
|
33
|
+
计算指定轮廓内像素的平均值
|
|
34
|
+
:param image:
|
|
35
|
+
:param contours:
|
|
36
|
+
:return:
|
|
37
|
+
"""
|
|
38
|
+
output = []
|
|
39
|
+
for c in contours:
|
|
40
|
+
mask = np.zeros(image.shape[:2], dtype=np.uint8)
|
|
41
|
+
cv2.drawContours(mask, [c], -1, 255, -1) # 填充指定轮廓(白色)
|
|
42
|
+
mean = cv2.mean(image, mask=mask) # 计算掩膜内像素的平均值
|
|
43
|
+
output.append(mean)
|
|
44
|
+
return output
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
if __name__ == '__main__':
|
|
48
|
+
image_file = "/home/PKing/nasdata/dataset-dmai/AILT/ailt-line/dataset-20251216-test/images/20251216_191638_主视_13300.jpg"
|
|
49
|
+
image = cv2.imread(image_file)
|
|
50
|
+
centers = [[100, 200], [300, 400], [500, 600]]
|
|
@@ -21,8 +21,9 @@ def video2frames_demo(root, out, vis=False):
|
|
|
21
21
|
# video_utils.video2frames_similarity(video_file, out_dir=out, func=None, interval=20, thresh=0.3, vis=True)
|
|
22
22
|
video_utils.video2frames(video_file, out_dir=out, task=None, interval=20, vis=vis, prefix="")
|
|
23
23
|
|
|
24
|
+
|
|
24
25
|
if __name__ == "__main__":
|
|
25
|
-
root = "/home/PKing/edudata/dataset/AIJE/【TOP】技能人才系统_数据集管理/06-联通岗评/02-训练数据/联通入户布线
|
|
26
|
+
root = "/home/PKing/edudata/dataset/AIJE/【TOP】技能人才系统_数据集管理/06-联通岗评/02-训练数据/联通入户布线_156_20251219_180523-胶枪打胶专题数据/20251219_180523_主视.mp4"
|
|
26
27
|
out = os.path.join(os.path.dirname(root), "frames")
|
|
27
28
|
# out = os.path.join(root, "frames")
|
|
28
29
|
video2frames_demo(root, out)
|