pybaseutils 2.4.11__tar.gz → 2.4.15__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.11 → pybaseutils-2.4.15}/PKG-INFO +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.4.15/pybaseutils/cvutils/camera.py +146 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/base_dataset.py +1 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/file_utils.py +42 -15
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/image_utils.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/metrics/average_meter.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/metrics/class_report.py +44 -17
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/numpy_utils.py +2 -2
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/action_dataset.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/demo_labelme_crop_aije.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/demo_labelme_crop_ailt.py +4 -6
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/demo_labelme_shock.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo2.py +17 -3
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_labelme_crop.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/single_class/demo.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/slowfastnet.py +3 -3
- pybaseutils-2.4.11/pybaseutils/cvutils/camera.py +0 -90
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/LICENCE +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/README.md +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/nets_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils.egg-info/SOURCES.txt +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/setup.cfg +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/setup.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo4.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/performance.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/qrcode/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/test_camera.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.15}/test_py/web_socket/chat_service.py +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import cv2
|
|
2
|
+
import time
|
|
3
|
+
import numpy as np
|
|
4
|
+
import subprocess
|
|
5
|
+
import json
|
|
6
|
+
import numbers
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def get_video_size(video, size=()):
|
|
10
|
+
"""获取视频原始分辨率"""
|
|
11
|
+
if isinstance(video, int): # TODO 摄像头
|
|
12
|
+
video = f"/dev/video{video}"
|
|
13
|
+
if size:
|
|
14
|
+
cmd = ['ffprobe', '-v', 'quiet',
|
|
15
|
+
'-video_size', f"{size[0]}x{size[1]}", # 视频分辨率
|
|
16
|
+
'-print_format', 'json',
|
|
17
|
+
'-show_streams', video]
|
|
18
|
+
else:
|
|
19
|
+
cmd = ['ffprobe', '-v', 'quiet',
|
|
20
|
+
'-print_format', 'json',
|
|
21
|
+
'-show_streams', video]
|
|
22
|
+
result = subprocess.check_output(cmd).decode()
|
|
23
|
+
info = json.loads(result)
|
|
24
|
+
width = None
|
|
25
|
+
height = None
|
|
26
|
+
for stream in info['streams']:
|
|
27
|
+
if stream['codec_type'] == 'video':
|
|
28
|
+
width, height = stream['width'], stream['height']
|
|
29
|
+
print("video={},width:{}, height:{}".format(video, width, height))
|
|
30
|
+
return width, height
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class CameraCapture(object):
|
|
34
|
+
def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0):
|
|
35
|
+
"""
|
|
36
|
+
查询视频设备分辨率: ffmpeg -f v4l2 -list_formats all -i /dev/video0
|
|
37
|
+
常见的视频分辨率 : 1920x1080 1280x720 640x480 352x288 320x240 176x144 160x120
|
|
38
|
+
:param video: 视频设备路径或索引(如 0 或 "/dev/video0")
|
|
39
|
+
:param fps: 视频帧率
|
|
40
|
+
:param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
|
|
41
|
+
:param scale: 视频缩放比例
|
|
42
|
+
"""
|
|
43
|
+
self.fps = fps
|
|
44
|
+
self.stopped = False
|
|
45
|
+
self.ssize = get_video_size(video, size=size)
|
|
46
|
+
self.dsize = self.ssize
|
|
47
|
+
if isinstance(video, int): # TODO 摄像头
|
|
48
|
+
video = f"/dev/video{video}"
|
|
49
|
+
self.video_size = f"{self.ssize[0]}x{self.ssize[1]}" # 视频文件没有这个参数
|
|
50
|
+
else: # TODO 视频文件
|
|
51
|
+
self.video_size = None
|
|
52
|
+
if size:
|
|
53
|
+
self.dsize = (int(size[0] * scale), int(size[1] * scale))
|
|
54
|
+
else:
|
|
55
|
+
self.dsize = (int(self.dsize[0] * scale), int(self.dsize[1] * scale))
|
|
56
|
+
vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
|
|
57
|
+
# TODO FFmpeg 命令
|
|
58
|
+
# -re: 以原生帧率读取(模拟直播流)
|
|
59
|
+
# -fflags nobuffer: 关键!禁用缓冲区
|
|
60
|
+
# -flags low_delay: 关键!低延迟模式
|
|
61
|
+
# -probesize 32: 减小探测包大小,加快启动
|
|
62
|
+
# -pix_fmt bgr24: 直接输出 BGR 格式,方便 OpenCV/Numpy 使用,避免后续转换
|
|
63
|
+
if self.video_size: # TODO 如果是摄像头
|
|
64
|
+
command = [
|
|
65
|
+
'ffmpeg',
|
|
66
|
+
'-re', # 按帧率读取
|
|
67
|
+
'-fflags', 'nobuffer', # 无缓冲
|
|
68
|
+
'-flags', 'low_delay', # 低延迟
|
|
69
|
+
'-probesize', '32', # 快速探测
|
|
70
|
+
'-video_size', f"{self.ssize[0]}x{self.ssize[1]}", # 视频分辨率
|
|
71
|
+
'-i', video, # 输入设备
|
|
72
|
+
'-f', 'rawvideo', # 输出原始视频流
|
|
73
|
+
'-pix_fmt', 'bgr24', # 像素格式 BGR
|
|
74
|
+
'-vf', vf, # 分辨率
|
|
75
|
+
'-r', str(fps), # 帧率
|
|
76
|
+
'-' # 输出到 stdout
|
|
77
|
+
]
|
|
78
|
+
else:
|
|
79
|
+
command = [
|
|
80
|
+
'ffmpeg',
|
|
81
|
+
'-re', # 按帧率读取
|
|
82
|
+
'-fflags', 'nobuffer', # 无缓冲
|
|
83
|
+
'-flags', 'low_delay', # 低延迟
|
|
84
|
+
'-probesize', '32', # 快速探测
|
|
85
|
+
'-i', video, # 输入设备
|
|
86
|
+
'-f', 'rawvideo', # 输出原始视频流
|
|
87
|
+
'-pix_fmt', 'bgr24', # 像素格式 BGR
|
|
88
|
+
'-vf', vf, # 分辨率
|
|
89
|
+
'-r', str(fps), # 帧率
|
|
90
|
+
'-' # 输出到 stdout
|
|
91
|
+
]
|
|
92
|
+
# 启动进程
|
|
93
|
+
print(f"command: {' '.join(command)}")
|
|
94
|
+
self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
|
|
95
|
+
|
|
96
|
+
def read(self):
|
|
97
|
+
if self.stopped:
|
|
98
|
+
self.stop()
|
|
99
|
+
return False, None
|
|
100
|
+
# 读取一帧的数据量 (宽 * 高 * 3通道)
|
|
101
|
+
buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
|
|
102
|
+
if len(buf) != self.dsize[0] * self.dsize[1] * 3:
|
|
103
|
+
self.stop()
|
|
104
|
+
return False, None # 读取失败或结束
|
|
105
|
+
# TODO 将字节流转换为numpy数组图像(bgr)
|
|
106
|
+
bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
|
|
107
|
+
return True, bgr
|
|
108
|
+
|
|
109
|
+
def release(self):
|
|
110
|
+
self.stop()
|
|
111
|
+
|
|
112
|
+
def stop(self):
|
|
113
|
+
self.stopped = True
|
|
114
|
+
time.sleep(0.1)
|
|
115
|
+
self.pipe.terminate() # 终止进程
|
|
116
|
+
try:
|
|
117
|
+
outs, errs = self.pipe.communicate(timeout=2)
|
|
118
|
+
except subprocess.TimeoutExpired as err:
|
|
119
|
+
# 如果 communicate 也超时(极少见),强制杀死
|
|
120
|
+
self.pipe.kill()
|
|
121
|
+
self.pipe.communicate() # 再次尝试清理
|
|
122
|
+
print(err)
|
|
123
|
+
|
|
124
|
+
def display(self, title="camera", delay=30):
|
|
125
|
+
while True:
|
|
126
|
+
t1 = time.time()
|
|
127
|
+
ret, frame = self.read()
|
|
128
|
+
t2 = time.time()
|
|
129
|
+
if not ret:
|
|
130
|
+
break
|
|
131
|
+
t21 = (t2 - t1) * 1000
|
|
132
|
+
print(f"image shape: {frame.shape},耗时: {t21:.3f}ms")
|
|
133
|
+
cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
|
|
134
|
+
cv2.imshow(title, frame)
|
|
135
|
+
cv2.waitKey(delay)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
if __name__ == '__main__':
|
|
139
|
+
fps = 10
|
|
140
|
+
video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
141
|
+
# video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
142
|
+
# video = "../../data/video/kunkun_cut.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
143
|
+
# cap = CameraCapture(video=video, size=(), scale=1.0, fps=fps)
|
|
144
|
+
cap = CameraCapture(video=video, size=(1920, 1080), scale=1.0, fps=fps)
|
|
145
|
+
# cap = CameraCapture(video=video, size=(), scale=2,fps=fps)
|
|
146
|
+
cap.display()
|
|
@@ -384,6 +384,7 @@ def get_targets_overlap(obj_info1: dict, obj_info2: dict, key="boxes", keys=[],
|
|
|
384
384
|
boxes2 = obj_info2[key]
|
|
385
385
|
nums1 = len(boxes1)
|
|
386
386
|
nums2 = len(boxes2)
|
|
387
|
+
if nums1==0 or nums2==0:return []
|
|
387
388
|
ious = image_utils.get_boxes_iom(boxes1, boxes2) if use_iom else image_utils.get_boxes_iou(boxes1, boxes2)
|
|
388
389
|
output = []
|
|
389
390
|
for i in range(len(boxes1)):
|
|
@@ -78,6 +78,9 @@ def get_time(format="p"):
|
|
|
78
78
|
# time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f') # 20200508_143059_379116
|
|
79
79
|
time = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
|
|
80
80
|
time = time[:-2]
|
|
81
|
+
elif format.lower() == "d": # 精确到微妙
|
|
82
|
+
# time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f') # 20200508_143059_379116
|
|
83
|
+
time = datetime.now().strftime("%Y%m%d")
|
|
81
84
|
elif format.lower() == "y": # 2025-06-18 11:02:05
|
|
82
85
|
# time = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S") #
|
|
83
86
|
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
@@ -891,6 +894,27 @@ def get_sub_list(file_list, dirname: str):
|
|
|
891
894
|
return sub_list
|
|
892
895
|
|
|
893
896
|
|
|
897
|
+
def get_sub_info(image_dir, postfix=IMG_POSTFIX, sub=0):
|
|
898
|
+
"""
|
|
899
|
+
获得目image_dir下每个子文件夹的数据,以dict数据返回
|
|
900
|
+
:param image_dir:
|
|
901
|
+
:param postfix: 后缀
|
|
902
|
+
:param sub: 是否去除根路径
|
|
903
|
+
:return: {"sub1":[file1,file2,...],"sub2":[file1,file2,...],"sub3":...}
|
|
904
|
+
"""
|
|
905
|
+
sub_names = get_sub_paths(image_dir)
|
|
906
|
+
data_info = defaultdict(list)
|
|
907
|
+
for name in sub_names:
|
|
908
|
+
files = get_files_list(os.path.join(image_dir, name), postfix=postfix)
|
|
909
|
+
if sub == 1:
|
|
910
|
+
files = get_sub_list(files, dirname=image_dir)
|
|
911
|
+
elif sub == -1:
|
|
912
|
+
files = get_sub_list(files, dirname=os.path.dirname(image_dir))
|
|
913
|
+
data_info[name].extend(files)
|
|
914
|
+
data_info = dict(data_info)
|
|
915
|
+
return data_info
|
|
916
|
+
|
|
917
|
+
|
|
894
918
|
def split_train_test(file_list, ratio=0.2, shuffle=False):
|
|
895
919
|
"""
|
|
896
920
|
划分训练集和测试集
|
|
@@ -1146,15 +1170,17 @@ def print_dict(dict_data, save_path):
|
|
|
1146
1170
|
def get_pair_data(image_dir, pair_num=-1):
|
|
1147
1171
|
"""
|
|
1148
1172
|
获得图片对数据
|
|
1173
|
+
Uages:
|
|
1174
|
+
pairs = file_utils.get_pair_data(image_dir, pair_num=-1)
|
|
1175
|
+
file_utils.write_data(pairs_file, pairs)
|
|
1149
1176
|
:param image_dir:
|
|
1150
1177
|
:param pair_num:-1 表示所有对
|
|
1151
|
-
:return:
|
|
1178
|
+
:return: [file1, file2, 1] 1表示相同类别,0表示不同类别
|
|
1152
1179
|
"""
|
|
1153
1180
|
max_nums = int(pair_num / 2)
|
|
1154
1181
|
image_list = get_files_lists(image_dir)
|
|
1155
1182
|
image_list = get_sub_list(image_list, dirname=image_dir)
|
|
1156
1183
|
nums = len(image_list)
|
|
1157
|
-
print("have {} images and {} combinations".format(nums, nums * (nums - 1) / 2))
|
|
1158
1184
|
pairs = []
|
|
1159
1185
|
for paths in itertools.combinations(image_list, 2):
|
|
1160
1186
|
file1, file2 = paths
|
|
@@ -1170,6 +1196,7 @@ def get_pair_data(image_dir, pair_num=-1):
|
|
|
1170
1196
|
pair1 = pairs[pairs[:, -1] == "1", :]
|
|
1171
1197
|
nums1 = len(pair1)
|
|
1172
1198
|
nums0 = len(pair0)
|
|
1199
|
+
print("have {} images, pair0:{}, pair1:{}".format(nums, nums0, nums1))
|
|
1173
1200
|
if pair_num < 0: max_nums = nums1
|
|
1174
1201
|
if max_nums > nums1:
|
|
1175
1202
|
raise Exception("pair_nums({}) must be less than num_pair1({})".format(max_nums, nums1))
|
|
@@ -1191,7 +1218,7 @@ def get_pair_files(data_root, out_root=None, image_sub="", label_sub="",
|
|
|
1191
1218
|
:param image_sub:
|
|
1192
1219
|
:param label_sub:
|
|
1193
1220
|
:param label_postfix: label文件后缀,如txt,png,json等
|
|
1194
|
-
:return:
|
|
1221
|
+
:return: [file1,file2]
|
|
1195
1222
|
"""
|
|
1196
1223
|
image_dir = os.path.join(data_root, image_sub)
|
|
1197
1224
|
label_dir = os.path.join(data_root, label_sub)
|
|
@@ -1201,11 +1228,11 @@ def get_pair_files(data_root, out_root=None, image_sub="", label_sub="",
|
|
|
1201
1228
|
for i, image_name in tqdm(enumerate(file_list)):
|
|
1202
1229
|
postfix = image_name.split(".")[-1]
|
|
1203
1230
|
lable_name = image_name.replace(f".{postfix}", f".{label_postfix}")
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
if os.path.exists(
|
|
1207
|
-
|
|
1208
|
-
pair_list.append([
|
|
1231
|
+
file1 = os.path.join(image_dir, image_name)
|
|
1232
|
+
file2 = os.path.join(label_dir, lable_name)
|
|
1233
|
+
if os.path.exists(file1) and os.path.exists(file2):
|
|
1234
|
+
file1, file2 = get_sub_list([file1, file2], dirname=data_root)
|
|
1235
|
+
pair_list.append([file1, file2])
|
|
1209
1236
|
if out_root:
|
|
1210
1237
|
filename = os.path.join(out_root, "file_list.txt")
|
|
1211
1238
|
write_data(filename, pair_list, split=",", mode='w')
|
|
@@ -1214,10 +1241,11 @@ def get_pair_files(data_root, out_root=None, image_sub="", label_sub="",
|
|
|
1214
1241
|
|
|
1215
1242
|
def read_pair_data(filename, split=True):
|
|
1216
1243
|
"""
|
|
1217
|
-
|
|
1244
|
+
读取图片对数据,data:[image1.jpg image2.jpg 0]
|
|
1245
|
+
可以使用get_pair_data(image_dir, pair_num=-1)获得图片对数据
|
|
1218
1246
|
:param filename:
|
|
1219
1247
|
:param split:
|
|
1220
|
-
:return:
|
|
1248
|
+
:return: [pair1, pair2, label] 1表示相同类别,0表示不同类别
|
|
1221
1249
|
"""
|
|
1222
1250
|
pair_list = read_data(filename)
|
|
1223
1251
|
if split:
|
|
@@ -1225,12 +1253,12 @@ def read_pair_data(filename, split=True):
|
|
|
1225
1253
|
pair1 = pair_list[:, :1].reshape(-1)
|
|
1226
1254
|
pair2 = pair_list[:, 1:2].reshape(-1)
|
|
1227
1255
|
# convert to 0/1
|
|
1228
|
-
|
|
1229
|
-
|
|
1256
|
+
label = np.asarray(pair_list[:, 2:3].reshape(-1), dtype=np.int32)
|
|
1257
|
+
label = np.where(label > 0, 1, 0)
|
|
1230
1258
|
pair1 = pair1.tolist()
|
|
1231
1259
|
pair2 = pair2.tolist()
|
|
1232
|
-
|
|
1233
|
-
return pair1, pair2,
|
|
1260
|
+
label = label.tolist()
|
|
1261
|
+
return pair1, pair2, label
|
|
1234
1262
|
return pair_list
|
|
1235
1263
|
|
|
1236
1264
|
|
|
@@ -1579,7 +1607,6 @@ def zip_file(src, dst=None, s=None):
|
|
|
1579
1607
|
return dst
|
|
1580
1608
|
|
|
1581
1609
|
|
|
1582
|
-
|
|
1583
1610
|
if __name__ == '__main__':
|
|
1584
1611
|
from pybaseutils import time_utils
|
|
1585
1612
|
|
|
@@ -300,7 +300,7 @@ def get_prewhiten_image(x):
|
|
|
300
300
|
'''
|
|
301
301
|
mean = np.mean(x)
|
|
302
302
|
std = np.std(x)
|
|
303
|
-
std_adj = np.maximum(std, 1.0 / np.sqrt(x.
|
|
303
|
+
std_adj = np.maximum(std, 1.0 / np.sqrt(x.dsize))
|
|
304
304
|
y = np.multiply(np.subtract(x, mean), 1 / std_adj)
|
|
305
305
|
return y
|
|
306
306
|
|
|
@@ -63,7 +63,7 @@ class MultiAverageMeter(object):
|
|
|
63
63
|
|
|
64
64
|
def accuracy(output, target, topk=(1, 5)):
|
|
65
65
|
maxk = max(topk)
|
|
66
|
-
batch_size = target.
|
|
66
|
+
batch_size = target.dsize(0)
|
|
67
67
|
_, pred = output.topk(maxk, 1, True, True)
|
|
68
68
|
pred = pred.t()
|
|
69
69
|
correct = pred.eq(target.view(1, -1).expand_as(pred))
|
|
@@ -12,6 +12,26 @@ from sklearn import metrics
|
|
|
12
12
|
from pybaseutils import pandas_utils
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
def get_metrics(true_labels, pred_labels, keys=['accuracy', 'precision', 'recall', 'f1_score']):
|
|
16
|
+
"""
|
|
17
|
+
计算分类指标
|
|
18
|
+
:param true_labels: 真实样本的标签
|
|
19
|
+
:param pred_labels: 预测的标签
|
|
20
|
+
:param keys: 计算的指标,默认计算accuracy, precision, recall, f1_score
|
|
21
|
+
:return: 分类指标
|
|
22
|
+
"""
|
|
23
|
+
aprf = {}
|
|
24
|
+
if 'accuracy' in keys:
|
|
25
|
+
aprf['accuracy'] = metrics.accuracy_score(true_labels, pred_labels)
|
|
26
|
+
if 'precision' in keys:
|
|
27
|
+
aprf['precision'] = metrics.precision_score(true_labels, pred_labels, average=None) # 每个类别
|
|
28
|
+
if 'recall' in keys:
|
|
29
|
+
aprf['recall'] = metrics.recall_score(true_labels, pred_labels, average=None)
|
|
30
|
+
if 'f1_score' in keys:
|
|
31
|
+
aprf['f1_score'] = metrics.f1_score(true_labels, pred_labels, average=None)
|
|
32
|
+
return aprf
|
|
33
|
+
|
|
34
|
+
|
|
15
35
|
def plot_confusion_matrix(conf_matrix, labels_name, title, normalization=True):
|
|
16
36
|
if normalization:
|
|
17
37
|
conf_matrix = conf_matrix.astype('float') / conf_matrix.sum(axis=1)[:, np.newaxis] # 归一化
|
|
@@ -67,10 +87,17 @@ def get_confusion_matrix(true_labels, pred_labels, target_names=None, filename=N
|
|
|
67
87
|
def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
|
|
68
88
|
output_dict=False, matrix=False, plot=False):
|
|
69
89
|
"""
|
|
90
|
+
Usage
|
|
91
|
+
-------
|
|
92
|
+
true_labels = ["A", "B", "A", "B"]
|
|
93
|
+
pred_labels = ["A", "B", "C", "B"]
|
|
94
|
+
out_result = get_metrics_report(true_labels, pred_labels)
|
|
95
|
+
-------
|
|
70
96
|
true_labels = [0, 1, 2, 3, 4, 1] # Y
|
|
71
97
|
pred_labels = [0, 1, 1, 2, 2, 1] # X
|
|
72
98
|
target_names = ["A", "B", "C", "D", "E"]
|
|
73
|
-
out_result = get_metrics_report(true_labels, pred_labels, target_names=target_names
|
|
99
|
+
out_result = get_metrics_report(true_labels, pred_labels, target_names=target_names)
|
|
100
|
+
-------
|
|
74
101
|
宏平均(macro avg)和微平均(micro avg)
|
|
75
102
|
如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异
|
|
76
103
|
如果每个class的样本数量差异很大,而且你想:
|
|
@@ -84,32 +111,33 @@ def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
|
|
|
84
111
|
:param matrix: 是否绘制混淆矩阵
|
|
85
112
|
:return:
|
|
86
113
|
"""
|
|
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]
|
|
92
114
|
result = metrics.classification_report(true_labels,
|
|
93
115
|
pred_labels,
|
|
94
116
|
labels=labels,
|
|
95
117
|
digits=4,
|
|
96
118
|
target_names=target_names,
|
|
97
|
-
output_dict=
|
|
119
|
+
output_dict=True,
|
|
98
120
|
zero_division=0)
|
|
99
121
|
if output_dict:
|
|
100
122
|
macro_avg = result["macro avg"]
|
|
101
|
-
accuracy = result["accuracy"]
|
|
102
123
|
weighted_avg = result["weighted avg"]
|
|
103
|
-
|
|
124
|
+
accuracy = result["accuracy"]
|
|
125
|
+
output = {"macro_avg": macro_avg, "accuracy": accuracy, "weighted_avg": weighted_avg}
|
|
104
126
|
# pdf=pd.DataFrame.from_dict(result)
|
|
105
127
|
# save_csv("classification_report.csv", pdf)
|
|
106
128
|
else:
|
|
107
|
-
|
|
129
|
+
p = (result['macro avg']['precision'] + result['weighted avg']['precision']) / 2
|
|
130
|
+
r = (result['macro avg']['recall'] + result['weighted avg']['recall']) / 2
|
|
131
|
+
support = result['macro avg']['support']
|
|
132
|
+
result["accuracy"] = {'precision': p, 'recall': r, 'f1-score': result["accuracy"], 'support': support}
|
|
133
|
+
output = pandas_utils.dict2df(result)
|
|
134
|
+
output = output.round(4) # 保留4位小数
|
|
135
|
+
output = output.to_markdown()
|
|
108
136
|
if matrix:
|
|
109
137
|
conf_matrix = get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
|
|
110
138
|
normalization=True, plot=plot, title="Confusion Matrix")
|
|
111
139
|
# out_result["confusion_matrix"] = conf_matrix
|
|
112
|
-
return
|
|
140
|
+
return output
|
|
113
141
|
|
|
114
142
|
|
|
115
143
|
get_classification_report = get_metrics_report
|
|
@@ -148,11 +176,10 @@ def create_file_path(filename):
|
|
|
148
176
|
if __name__ == "__main__":
|
|
149
177
|
# true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
|
|
150
178
|
# pred_labels = [1, 1, 2, 2, 2, 1, 0] # X
|
|
151
|
-
true_labels = ["A", "B", "A", "B"]
|
|
152
|
-
pred_labels = ["A", "
|
|
153
|
-
# target_names = ["A0", "B1", "C2", "D3"]
|
|
179
|
+
true_labels = ["A", "B", "A", "B", "C", "D"]
|
|
180
|
+
pred_labels = ["A", "D", "C", "B", "C", "A"]
|
|
154
181
|
target_names = None
|
|
155
182
|
confuse_file = "./confuse.csv"
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
print(
|
|
183
|
+
result = get_metrics_report(true_labels, pred_labels, target_names=target_names, output_dict=False,
|
|
184
|
+
matrix=True, plot=False)
|
|
185
|
+
print(result)
|
|
@@ -489,13 +489,13 @@ def L2_loss(y_true, y_pre):
|
|
|
489
489
|
def mean_squared_error(y_true, y_pre):
|
|
490
490
|
"""MSE(Mean Squared Error)平均平方误差(L2)"""
|
|
491
491
|
l2 = np.sum(np.square(y_true - y_pre))
|
|
492
|
-
return l2 / y_true.
|
|
492
|
+
return l2 / y_true.dsize
|
|
493
493
|
|
|
494
494
|
|
|
495
495
|
def mean_absolute_error(y_true, y_pre):
|
|
496
496
|
"""MAE(Mean Absolute Error)平均绝对差值(L1),也等于MAD(Mean Absolute Difference)"""
|
|
497
497
|
l1 = np.sum(np.abs(y_true - y_pre))
|
|
498
|
-
return l1 / y_true.
|
|
498
|
+
return l1 / y_true.dsize
|
|
499
499
|
|
|
500
500
|
|
|
501
501
|
def mean(data):
|
|
@@ -47,7 +47,7 @@ def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=Fals
|
|
|
47
47
|
thickness=2, fontScale=0.8, drawType="chinese")
|
|
48
48
|
image_utils.cv_show_image("image", m, use_rgb=False, delay=0)
|
|
49
49
|
for i, img in enumerate(crops):
|
|
50
|
-
if img.
|
|
50
|
+
if img.dsize < min_size: continue
|
|
51
51
|
name = class_name[int(labels[i])] if class_name else labels[i]
|
|
52
52
|
if out_dir:
|
|
53
53
|
file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id, i)
|
|
@@ -49,7 +49,7 @@ def save_object_crops(data_info, out_dir, class_name=None, target_name=None, sca
|
|
|
49
49
|
thickness=2, fontScale=0.8, drawType='chinese')
|
|
50
50
|
image_utils.cv_show_image('image', m, use_rgb=False, delay=0)
|
|
51
51
|
for i, img in enumerate(crops):
|
|
52
|
-
if img.
|
|
52
|
+
if img.dsize < min_size: continue
|
|
53
53
|
name = class_name[int(labels[i])] if class_name else labels[i]
|
|
54
54
|
if out_dir:
|
|
55
55
|
file_name = '{}_{:0=4d}_{}.jpg'.format(image_id, i, flag) if flag else '{}_{:0=4d}.jpg'.format(image_id, i)
|
|
@@ -49,7 +49,7 @@ def save_object_crops(data_info, out_dir, class_name=None, target_name=None, sca
|
|
|
49
49
|
thickness=2, fontScale=0.8, drawType='chinese')
|
|
50
50
|
image_utils.cv_show_image('image', m, use_rgb=False, delay=0)
|
|
51
51
|
for i, img in enumerate(crops):
|
|
52
|
-
if img.
|
|
52
|
+
if img.dsize < min_size: continue
|
|
53
53
|
name = class_name[int(labels[i])] if class_name else labels[i]
|
|
54
54
|
if out_dir:
|
|
55
55
|
file_name = '{}_{:0=4d}_{}.jpg'.format(image_id, i, flag) if flag else '{}_{:0=4d}.jpg'.format(image_id, i)
|
|
@@ -106,17 +106,15 @@ if __name__ == '__main__':
|
|
|
106
106
|
'胶枪灯', '胶枪灯红色', '胶枪灯绿色',
|
|
107
107
|
'PDA', 'PDA*', '清洁布', '手与*接触', '电视柜台面', '*标签'
|
|
108
108
|
]
|
|
109
|
-
# '*长条标签'
|
|
110
109
|
datasets = [
|
|
111
|
-
'/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-
|
|
112
|
-
'/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260211/images',
|
|
110
|
+
'/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/dataset-20260420/images',
|
|
113
111
|
]
|
|
114
112
|
# datasets = "/home/PKing/nasdata/dataset-dmai/AILT/ailt-det/文件列表.txt"
|
|
115
|
-
datasets = file_utils.read_data(datasets, split=None)
|
|
113
|
+
# datasets = file_utils.read_data(datasets, split=None)
|
|
116
114
|
# dataroot = '/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det'
|
|
117
115
|
# datasets = get_sub_dataset(dataroot)
|
|
118
116
|
class_name = []
|
|
119
|
-
datasets = sorted(datasets)
|
|
117
|
+
# datasets = sorted(datasets)
|
|
120
118
|
for anno_dir in datasets:
|
|
121
119
|
print(anno_dir)
|
|
122
120
|
assert os.path.exists(anno_dir), anno_dir
|
|
@@ -46,7 +46,7 @@ def save_object_crops(data_info, item_list, out_dir, class_name=None, scale=[],
|
|
|
46
46
|
else:
|
|
47
47
|
crops = image_utils.get_bboxes_crop(image, bboxes)
|
|
48
48
|
img = crops[0]
|
|
49
|
-
if img.
|
|
49
|
+
if img.dsize < min_size: continue
|
|
50
50
|
name = "_".join(labels + list(set(attrib_name)))
|
|
51
51
|
if out_dir:
|
|
52
52
|
file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id,
|
|
@@ -61,6 +61,20 @@ def video_iterator(video):
|
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
if __name__ == '__main__':
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
|
|
65
|
+
|
|
66
|
+
true_labels = ["A", "B", "A", "B", "C"]
|
|
67
|
+
pred_labels = ["A", "B", "C", "B", "C"]
|
|
68
|
+
|
|
69
|
+
accuracy = accuracy_score(true_labels, pred_labels)
|
|
70
|
+
precision = precision_score(true_labels, pred_labels, average=None) # 每个类别
|
|
71
|
+
recall = recall_score(true_labels, pred_labels, average=None)
|
|
72
|
+
f1_score = f1_score(true_labels, pred_labels, average=None)
|
|
73
|
+
|
|
74
|
+
print(f"准确率: {accuracy}")
|
|
75
|
+
print(f"精确率: {dict(zip(set(true_labels), precision))}")
|
|
76
|
+
print(f"召回率: {dict(zip(set(true_labels), recall))}")
|
|
77
|
+
print(f"F1值: {dict(zip(set(true_labels), f1_score))}")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
@@ -48,7 +48,7 @@ def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=Fals
|
|
|
48
48
|
thickness=2, fontScale=0.8, drawType="chinese")
|
|
49
49
|
image_utils.cv_show_image("image", m, use_rgb=False, delay=0)
|
|
50
50
|
for i, img in enumerate(crops):
|
|
51
|
-
if img.
|
|
51
|
+
if img.dsize < min_size: continue
|
|
52
52
|
name = class_name[int(labels[i])] if class_name else labels[i]
|
|
53
53
|
if out_dir:
|
|
54
54
|
file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id, i)
|
|
@@ -89,7 +89,7 @@ class LabelSmoothingCrossEntropy(nn.Module):
|
|
|
89
89
|
self.reduction = reduction
|
|
90
90
|
|
|
91
91
|
def forward(self, output, target):
|
|
92
|
-
c = output.
|
|
92
|
+
c = output.dsize()[-1]
|
|
93
93
|
log_preds = F.log_softmax(output, dim=-1)
|
|
94
94
|
if self.reduction == 'sum':
|
|
95
95
|
loss = -log_preds.sum()
|
|
@@ -111,7 +111,7 @@ class SlowFast(nn.Module):
|
|
|
111
111
|
x = torch.cat([x, lateral[3]],dim=1)
|
|
112
112
|
x = self.slow_res5(x)
|
|
113
113
|
x = nn.AdaptiveAvgPool3d(1)(x)
|
|
114
|
-
x = x.view(-1, x.
|
|
114
|
+
x = x.view(-1, x.dsize(1))
|
|
115
115
|
return x
|
|
116
116
|
|
|
117
117
|
def FastPath(self, input):
|
|
@@ -137,7 +137,7 @@ class SlowFast(nn.Module):
|
|
|
137
137
|
|
|
138
138
|
res5 = self.fast_res5(res4)
|
|
139
139
|
x = nn.AdaptiveAvgPool3d(1)(res5)
|
|
140
|
-
x = x.view(-1, x.
|
|
140
|
+
x = x.view(-1, x.dsize(1))
|
|
141
141
|
|
|
142
142
|
return x, lateral
|
|
143
143
|
|
|
@@ -214,4 +214,4 @@ if __name__ == "__main__":
|
|
|
214
214
|
input_tensor = torch.autograd.Variable(torch.rand(1, 3, 64, 224, 224))
|
|
215
215
|
model = resnet50(class_num=num_classes)
|
|
216
216
|
output = model(input_tensor)
|
|
217
|
-
print(output.
|
|
217
|
+
print(output.dsize())
|