pybaseutils 2.4.6__tar.gz → 2.4.8__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.6 → pybaseutils-2.4.8}/PKG-INFO +1 -1
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base/list_queue.py +5 -0
- pybaseutils-2.4.8/pybaseutils/base/producer_consumer.py +155 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base64_utils.py +2 -2
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/video_utils.py +30 -26
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_labelme.py +22 -16
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dict_uils.py +2 -1
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/image_utils.py +19 -14
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/json_utils.py +28 -2
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/singleton_utils.py +3 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/SOURCES.txt +4 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/setup.cfg +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_labelme_crop_ailt.py +7 -4
- pybaseutils-2.4.8/test_py/aije/demo_motion_blur.py +91 -0
- pybaseutils-2.4.8/test_py/aije/demo_video_aije.py +42 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/parking_rois_gopro.py +0 -0
- pybaseutils-2.4.8/test_py/demo1.py +46 -0
- pybaseutils-2.4.8/test_py/demo2.py +69 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_gif_video.py +4 -4
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_lableme_vis.py +1 -5
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_nii.py +5 -5
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_video2frame.py +5 -4
- pybaseutils-2.4.8/test_py/fast_api/__init__.py +9 -0
- pybaseutils-2.4.8/test_py/fast_api/create_image_url.py +55 -0
- pybaseutils-2.4.8/test_py/fast_api/get_image_url.py +88 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/qrcode/demo.py +0 -0
- pybaseutils-2.4.8/test_py/registry/main.py +23 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/chat_service.py +52 -28
- pybaseutils-2.4.6/pybaseutils/base/producer_consumer.py +0 -138
- pybaseutils-2.4.6/test_py/aije/demo_video_aije.py +0 -97
- pybaseutils-2.4.6/test_py/demo1.py +0 -21
- pybaseutils-2.4.6/test_py/demo2.py +0 -50
- pybaseutils-2.4.6/test_py/registry/main.py +0 -62
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/LICENCE +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/README.md +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/file_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/setup.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo4.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/performance.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.6 → pybaseutils-2.4.8}/test_py/web_socket/asr_service.py +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
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.log = kwargs.get('log', print) if kwargs.get('log', print) else print
|
|
32
|
+
self.winsize = winsize
|
|
33
|
+
self.overlap = overlap
|
|
34
|
+
self.max_workers = max_workers
|
|
35
|
+
self.kwargs = kwargs
|
|
36
|
+
self.producer = list_queue.Queue(maxsize=self.winsize) # 生产者
|
|
37
|
+
self.consumer = list_queue.Queue(maxsize=self.winsize) # 消费者
|
|
38
|
+
self.producer_end = False # 生产者是否结束
|
|
39
|
+
self.consumer_end = False # 消费者是否结束
|
|
40
|
+
|
|
41
|
+
def stop_producer(self):
|
|
42
|
+
"""
|
|
43
|
+
停止生产者线程
|
|
44
|
+
:return:
|
|
45
|
+
"""
|
|
46
|
+
self.producer_end = True
|
|
47
|
+
self.log("stop producer")
|
|
48
|
+
|
|
49
|
+
def stop_consumer(self):
|
|
50
|
+
"""
|
|
51
|
+
停止消费者线程
|
|
52
|
+
:return:
|
|
53
|
+
"""
|
|
54
|
+
self.consumer_end = True
|
|
55
|
+
self.log("stop consumer")
|
|
56
|
+
|
|
57
|
+
def task(self, data: List, *args, **kwargs):
|
|
58
|
+
"""
|
|
59
|
+
任务函数,处理输入数据
|
|
60
|
+
:param data: 输入数据
|
|
61
|
+
:return: 处理结果
|
|
62
|
+
"""
|
|
63
|
+
self.log(f"args ={args},kwargs={kwargs}")
|
|
64
|
+
time.sleep(3)
|
|
65
|
+
result = "收到消息:" + file_utils.get_time(format="s")
|
|
66
|
+
return result
|
|
67
|
+
|
|
68
|
+
def task_consumer(self, task, *args, **kwargs):
|
|
69
|
+
"""消费者任务"""
|
|
70
|
+
self.log(f"start consumer thread")
|
|
71
|
+
self.consumer_end = False
|
|
72
|
+
pool = thread_utils.ThreadPool(max_workers=self.max_workers)
|
|
73
|
+
future = []
|
|
74
|
+
while True:
|
|
75
|
+
# winsize = self.producer.qsize() if self.producer_end else self.winsize
|
|
76
|
+
if self.producer_end and self.producer.qsize() <= self.winsize:
|
|
77
|
+
winsize, overlap = self.producer.qsize(), 0 # TODO 如果生产者已经结束,则一次性处理剩余的数据
|
|
78
|
+
else:
|
|
79
|
+
winsize, overlap = self.winsize, self.overlap
|
|
80
|
+
while self.producer.qsize() >= winsize > 0 and len(future) < self.max_workers:
|
|
81
|
+
data = self.producer.get_window(winsize=winsize, overlap=overlap, block=False) # 提取窗口数据
|
|
82
|
+
f = pool.submit(task, data, args, **kwargs)
|
|
83
|
+
future.append(f)
|
|
84
|
+
self.log(f"tid={id(f)} producer={self.producer.qsize()} consumer={self.consumer.qsize()} "
|
|
85
|
+
f"winsize={winsize} future={len(future)} ")
|
|
86
|
+
if not future: time.sleep(0.1)
|
|
87
|
+
tmp = []
|
|
88
|
+
for f in future:
|
|
89
|
+
try:
|
|
90
|
+
self.consumer.put(f.result(timeout=0.1))
|
|
91
|
+
except Exception as e:
|
|
92
|
+
tmp.append(f)
|
|
93
|
+
future = tmp
|
|
94
|
+
# 生产者队列空,且停止发送数据(pend=True)
|
|
95
|
+
if len(future) == 0 and self.producer_end and self.producer.qsize() == 0:
|
|
96
|
+
print(f"finish consumer thread")
|
|
97
|
+
break
|
|
98
|
+
self.stop_consumer() # 消费者停止处理数据
|
|
99
|
+
|
|
100
|
+
def start_consumer(self, task: Callable, *args, **kwargs):
|
|
101
|
+
"""启动消费者线程
|
|
102
|
+
:param task: 任务函数
|
|
103
|
+
:param args: 任务函数参数
|
|
104
|
+
:param kwargs: 任务函数参数
|
|
105
|
+
:return:
|
|
106
|
+
"""
|
|
107
|
+
thread = threading.Thread(target=self.task_consumer, args=args, kwargs={"task": task, **kwargs})
|
|
108
|
+
thread.daemon = True
|
|
109
|
+
thread.start()
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def example(text, video, realtime=False, freq=2, wintime=3, overlap=0.5, max_workers=2, delay=20, vis=True, **kwargs):
|
|
113
|
+
"""
|
|
114
|
+
实时分析功能,从视频中提取帧进行分析
|
|
115
|
+
:param text: 用户问题/任务描述
|
|
116
|
+
:param video: 视频文件路径或者摄像头ID
|
|
117
|
+
:param realtime: 是否实时处理视频帧,实时处理会丢弃很多视频帧,非实时会处理所有视频帧,但视频播放会很卡顿
|
|
118
|
+
:param freq: 视频帧提取频率(Hz)
|
|
119
|
+
:param wintime: 窗口时间长度,单位秒
|
|
120
|
+
:param overlap: 滑动窗口重叠比例
|
|
121
|
+
:param max_workers: 视频处理线程数
|
|
122
|
+
:return:
|
|
123
|
+
"""
|
|
124
|
+
winsize = int(wintime * freq)
|
|
125
|
+
pc = ProducerConsumer(winsize=winsize, overlap=overlap, max_workers=max_workers, **kwargs)
|
|
126
|
+
# TODO 打开视频文件或摄像头
|
|
127
|
+
w, h, num_frames, fps = image_utils.get_video_info(video)
|
|
128
|
+
fpm = 1 / fps
|
|
129
|
+
interval = int(fps / freq) if fps > 0 else 1
|
|
130
|
+
video_cap = video_utils.video_iterator(video, save_video=None)
|
|
131
|
+
pc.start_consumer(task=pc.task, text=text, freq=freq) # 启动消费者线程
|
|
132
|
+
# TODO 主线程处理视频帧
|
|
133
|
+
for data_info in video_cap:
|
|
134
|
+
t1 = time.time()
|
|
135
|
+
image = data_info["frame"][:, :, ::-1] # BGR to RGB
|
|
136
|
+
image = image_utils.resize_image(image, size=(None, 640))
|
|
137
|
+
data_info["frame"] = image
|
|
138
|
+
# TODO 视频抽帧,放入生产者队列,非实时处理会阻塞,实时处理会丢弃旧的视频帧
|
|
139
|
+
if data_info['count'] % interval == 0:
|
|
140
|
+
# data_info['text'] = text
|
|
141
|
+
# data_info['freq'] = freq
|
|
142
|
+
pc.producer.put(data_info, block=not realtime)
|
|
143
|
+
if vis: image_utils.show_image("image", image, delay=1, use_rgb=True)
|
|
144
|
+
if data_info["finish"]: pc.stop_producer() # 标记生产者是否结束
|
|
145
|
+
td = time.time() - t1 # 秒
|
|
146
|
+
time.sleep(max(0.0, fpm - td)) # 保证视频有40ms延时
|
|
147
|
+
while pc.consumer.qsize() > 0 or (pc.producer_end and not pc.consumer_end):
|
|
148
|
+
result = pc.consumer.pop(block=False, timeout=0.005)
|
|
149
|
+
if result: print("result={}".format(result))
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
if __name__ == '__main__':
|
|
153
|
+
text = "请分析这个视频"
|
|
154
|
+
video_file = "/home/PKing/Videos/video4.mp4"
|
|
155
|
+
example(text=text, video=video_file, freq=2)
|
|
@@ -159,8 +159,8 @@ if __name__ == "__main__":
|
|
|
159
159
|
print(image_file)
|
|
160
160
|
src = image_utils.read_image(image_file, use_rgb=True)
|
|
161
161
|
image_base64 = image2base64(src, prefix="data:image/jpeg;base64,", )
|
|
162
|
-
|
|
163
|
-
data = {"image":
|
|
162
|
+
pltimg = Image.fromarray(src)
|
|
163
|
+
data = {"image": pltimg, "file": image_file}
|
|
164
164
|
data = serialization(data)
|
|
165
165
|
data = deserialization(data)
|
|
166
166
|
dst = data["image"]
|
|
@@ -11,6 +11,7 @@ import os
|
|
|
11
11
|
import cv2
|
|
12
12
|
import numpy as np
|
|
13
13
|
import math
|
|
14
|
+
import time as timelib
|
|
14
15
|
from typing import Callable
|
|
15
16
|
from tqdm import tqdm
|
|
16
17
|
from pybaseutils import image_utils, file_utils
|
|
@@ -147,11 +148,11 @@ def video2frames(video_file, out_dir=None, task: Callable = None, interval=1, si
|
|
|
147
148
|
frame_file = os.path.join(out_dir, "{}_{:0=5d}.jpg".format(filename, count))
|
|
148
149
|
cv2.imwrite(frame_file, frame)
|
|
149
150
|
data_info["file"] = frame_file
|
|
150
|
-
frames.append(data_info)
|
|
151
|
+
if not out_dir: frames.append(data_info)
|
|
151
152
|
return frames
|
|
152
153
|
|
|
153
154
|
|
|
154
|
-
def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thresh=0.3, vis=True, **kwargs):
|
|
155
|
+
def video2frames_similarity(video_file, out_dir=None, func=None, prefix="", interval=1, thresh=0.3, vis=True, **kwargs):
|
|
155
156
|
"""
|
|
156
157
|
视频抽帧图像
|
|
157
158
|
:param video_file: 视频文件
|
|
@@ -162,7 +163,8 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
|
|
|
162
163
|
:return:
|
|
163
164
|
"""
|
|
164
165
|
sm = monitor.StatusMonitor()
|
|
165
|
-
name = os.path.basename(video_file).split(".")[0]
|
|
166
|
+
name = os.path.basename(video_file).split(".")[0].replace("-", "_")
|
|
167
|
+
if prefix: name = f"{prefix}_{name}"
|
|
166
168
|
if not out_dir: out_dir = os.path.join(os.path.dirname(video_file), name)
|
|
167
169
|
video_cap = get_video_capture(video_file)
|
|
168
170
|
width, height, num_frames, fps = get_video_info(video_cap, **kwargs)
|
|
@@ -181,13 +183,13 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
|
|
|
181
183
|
last_frame = curr_frame.copy()
|
|
182
184
|
diff = sm.get_frame_similarity(curr_frame, last_frame, size=(256, 256), vis=False)
|
|
183
185
|
if diff > thresh:
|
|
184
|
-
frame_file = os.path.join(out_dir, "{}_{:0=
|
|
186
|
+
frame_file = os.path.join(out_dir, "{}_{:0=6d}.jpg".format(name, count))
|
|
185
187
|
last_frame = curr_frame.copy()
|
|
186
188
|
cv2.imwrite(frame_file, curr_frame)
|
|
187
189
|
frame_files.append(frame_file)
|
|
188
190
|
if vis:
|
|
189
191
|
text = "TH={},diff={:3.3f}".format(thresh, diff)
|
|
190
|
-
image = image_utils.draw_text(curr_frame, point=(10,
|
|
192
|
+
image = image_utils.draw_text(curr_frame, point=(10, 100), color=(0, 255, 0),
|
|
191
193
|
text=text, drawType="simple")
|
|
192
194
|
image = image_utils.cv_show_image("image", image, delay=5)
|
|
193
195
|
count += 1
|
|
@@ -245,7 +247,7 @@ def video2video(video_file: int or str, save_video: str or int, interval=1, size
|
|
|
245
247
|
:param interval: 间隔
|
|
246
248
|
:return:
|
|
247
249
|
"""
|
|
248
|
-
video_capture(
|
|
250
|
+
video_capture(video=video_file, save_video=save_video, interval=interval, size=size, freq=freq, task=task,
|
|
249
251
|
vis=vis, **kwargs)
|
|
250
252
|
|
|
251
253
|
|
|
@@ -284,11 +286,11 @@ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True,
|
|
|
284
286
|
video_writer.release()
|
|
285
287
|
|
|
286
288
|
|
|
287
|
-
def video_capture(
|
|
289
|
+
def video_capture(video: int or str, save_video: str or int = None, interval=1, size=(), freq=0,
|
|
288
290
|
task: Callable = None, vis=True, **kwargs):
|
|
289
291
|
"""
|
|
290
292
|
读取摄像头或者视频流
|
|
291
|
-
:param
|
|
293
|
+
:param video: String 视频文件,如*.avi,*.mp4,...
|
|
292
294
|
Int 摄像头ID,如0,1,2
|
|
293
295
|
:param save_video: 保存task视频处理后的结果
|
|
294
296
|
:param interval: 抽帧处理间隔
|
|
@@ -299,13 +301,13 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
299
301
|
title: 控制显示窗口名
|
|
300
302
|
:return:
|
|
301
303
|
"""
|
|
302
|
-
|
|
303
|
-
if isinstance(
|
|
304
|
-
assert os.path.exists(
|
|
305
|
-
video_cap = image_utils.get_video_capture(
|
|
304
|
+
video = file_utils.str2number(video)
|
|
305
|
+
if isinstance(video, str) and os.path.isfile(video):
|
|
306
|
+
assert os.path.exists(video), f"video={video}"
|
|
307
|
+
video_cap = image_utils.get_video_capture(video, fps=None)
|
|
306
308
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
|
|
307
309
|
time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
308
|
-
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置
|
|
310
|
+
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
|
|
309
311
|
start, end = 0, -1
|
|
310
312
|
if time and fps > 0:
|
|
311
313
|
start, end = int(time[0] * fps), int(time[1] * fps)
|
|
@@ -322,7 +324,7 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
322
324
|
ret, frame = video_cap.read()
|
|
323
325
|
if count % interval == 0 and count >= start:
|
|
324
326
|
# TODO 设置抽帧的位置,但某些格式视频容易出现问题
|
|
325
|
-
# if isinstance(
|
|
327
|
+
# if isinstance(video, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
326
328
|
# ret, frame = video_cap.read()
|
|
327
329
|
if not ret or 0 < end < count or frame is None: break
|
|
328
330
|
if size: frame = image_utils.resize_image(frame, size=size)
|
|
@@ -339,17 +341,17 @@ def video_capture(video_file: int or str, save_video: str or int = None, interva
|
|
|
339
341
|
video_writer.release()
|
|
340
342
|
|
|
341
343
|
|
|
342
|
-
def video_iterator(
|
|
344
|
+
def video_iterator(video, save_video: str or int = None, interval=1, size=(), freq=0,
|
|
343
345
|
task: Callable = None, vis=False, **kwargs):
|
|
344
346
|
"""
|
|
345
347
|
读取摄像头或者视频流迭代器
|
|
346
348
|
Usage:
|
|
347
349
|
from pybaseutils.cvutils import video_utils
|
|
348
|
-
video_cap = video_utils.video_iterator(
|
|
350
|
+
video_cap = video_utils.video_iterator(video, save_video, time=(4, 10))
|
|
349
351
|
for data_info in video_cap:
|
|
350
352
|
frame = data_info["frame"]
|
|
351
353
|
...
|
|
352
|
-
:param
|
|
354
|
+
:param video: String 视频文件,如*.avi,*.mp4,...
|
|
353
355
|
Int 摄像头ID,如0,1,2
|
|
354
356
|
:param save_video: 保存task视频处理后的结果
|
|
355
357
|
:param interval: 抽帧处理间隔,当interval=-1,表示当interval=fps,即一秒一帧
|
|
@@ -360,20 +362,20 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
|
|
|
360
362
|
delay: 控制显示延时,默认10S
|
|
361
363
|
title: 控制显示窗口名,默认video
|
|
362
364
|
time: 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
363
|
-
clip: 开始播放位置
|
|
365
|
+
clip: 开始播放位置clip[0],结束播放位置clip[1]
|
|
364
366
|
speed: 保存视频的播放速度,默认是播放帧率
|
|
365
367
|
save_fps: 保存视频的帧率,默认是播放帧率
|
|
366
368
|
:return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
|
|
367
369
|
当输入是视频文件时,返回视频偏移量time和duration都是播放时间,单位S,差异不大
|
|
368
370
|
当输入是摄像头时, 返回视频偏移量time是视频播放时间,duration是根据count计算的播放的时间
|
|
369
371
|
"""
|
|
370
|
-
|
|
371
|
-
if isinstance(
|
|
372
|
-
assert os.path.exists(
|
|
373
|
-
video_cap = image_utils.get_video_capture(
|
|
372
|
+
video = file_utils.str2number(video)
|
|
373
|
+
if isinstance(video, str) and os.path.isfile(video):
|
|
374
|
+
assert os.path.exists(video), f"video={video}"
|
|
375
|
+
video_cap = image_utils.get_video_capture(video, fps=None)
|
|
374
376
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap, **kwargs)
|
|
375
377
|
time = kwargs.get("time", tuple()) # TODO 开始播放时间time[0],结束播放时间time[1],单位秒S
|
|
376
|
-
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置
|
|
378
|
+
clip = kwargs.get("clip", tuple()) # TODO 开始播放位置clip[0],结束播放位置clip[1]
|
|
377
379
|
start, end = 0, -1
|
|
378
380
|
if time and fps > 0:
|
|
379
381
|
start, end = int(time[0] * fps), int(time[1] * fps)
|
|
@@ -390,14 +392,15 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
|
|
|
390
392
|
data_info = {}
|
|
391
393
|
t0 = -1
|
|
392
394
|
while True:
|
|
393
|
-
|
|
395
|
+
systime = timelib.time()
|
|
396
|
+
ret, frame = (False, None) if use_fast else video_cap.read() # 读取视频很快,但读取USB摄像头比较耗时
|
|
394
397
|
t = video_cap.get(cv2.CAP_PROP_POS_MSEC) / 1000 # 获得视频偏移量毫秒为单位
|
|
395
398
|
if t0 < 0 < t: t0 = t
|
|
396
399
|
if t0 > 0: t = t - t0 # 获得视频偏移量毫秒为单位
|
|
397
400
|
finish = 0 < end <= (count + interval)
|
|
398
401
|
if count % interval == 0 and count >= start:
|
|
399
402
|
# TODO 设置抽帧的位置,但某些格式视频容易出现问题
|
|
400
|
-
if use_fast and isinstance(
|
|
403
|
+
if use_fast and isinstance(video, str):
|
|
401
404
|
video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
402
405
|
ret, frame = video_cap.read()
|
|
403
406
|
if not ret or 0 < end <= count or frame is None: break
|
|
@@ -407,7 +410,7 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
|
|
|
407
410
|
d = round(count / fps, 3) # TODO 通过fps计算播放时间
|
|
408
411
|
t = round(t, 3) # 通过视频偏移量计算播放时间
|
|
409
412
|
data_info = {"count": count, "time": t, "frame": frame, "w": w, "h": h, "fps": fps,
|
|
410
|
-
"finish": finish, 'duration': d}
|
|
413
|
+
"finish": finish, 'duration': d, 'systime': systime}
|
|
411
414
|
# TODO 返回data_info
|
|
412
415
|
yield data_info
|
|
413
416
|
frame = data_info["frame"]
|
|
@@ -416,6 +419,7 @@ def video_iterator(video_file: int | str, save_video: str or int = None, interva
|
|
|
416
419
|
h, w = frame.shape[:2]
|
|
417
420
|
if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
|
|
418
421
|
video_writer.write(frame)
|
|
422
|
+
if data_info['finish']: break # 控制结束
|
|
419
423
|
count += 1
|
|
420
424
|
video_cap.release()
|
|
421
425
|
if video_writer:
|
|
@@ -14,6 +14,7 @@ import glob
|
|
|
14
14
|
import random
|
|
15
15
|
import numbers
|
|
16
16
|
import json
|
|
17
|
+
import traceback
|
|
17
18
|
from tqdm import tqdm
|
|
18
19
|
from pybaseutils import image_utils, file_utils, json_utils, text_utils
|
|
19
20
|
from pybaseutils.dataloader.base_dataset import Dataset, ConcatDataset
|
|
@@ -145,21 +146,26 @@ class LabelMeDataset(Dataset):
|
|
|
145
146
|
class_name = []
|
|
146
147
|
for image_id in tqdm(image_ids, desc="check data"):
|
|
147
148
|
image_file, anno_file, image_id = self.get_image_anno_file(image_id)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
149
|
+
try:
|
|
150
|
+
if not os.path.exists(anno_file):
|
|
151
|
+
continue
|
|
152
|
+
if not os.path.exists(image_file):
|
|
153
|
+
continue
|
|
154
|
+
annotation, width, height = self.load_annotations(anno_file)
|
|
155
|
+
data_info = self.parser_annotation(annotation, self.total_names, size=(width, height),
|
|
156
|
+
min_points=self.min_points,
|
|
157
|
+
unique=self.unique)
|
|
158
|
+
if self.use_kpt:
|
|
159
|
+
data_info = self.get_kpts_info(data_info, anno_file=anno_file, check_kpt=self.check_kpt, disp=True)
|
|
160
|
+
labels = data_info["labels"]
|
|
161
|
+
if len(labels) == 0:
|
|
162
|
+
continue
|
|
163
|
+
dst_ids.append(image_id)
|
|
164
|
+
class_name += labels
|
|
165
|
+
except Exception as e:
|
|
166
|
+
traceback.print_exc()
|
|
167
|
+
print(anno_file)
|
|
160
168
|
continue
|
|
161
|
-
dst_ids.append(image_id)
|
|
162
|
-
class_name += labels
|
|
163
169
|
if self.class_name is None:
|
|
164
170
|
class_name = sorted(list(set(class_name)))
|
|
165
171
|
self.class_name, self.class_dict = self.parser_classes(class_name)
|
|
@@ -417,8 +423,8 @@ class LabelMeDataset(Dataset):
|
|
|
417
423
|
with open(anno_file, "r") as f:
|
|
418
424
|
annotation: dict = json.load(f)
|
|
419
425
|
annos = annotation.get("shapes", [])
|
|
420
|
-
width = annotation.get('imageWidth', -1)
|
|
421
|
-
height = annotation.get('imageHeight', -1)
|
|
426
|
+
width = int(annotation.get('imageWidth', -1))
|
|
427
|
+
height = int(annotation.get('imageHeight', -1))
|
|
422
428
|
except Exception as e:
|
|
423
429
|
# print(e,"illegal annotation:{}".format(anno_file))
|
|
424
430
|
annos = []
|
|
File without changes
|
|
@@ -15,7 +15,7 @@ from collections import defaultdict
|
|
|
15
15
|
|
|
16
16
|
class Objects(object):
|
|
17
17
|
def __init__(self, boxes, label, score, names=[], size=[], segms=None, masks=None, keypt=None,
|
|
18
|
-
traid=None, trace=None, color=[], image=None):
|
|
18
|
+
traid=None, trace=None, color=[], image=None, file=""):
|
|
19
19
|
self.boxes = boxes # 目标框(xmin,ymin,xmax,ymax)
|
|
20
20
|
self.score = score # 目标框置信度
|
|
21
21
|
self.label = label # 目标框类别
|
|
@@ -28,6 +28,7 @@ class Objects(object):
|
|
|
28
28
|
self.trace = trace # 轨迹的历史boxes
|
|
29
29
|
self.color = [(255, 0, 0)] * len(boxes) # 目标框颜色
|
|
30
30
|
self.size = size # 原始图像大小
|
|
31
|
+
self.file = file # 文件路径
|
|
31
32
|
self.depth = None # 深度图
|
|
32
33
|
self.metas = defaultdict() # 其他信息
|
|
33
34
|
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
import os
|
|
12
12
|
import copy
|
|
13
13
|
import re
|
|
14
|
+
import time
|
|
15
|
+
|
|
14
16
|
import cv2
|
|
15
17
|
import numpy as np
|
|
16
18
|
import matplotlib.pyplot as plt
|
|
@@ -49,6 +51,8 @@ coco_skeleton_v2 = [[15, 13], [13, 11], [16, 14], [14, 12], [11, 12], [5, 11], [
|
|
|
49
51
|
mpii_skeleton = [[0, 1], [1, 2], [3, 4], [4, 5], [2, 6], [6, 3], [12, 11], [7, 12],
|
|
50
52
|
[11, 10], [13, 14], [14, 15], [8, 9], [8, 7], [6, 7], [7, 13]]
|
|
51
53
|
|
|
54
|
+
pltimg = None
|
|
55
|
+
|
|
52
56
|
|
|
53
57
|
def create_image(shape, color=(255, 255, 255), dtype=np.uint8, use_rgb=False):
|
|
54
58
|
"""
|
|
@@ -155,7 +159,7 @@ def show_batch_image(title, batch_images, index=0):
|
|
|
155
159
|
cv_show_image(title, image)
|
|
156
160
|
|
|
157
161
|
|
|
158
|
-
def show_image_plt(title, image, use_rgb=True):
|
|
162
|
+
def show_image_plt(title, image, use_rgb=True, delay=30):
|
|
159
163
|
"""
|
|
160
164
|
use matplotlib to show image
|
|
161
165
|
调用matplotlib显示RGB图片
|
|
@@ -164,18 +168,19 @@ def show_image_plt(title, image, use_rgb=True):
|
|
|
164
168
|
:param use_rgb: True:输入image是RGB的图像, False:返输入image是BGR格式的图像
|
|
165
169
|
:return:
|
|
166
170
|
"""
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
plt.imshow(image)
|
|
171
|
+
global pltimg
|
|
172
|
+
if use_rgb: image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 将BGR转为RGB
|
|
173
|
+
if pltimg is None:
|
|
174
|
+
plt.ion() # 启用交互模式(关键!)
|
|
175
|
+
plt.axis('off') # 坐标轴为 on/off
|
|
176
|
+
plt.tight_layout(pad=0)
|
|
177
|
+
pltimg = plt.imshow(image) # 循环显示很慢
|
|
178
|
+
plt.show() # 这里耗时,仅调用一次
|
|
174
179
|
else:
|
|
175
|
-
|
|
176
|
-
plt.
|
|
177
|
-
plt.
|
|
178
|
-
plt.
|
|
180
|
+
pltimg.set_data(image)
|
|
181
|
+
plt.title(title)
|
|
182
|
+
if delay == 0: pltimg = plt.imshow(image)
|
|
183
|
+
plt.pause(delay / 1000.0)
|
|
179
184
|
return image
|
|
180
185
|
|
|
181
186
|
|
|
@@ -3299,10 +3304,10 @@ def get_video_capture(video, width=None, height=None, fps=None):
|
|
|
3299
3304
|
return video_cap
|
|
3300
3305
|
|
|
3301
3306
|
|
|
3302
|
-
def get_video_info(video_cap
|
|
3307
|
+
def get_video_info(video_cap, disp=True, **kwargs):
|
|
3303
3308
|
"""
|
|
3304
3309
|
获得视频的基础信息
|
|
3305
|
-
:param video_cap:视频对象 或者视频文件路径
|
|
3310
|
+
:param video_cap:视频对象 或者视频文件路径 int | str | cv2.VideoCapture
|
|
3306
3311
|
:param disp: 是否显示视频信息
|
|
3307
3312
|
:return:
|
|
3308
3313
|
"""
|
|
@@ -11,6 +11,7 @@ import os
|
|
|
11
11
|
import toolz
|
|
12
12
|
import json
|
|
13
13
|
import numbers
|
|
14
|
+
import PIL.Image as Image
|
|
14
15
|
from collections import Counter
|
|
15
16
|
from typing import List, Tuple, Dict
|
|
16
17
|
from pybaseutils.file_utils import load_json, read_json_data, save_json, write_json_path
|
|
@@ -34,6 +35,23 @@ def formatting(data):
|
|
|
34
35
|
return info
|
|
35
36
|
|
|
36
37
|
|
|
38
|
+
def format_array(data):
|
|
39
|
+
"""格式化数组数据,将numpy数组转换为PIL.Image对象"""
|
|
40
|
+
if isinstance(data, np.ndarray):
|
|
41
|
+
try:
|
|
42
|
+
r = Image.fromarray(data)
|
|
43
|
+
except:
|
|
44
|
+
r = data.shape
|
|
45
|
+
return r
|
|
46
|
+
elif isinstance(data, list):
|
|
47
|
+
for i in range(len(data)):
|
|
48
|
+
data[i] = format_array(data[i])
|
|
49
|
+
elif isinstance(data, dict):
|
|
50
|
+
for k, v in data.items():
|
|
51
|
+
data[k] = format_array(v)
|
|
52
|
+
return data
|
|
53
|
+
|
|
54
|
+
|
|
37
55
|
def get_keys_vaules(data, func=None):
|
|
38
56
|
"""
|
|
39
57
|
遍历json数据并获得所有value的key路径
|
|
@@ -139,6 +157,14 @@ def toolz_assoc_in(data, keys, value):
|
|
|
139
157
|
return toolz.assoc_in(data, cur_keys, value)
|
|
140
158
|
|
|
141
159
|
|
|
160
|
+
def get_index(data: list, v):
|
|
161
|
+
"""获得列表中所有值为v的索引"""
|
|
162
|
+
indices = [i for i, x in enumerate(data) if x == v]
|
|
163
|
+
return indices
|
|
164
|
+
|
|
165
|
+
|
|
142
166
|
if __name__ == "__main__":
|
|
143
|
-
data = {'C': 0, 'A': 5, 'B': 3, 'D': 2}
|
|
144
|
-
print(dict_sort(data))
|
|
167
|
+
# data = {'C': 0, 'A': 5, 'B': 3, 'D': 2}
|
|
168
|
+
# print(dict_sort(data))
|
|
169
|
+
i= get_index(data=[], v=7)
|
|
170
|
+
print(i)
|
|
File without changes
|
|
@@ -213,6 +213,7 @@ test_py/aije/copy_move.py
|
|
|
213
213
|
test_py/aije/demo_labelme_crop_aije.py
|
|
214
214
|
test_py/aije/demo_labelme_crop_ailt.py
|
|
215
215
|
test_py/aije/demo_labelme_shock.py
|
|
216
|
+
test_py/aije/demo_motion_blur.py
|
|
216
217
|
test_py/aije/demo_video_aije.py
|
|
217
218
|
test_py/aije/demo_voc_crop.py
|
|
218
219
|
test_py/aije/demo_voc_vis.py
|
|
@@ -279,6 +280,9 @@ test_py/detector/predet_labelme.py
|
|
|
279
280
|
test_py/edit_distance/__init__.py
|
|
280
281
|
test_py/edit_distance/demo.py
|
|
281
282
|
test_py/edit_distance/text_matching.py
|
|
283
|
+
test_py/fast_api/__init__.py
|
|
284
|
+
test_py/fast_api/create_image_url.py
|
|
285
|
+
test_py/fast_api/get_image_url.py
|
|
282
286
|
test_py/flask_demo/__init__.py
|
|
283
287
|
test_py/flask_demo/app.py
|
|
284
288
|
test_py/flask_demo/utils/__init__.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -100,17 +100,20 @@ if __name__ == '__main__':
|
|
|
100
100
|
对labelme的数据目标进行裁剪,用于制作分类数据集
|
|
101
101
|
"""
|
|
102
102
|
# TODO 蓝色长条标签和鞋套是否相似
|
|
103
|
-
target_name = ['身穿工作服', '未穿工作服',
|
|
103
|
+
target_name = ['身穿工作服', '未穿工作服', '螺丝刀',
|
|
104
104
|
'绝缘鞋', '脚穿绝缘鞋', '长筒靴', '脚穿长筒靴', '其他鞋', '脚穿其他鞋', '脚穿鞋套',
|
|
105
105
|
'手', '绝缘手套', '手穿绝缘手套', '棉纱手套', '手穿棉纱手套', '其他手套', '手穿其他手套',
|
|
106
106
|
'胶枪灯', '胶枪灯红色', '胶枪灯绿色',
|
|
107
|
-
'PDA', 'PDA*', '手与*接触', '电视柜台面'
|
|
107
|
+
'PDA', 'PDA*', '清洁布', '手与*接触', '电视柜台面', '*标签'
|
|
108
108
|
]
|
|
109
109
|
# '*长条标签'
|
|
110
110
|
datasets = [
|
|
111
|
-
'/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-
|
|
112
|
-
|
|
111
|
+
'/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260120/images',
|
|
112
|
+
'/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260130/images',
|
|
113
|
+
'/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260206/images',
|
|
113
114
|
]
|
|
115
|
+
datasets = "/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/文件列表.txt"
|
|
116
|
+
datasets = file_utils.read_data(datasets, split=None)
|
|
114
117
|
# dataroot = '/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det'
|
|
115
118
|
# datasets = get_sub_dataset(dataroot)
|
|
116
119
|
class_name = []
|