pybaseutils 2.4.34__tar.gz → 2.5.0__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.5.0}/PKG-INFO +9 -5
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/audio_utils.py +8 -4
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base64_utils.py +10 -3
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/color_utils.py +25 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme.py +35 -1
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_voc.py +1 -1
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/file_utils.py +31 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/font_style/__init__.py +1 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/font_utils.py +24 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/image_utils.py +133 -72
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/class_report.py +10 -5
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/thread_utils.py +31 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/PKG-INFO +9 -5
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/SOURCES.txt +2 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/setup.cfg +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/setup.py +23 -3
- pybaseutils-2.5.0/test_py/aije/demo_labelme_class_counts.py +20 -0
- pybaseutils-2.5.0/test_py/aije/demo_labelme_crop_aicq.py +138 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_crop_aije.py +1 -1
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_crop_ailt.py +23 -17
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/camera/demo.py +5 -3
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/parking_rois_gopro.py +0 -0
- pybaseutils-2.5.0/test_py/demo1.py +10 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo2.py +6 -4
- pybaseutils-2.5.0/test_py/demo3.py +35 -0
- pybaseutils-2.5.0/test_py/demo4.py +30 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_gif_video.py +7 -5
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/qrcode/demo.py +0 -0
- pybaseutils-2.4.34/test_py/demo1.py +0 -43
- 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.5.0}/LICENCE +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/README.md +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/camera.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/frame_record.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/dict_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/nets_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/download_pdf.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/camera.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/car_accident.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_video_segm.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/performance.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_camera.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.34 → pybaseutils-2.5.0}/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.
|
|
3
|
+
Version: 2.5.0
|
|
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
|
-
|
|
@@ -19,7 +19,6 @@ from ffmpy import FFmpeg
|
|
|
19
19
|
import matplotlib.pyplot as plt
|
|
20
20
|
from scipy.fft import fft
|
|
21
21
|
from IPython.display import Audio, display
|
|
22
|
-
from playsound import playsound
|
|
23
22
|
from scipy.io import wavfile
|
|
24
23
|
|
|
25
24
|
import numpy as np
|
|
@@ -267,6 +266,8 @@ def sound_audio(audio, sr=16000):
|
|
|
267
266
|
|
|
268
267
|
def sound_audio_file(audio_file, jupyter=False):
|
|
269
268
|
"""
|
|
269
|
+
sudo apt-get install libasound2-dev
|
|
270
|
+
pip install simpleaudio==1.0.4
|
|
270
271
|
:param audio_file:
|
|
271
272
|
:param jupyter:
|
|
272
273
|
:return:
|
|
@@ -274,7 +275,10 @@ def sound_audio_file(audio_file, jupyter=False):
|
|
|
274
275
|
if jupyter:
|
|
275
276
|
display(Audio(audio_file))
|
|
276
277
|
else:
|
|
277
|
-
|
|
278
|
+
import simpleaudio as sa
|
|
279
|
+
wave_obj = sa.WaveObject.from_wave_file(audio_file)
|
|
280
|
+
play_obj = wave_obj.play() # 播放
|
|
281
|
+
play_obj.wait_done() # 等待播放结束(可选,但推荐)
|
|
278
282
|
|
|
279
283
|
|
|
280
284
|
def sound_audio_buffer(audio_buffer, tmp_audio="./tmp.wav"):
|
|
@@ -470,8 +474,8 @@ if __name__ == '__main__':
|
|
|
470
474
|
video_out = "../../data/video/test-video-result.mp4"
|
|
471
475
|
audio_file = "../../data/audio/bus_chinese.wav"
|
|
472
476
|
|
|
473
|
-
test_time(audio_file)
|
|
474
|
-
|
|
477
|
+
# test_time(audio_file)
|
|
478
|
+
sound_audio_file(audio_file,jupyter=False)
|
|
475
479
|
# playsound(audio_file)
|
|
476
480
|
# display_time_domain(audio_file)
|
|
477
481
|
# display_freq_domain(audio_file)
|
|
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,7 @@
|
|
|
10
10
|
import cv2
|
|
11
11
|
import matplotlib.pyplot as plt
|
|
12
12
|
import numpy as np
|
|
13
|
+
from collections import defaultdict, Counter
|
|
13
14
|
|
|
14
15
|
VOC_NAMES = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat",
|
|
15
16
|
"chair", "cow", "diningtable", "dog", "horse", "motorbike", "person",
|
|
@@ -28,6 +29,30 @@ COCO_NAMES = ['background', 'person', 'bicycle', 'car', 'motorcycle', 'airplane'
|
|
|
28
29
|
'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
|
|
29
30
|
'teddy bear', 'hair drier', 'toothbrush']
|
|
30
31
|
|
|
32
|
+
color_table = [(0, 0, 0), (0, 255, 0), (255, 0, 0), (0, 0, 255), (0, 255, 255), (255, 0, 255), (255, 255, 0),
|
|
33
|
+
(128, 0, 0), (0, 128, 0), (128, 128, 0),
|
|
34
|
+
(0, 0, 128), (128, 0, 128), (0, 128, 128), (128, 128, 128),
|
|
35
|
+
(64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0),
|
|
36
|
+
(64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128),
|
|
37
|
+
(0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)] * 100
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ColorLabel():
|
|
41
|
+
def __init__(self):
|
|
42
|
+
self.color = dict()
|
|
43
|
+
self.cnums = len(color_table)
|
|
44
|
+
|
|
45
|
+
def get_color(self, label: str):
|
|
46
|
+
"""
|
|
47
|
+
:param label: str or list
|
|
48
|
+
:return:
|
|
49
|
+
"""
|
|
50
|
+
h = str(label)
|
|
51
|
+
if h not in self.color:
|
|
52
|
+
i = len(self.color) + 1
|
|
53
|
+
self.color[h] = color_table[i % self.cnums]
|
|
54
|
+
return self.color[h]
|
|
55
|
+
|
|
31
56
|
|
|
32
57
|
def get_colormap(data_type="custom"):
|
|
33
58
|
if data_type == 'pascal':
|
|
@@ -537,6 +537,34 @@ def LabelMeDatasets(filename=None,
|
|
|
537
537
|
return datasets
|
|
538
538
|
|
|
539
539
|
|
|
540
|
+
def get_class_counts(datasets, save=""):
|
|
541
|
+
"""
|
|
542
|
+
统计每个类别的样本数量
|
|
543
|
+
:param datasets: List[str] or ConcatDataset
|
|
544
|
+
:param save: 保存路径
|
|
545
|
+
:return: 每个类别的样本数量
|
|
546
|
+
"""
|
|
547
|
+
from pybaseutils import dict_utils
|
|
548
|
+
if isinstance(datasets, list):
|
|
549
|
+
datasets = LabelMeDatasets(filename=None,
|
|
550
|
+
data_root=None,
|
|
551
|
+
anno_dir=datasets,
|
|
552
|
+
image_dir=None,
|
|
553
|
+
class_name=[],
|
|
554
|
+
check=False,
|
|
555
|
+
phase='val',
|
|
556
|
+
shuffle=False)
|
|
557
|
+
counts = {}
|
|
558
|
+
for i in tqdm(range(len(datasets))):
|
|
559
|
+
info = datasets.__getitem__(i)
|
|
560
|
+
for n in info["names"]:
|
|
561
|
+
counts[n] = counts.get(n, 0) + 1
|
|
562
|
+
counts = dict_utils.dict_sort(counts,use_key=False)
|
|
563
|
+
if save:
|
|
564
|
+
json_utils.save_json(os.path.join(save, "counts.json"), counts)
|
|
565
|
+
return counts
|
|
566
|
+
|
|
567
|
+
|
|
540
568
|
def parser_labelme(anno_file, class_dict={}, size=()):
|
|
541
569
|
"""
|
|
542
570
|
:param annotation: labelme标注的数据
|
|
@@ -633,4 +661,10 @@ def example_for_segment():
|
|
|
633
661
|
|
|
634
662
|
if __name__ == "__main__":
|
|
635
663
|
# example_for_segment()
|
|
636
|
-
example_for_keypoints()
|
|
664
|
+
# example_for_keypoints()
|
|
665
|
+
datasets = [
|
|
666
|
+
'/home/PKing/edudata/dataset/AICQ/dataset/data-2026-10-06/images',
|
|
667
|
+
'/home/PKing/edudata/dataset/AICQ/dataset/data-2026-09-30/images',
|
|
668
|
+
]
|
|
669
|
+
counts = get_class_counts(datasets)
|
|
670
|
+
print(counts)
|
|
File without changes
|
|
@@ -119,7 +119,7 @@ class VOCDataset(Dataset):
|
|
|
119
119
|
class_set = labels.reshape(-1).tolist() + class_set
|
|
120
120
|
class_set = list(set(class_set))
|
|
121
121
|
if ignore_empty and (len(boxes) == 0 or len(labels) == 0):
|
|
122
|
-
print("empty annotation:{}".format(annotation_file))
|
|
122
|
+
# print("empty annotation:{}".format(annotation_file))
|
|
123
123
|
continue
|
|
124
124
|
dst_ids.append(image_id)
|
|
125
125
|
class_set = sorted(class_set)
|
|
@@ -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读取文件
|
|
@@ -243,6 +243,30 @@ def re_example():
|
|
|
243
243
|
print(out)
|
|
244
244
|
|
|
245
245
|
|
|
246
|
+
def align_display(s, align='C', width=20, pchar=" "):
|
|
247
|
+
"""
|
|
248
|
+
对齐显示字符串
|
|
249
|
+
print("[{}] 下载进度".format(align_display(item, 'C')))
|
|
250
|
+
:param s: 要显示的字符串
|
|
251
|
+
:param align: 对齐方式,'L' 左对齐,'C' 居中对齐,'R' 右对齐
|
|
252
|
+
:param width: 目标显示宽度
|
|
253
|
+
:param pchar: 对齐字符,默认空格
|
|
254
|
+
:return: 对齐后的字符串
|
|
255
|
+
"""
|
|
256
|
+
w = sum(2 if ord(c) > 127 else 1 for c in s) # 计算字符串的显示宽度(中文等宽字符算2,英文算1)
|
|
257
|
+
total_pad = max(width - w, 0)
|
|
258
|
+
if align == 'L':
|
|
259
|
+
L = 0
|
|
260
|
+
R = total_pad
|
|
261
|
+
elif align == 'R':
|
|
262
|
+
L = total_pad
|
|
263
|
+
R = 0
|
|
264
|
+
else: # 默认居中对齐
|
|
265
|
+
L = total_pad // 2
|
|
266
|
+
R = total_pad - L
|
|
267
|
+
return pchar * L + s + pchar * R
|
|
268
|
+
|
|
269
|
+
|
|
246
270
|
if __name__ == "__main__":
|
|
247
271
|
draw_font_example()
|
|
248
272
|
# get_system_fonts()
|
|
@@ -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_label = color_utils.ColorLabel()
|
|
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]]
|
|
@@ -1124,13 +1126,14 @@ def draw_image_bboxes_text(image, boxes, boxes_name, color=(), thickness=0, font
|
|
|
1124
1126
|
return image
|
|
1125
1127
|
|
|
1126
1128
|
|
|
1127
|
-
def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale=0, alpha=0,
|
|
1128
|
-
top=True):
|
|
1129
|
+
def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale=0, alpha=0,
|
|
1130
|
+
drawType="custom", color_type="class", top=True):
|
|
1129
1131
|
"""
|
|
1130
1132
|
:param image:
|
|
1131
1133
|
:param boxes:
|
|
1132
1134
|
:param texts:
|
|
1133
1135
|
:param color:
|
|
1136
|
+
:param kColor:
|
|
1134
1137
|
:param thickness:
|
|
1135
1138
|
:param fontScale:
|
|
1136
1139
|
:param drawType:
|
|
@@ -1138,8 +1141,10 @@ def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale
|
|
|
1138
1141
|
:return:
|
|
1139
1142
|
"""
|
|
1140
1143
|
for i, (bbox, text) in enumerate(zip(boxes, texts)):
|
|
1141
|
-
|
|
1142
|
-
|
|
1144
|
+
if color_type == "class":
|
|
1145
|
+
c = color if color else color_label.get_color(text) # 相同类别相同颜色
|
|
1146
|
+
else:
|
|
1147
|
+
c = color if color else color_table[(i + 1) % len(color_table)] # 每个实例不同颜色
|
|
1143
1148
|
draw_image_bbox_text(image, bbox, text, color=c, thickness=thickness, fontScale=fontScale, alpha=alpha,
|
|
1144
1149
|
drawType=drawType, top=top)
|
|
1145
1150
|
return image
|
|
@@ -1161,16 +1166,14 @@ def draw_image_bboxes_labels_text(image, boxes, labels, boxes_name=None, color=N
|
|
|
1161
1166
|
|
|
1162
1167
|
def draw_image_boxes_labels_texts(image, boxes, labels, texts, color=None, thickness=2, fontScale=0.8,
|
|
1163
1168
|
drawType="custom", top=True, colors=None, color_type="class"):
|
|
1164
|
-
if isinstance(labels, np.ndarray):
|
|
1165
|
-
labels = labels.reshape(-1).tolist()
|
|
1169
|
+
if isinstance(labels, np.ndarray): labels = labels.reshape(-1).tolist()
|
|
1166
1170
|
colors = [(0, 0, 0)] + colors if colors else color_table
|
|
1167
|
-
for i, (label, bbox,
|
|
1168
|
-
bbox = [int(b) for b in bbox]
|
|
1171
|
+
for i, (label, bbox, text) in enumerate(zip(labels, boxes, texts)):
|
|
1169
1172
|
if color_type == "class":
|
|
1170
|
-
c = color if color else
|
|
1173
|
+
c = color if color else color_label.get_color(label) # 相同类别相同颜色
|
|
1171
1174
|
else:
|
|
1172
|
-
c = color if color else colors[(i + 1) %
|
|
1173
|
-
image = draw_image_bbox_text(image, bbox, str(
|
|
1175
|
+
c = color if color else colors[(i + 1) % len(colors)] # 每个实例不同颜色
|
|
1176
|
+
image = draw_image_bbox_text(image, bbox, str(text), color=c, thickness=thickness, fontScale=fontScale,
|
|
1174
1177
|
drawType=drawType, top=top)
|
|
1175
1178
|
return image
|
|
1176
1179
|
|
|
@@ -1253,28 +1256,34 @@ def show_image_rects_texts(title, image, rects, texts, color=None, thickness=0,
|
|
|
1253
1256
|
return image
|
|
1254
1257
|
|
|
1255
1258
|
|
|
1256
|
-
def
|
|
1257
|
-
|
|
1259
|
+
def draw_image_boxes_labels(image, boxes, labels, class_name=None, color=None, kColor=True, thickness=0, fontScale=0,
|
|
1260
|
+
alpha=0, drawType="custom", top=True):
|
|
1258
1261
|
"""
|
|
1259
|
-
|
|
1260
|
-
:param
|
|
1261
|
-
:param
|
|
1262
|
+
绘制框和标签
|
|
1263
|
+
:param image: 图像
|
|
1264
|
+
:param boxes: 框坐标
|
|
1265
|
+
:param labels: 标签index
|
|
1266
|
+
:param class_name: 类别名称
|
|
1267
|
+
:param color:
|
|
1268
|
+
:param kColor: True 相同类别颜色相同,每个类别颜色不同; False 每个实例颜色不同
|
|
1269
|
+
:param thickness:
|
|
1270
|
+
:param fontScale:
|
|
1271
|
+
:param alpha:
|
|
1272
|
+
:param drawType:
|
|
1273
|
+
:param top:
|
|
1262
1274
|
:return:
|
|
1263
1275
|
"""
|
|
1264
1276
|
if isinstance(labels, np.ndarray): labels = labels.astype(np.int32).reshape(-1).tolist()
|
|
1265
|
-
for
|
|
1266
|
-
|
|
1267
|
-
c = color
|
|
1268
|
-
if
|
|
1269
|
-
c = color_table[(int(label) + 1) % 20]
|
|
1270
|
-
label = class_name[int(label)]
|
|
1271
|
-
if not c: c = color_table[1]
|
|
1277
|
+
if class_name: labels = [class_name[i] for i in labels]
|
|
1278
|
+
for i, (label, bbox) in enumerate(zip(labels, boxes)):
|
|
1279
|
+
c = color if color else color_label.get_color(label) # 相同类别相同颜色
|
|
1280
|
+
if not kColor: c = color_table[(i + 1) % len(color_table)]
|
|
1272
1281
|
image = draw_image_bbox_text(image, bbox, str(label), color=c, thickness=thickness, fontScale=fontScale,
|
|
1273
|
-
drawType=drawType, top=top)
|
|
1282
|
+
alpha=alpha, drawType=drawType, top=top)
|
|
1274
1283
|
return image
|
|
1275
1284
|
|
|
1276
1285
|
|
|
1277
|
-
|
|
1286
|
+
draw_image_bboxes_labels = draw_image_boxes_labels
|
|
1278
1287
|
|
|
1279
1288
|
|
|
1280
1289
|
def draw_image_rects_labels(image, rects, labels, class_name=None, color=None, thickness=0, fontScale=0):
|
|
@@ -1467,25 +1476,22 @@ def draw_text(image, point, text, color=(255, 0, 0), fontScale=0, thickness=0, d
|
|
|
1467
1476
|
:param image:
|
|
1468
1477
|
:param point:
|
|
1469
1478
|
:param text:
|
|
1470
|
-
:param drawType:
|
|
1479
|
+
:param drawType: en/ch/simple
|
|
1471
1480
|
:return:
|
|
1472
1481
|
"""
|
|
1473
1482
|
point = (int(point[0]), int(point[1]))
|
|
1474
1483
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1475
|
-
fontFace = cv2.
|
|
1476
|
-
# fontFace=cv2.FONT_HERSHEY_SIMPLEX
|
|
1484
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
1477
1485
|
if drawType == "custom" or drawType == "en":
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
cv2.putText(image, str(text), (text_loc[0], text_loc[1] + baseline), fontFace, fontScale, (255, 255, 255),
|
|
1484
|
-
abs(thickness), 2)
|
|
1486
|
+
bbox = [point[0], point[1]]
|
|
1487
|
+
image = draw_bbox_text_en(image, bbox, text, color=color, thickness=thickness, fontScale=fontScale)
|
|
1488
|
+
elif drawType == "chinese" or drawType == "ch":
|
|
1489
|
+
bbox = [point[0], point[1]]
|
|
1490
|
+
image = draw_bbox_text_ch(image, bbox, text, color=color, thickness=thickness, fontScale=fontScale)
|
|
1485
1491
|
elif drawType == "simple":
|
|
1486
1492
|
cv2.putText(image, str(text), (point[0], point[1]), fontFace, fontScale, color=color, thickness=abs(thickness))
|
|
1487
|
-
|
|
1488
|
-
|
|
1493
|
+
else:
|
|
1494
|
+
cv2.putText(image, str(text), (point[0], point[1]), fontFace, fontScale, color=color, thickness=abs(thickness))
|
|
1489
1495
|
return image
|
|
1490
1496
|
|
|
1491
1497
|
|
|
@@ -1499,38 +1505,62 @@ def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, a
|
|
|
1499
1505
|
:param top:
|
|
1500
1506
|
:return:
|
|
1501
1507
|
"""
|
|
1508
|
+
bbox = [int(b) for b in bbox]
|
|
1502
1509
|
text = str(text)
|
|
1503
1510
|
if alpha > 0:
|
|
1504
1511
|
bgimg = draw_image_bbox_text(image.copy(), bbox, text=text, color=color, thickness=thickness,
|
|
1505
1512
|
fontScale=fontScale, drawType=drawType, top=top, alpha=0)
|
|
1506
1513
|
image[:] = cv2.addWeighted(bgimg, 1 - alpha, image, alpha, 0)
|
|
1507
1514
|
return image
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
if top:
|
|
1513
|
-
# text_loc = (bbox[0], bbox[1] + text_size[1]) # 在左上角下方绘制文字
|
|
1515
|
+
if drawType == "ch" or drawType == "chinese":
|
|
1516
|
+
image = draw_bbox_text_ch(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
|
|
1517
|
+
elif drawType == "simple":
|
|
1518
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1514
1519
|
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1515
|
-
else:
|
|
1516
|
-
text_loc = (bbox[0], bbox[3] + text_size[1] + baseline // 2)
|
|
1517
|
-
if drawType == "chinese" or drawType == "ch":
|
|
1518
|
-
if not top: text_loc = (text_loc[0], text_loc[1] - baseline)
|
|
1519
|
-
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1520
|
-
cv2_putText(image, str(text), text_loc, color=color, fontScale=fontScale, thickness=abs(thickness))
|
|
1521
|
-
elif drawType == "simple" or drawType == "en":
|
|
1522
1520
|
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
|
-
|
|
1525
|
-
|
|
1526
|
-
|
|
1527
|
-
|
|
1528
|
-
|
|
1529
|
-
|
|
1530
|
-
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1521
|
+
cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
|
|
1522
|
+
else: # custom ,en
|
|
1523
|
+
image = draw_bbox_text_en(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
|
|
1524
|
+
return image
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
def draw_bbox_text_ch(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
1528
|
+
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1529
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1530
|
+
baseline = baseline + 1
|
|
1531
|
+
text_wh = (text_wh[0], int(text_wh[1] * 0.8)) # 与draw_bbox_text_en区别,底纹缩小80%
|
|
1532
|
+
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1533
|
+
text_bgy = text_loc[1] - text_wh[1] - baseline // 2
|
|
1534
|
+
if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
|
|
1535
|
+
text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
|
|
1536
|
+
bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
|
|
1537
|
+
bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1538
|
+
# bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
|
|
1539
|
+
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,避免断裂
|
|
1540
|
+
cv2.rectangle(image, bg1, bg2, color, -1) # 绘制底纹
|
|
1541
|
+
if len(bbox) == 4: cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness) # 绘制bbox
|
|
1542
|
+
text_loc = (text_loc[0], int(text_loc[1] * 1.0)) # 调整字体位置
|
|
1543
|
+
cv2_putText(image, str(text), text_loc, color=(255, 255, 255), fontScale=fontScale, thickness=abs(thickness))
|
|
1544
|
+
return image
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
def draw_bbox_text_en(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
1548
|
+
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1549
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, abs(thickness))
|
|
1550
|
+
baseline = baseline + 1
|
|
1551
|
+
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1552
|
+
text_bgy = text_loc[1] - text_wh[1] - baseline // 2
|
|
1553
|
+
if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
|
|
1554
|
+
text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
|
|
1555
|
+
bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
|
|
1556
|
+
bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1557
|
+
# bg2 = (max(bbox[2], text_loc[0] + text_wh[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
|
|
1558
|
+
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,避免断裂
|
|
1559
|
+
cv2.rectangle(image, bg1, bg2, color, -1) # 绘制底纹
|
|
1560
|
+
if len(bbox) == 4: cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness) # 绘制bbox
|
|
1561
|
+
text_loc = (text_loc[0], int(text_loc[1] * 0.95)) # 调整字体位置
|
|
1562
|
+
cv2.putText(image, str(text), (text_loc[0], text_loc[1]), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
|
|
1563
|
+
fontScale=fontScale, color=(255, 255, 255), thickness=abs(thickness))
|
|
1534
1564
|
return image
|
|
1535
1565
|
|
|
1536
1566
|
|
|
@@ -1543,14 +1573,13 @@ def draw_text_line(image, point, text_line: str, bg_color=(255, 0, 0), thickness
|
|
|
1543
1573
|
:return:
|
|
1544
1574
|
"""
|
|
1545
1575
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1546
|
-
fontFace = cv2.
|
|
1547
|
-
# fontFace=cv2.FONT_HERSHEY_SIMPLEX
|
|
1576
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
1548
1577
|
text_line = text_line.split("\n")
|
|
1549
|
-
#
|
|
1550
|
-
|
|
1578
|
+
# text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
|
|
1579
|
+
text_wh, baseline = cv2.getTextSize(str(text_line), fontFace, fontScale, thickness)
|
|
1551
1580
|
for i, text in enumerate(text_line):
|
|
1552
1581
|
if text:
|
|
1553
|
-
draw_point = (point[0], point[1] + (
|
|
1582
|
+
draw_point = (point[0], point[1] + (text_wh[1] + 2 + baseline) * i)
|
|
1554
1583
|
image = draw_text(image, draw_point, text, bg_color, thickness=thickness, drawType=drawType)
|
|
1555
1584
|
return image
|
|
1556
1585
|
|
|
@@ -1599,11 +1628,11 @@ def get_font_type(size, font=""):
|
|
|
1599
1628
|
|
|
1600
1629
|
def cv2_putText(img, text, point, fontFace=None, fontScale=0.8, color=(255, 0, 0), thickness=None):
|
|
1601
1630
|
# cv2.putText(img, str(text), point, fontFace, fontScale, color=color, thickness=thickness)
|
|
1602
|
-
|
|
1631
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1603
1632
|
pilimg = Image.fromarray(img) # Image.fromarray()将数组类型转成图片格式,与np.array()相反
|
|
1604
1633
|
draw = ImageDraw.Draw(pilimg) # PIL图片上打印汉字
|
|
1605
|
-
size =
|
|
1606
|
-
point = (point[0], point[1] -
|
|
1634
|
+
size = text_wh[1] # 字体大小
|
|
1635
|
+
point = (point[0], point[1] - text_wh[1] + baseline // 2)
|
|
1607
1636
|
font = get_font_type(size=size)
|
|
1608
1637
|
draw.text(point, text, color, font)
|
|
1609
1638
|
img[:] = np.asarray(pilimg)
|
|
@@ -2333,7 +2362,7 @@ def draw_yaw_pitch_roll_in_right_axis(image,
|
|
|
2333
2362
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
|
|
2334
2363
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
|
|
2335
2364
|
if vis:
|
|
2336
|
-
fontFace = cv2.
|
|
2365
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
2337
2366
|
image = cv2.putText(image, str(text),
|
|
2338
2367
|
# (int(cx), int(cy) + 10),
|
|
2339
2368
|
(10, 10),
|
|
@@ -2379,7 +2408,7 @@ def draw_yaw_pitch_roll_in_left_axis(image,
|
|
|
2379
2408
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x2), int(y2)), color_pitch_y, 2, tipLength=0.2)
|
|
2380
2409
|
cv2.arrowedLine(image, (int(cx), int(cy)), (int(x3), int(y3)), color_roll_z, 2, tipLength=0.2)
|
|
2381
2410
|
if vis:
|
|
2382
|
-
fontFace = cv2.
|
|
2411
|
+
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
2383
2412
|
image = cv2.putText(image, str(text),
|
|
2384
2413
|
# (int(cx), int(cy) + 10),
|
|
2385
2414
|
(10, 10),
|
|
@@ -2701,7 +2730,39 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
|
|
|
2701
2730
|
"""
|
|
2702
2731
|
colors = [(0, 0, 0)] + colors if colors else color_table
|
|
2703
2732
|
for i in range(0, len(contours)):
|
|
2704
|
-
c = color
|
|
2733
|
+
c = color
|
|
2734
|
+
if not color:
|
|
2735
|
+
c = color_label.get_color(texts[i]) if texts else colors[(i + 1) % len(colors)] # 相同类别相同颜色
|
|
2736
|
+
t = str(texts[i]) if texts else ""
|
|
2737
|
+
p = np.asarray(contours[i], dtype=np.int32)
|
|
2738
|
+
b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))
|
|
2739
|
+
if len(p.shape) == 2: p = [p]
|
|
2740
|
+
image[:] = cv2.drawContours(image, p, contourIdx=-1, color=c, thickness=thickness)
|
|
2741
|
+
bgimg = image.copy()
|
|
2742
|
+
bgimg = cv2.fillPoly(bgimg, p, color=c)
|
|
2743
|
+
image[:] = cv2.addWeighted(src1=image, alpha=1 - alpha, src2=bgimg, beta=alpha, gamma=0)
|
|
2744
|
+
if t: image[:] = draw_text(image, point=(b[0], b[1]), color=c, text=t, thickness=thickness,
|
|
2745
|
+
fontScale=fontScale, drawType=drawType)
|
|
2746
|
+
return image
|
|
2747
|
+
|
|
2748
|
+
|
|
2749
|
+
draw_image_contours_texts = draw_image_contours
|
|
2750
|
+
|
|
2751
|
+
|
|
2752
|
+
def draw_image_contours_labels_texts(image, contours: List[np.ndarray], labels=[], texts=[], color=(), alpha=0.5,
|
|
2753
|
+
thickness=1, fontScale=0.8, drawType="ch", colors=None):
|
|
2754
|
+
"""
|
|
2755
|
+
参考:draw_image_mask_color
|
|
2756
|
+
:param image:
|
|
2757
|
+
:param contours: List[np.ndarray],每个列表是一个轮廓(num_points,1,2)
|
|
2758
|
+
:param texts:轮廓文本
|
|
2759
|
+
:param color:绘制轮廓的颜色
|
|
2760
|
+
:param alpha:绘制颜色的透明度 0: 轮廓填充完全透明,1: 轮廓填充完全不透明
|
|
2761
|
+
:param thickness:轮廓线宽
|
|
2762
|
+
:return:
|
|
2763
|
+
"""
|
|
2764
|
+
for i in range(0, len(contours)):
|
|
2765
|
+
c = color if color else color_label.get_color(labels[i]) # 相同类别相同颜色
|
|
2705
2766
|
t = str(texts[i]) if texts else ""
|
|
2706
2767
|
p = np.asarray(contours[i], dtype=np.int32)
|
|
2707
2768
|
b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))
|