pybaseutils 2.4.34__tar.gz → 2.4.35__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.34 → pybaseutils-2.4.35}/PKG-INFO +9 -5
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base64_utils.py +10 -3
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/color_utils.py +26 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/file_utils.py +31 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/image_utils.py +121 -25
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/class_report.py +10 -5
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/PKG-INFO +9 -5
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/SOURCES.txt +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/setup.cfg +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/setup.py +22 -3
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/camera/demo.py +5 -3
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/parking_rois_gopro.py +0 -0
- pybaseutils-2.4.35/test_py/demo3.py +21 -0
- pybaseutils-2.4.35/test_py/demo4.py +30 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_gif_video.py +3 -1
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/qrcode/demo.py +0 -0
- pybaseutils-2.4.34/test_py/demo3.py +0 -67
- pybaseutils-2.4.34/test_py/demo4.py +0 -70
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/LICENCE +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/README.md +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/camera.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/frame_record.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/dict_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/nets_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/download_pdf.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_labelme_crop_aije.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_labelme_crop_ailt.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/camera.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/car_accident.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_video_segm.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/performance.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_camera.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.4.35}/test_py/web_socket/chat_service.py +0 -0
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.35
|
|
4
4
|
Summary: pybaseutils
|
|
5
5
|
Home-page: https://github.com/PanJinquan/base-utils
|
|
6
6
|
Author: PanJinquan
|
|
7
7
|
Author-email: 390737991@qq.com
|
|
8
8
|
License: MIT
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
License-File: LICENCE
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: author-email
|
|
12
|
+
Dynamic: description
|
|
13
|
+
Dynamic: home-page
|
|
14
|
+
Dynamic: license
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
Dynamic: summary
|
|
11
17
|
|
|
12
18
|
base-utils
|
|
13
19
|
==========
|
|
@@ -142,5 +148,3 @@ base_utils(C++)
|
|
|
142
148
|
DEBUG_IMSHOW("image", image);
|
|
143
149
|
return 0;
|
|
144
150
|
}
|
|
145
|
-
|
|
146
|
-
|
|
File without changes
|
|
@@ -11,13 +11,16 @@ import sys
|
|
|
11
11
|
import os
|
|
12
12
|
|
|
13
13
|
import PIL.Image as Image
|
|
14
|
+
from PIL import ImageFile
|
|
14
15
|
import cv2
|
|
15
16
|
import base64
|
|
16
17
|
import numpy as np
|
|
17
18
|
from typing import Any
|
|
19
|
+
from io import BytesIO
|
|
18
20
|
|
|
19
21
|
IMG_PREFIX = "image/jpg" # 图片base64字符串前缀
|
|
20
22
|
precision = 6 # 小数点精度
|
|
23
|
+
ImageFile.LOAD_TRUNCATED_IMAGES = True # 允许加载截断的图像
|
|
21
24
|
|
|
22
25
|
|
|
23
26
|
def isbase64(data: str, prefix=IMG_PREFIX):
|
|
@@ -36,10 +39,14 @@ def base642image(bs64, prefix=IMG_PREFIX, use_rgb=False) -> np.ndarray:
|
|
|
36
39
|
if prefix == bs64[0:len(prefix)]:
|
|
37
40
|
bs64 = bs64[len(prefix):]
|
|
38
41
|
bs64 = bytes(bs64, 'utf-8')
|
|
39
|
-
|
|
40
|
-
image = np.frombuffer(
|
|
41
|
-
image = cv2.imdecode(image, flags=cv2.IMREAD_UNCHANGED)
|
|
42
|
+
imgbf = base64.b64decode(bs64)
|
|
43
|
+
# image = np.frombuffer(imgbf, np.uint8)
|
|
44
|
+
# image = cv2.imdecode(image, flags=cv2.IMREAD_UNCHANGED)
|
|
42
45
|
# image = cv2.imdecode(image, cv2.IMREAD_COLOR)
|
|
46
|
+
# if image is None:
|
|
47
|
+
image = Image.open(BytesIO(imgbf)) # 修复截断的图像
|
|
48
|
+
image = np.array(image)
|
|
49
|
+
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
|
|
43
50
|
if use_rgb:
|
|
44
51
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
|
45
52
|
return image
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
import cv2
|
|
11
11
|
import matplotlib.pyplot as plt
|
|
12
12
|
import numpy as np
|
|
13
|
+
from collections import defaultdict, Counter
|
|
14
|
+
from pybaseutils import file_utils
|
|
13
15
|
|
|
14
16
|
VOC_NAMES = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat",
|
|
15
17
|
"chair", "cow", "diningtable", "dog", "horse", "motorbike", "person",
|
|
@@ -28,6 +30,30 @@ COCO_NAMES = ['background', 'person', 'bicycle', 'car', 'motorcycle', 'airplane'
|
|
|
28
30
|
'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
|
|
29
31
|
'teddy bear', 'hair drier', 'toothbrush']
|
|
30
32
|
|
|
33
|
+
color_table = [(0, 0, 0), (0, 255, 0), (255, 0, 0), (0, 0, 255), (0, 255, 255), (255, 0, 255), (255, 255, 0),
|
|
34
|
+
(128, 0, 0), (0, 128, 0), (128, 128, 0),
|
|
35
|
+
(0, 0, 128), (128, 0, 128), (0, 128, 128), (128, 128, 128),
|
|
36
|
+
(64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0),
|
|
37
|
+
(64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128),
|
|
38
|
+
(0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)] * 100
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class ColorHash():
|
|
42
|
+
def __init__(self):
|
|
43
|
+
self.color = dict()
|
|
44
|
+
self.cnums = len(color_table)
|
|
45
|
+
|
|
46
|
+
def get_color(self, label: str):
|
|
47
|
+
"""
|
|
48
|
+
:param label: str or list
|
|
49
|
+
:return:
|
|
50
|
+
"""
|
|
51
|
+
h = file_utils.get_hash(texts=[str(label)])
|
|
52
|
+
if h not in self.color:
|
|
53
|
+
i = len(self.color) + 1
|
|
54
|
+
self.color[h] = color_table[i % self.cnums]
|
|
55
|
+
return self.color[h]
|
|
56
|
+
|
|
31
57
|
|
|
32
58
|
def get_colormap(data_type="custom"):
|
|
33
59
|
if data_type == 'pascal':
|
|
File without changes
|
|
@@ -148,6 +148,25 @@ def get_data_hash(data: np.ndarray):
|
|
|
148
148
|
return hash
|
|
149
149
|
|
|
150
150
|
|
|
151
|
+
def get_hash(image: np.ndarray = None, texts=[]) -> str:
|
|
152
|
+
"""根据image和texts数据生成唯一ID(hash)"""
|
|
153
|
+
if texts is None: texts = []
|
|
154
|
+
# 使用更快的哈希算法(如果安全性要求不高)
|
|
155
|
+
hasher = hashlib.sha256() # 或 hashlib.md5() for speed
|
|
156
|
+
# 文本处理
|
|
157
|
+
if texts:
|
|
158
|
+
texts = sorted([t.strip() for t in texts if t and t.strip()])
|
|
159
|
+
if texts: hasher.update('|'.join(texts).encode('utf-8'))
|
|
160
|
+
# 图像处理
|
|
161
|
+
if image is not None and isinstance(image, np.ndarray):
|
|
162
|
+
if not image.flags.c_contiguous: image = np.ascontiguousarray(image) # 确保连续性(视图操作)
|
|
163
|
+
# 使用memoryview避免拷贝
|
|
164
|
+
hasher.update(memoryview(image))
|
|
165
|
+
# 如果完全没有数据,返回空哈希
|
|
166
|
+
v = hasher.hexdigest() if hasher.digest_size > 0 else hashlib.sha256(b'empty').hexdigest()
|
|
167
|
+
return v
|
|
168
|
+
|
|
169
|
+
|
|
151
170
|
def replace_elements(items, src, dst, ignore=True):
|
|
152
171
|
"""
|
|
153
172
|
将列表中,值为src改为dst
|
|
@@ -264,6 +283,18 @@ def save_json(json_file, json_data):
|
|
|
264
283
|
write_json_path = save_json
|
|
265
284
|
|
|
266
285
|
|
|
286
|
+
def save_jsonl(jsonl_file, data_list: list):
|
|
287
|
+
"""
|
|
288
|
+
data_list转为jsonl保持
|
|
289
|
+
:param jsonl_file:
|
|
290
|
+
:param data_list:
|
|
291
|
+
:return:
|
|
292
|
+
"""
|
|
293
|
+
with open(jsonl_file, 'w', encoding='utf-8') as f:
|
|
294
|
+
for item in data_list:
|
|
295
|
+
f.write(json.dumps(item, ensure_ascii=False) + '\n')
|
|
296
|
+
|
|
297
|
+
|
|
267
298
|
def load_json_files(files: list, max_workers=8):
|
|
268
299
|
"""
|
|
269
300
|
根据url读取文件
|
|
@@ -43,6 +43,8 @@ color_map = [(0, 0, 0), (56, 56, 255), (151, 157, 255), (31, 112, 255), (29, 178
|
|
|
43
43
|
(168, 153, 44), (255, 194, 0), (147, 69, 52), (255, 115, 100),
|
|
44
44
|
(236, 24, 0), (255, 56, 132), (133, 0, 82), (255, 56, 203), (200, 149, 255), (199, 55, 255)] * 100
|
|
45
45
|
|
|
46
|
+
color_hash = color_utils.ColorHash()
|
|
47
|
+
|
|
46
48
|
root = os.path.dirname(__file__)
|
|
47
49
|
coco_skeleton = [[1, 3], [1, 0], [2, 4], [2, 0], [0, 5], [0, 6], [5, 7], [7, 9], [6, 8],
|
|
48
50
|
[8, 10], [5, 11], [6, 12], [11, 12], [11, 13], [13, 15], [12, 14], [14, 16]]
|
|
@@ -1167,7 +1169,7 @@ def draw_image_boxes_labels_texts(image, boxes, labels, texts, color=None, thick
|
|
|
1167
1169
|
for i, (label, bbox, name) in enumerate(zip(labels, boxes, texts)):
|
|
1168
1170
|
bbox = [int(b) for b in bbox]
|
|
1169
1171
|
if color_type == "class":
|
|
1170
|
-
c = color if color else
|
|
1172
|
+
c = color if color else color_hash.get_color(label) # 相同类别相同颜色
|
|
1171
1173
|
else:
|
|
1172
1174
|
c = color if color else colors[(i + 1) % 20] # 每个实例不同颜色
|
|
1173
1175
|
image = draw_image_bbox_text(image, bbox, str(name), color=c, thickness=thickness, fontScale=fontScale,
|
|
@@ -1472,13 +1474,12 @@ def draw_text(image, point, text, color=(255, 0, 0), fontScale=0, thickness=0, d
|
|
|
1472
1474
|
"""
|
|
1473
1475
|
point = (int(point[0]), int(point[1]))
|
|
1474
1476
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1475
|
-
fontFace = cv2.
|
|
1476
|
-
# fontFace=cv2.FONT_HERSHEY_SIMPLEX
|
|
1477
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
1477
1478
|
if drawType == "custom" or drawType == "en":
|
|
1478
|
-
|
|
1479
|
-
text_loc = (point[0], point[1] +
|
|
1479
|
+
text_wh, baseline = cv2.getTextSize(str(text), fontFace, fontScale, abs(thickness))
|
|
1480
|
+
text_loc = (point[0], point[1] + text_wh[1])
|
|
1480
1481
|
cv2.rectangle(image, (text_loc[0] - 2 // 2, text_loc[1] - 2 - baseline),
|
|
1481
|
-
(text_loc[0] +
|
|
1482
|
+
(text_loc[0] + text_wh[0], text_loc[1] + text_wh[1]), color=color, thickness=-1)
|
|
1482
1483
|
# draw score value
|
|
1483
1484
|
cv2.putText(image, str(text), (text_loc[0], text_loc[1] + baseline), fontFace, fontScale, (255, 255, 255),
|
|
1484
1485
|
abs(thickness), 2)
|
|
@@ -1489,7 +1490,7 @@ def draw_text(image, point, text, color=(255, 0, 0), fontScale=0, thickness=0, d
|
|
|
1489
1490
|
return image
|
|
1490
1491
|
|
|
1491
1492
|
|
|
1492
|
-
def
|
|
1493
|
+
def draw_image_bbox_text_bk(image, bbox, text, color, thickness=2, fontScale=0.8, alpha=0, drawType="custom", top=True):
|
|
1493
1494
|
"""
|
|
1494
1495
|
:param image:
|
|
1495
1496
|
:param bbox:
|
|
@@ -1508,32 +1509,100 @@ def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, a
|
|
|
1508
1509
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1509
1510
|
# text_loc = (bbox[0], bbox[1]) if top else (bbox[0], bbox[3])
|
|
1510
1511
|
if not text: drawType = "simple"
|
|
1511
|
-
|
|
1512
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1512
1513
|
if top:
|
|
1513
|
-
# text_loc = (bbox[0], bbox[1] +
|
|
1514
|
+
# text_loc = (bbox[0], bbox[1] + text_wh[1]) # 在左上角下方绘制文字
|
|
1514
1515
|
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1515
1516
|
else:
|
|
1516
|
-
text_loc = (bbox[0], bbox[3] +
|
|
1517
|
+
text_loc = (bbox[0], bbox[3] + text_wh[1] + baseline // 2)
|
|
1517
1518
|
if drawType == "chinese" or drawType == "ch":
|
|
1518
1519
|
if not top: text_loc = (text_loc[0], text_loc[1] - baseline)
|
|
1519
1520
|
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1520
1521
|
cv2_putText(image, str(text), text_loc, color=color, fontScale=fontScale, thickness=abs(thickness))
|
|
1521
1522
|
elif drawType == "simple" or drawType == "en":
|
|
1522
1523
|
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness, 8, 0)
|
|
1523
|
-
cv2.putText(image, str(text), text_loc, cv2.
|
|
1524
|
+
cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
|
|
1524
1525
|
elif drawType == "custom":
|
|
1526
|
+
text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
|
|
1527
|
+
# text_loc = (bbox[0], bbox[1] + baseline) # 在左上角上方绘制文字
|
|
1525
1528
|
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1526
|
-
bg1 = (text_loc[0], text_loc[1] -
|
|
1527
|
-
bg2 = (text_loc[0] +
|
|
1528
|
-
# bg2 = (max(bbox[2], text_loc[0] +
|
|
1529
|
+
bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
|
|
1530
|
+
bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1531
|
+
# bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
|
|
1529
1532
|
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
|
|
1530
1533
|
cv2.rectangle(image, bg1, bg2, color, -1)
|
|
1531
1534
|
# draw score value
|
|
1532
|
-
cv2.putText(image, str(text), (text_loc[0], text_loc[1]), cv2.
|
|
1535
|
+
cv2.putText(image, str(text), (text_loc[0], text_loc[1]), cv2.FONT_HERSHEY_COMPLEX, fontScale,
|
|
1533
1536
|
(255, 255, 255), abs(thickness))
|
|
1534
1537
|
return image
|
|
1535
1538
|
|
|
1536
1539
|
|
|
1540
|
+
def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, alpha=0, drawType="custom", top=True):
|
|
1541
|
+
"""
|
|
1542
|
+
:param image:
|
|
1543
|
+
:param bbox:
|
|
1544
|
+
:param color:
|
|
1545
|
+
:param text:
|
|
1546
|
+
:param drawType:
|
|
1547
|
+
:param top:
|
|
1548
|
+
:return:
|
|
1549
|
+
"""
|
|
1550
|
+
text = str(text)
|
|
1551
|
+
if alpha > 0:
|
|
1552
|
+
bgimg = draw_image_bbox_text(image.copy(), bbox, text=text, color=color, thickness=thickness,
|
|
1553
|
+
fontScale=fontScale, drawType=drawType, top=top, alpha=0)
|
|
1554
|
+
image[:] = cv2.addWeighted(bgimg, 1 - alpha, image, alpha, 0)
|
|
1555
|
+
return image
|
|
1556
|
+
if drawType == "ch" or drawType == "chinese":
|
|
1557
|
+
image = draw_ch_text(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
|
|
1558
|
+
elif drawType == "simple":
|
|
1559
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1560
|
+
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1561
|
+
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness, 8, 0)
|
|
1562
|
+
cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
|
|
1563
|
+
else: # custom ,en
|
|
1564
|
+
image = draw_en_text(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
|
|
1565
|
+
return image
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
def draw_ch_text(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
1569
|
+
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1570
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1571
|
+
text_wh = (text_wh[0], int(text_wh[1] * 0.7)) # 与draw_en_text区别,底纹缩小80%
|
|
1572
|
+
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1573
|
+
text_bgy = text_loc[1] - text_wh[1] - baseline // 2
|
|
1574
|
+
if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
|
|
1575
|
+
text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
|
|
1576
|
+
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1577
|
+
bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
|
|
1578
|
+
bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1579
|
+
# bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
|
|
1580
|
+
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
|
|
1581
|
+
cv2.rectangle(image, bg1, bg2, color, -1)
|
|
1582
|
+
# draw score value
|
|
1583
|
+
cv2_putText(image, str(text), text_loc, color=(255, 255, 255), fontScale=fontScale, thickness=abs(thickness))
|
|
1584
|
+
return image
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
def draw_en_text(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
1588
|
+
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1589
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1590
|
+
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1591
|
+
text_bgy = text_loc[1] - text_wh[1] - baseline // 2
|
|
1592
|
+
if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
|
|
1593
|
+
text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
|
|
1594
|
+
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1595
|
+
bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
|
|
1596
|
+
bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1597
|
+
# bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
|
|
1598
|
+
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
|
|
1599
|
+
cv2.rectangle(image, bg1, bg2, color, -1)
|
|
1600
|
+
# draw score value
|
|
1601
|
+
cv2.putText(image, str(text), (text_loc[0], text_loc[1]), fontFace=cv2.FONT_HERSHEY_COMPLEX, fontScale=fontScale,
|
|
1602
|
+
color=(255, 255, 255), thickness=abs(thickness))
|
|
1603
|
+
return image
|
|
1604
|
+
|
|
1605
|
+
|
|
1537
1606
|
def draw_text_line(image, point, text_line: str, bg_color=(255, 0, 0), thickness=0, fontScale=0, drawType="custom"):
|
|
1538
1607
|
"""
|
|
1539
1608
|
:param image:
|
|
@@ -1543,14 +1612,13 @@ def draw_text_line(image, point, text_line: str, bg_color=(255, 0, 0), thickness
|
|
|
1543
1612
|
:return:
|
|
1544
1613
|
"""
|
|
1545
1614
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1546
|
-
fontFace = cv2.
|
|
1547
|
-
# fontFace=cv2.FONT_HERSHEY_SIMPLEX
|
|
1615
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
1548
1616
|
text_line = text_line.split("\n")
|
|
1549
|
-
#
|
|
1550
|
-
|
|
1617
|
+
# text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
|
|
1618
|
+
text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
|
|
1551
1619
|
for i, text in enumerate(text_line):
|
|
1552
1620
|
if text:
|
|
1553
|
-
draw_point = (point[0], point[1] + (
|
|
1621
|
+
draw_point = (point[0], point[1] + (text_wh[1] + 2 + baseline) * i)
|
|
1554
1622
|
image = draw_text(image, draw_point, text, bg_color, thickness=thickness, drawType=drawType)
|
|
1555
1623
|
return image
|
|
1556
1624
|
|
|
@@ -1599,11 +1667,11 @@ def get_font_type(size, font=""):
|
|
|
1599
1667
|
|
|
1600
1668
|
def cv2_putText(img, text, point, fontFace=None, fontScale=0.8, color=(255, 0, 0), thickness=None):
|
|
1601
1669
|
# cv2.putText(img, str(text), point, fontFace, fontScale, color=color, thickness=thickness)
|
|
1602
|
-
|
|
1670
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1603
1671
|
pilimg = Image.fromarray(img) # Image.fromarray()将数组类型转成图片格式,与np.array()相反
|
|
1604
1672
|
draw = ImageDraw.Draw(pilimg) # PIL图片上打印汉字
|
|
1605
|
-
size =
|
|
1606
|
-
point = (point[0], point[1] -
|
|
1673
|
+
size = text_wh[1] # 字体大小
|
|
1674
|
+
point = (point[0], point[1] - text_wh[1] + baseline // 2)
|
|
1607
1675
|
font = get_font_type(size=size)
|
|
1608
1676
|
draw.text(point, text, color, font)
|
|
1609
1677
|
img[:] = np.asarray(pilimg)
|
|
@@ -2333,7 +2401,7 @@ def draw_yaw_pitch_roll_in_right_axis(image,
|
|
|
2333
2401
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
|
|
2334
2402
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
|
|
2335
2403
|
if vis:
|
|
2336
|
-
fontFace = cv2.
|
|
2404
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
2337
2405
|
image = cv2.putText(image, str(text),
|
|
2338
2406
|
# (int(cx), int(cy) + 10),
|
|
2339
2407
|
(10, 10),
|
|
@@ -2379,7 +2447,7 @@ def draw_yaw_pitch_roll_in_left_axis(image,
|
|
|
2379
2447
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
|
|
2380
2448
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
|
|
2381
2449
|
if vis:
|
|
2382
|
-
fontFace = cv2.
|
|
2450
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
2383
2451
|
image = cv2.putText(image, str(text),
|
|
2384
2452
|
# (int(cx), int(cy) + 10),
|
|
2385
2453
|
(10, 10),
|
|
@@ -2715,6 +2783,34 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
|
|
|
2715
2783
|
return image
|
|
2716
2784
|
|
|
2717
2785
|
|
|
2786
|
+
def draw_image_contours_labels_texts(image, contours: List[np.ndarray], labels=[], texts=[], color=(), alpha=0.5,
|
|
2787
|
+
thickness=1, fontScale=0.8, drawType="ch", colors=None):
|
|
2788
|
+
"""
|
|
2789
|
+
参考:draw_image_mask_color
|
|
2790
|
+
:param image:
|
|
2791
|
+
:param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
|
|
2792
|
+
:param texts:轮廓文本
|
|
2793
|
+
:param color:绘制轮廓的颜色
|
|
2794
|
+
:param alpha:绘制颜色的透明度 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
|
|
2795
|
+
:param thickness:轮廓线宽
|
|
2796
|
+
:return:
|
|
2797
|
+
"""
|
|
2798
|
+
colors = [(0, 0, 0)] + colors if colors else color_table
|
|
2799
|
+
for i in range(0, len(contours)):
|
|
2800
|
+
c = color if color else color_hash.get_color(labels[i]) # 相同类别相同颜色
|
|
2801
|
+
t = str(texts[i]) if texts else ""
|
|
2802
|
+
p = np.asarray(contours[i], dtype=np.int32)
|
|
2803
|
+
b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))
|
|
2804
|
+
if len(p.shape) == 2: p = [p]
|
|
2805
|
+
image[:] = cv2.drawContours(image, p, contourIdx=-1, color=c, thickness=thickness)
|
|
2806
|
+
bgimg = image.copy()
|
|
2807
|
+
bgimg = cv2.fillPoly(bgimg, p, color=c)
|
|
2808
|
+
image[:] = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
|
|
2809
|
+
if t: image[:] = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness,
|
|
2810
|
+
fontScale=fontScale, drawType=drawType)
|
|
2811
|
+
return image
|
|
2812
|
+
|
|
2813
|
+
|
|
2718
2814
|
draw_image_mask_color = color_utils.draw_image_mask_color
|
|
2719
2815
|
|
|
2720
2816
|
|
|
@@ -85,7 +85,7 @@ def get_confusion_matrix(true_labels, pred_labels, target_names=None, filename=N
|
|
|
85
85
|
|
|
86
86
|
|
|
87
87
|
def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
|
|
88
|
-
output_dict=False, matrix=False, plot=False):
|
|
88
|
+
output_dict=False, output_csv="", matrix=False, plot=False):
|
|
89
89
|
"""
|
|
90
90
|
Usage
|
|
91
91
|
-------
|
|
@@ -108,6 +108,7 @@ def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
|
|
|
108
108
|
:param target_names:
|
|
109
109
|
:param labels:
|
|
110
110
|
:param output_dict:
|
|
111
|
+
:param output_csv: 'output/data.csv'
|
|
111
112
|
:param matrix: 是否绘制混淆矩阵
|
|
112
113
|
:return:
|
|
113
114
|
"""
|
|
@@ -132,6 +133,10 @@ def get_metrics_report(true_labels, pred_labels, target_names=None, labels=None,
|
|
|
132
133
|
result["accuracy"] = {'precision': p, 'recall': r, 'f1-score': result["accuracy"], 'support': support}
|
|
133
134
|
output = pandas_utils.dict2df(result)
|
|
134
135
|
output = output.round(4) # 保留4位小数
|
|
136
|
+
if output_csv:
|
|
137
|
+
output_csv = output_csv.replace(".csv", "-f1s{:3.4f}.csv".format(result["accuracy"]["f1-score"]))
|
|
138
|
+
output.to_csv(output_csv, index=True)
|
|
139
|
+
# TODO: 若发现表格中英文字体显示没有对齐,则需要安装wcwidth库: pip install --upgrade tabulate wcwidth
|
|
135
140
|
output = output.to_markdown()
|
|
136
141
|
if matrix:
|
|
137
142
|
conf_matrix = get_confusion_matrix(true_labels, pred_labels, target_names=target_names,
|
|
@@ -176,10 +181,10 @@ def create_file_path(filename):
|
|
|
176
181
|
if __name__ == "__main__":
|
|
177
182
|
# true_labels = [0, 1, 2, 3, 3, 1, 1] # Y
|
|
178
183
|
# pred_labels = [1, 1, 2, 2, 2, 1, 0] # X
|
|
179
|
-
true_labels = ["A", "B", "A", "B", "C", "D"]
|
|
180
|
-
pred_labels = ["A", "D", "C", "B", "C", "A"]
|
|
184
|
+
true_labels = ["A手", "B机器", "A机器人", "B", "C", "D"]
|
|
185
|
+
pred_labels = ["A", "D", "C", "B", "C", "A你好"]
|
|
181
186
|
target_names = None
|
|
182
|
-
|
|
187
|
+
output_excel = "./result.csv"
|
|
183
188
|
result = get_metrics_report(true_labels, pred_labels, target_names=target_names, output_dict=False,
|
|
184
|
-
|
|
189
|
+
output_csv=output_excel, plot=False)
|
|
185
190
|
print(result)
|
|
File without changes
|
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.4.
|
|
3
|
+
Version: 2.4.35
|
|
4
4
|
Summary: pybaseutils
|
|
5
5
|
Home-page: https://github.com/PanJinquan/base-utils
|
|
6
6
|
Author: PanJinquan
|
|
7
7
|
Author-email: 390737991@qq.com
|
|
8
8
|
License: MIT
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
License-File: LICENCE
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: author-email
|
|
12
|
+
Dynamic: description
|
|
13
|
+
Dynamic: home-page
|
|
14
|
+
Dynamic: license
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
Dynamic: summary
|
|
11
17
|
|
|
12
18
|
base-utils
|
|
13
19
|
==========
|
|
@@ -142,5 +148,3 @@ base_utils(C++)
|
|
|
142
148
|
DEBUG_IMSHOW("image", image);
|
|
143
149
|
return 0;
|
|
144
150
|
}
|
|
145
|
-
|
|
146
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -9,15 +9,34 @@
|
|
|
9
9
|
"""
|
|
10
10
|
import os
|
|
11
11
|
import pybaseutils
|
|
12
|
-
import pypandoc
|
|
13
12
|
from setuptools import setup, find_packages
|
|
14
13
|
|
|
15
14
|
root = os.path.dirname(__file__)
|
|
16
|
-
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def get_description():
|
|
18
|
+
"""
|
|
19
|
+
安全读取 README 作为 long_description。
|
|
20
|
+
优先尝试用 pypandoc 转换为 rst;若不可用则回退到原始 markdown。
|
|
21
|
+
"""
|
|
22
|
+
mdfile = os.path.join(root, 'README.md')
|
|
23
|
+
try: # 优先尝试 pypandoc 转换
|
|
24
|
+
import pypandoc
|
|
25
|
+
return pypandoc.convert_file(mdfile, 'rst')
|
|
26
|
+
except (ImportError, OSError):
|
|
27
|
+
pass
|
|
28
|
+
try:
|
|
29
|
+
# 回退:直接读取原始 markdown
|
|
30
|
+
with open(mdfile, 'r', encoding='utf-8') as f:
|
|
31
|
+
return f.read()
|
|
32
|
+
except FileNotFoundError:
|
|
33
|
+
return ''
|
|
34
|
+
|
|
35
|
+
|
|
17
36
|
setup(name='pybaseutils',
|
|
18
37
|
version=pybaseutils.__version__,
|
|
19
38
|
description='pybaseutils',
|
|
20
|
-
long_description=
|
|
39
|
+
long_description=get_description(),
|
|
21
40
|
url='https://github.com/PanJinquan/base-utils',
|
|
22
41
|
author='PanJinquan',
|
|
23
42
|
author_email='390737991@qq.com',
|
|
File without changes
|
|
@@ -81,7 +81,8 @@ class CameraDemo():
|
|
|
81
81
|
|
|
82
82
|
def capture(self, title="camera", save_video="./camera.avi"):
|
|
83
83
|
format = '%Y-%m-%dT%H:%M:%S' # 海康摄像头默认格式
|
|
84
|
-
video_url = f"rtsp://{self.username}:{self.password}@{self.ip}/Streaming/Channels/1"
|
|
84
|
+
# video_url = f"rtsp://{self.username}:{self.password}@{self.ip}/Streaming/Channels/1"
|
|
85
|
+
video_url = f"rtsp://{self.username}:{self.password}@{self.ip}:554"
|
|
85
86
|
print(f"正在连接摄像头: {video_url}")
|
|
86
87
|
# 创建视频流连接
|
|
87
88
|
cap = cv2.VideoCapture(video_url)
|
|
@@ -140,8 +141,9 @@ class CameraDemo():
|
|
|
140
141
|
|
|
141
142
|
if __name__ == "__main__":
|
|
142
143
|
# 摄像头信息,按'q'键退出程序
|
|
143
|
-
|
|
144
|
+
# rtsp://admin:zhgp@2024@192.168.28.61
|
|
145
|
+
ip = "192.168.28.61"
|
|
144
146
|
username = "admin"
|
|
145
|
-
password = "
|
|
147
|
+
password = "zhgp@2024"
|
|
146
148
|
c = CameraDemo(ip, username, password)
|
|
147
149
|
c.capture()
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-07-08 14:10:15
|
|
7
|
+
# @Brief :
|
|
8
|
+
# --------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
import cv2
|
|
11
|
+
import numpy as np
|
|
12
|
+
from pybaseutils import file_utils, image_utils
|
|
13
|
+
|
|
14
|
+
import cv2
|
|
15
|
+
|
|
16
|
+
data="ABCDabcd你好我是一名学生1234567890"
|
|
17
|
+
fontScale = 1.0
|
|
18
|
+
thickness = 1
|
|
19
|
+
for text in data:
|
|
20
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX , fontScale, abs(thickness))
|
|
21
|
+
print(f"fontScale={fontScale}, thickness={thickness}, text={text}, text_wh={text_wh}, baseline={baseline}")
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-07-08 14:10:15
|
|
7
|
+
# @Brief : 转换labelme标注数据为voc格式
|
|
8
|
+
# --------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
import os
|
|
11
|
+
import numpy as np
|
|
12
|
+
import cv2
|
|
13
|
+
from pybaseutils.converter import convert_labelme2voc
|
|
14
|
+
from pybaseutils import time_utils, image_utils, file_utils, json_utils
|
|
15
|
+
fontScale=2.0
|
|
16
|
+
alpha = 0.
|
|
17
|
+
if __name__ == "__main__":
|
|
18
|
+
image_file = "../data/test_image/grid1.png"
|
|
19
|
+
|
|
20
|
+
for i in range(100):
|
|
21
|
+
image = cv2.imread(image_file)
|
|
22
|
+
boxes = [[0, i, 500, 300]]
|
|
23
|
+
# texts = ["ABC"] * len(boxes)
|
|
24
|
+
texts = ["ABC你是一名学生"] * len(boxes)
|
|
25
|
+
print(boxes)
|
|
26
|
+
image = image_utils.draw_image_boxes_texts(image, boxes, texts, thickness=1, fontScale=fontScale, alpha=alpha,drawType="simple")
|
|
27
|
+
image_utils.show_image("ch", image)
|
|
28
|
+
image = cv2.imread(image_file)
|
|
29
|
+
image = image_utils.draw_image_boxes_texts(image, boxes, texts, thickness=1, fontScale=fontScale, alpha=alpha,drawType="en")
|
|
30
|
+
image_utils.show_image("en", image)
|
|
@@ -39,7 +39,9 @@ def android_gif():
|
|
|
39
39
|
|
|
40
40
|
def python_gif():
|
|
41
41
|
video_file = "/home/PKing/nasdata/Project/LLM/MLLM-Factory/docs/chat-demo.mp4"
|
|
42
|
-
|
|
42
|
+
video_file = "/media/PKing/dev1/project/AI-Labelme/docs/video-track-label.mp4"
|
|
43
|
+
# video_utils.video2gif(video_file, interval=10, func=resize_fun, fps=4, time=(0.5, 24), use_pil=True, vis=True)
|
|
44
|
+
video_utils.video2gif(video_file, interval=8, func=resize_fun, fps=4, use_pil=True, vis=True)
|
|
43
45
|
|
|
44
46
|
|
|
45
47
|
def image_gif():
|
|
File without changes
|
|
File without changes
|