pybaseutils 2.4.11__tar.gz → 2.4.14__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.14}/PKG-INFO +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/camera.py +37 -15
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/base_dataset.py +1 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/file_utils.py +42 -15
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/image_utils.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/average_meter.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/class_report.py +44 -17
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/numpy_utils.py +2 -2
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/action_dataset.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_labelme_crop_aije.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_labelme_crop_ailt.py +4 -6
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_labelme_shock.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo2.py +17 -3
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_labelme_crop.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/demo.py +1 -1
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/slowfastnet.py +3 -3
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/LICENCE +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/README.md +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/nets_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/SOURCES.txt +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/setup.cfg +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/setup.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo3.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo4.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/performance.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/qrcode/demo.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_camera.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.11 → pybaseutils-2.4.14}/test_py/web_socket/chat_service.py +0 -0
|
@@ -2,20 +2,42 @@ import cv2
|
|
|
2
2
|
import time
|
|
3
3
|
import numpy as np
|
|
4
4
|
import subprocess
|
|
5
|
+
import json
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def get_video_size(video):
|
|
9
|
+
"""获取视频原始分辨率"""
|
|
10
|
+
cmd = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_streams', video]
|
|
11
|
+
result = subprocess.check_output(cmd).decode()
|
|
12
|
+
info = json.loads(result)
|
|
13
|
+
for stream in info['streams']:
|
|
14
|
+
if stream['codec_type'] == 'video':
|
|
15
|
+
return stream['width'], stream['height']
|
|
16
|
+
return None, None
|
|
5
17
|
|
|
6
18
|
|
|
7
19
|
class CameraCapture(object):
|
|
8
|
-
def __init__(self, video: str or int = 0, size=(1920, 1080),
|
|
20
|
+
def __init__(self, video: str or int = 0, fps=30, size=(1920, 1080), scale=1.0, pad=False):
|
|
9
21
|
"""
|
|
10
22
|
:param video: 视频设备路径或索引(如 0 或 "/dev/video0")
|
|
11
|
-
:param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
|
|
12
23
|
:param fps: 视频帧率
|
|
24
|
+
:param size: 视频分辨率 (宽, 高),(1280,720),(1920,1080)
|
|
25
|
+
:param scale: 视频缩放比例
|
|
26
|
+
:param pad: 是否保持原始视频比例并填充到指定分辨率
|
|
13
27
|
"""
|
|
14
|
-
self.size = size
|
|
15
28
|
self.fps = fps
|
|
16
29
|
self.stopped = False
|
|
17
30
|
if isinstance(video, int): video = f"/dev/video{video}"
|
|
18
|
-
|
|
31
|
+
self.dsize = size
|
|
32
|
+
self.ssize = get_video_size(video)
|
|
33
|
+
if size and pad:
|
|
34
|
+
vf = f'scale={self.dsize[0]}:{self.dsize[1]}:force_original_aspect_ratio=decrease,pad={self.dsize[0]}:{self.dsize[1]}:(ow-iw)/2:(oh-ih)/2'
|
|
35
|
+
elif size:
|
|
36
|
+
vf = f'scale={self.dsize[0]}:{self.dsize[1]}'
|
|
37
|
+
else:
|
|
38
|
+
vf = f'scale=trunc(iw*{scale}):trunc(ih*{scale})'
|
|
39
|
+
self.dsize = (int(self.ssize[0] * scale), int(self.ssize[1] * scale))
|
|
40
|
+
# TODO FFmpeg 命令
|
|
19
41
|
# -re: 以原生帧率读取(模拟直播流)
|
|
20
42
|
# -fflags nobuffer: 关键!禁用缓冲区
|
|
21
43
|
# -flags low_delay: 关键!低延迟模式
|
|
@@ -30,25 +52,25 @@ class CameraCapture(object):
|
|
|
30
52
|
'-i', video, # 输入设备
|
|
31
53
|
'-f', 'rawvideo', # 输出原始视频流
|
|
32
54
|
'-pix_fmt', 'bgr24', # 像素格式 BGR (OpenCV 格式)
|
|
33
|
-
'-
|
|
55
|
+
'-vf', vf, # 分辨率
|
|
34
56
|
'-r', str(fps), # 帧率
|
|
35
57
|
'-' # 输出到 stdout
|
|
36
58
|
]
|
|
37
59
|
# 启动进程
|
|
38
|
-
self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
|
|
39
60
|
print(f"command: {' '.join(command)}")
|
|
61
|
+
self.pipe = subprocess.Popen(command, stdout=subprocess.PIPE, bufsize=10 ** 8)
|
|
40
62
|
|
|
41
63
|
def read(self):
|
|
42
64
|
if self.stopped:
|
|
43
65
|
self.stop()
|
|
44
66
|
return False, None
|
|
45
67
|
# 读取一帧的数据量 (宽 * 高 * 3通道)
|
|
46
|
-
buf = self.pipe.stdout.read(self.
|
|
47
|
-
if len(buf) != self.
|
|
68
|
+
buf = self.pipe.stdout.read(self.dsize[0] * self.dsize[1] * 3)
|
|
69
|
+
if len(buf) != self.dsize[0] * self.dsize[1] * 3:
|
|
48
70
|
self.stop()
|
|
49
71
|
return False, None # 读取失败或结束
|
|
50
72
|
# TODO 将字节流转换为numpy数组图像(bgr)
|
|
51
|
-
bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.
|
|
73
|
+
bgr = np.frombuffer(buf, dtype=np.uint8).reshape((self.dsize[1], self.dsize[0], 3))
|
|
52
74
|
return True, bgr
|
|
53
75
|
|
|
54
76
|
def release(self):
|
|
@@ -81,10 +103,10 @@ class CameraCapture(object):
|
|
|
81
103
|
|
|
82
104
|
|
|
83
105
|
if __name__ == '__main__':
|
|
84
|
-
fps =
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
video =
|
|
88
|
-
|
|
89
|
-
cap = CameraCapture(video=video, size=(
|
|
106
|
+
fps = 10
|
|
107
|
+
# video = 0 # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
108
|
+
video = "/home/PKing/Videos/video1.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
109
|
+
video = "/home/PKing/Videos/demo-src.mp4" # Windows 下可能是 0 或 "video=Integrated Webcam"
|
|
110
|
+
cap = CameraCapture(video=video, size=(640, 640), scale=0.5, pad=True, fps=fps)
|
|
111
|
+
# cap = CameraCapture(video=video, size=(), scale=0.5, fps=fps)
|
|
90
112
|
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())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|