pybaseutils 2.1.3__tar.gz → 2.1.4__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.1.3 → pybaseutils-2.1.4}/PKG-INFO +1 -1
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/video_utils.py +1 -1
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/data_resample.py +74 -11
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_image_folder.py +11 -21
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_image_text.py +47 -35
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/file_utils.py +1 -1
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/image_utils.py +11 -11
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/plot_utils.py +50 -5
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/SOURCES.txt +4 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo1.py +5 -1
- pybaseutils-2.1.4/test_py/demo_video.py +28 -0
- pybaseutils-2.1.4/test_py/single_class/GRU.py +36 -0
- pybaseutils-2.1.4/test_py/single_class/TCN.py +91 -0
- pybaseutils-2.1.4/test_py/single_class/__init__.py +7 -0
- pybaseutils-2.1.4/test_py/single_class/demo.py +216 -0
- pybaseutils-2.1.3/test_py/demo_video.py +0 -28
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/LICENCE +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/README.md +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/log.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/logger.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/setup.cfg +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/setup.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_labelme_crop.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/main.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/class_names.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo2.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo3.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/flask_demo/func.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/flask_demo/server.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/performance.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/base.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/component.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/main.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/registry/register.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.1.3 → pybaseutils-2.1.4}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -13,7 +13,7 @@ from tqdm import tqdm
|
|
|
13
13
|
from pybaseutils import image_utils, file_utils
|
|
14
14
|
from pybaseutils.cvutils import monitor
|
|
15
15
|
|
|
16
|
-
VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov']
|
|
16
|
+
VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov', "*.flv"]
|
|
17
17
|
|
|
18
18
|
get_video_capture = image_utils.get_video_capture
|
|
19
19
|
get_video_info = image_utils.get_video_info
|
|
@@ -12,7 +12,7 @@ import math
|
|
|
12
12
|
class ResampleExample(object):
|
|
13
13
|
"""样本均衡,重采样DataResampler的使用方法"""
|
|
14
14
|
|
|
15
|
-
def __init__(self, item_list, label_index
|
|
15
|
+
def __init__(self, item_list, label_index, shuffle=True, disp=False):
|
|
16
16
|
"""
|
|
17
17
|
:param item_list: item_list=[item_0,item_1,...,item_n],
|
|
18
18
|
item_n= [path/to/image,label]
|
|
@@ -28,14 +28,14 @@ class ResampleExample(object):
|
|
|
28
28
|
disp=self.disp)
|
|
29
29
|
|
|
30
30
|
def __len__(self):
|
|
31
|
+
print("start resampler, data will shuffle and update")
|
|
31
32
|
# 更新resampler,实现每个epoch重新采样,避免样本数比较多的类别,没有加入训练
|
|
32
33
|
self.item_list = self.resampler.update(self.shuffle)
|
|
33
34
|
return len(self.item_list)
|
|
34
35
|
|
|
35
|
-
def __getitem__(self,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return image_path, label_id
|
|
36
|
+
def __getitem__(self, index):
|
|
37
|
+
data_info = self.item_list[index]
|
|
38
|
+
return data_info
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class DataResample(object):
|
|
@@ -195,9 +195,71 @@ class DataResample(object):
|
|
|
195
195
|
return class_weight
|
|
196
196
|
|
|
197
197
|
|
|
198
|
+
class DataLabelResample(object):
|
|
199
|
+
"""样本均衡,重采样的方法"""
|
|
200
|
+
|
|
201
|
+
def __init__(self, data, label, balance="mean", shuffle=True, disp=False):
|
|
202
|
+
"""
|
|
203
|
+
Usage:
|
|
204
|
+
参考:ResampleExample例子的使用方法
|
|
205
|
+
:param item_list:
|
|
206
|
+
:param label_index:
|
|
207
|
+
:param balance:实现样本均衡策略,均衡力度:mean > log > sqrt > y
|
|
208
|
+
"y": 每个label样本数跟原来一样
|
|
209
|
+
"sqrt": 每个label样本取sqrt数,实现样本均衡
|
|
210
|
+
"log": 每个label样本取log数,实现样本均衡
|
|
211
|
+
"mean": 每个label样本取样本平均数,每个label的个数一样
|
|
212
|
+
"""
|
|
213
|
+
self.shuffle = shuffle
|
|
214
|
+
self.item_list = list(zip(data, label))
|
|
215
|
+
self.resample = DataResample(item_list=self.item_list, label_index=1, balance=balance,
|
|
216
|
+
shuffle=shuffle, disp=disp)
|
|
217
|
+
|
|
218
|
+
def __len__(self):
|
|
219
|
+
data, label = self.update(shuffle=self.shuffle)
|
|
220
|
+
return len(data)
|
|
221
|
+
|
|
222
|
+
def update(self, shuffle=False):
|
|
223
|
+
item_list = self.resample.update(shuffle=shuffle)
|
|
224
|
+
data = [item[0] for item in item_list]
|
|
225
|
+
label = [item[1] for item in item_list]
|
|
226
|
+
return data, label
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def get_class_count(item_list, label_index):
|
|
230
|
+
"""
|
|
231
|
+
统计每个类别的个数
|
|
232
|
+
:param item_list: List[list,list]
|
|
233
|
+
:param label_index: label在item中的序号
|
|
234
|
+
:return:
|
|
235
|
+
"""
|
|
236
|
+
count_info = {}
|
|
237
|
+
for item in item_list:
|
|
238
|
+
label = item[label_index]
|
|
239
|
+
try:
|
|
240
|
+
# if label in class_count: # 比较慢,相当于需要查询label是否存在
|
|
241
|
+
count_info[label] += 1
|
|
242
|
+
except Exception as e:
|
|
243
|
+
count_info[label] = 1
|
|
244
|
+
return count_info
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def get_label_count(label):
|
|
248
|
+
"""
|
|
249
|
+
统计每个类别的个数
|
|
250
|
+
:param label: [int,int,...]
|
|
251
|
+
:return:
|
|
252
|
+
"""
|
|
253
|
+
count = np.bincount(label).tolist()
|
|
254
|
+
label = list(range(max(count)))
|
|
255
|
+
count_info = {l: c for l, c in zip(label, count) if c > 0}
|
|
256
|
+
return count_info
|
|
257
|
+
|
|
258
|
+
|
|
198
259
|
if __name__ == "__main__":
|
|
260
|
+
from tqdm import tqdm
|
|
199
261
|
from torch.utils.data import Dataset, DataLoader, Sampler
|
|
200
|
-
from utils import torch_tools
|
|
262
|
+
from basetrainer.utils import torch_tools
|
|
201
263
|
|
|
202
264
|
torch_tools.set_env_random_seed()
|
|
203
265
|
label0 = [["0.1.jpg", 0], ["0.2.jpg", 0], ["0.3.jpg", 0]]
|
|
@@ -206,15 +268,16 @@ if __name__ == "__main__":
|
|
|
206
268
|
["2.5.jpg", 2], ["2.6.jpg", 2], ["2.7.jpg", 2], ["2.8.jpg", 2]]
|
|
207
269
|
label3 = [["3.1.jpg", 3], ["3.2.jpg", 3], ["3.3.jpg", 3]]
|
|
208
270
|
item_list = label0 + label1 + label2 + label3
|
|
209
|
-
item_list = item_list *
|
|
271
|
+
item_list = item_list * 1
|
|
272
|
+
item_list = [{"file": item[0], "label": item[1]} for item in item_list]
|
|
210
273
|
print("have item_list:{}".format(len(item_list)))
|
|
211
|
-
dataset_train = ResampleExample(item_list=item_list, label_index=
|
|
274
|
+
dataset_train = ResampleExample(item_list=item_list, label_index="label", shuffle=True, disp=True)
|
|
212
275
|
# dataset_train = ResampleExample(item_list=item_list, label_index=1, disp=False)
|
|
213
276
|
# dataset_train = ResampleExample(item_list=item_list, label_index=1, disp=False)
|
|
214
|
-
batch_size =
|
|
277
|
+
batch_size = 20
|
|
215
278
|
dataloader = DataLoader(dataset_train, batch_size, num_workers=0)
|
|
216
279
|
epochs = 2
|
|
217
280
|
for epoch in range(epochs):
|
|
218
281
|
print("{}===".format(epoch) * 10)
|
|
219
|
-
for
|
|
220
|
-
print(
|
|
282
|
+
for step, data in enumerate(tqdm(dataloader)):
|
|
283
|
+
print(step, data)
|
|
@@ -19,13 +19,14 @@ class FolderDataset(parser_image_text.TextDataset):
|
|
|
19
19
|
def __init__(self, image_dir, class_name=None, transform=None, use_rgb=False, shuffle=False,
|
|
20
20
|
phase="test", disp=False, check=False, **kwargs):
|
|
21
21
|
"""
|
|
22
|
+
文件夹数据集,要求相同类别的数据放在同一个文件夹,文件名为类别名称
|
|
22
23
|
:param image_dir: [image_dir]->list or `path/to/image_dir`->str
|
|
23
|
-
:param class_name:
|
|
24
|
+
:param class_name: 类别文件/列表/字典
|
|
24
25
|
:param transform: torch transform
|
|
25
26
|
:param shuffle:
|
|
26
27
|
:param disp:
|
|
27
28
|
"""
|
|
28
|
-
super(FolderDataset, self).__init__(
|
|
29
|
+
super(FolderDataset, self).__init__(data_file=image_dir,
|
|
29
30
|
data_root=None,
|
|
30
31
|
class_name=class_name,
|
|
31
32
|
transform=transform,
|
|
@@ -41,35 +42,24 @@ class FolderDataset(parser_image_text.TextDataset):
|
|
|
41
42
|
:param index:
|
|
42
43
|
:return: {"image": image, "label": label}
|
|
43
44
|
"""
|
|
44
|
-
|
|
45
|
-
bbox = item[2:] if len(item) == 6 else []
|
|
46
|
-
image_file, label = item[0], item[1]
|
|
47
|
-
image = self.read_image(image_file, use_rgb=self.use_rgb)
|
|
48
|
-
image = self.crop_image(image, bbox=bbox) if bbox else image
|
|
49
|
-
if self.transform:
|
|
50
|
-
image = Image.fromarray(image)
|
|
51
|
-
image = self.transform(image)
|
|
52
|
-
if image is None:
|
|
53
|
-
index = int(random.uniform(0, self.num_images))
|
|
54
|
-
return self.__getitem__(index)
|
|
55
|
-
return {"image": image, "label": label}
|
|
45
|
+
return super(FolderDataset, self).__getitem__(index)
|
|
56
46
|
|
|
57
|
-
def load_dataset(self,
|
|
47
|
+
def load_dataset(self, data_file, data_root="", use_sub=False):
|
|
58
48
|
"""
|
|
59
49
|
保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,,ymax]
|
|
60
|
-
:param
|
|
50
|
+
:param data_file:
|
|
61
51
|
:param data_root:
|
|
62
|
-
:return: item_list [
|
|
52
|
+
:return: item_list [{"file":file,"label":label}]
|
|
63
53
|
"""
|
|
64
|
-
if isinstance(
|
|
54
|
+
if isinstance(data_file, str): data_file = [data_file]
|
|
65
55
|
item_list = []
|
|
66
|
-
for i, dir in enumerate(
|
|
67
|
-
print("loading image from:{}".format(dir))
|
|
56
|
+
for i, dir in enumerate(data_file):
|
|
68
57
|
if not os.path.exists(dir): raise Exception("文件不存在,image_dir:{}".format(dir))
|
|
69
58
|
paths, labels = file_utils.get_files_labels(dir, postfix=file_utils.IMG_POSTFIX)
|
|
59
|
+
print("loading data from:{},have {}".format(dir, len(paths)))
|
|
70
60
|
# TODO # 避免多个数据集的相同的label
|
|
71
61
|
if use_sub: labels = [os.path.join(str(i), l) for l in labels]
|
|
72
|
-
data = [
|
|
62
|
+
data = [{"file": p, "label": l} for p, l in zip(paths, labels)]
|
|
73
63
|
item_list += data
|
|
74
64
|
return item_list
|
|
75
65
|
|
|
@@ -23,12 +23,13 @@ from pybaseutils.dataloader import data_resample
|
|
|
23
23
|
|
|
24
24
|
class TextDataset(Dataset):
|
|
25
25
|
|
|
26
|
-
def __init__(self,
|
|
26
|
+
def __init__(self, data_file, data_root=None, class_name=None, transform=None, shuffle=False, use_rgb=False,
|
|
27
27
|
phase="test", disp=False, check=False, **kwargs):
|
|
28
28
|
"""
|
|
29
|
-
|
|
30
|
-
:param
|
|
31
|
-
:param
|
|
29
|
+
数据文件保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
|
|
30
|
+
:param data_file: 数据文件路径,List[str] or str
|
|
31
|
+
:param data_root: 数据文件根目录
|
|
32
|
+
:param class_name: 类别文件/列表/字典
|
|
32
33
|
:param transform:
|
|
33
34
|
:param shuffle:
|
|
34
35
|
:param use_rgb:
|
|
@@ -41,18 +42,21 @@ class TextDataset(Dataset):
|
|
|
41
42
|
self.use_rgb = use_rgb
|
|
42
43
|
self.transform = transform
|
|
43
44
|
self.phase = phase
|
|
45
|
+
self.label_index = kwargs.get("label_index", "label") # 类别字段key
|
|
44
46
|
self.class_name, self.class_dict = self.parser_classes(class_name)
|
|
45
|
-
self.item_list = self.parser_dataset(
|
|
47
|
+
self.item_list = self.parser_dataset(data_file, data_root=data_root, label_index=self.label_index,
|
|
48
|
+
shuffle=shuffle, check=check)
|
|
46
49
|
self.resample = kwargs.get("resample", False)
|
|
47
50
|
if self.resample:
|
|
48
51
|
self.data_resample = data_resample.DataResample(self.item_list,
|
|
49
|
-
label_index=
|
|
52
|
+
label_index=self.label_index,
|
|
50
53
|
shuffle=shuffle,
|
|
51
54
|
disp=disp)
|
|
52
55
|
self.item_list = self.data_resample.update(True)
|
|
53
56
|
class_count = self.data_resample.class_count # resample前,每个类别的分布
|
|
54
57
|
balance_nums = self.data_resample.balance_nums # resample后,每个类别的分布
|
|
55
|
-
self.class_count = self.count_class_info(self.item_list, class_name=self.class_name
|
|
58
|
+
self.class_count = self.count_class_info(self.item_list, class_name=self.class_name,
|
|
59
|
+
label_index=self.label_index)
|
|
56
60
|
self.num_images = len(self.item_list)
|
|
57
61
|
self.classes = list(self.class_dict.values())
|
|
58
62
|
self.num_classes = max(self.classes) + 1
|
|
@@ -81,46 +85,53 @@ class TextDataset(Dataset):
|
|
|
81
85
|
print("loss_labels: {}".format(class_lack))
|
|
82
86
|
print("------------------------------------------------------------------")
|
|
83
87
|
|
|
84
|
-
def parser_dataset(self,
|
|
88
|
+
def parser_dataset(self, data_file, data_root="", label_index="label", shuffle=False, check=False):
|
|
85
89
|
"""
|
|
86
90
|
保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
|
|
87
|
-
:param
|
|
91
|
+
:param data_file:
|
|
88
92
|
:param data_root:
|
|
93
|
+
:param label_index: label index
|
|
89
94
|
:param shuffle:
|
|
90
95
|
:param check:
|
|
91
96
|
:return:
|
|
92
97
|
"""
|
|
93
|
-
data_list = self.load_dataset(
|
|
98
|
+
data_list = self.load_dataset(data_file, data_root=data_root)
|
|
94
99
|
if not self.class_name:
|
|
95
|
-
self.class_name = list(set([d[
|
|
100
|
+
self.class_name = list(set([d[label_index] for d in data_list]))
|
|
96
101
|
self.class_name, self.class_dict = self.parser_classes(self.class_name)
|
|
97
102
|
item_list = []
|
|
98
103
|
for data in data_list:
|
|
99
|
-
label = data[
|
|
104
|
+
label = data[label_index]
|
|
100
105
|
if label not in self.class_dict: continue
|
|
101
|
-
data[
|
|
106
|
+
data[label_index] = self.class_dict[label]
|
|
102
107
|
item_list.append(data)
|
|
103
108
|
if check: item_list = self.check_item(item_list)
|
|
104
109
|
assert self.class_name, f"类别为空,请检查,class_name={self.class_name}"
|
|
105
|
-
assert item_list, f"文件列表为空,请检查输入数据,
|
|
110
|
+
assert item_list, f"文件列表为空,请检查输入数据,data_file={data_file}"
|
|
106
111
|
if shuffle:
|
|
107
112
|
random.seed(100)
|
|
108
113
|
random.shuffle(item_list)
|
|
109
114
|
return item_list
|
|
110
115
|
|
|
111
|
-
def load_dataset(self,
|
|
116
|
+
def load_dataset(self, data_file, data_root="", **kwargs):
|
|
112
117
|
"""
|
|
113
118
|
保存格式:[path,label] 或者 [path,label,xmin,ymin,xmax,ymax]
|
|
114
|
-
:param
|
|
119
|
+
:param data_file:
|
|
115
120
|
:param data_root:
|
|
116
|
-
:return:
|
|
121
|
+
:return: item_list [{"file":file,"label":label},"bbox":[]]
|
|
117
122
|
"""
|
|
118
|
-
if isinstance(
|
|
123
|
+
if isinstance(data_file, str): data_file = [data_file]
|
|
119
124
|
item_list = []
|
|
120
|
-
for file in
|
|
125
|
+
for file in data_file:
|
|
121
126
|
root = data_root if data_root else os.path.dirname(file)
|
|
122
|
-
|
|
123
|
-
data = [
|
|
127
|
+
content = file_utils.read_data(file, split=",")
|
|
128
|
+
data = []
|
|
129
|
+
for line in content:
|
|
130
|
+
if len(line) == 2:
|
|
131
|
+
data.append({"file": os.path.join(root, line[0]), "label": line[1]})
|
|
132
|
+
elif len(line) == 6:
|
|
133
|
+
data.append({"file": os.path.join(root, line[0]), "label": line[1], "bbox": line[2:]})
|
|
134
|
+
print("loading data from:{},have {}".format(file, len(data)))
|
|
124
135
|
item_list += data
|
|
125
136
|
return item_list
|
|
126
137
|
|
|
@@ -148,7 +159,7 @@ class TextDataset(Dataset):
|
|
|
148
159
|
dst_list = []
|
|
149
160
|
print("Please wait, it's in checking")
|
|
150
161
|
for item in tqdm(item_list):
|
|
151
|
-
file, label = item[
|
|
162
|
+
file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
|
|
152
163
|
if not os.path.exists(file):
|
|
153
164
|
print("no file:{}".format(file))
|
|
154
165
|
continue
|
|
@@ -162,9 +173,8 @@ class TextDataset(Dataset):
|
|
|
162
173
|
:return: {"image": image, "label": label}
|
|
163
174
|
"""
|
|
164
175
|
item = self.item_list[index]
|
|
165
|
-
bbox = item[
|
|
166
|
-
|
|
167
|
-
image = self.read_image(image_file, use_rgb=self.use_rgb)
|
|
176
|
+
file, label, bbox = item["file"], item[self.label_index], item.get("bbox", [])
|
|
177
|
+
image = self.read_image(file, use_rgb=self.use_rgb)
|
|
168
178
|
image = self.crop_image(image, bbox=bbox, **self.kwargs) if bbox else image
|
|
169
179
|
if self.transform:
|
|
170
180
|
image = Image.fromarray(image)
|
|
@@ -172,7 +182,7 @@ class TextDataset(Dataset):
|
|
|
172
182
|
if image is None:
|
|
173
183
|
index = int(random.uniform(0, self.num_images))
|
|
174
184
|
return self.__getitem__(index)
|
|
175
|
-
return {"image": image, "label": label}
|
|
185
|
+
return {"image": image, "label": label, "file": file}
|
|
176
186
|
|
|
177
187
|
def __len__(self):
|
|
178
188
|
if self.resample:
|
|
@@ -226,17 +236,17 @@ class TextDataset(Dataset):
|
|
|
226
236
|
return image
|
|
227
237
|
|
|
228
238
|
@staticmethod
|
|
229
|
-
def count_class_info(item_list, class_name=None,
|
|
239
|
+
def count_class_info(item_list, class_name=None, label_index="label"):
|
|
230
240
|
"""
|
|
231
241
|
统计类别信息
|
|
232
|
-
item_list=[[
|
|
242
|
+
item_list=[[file,label,...],[file,label,...]]
|
|
233
243
|
:param item_list:
|
|
234
244
|
:param class_name:
|
|
235
245
|
:return:
|
|
236
246
|
"""
|
|
237
247
|
count = {}
|
|
238
248
|
for item in item_list:
|
|
239
|
-
label = item[
|
|
249
|
+
label = item[label_index]
|
|
240
250
|
count[label] = count[label] + 1 if label in count else 1
|
|
241
251
|
if class_name: count = {class_name[k]: v for k, v in count.items()}
|
|
242
252
|
return count
|
|
@@ -246,8 +256,8 @@ if __name__ == '__main__':
|
|
|
246
256
|
from pybaseutils import image_utils
|
|
247
257
|
from torchvision import transforms
|
|
248
258
|
|
|
249
|
-
|
|
250
|
-
'/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-images-
|
|
259
|
+
data_files = [
|
|
260
|
+
'/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-images-v2/train.txt',
|
|
251
261
|
]
|
|
252
262
|
class_name = None
|
|
253
263
|
input_size = [112, 112]
|
|
@@ -258,18 +268,20 @@ if __name__ == '__main__':
|
|
|
258
268
|
transforms.ToTensor(),
|
|
259
269
|
transforms.Normalize(mean=rgb_mean, std=rgb_std),
|
|
260
270
|
])
|
|
261
|
-
|
|
271
|
+
class_name = ['fake', 'real']
|
|
272
|
+
dataset = TextDataset(data_file=data_files,
|
|
262
273
|
transform=transform,
|
|
263
274
|
class_name=class_name,
|
|
264
|
-
resample=
|
|
275
|
+
resample=True,
|
|
265
276
|
shuffle=True,
|
|
277
|
+
check=False,
|
|
266
278
|
crop_scale=(1.5, 1.5),
|
|
267
279
|
disp=True)
|
|
268
280
|
for i in range(len(dataset)):
|
|
269
281
|
data_info = dataset.__getitem__(i)
|
|
270
|
-
image, label = data_info["image"], data_info["label"]
|
|
282
|
+
image, label, file = data_info["image"], data_info["label"], data_info["file"]
|
|
271
283
|
image = np.asarray(image).transpose(1, 2, 0) # 通道由[c,h,w]->[h,w,c]
|
|
272
284
|
image = np.asarray(image * 255, dtype=np.uint8)
|
|
273
285
|
label = np.asarray(label, dtype=np.int32)
|
|
274
|
-
print("batch_image.shape:{},batch_label:{}".format(image.shape, label))
|
|
286
|
+
print("{},batch_image.shape:{},batch_label:{}".format(file, image.shape, label))
|
|
275
287
|
image_utils.cv_show_image("image", image)
|
|
@@ -380,19 +380,19 @@ def image_unnormalize(image, mean=None, std=None):
|
|
|
380
380
|
image_unnormalization = image_unnormalize
|
|
381
381
|
|
|
382
382
|
|
|
383
|
-
def
|
|
384
|
-
"""
|
|
385
|
-
NORMALIZATION 将数据x归一化到任意区间[ymin,
|
|
386
|
-
:param
|
|
387
|
-
:param
|
|
388
|
-
:param
|
|
389
|
-
:param
|
|
390
|
-
:param
|
|
383
|
+
def data_normalize(x, ymin=0, ymax=1.0, xmin=None, xmax=None):
|
|
384
|
+
"""
|
|
385
|
+
NORMALIZATION 将数据x归一化到任意区间[ymin,ymax]范围的方法
|
|
386
|
+
:param x: 输入参数x:需要被归一化的数据,numpy
|
|
387
|
+
:param ymin: 输入参数ymin:归一化的区间[ymin,ymax]下限
|
|
388
|
+
:param ymax: 输入参数ymax:归一化的区间[ymin,ymax]上限
|
|
389
|
+
:param xmin: 输入参数xmin的最小值
|
|
390
|
+
:param xmax: 输入参数xmax的最大值
|
|
391
391
|
:return: 输出参数y:归一化到区间[omin,omax]的数据
|
|
392
392
|
"""
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
y = (
|
|
393
|
+
xmax = np.max(x) if xmax is None else xmax # %计算最大值
|
|
394
|
+
xmin = np.min(x) if xmin is None else xmin # %计算最小值
|
|
395
|
+
y = (ymax - ymin) * (x - xmin) / (xmax - xmin) + ymin
|
|
396
396
|
return y
|
|
397
397
|
|
|
398
398
|
|
|
@@ -106,7 +106,50 @@ def plot_bar(x, y, xlabel="X", ylabel="Y", title="bar", bin_width=1, vis=True, s
|
|
|
106
106
|
if vis: plt.savefig('out.png')
|
|
107
107
|
|
|
108
108
|
|
|
109
|
-
def
|
|
109
|
+
def plot_line(x, y, name=None, title="", xlabel="", ylabel="", color="b"):
|
|
110
|
+
"""
|
|
111
|
+
:param x: List[]
|
|
112
|
+
:param y: List[]
|
|
113
|
+
:param names: List[]
|
|
114
|
+
:param title:
|
|
115
|
+
:param xlabel:
|
|
116
|
+
:param ylabel:
|
|
117
|
+
:return:
|
|
118
|
+
"""
|
|
119
|
+
# 绘图
|
|
120
|
+
# plt.figure()
|
|
121
|
+
if x is None: x = list(range(0, len(y)))
|
|
122
|
+
lw = 2
|
|
123
|
+
plt.figure(figsize=(10, 10))
|
|
124
|
+
plt.plot(x, y, color=color, lw=lw, label=name) # 假正率为横坐标,真正率为纵坐标做曲线
|
|
125
|
+
# plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
|
|
126
|
+
# plt.plot([0, 1], [1, 0], color='navy', lw=lw, linestyle='--') # 绘制y=1-x的直线
|
|
127
|
+
# plt.xlim([xlim_min - 0.01 * x_deta, xlim_max + 0.1 * x_deta])
|
|
128
|
+
# plt.ylim([ylim_min - 0.01 * y_deta, ylim_max + 0.1 * y_deta])
|
|
129
|
+
# 设置横纵坐标的名称以及对应字体格式
|
|
130
|
+
font = {'family': 'Times New Roman',
|
|
131
|
+
'weight': 'normal',
|
|
132
|
+
'size': 20,
|
|
133
|
+
}
|
|
134
|
+
plt.xlabel(xlabel, font)
|
|
135
|
+
plt.ylabel(ylabel, font)
|
|
136
|
+
plt.title(title)
|
|
137
|
+
plt.legend(loc="lower right") # "upper right"
|
|
138
|
+
# plt.legend(loc="upper right")#"upper right"
|
|
139
|
+
plt.grid(True) # 显示网格;
|
|
140
|
+
plt.show()
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def plot_lines(X, Y, names=None, title="", xlabel="", ylabel=""):
|
|
144
|
+
"""
|
|
145
|
+
:param X: List[List]
|
|
146
|
+
:param Y: List[List]
|
|
147
|
+
:param names: List[]
|
|
148
|
+
:param title:
|
|
149
|
+
:param xlabel:
|
|
150
|
+
:param ylabel:
|
|
151
|
+
:return:
|
|
152
|
+
"""
|
|
110
153
|
# 绘图
|
|
111
154
|
# plt.figure()
|
|
112
155
|
lw = 2
|
|
@@ -117,10 +160,9 @@ def plot_multi_line(x_data_list, y_data_list, line_names=None, title="", xlabel=
|
|
|
117
160
|
|
|
118
161
|
xlim_min = 0
|
|
119
162
|
ylim_min = 0
|
|
120
|
-
if not
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
plt.plot(x, y, color=color, lw=lw, label=line_name) # 假正率为横坐标,真正率为纵坐标做曲线
|
|
163
|
+
if not names: names = " " * len(X)
|
|
164
|
+
for x, y, color, label in zip(X, Y, colors, names):
|
|
165
|
+
plt.plot(x, y, color=color, lw=lw, label=label) # 假正率为横坐标,真正率为纵坐标做曲线
|
|
124
166
|
if xlim_max < max(x):
|
|
125
167
|
xlim_max = max(x)
|
|
126
168
|
if ylim_max < max(y):
|
|
@@ -150,6 +192,9 @@ def plot_multi_line(x_data_list, y_data_list, line_names=None, title="", xlabel=
|
|
|
150
192
|
plt.show()
|
|
151
193
|
|
|
152
194
|
|
|
195
|
+
plot_multi_line = plot_lines
|
|
196
|
+
|
|
197
|
+
|
|
153
198
|
def plot_skew_kurt(data, name="Title"):
|
|
154
199
|
"""
|
|
155
200
|
https://blog.csdn.net/u012735708/article/details/84750295
|
|
@@ -243,6 +243,10 @@ test_py/registry/base.py
|
|
|
243
243
|
test_py/registry/component.py
|
|
244
244
|
test_py/registry/main.py
|
|
245
245
|
test_py/registry/register.py
|
|
246
|
+
test_py/single_class/GRU.py
|
|
247
|
+
test_py/single_class/TCN.py
|
|
248
|
+
test_py/single_class/__init__.py
|
|
249
|
+
test_py/single_class/demo.py
|
|
246
250
|
test_py/test_fr/__init__.py
|
|
247
251
|
test_py/test_fr/demo11.py
|
|
248
252
|
test_py/test_fr/idcardocr.py
|
|
@@ -49,4 +49,8 @@ class Promote():
|
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
if __name__ == '__main__':
|
|
52
|
-
|
|
52
|
+
data = ["1.jpg", "2.jpg"]
|
|
53
|
+
label = [0, 1]
|
|
54
|
+
item_list = list(zip(data, label))
|
|
55
|
+
item_list = zip()
|
|
56
|
+
print(item_list)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : PKing
|
|
4
|
+
@E-mail : 390737991@qq.com
|
|
5
|
+
@Date : 2022-12-31 11:37:30
|
|
6
|
+
@Brief :
|
|
7
|
+
"""
|
|
8
|
+
import os
|
|
9
|
+
import cv2
|
|
10
|
+
import numpy as np
|
|
11
|
+
from pybaseutils import file_utils, image_utils
|
|
12
|
+
from pybaseutils.cvutils import video_utils
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def video2frames_demo(root, out):
|
|
16
|
+
files = file_utils.get_files_lists(root, postfix=file_utils.VIDEO_POSTFIX)
|
|
17
|
+
print("save:{}".format(out))
|
|
18
|
+
for video_file in files:
|
|
19
|
+
print(video_file)
|
|
20
|
+
# video_utils.video2frames_similarity(video_file, out_dir=out, func=None, interval=20, thresh=0.3, vis=True)
|
|
21
|
+
video_utils.video2frames(video_file, out_dir=out, func=None, interval=15, vis=True)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
if __name__ == "__main__":
|
|
25
|
+
root = "/home/PKing/nasdata/tmp/tmp/RealFakeFace/anti-spoofing-video-v1/test"
|
|
26
|
+
out = os.path.join(os.path.dirname(root), "frame")
|
|
27
|
+
out = file_utils.create_dir(out, os.path.basename(root))
|
|
28
|
+
video2frames_demo(root, out)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : PKing
|
|
4
|
+
@E-mail :
|
|
5
|
+
@Date : 2024-02-05 18:19:18
|
|
6
|
+
@Brief : https://tianchi.aliyun.com/notebook/231732
|
|
7
|
+
"""
|
|
8
|
+
import torch
|
|
9
|
+
from torch import nn
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ModelGRU(nn.Module):
|
|
13
|
+
def __init__(self, input_size=1, output_size=4, hidden_size=300):
|
|
14
|
+
"""
|
|
15
|
+
:param input_size: The number of expected features in the input `x`
|
|
16
|
+
:param output_size: num_class
|
|
17
|
+
:param hidden_size: The number of features in the hidden state `h`
|
|
18
|
+
"""
|
|
19
|
+
super(ModelGRU, self).__init__()
|
|
20
|
+
self.hidden_layer_size = hidden_size
|
|
21
|
+
self.lstm = nn.GRU(
|
|
22
|
+
input_size=input_size,
|
|
23
|
+
hidden_size=hidden_size,
|
|
24
|
+
dropout=0.8,
|
|
25
|
+
batch_first=True
|
|
26
|
+
)
|
|
27
|
+
self.linear = nn.Linear(hidden_size, output_size)
|
|
28
|
+
|
|
29
|
+
def forward(self, inputs):
|
|
30
|
+
"""
|
|
31
|
+
:param inputs: shape is (batch,dim-size,1)
|
|
32
|
+
:return:
|
|
33
|
+
"""
|
|
34
|
+
r_out, h_c = self.lstm(inputs, None)
|
|
35
|
+
x = self.linear(r_out[:, -1, :])
|
|
36
|
+
return x
|