pybaseutils 2.4.35__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.35 → pybaseutils-2.5.0}/PKG-INFO +1 -1
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/audio/audio_utils.py +8 -4
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/color_utils.py +2 -3
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme.py +35 -1
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_voc.py +1 -1
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/font_style/__init__.py +1 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/font_utils.py +24 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/image_utils.py +66 -101
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/thread_utils.py +31 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils.egg-info/SOURCES.txt +2 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/setup.py +1 -0
- 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.35 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_crop_aije.py +1 -1
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_crop_ailt.py +23 -17
- pybaseutils-2.5.0/test_py/demo1.py +10 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo2.py +6 -4
- pybaseutils-2.5.0/test_py/demo3.py +35 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo4.py +1 -1
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_gif_video.py +4 -4
- pybaseutils-2.4.35/test_py/demo1.py +0 -43
- pybaseutils-2.4.35/test_py/demo3.py +0 -21
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/LICENCE +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/README.md +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/base/list_queue.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/base/producer_consumer.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cvutils/camera.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cvutils/frame_record.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_labelme_line.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_video_folder.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_video_text.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/dict_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/file_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/log.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/nets_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/transforms/build_transform.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/transforms/imgaug_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/setup.cfg +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/WebCrawler/download_pdf.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/demo_motion_blur.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/mask_image.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio/main.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/camera.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/class_names.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/car_accident.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/fall_dataset.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/parking_rois_gopro.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/date_demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_letterbox.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_video2frame.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_video_segm.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/fast_api/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/fast_api/create_image_url.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/fast_api/get_image_url.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/model_process.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/performance.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/qrcode/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/qrcode/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/registry/base.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/registry/component.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/registry/main.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/registry/register.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/test_camera.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.4.35 → pybaseutils-2.5.0}/test_py/web_socket/chat_service.py +0 -0
|
@@ -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)
|
|
@@ -11,7 +11,6 @@ import cv2
|
|
|
11
11
|
import matplotlib.pyplot as plt
|
|
12
12
|
import numpy as np
|
|
13
13
|
from collections import defaultdict, Counter
|
|
14
|
-
from pybaseutils import file_utils
|
|
15
14
|
|
|
16
15
|
VOC_NAMES = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat",
|
|
17
16
|
"chair", "cow", "diningtable", "dog", "horse", "motorbike", "person",
|
|
@@ -38,7 +37,7 @@ color_table = [(0, 0, 0), (0, 255, 0), (255, 0, 0), (0, 0, 255), (0, 255, 255),
|
|
|
38
37
|
(0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)] * 100
|
|
39
38
|
|
|
40
39
|
|
|
41
|
-
class
|
|
40
|
+
class ColorLabel():
|
|
42
41
|
def __init__(self):
|
|
43
42
|
self.color = dict()
|
|
44
43
|
self.cnums = len(color_table)
|
|
@@ -48,7 +47,7 @@ class ColorHash():
|
|
|
48
47
|
:param label: str or list
|
|
49
48
|
:return:
|
|
50
49
|
"""
|
|
51
|
-
h =
|
|
50
|
+
h = str(label)
|
|
52
51
|
if h not in self.color:
|
|
53
52
|
i = len(self.color) + 1
|
|
54
53
|
self.color[h] = color_table[i % self.cnums]
|
|
@@ -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)
|
|
@@ -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)
|
|
@@ -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,7 +43,7 @@ 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
|
-
|
|
46
|
+
color_label = color_utils.ColorLabel()
|
|
47
47
|
|
|
48
48
|
root = os.path.dirname(__file__)
|
|
49
49
|
coco_skeleton = [[1, 3], [1, 0], [2, 4], [2, 0], [0, 5], [0, 6], [5, 7], [7, 9], [6, 8],
|
|
@@ -1126,13 +1126,14 @@ def draw_image_bboxes_text(image, boxes, boxes_name, color=(), thickness=0, font
|
|
|
1126
1126
|
return image
|
|
1127
1127
|
|
|
1128
1128
|
|
|
1129
|
-
def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale=0, alpha=0,
|
|
1130
|
-
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):
|
|
1131
1131
|
"""
|
|
1132
1132
|
:param image:
|
|
1133
1133
|
:param boxes:
|
|
1134
1134
|
:param texts:
|
|
1135
1135
|
:param color:
|
|
1136
|
+
:param kColor:
|
|
1136
1137
|
:param thickness:
|
|
1137
1138
|
:param fontScale:
|
|
1138
1139
|
:param drawType:
|
|
@@ -1140,8 +1141,10 @@ def draw_image_boxes_texts(image, boxes, texts, color=(), thickness=0, fontScale
|
|
|
1140
1141
|
:return:
|
|
1141
1142
|
"""
|
|
1142
1143
|
for i, (bbox, text) in enumerate(zip(boxes, texts)):
|
|
1143
|
-
|
|
1144
|
-
|
|
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)] # 每个实例不同颜色
|
|
1145
1148
|
draw_image_bbox_text(image, bbox, text, color=c, thickness=thickness, fontScale=fontScale, alpha=alpha,
|
|
1146
1149
|
drawType=drawType, top=top)
|
|
1147
1150
|
return image
|
|
@@ -1163,16 +1166,14 @@ def draw_image_bboxes_labels_text(image, boxes, labels, boxes_name=None, color=N
|
|
|
1163
1166
|
|
|
1164
1167
|
def draw_image_boxes_labels_texts(image, boxes, labels, texts, color=None, thickness=2, fontScale=0.8,
|
|
1165
1168
|
drawType="custom", top=True, colors=None, color_type="class"):
|
|
1166
|
-
if isinstance(labels, np.ndarray):
|
|
1167
|
-
labels = labels.reshape(-1).tolist()
|
|
1169
|
+
if isinstance(labels, np.ndarray): labels = labels.reshape(-1).tolist()
|
|
1168
1170
|
colors = [(0, 0, 0)] + colors if colors else color_table
|
|
1169
|
-
for i, (label, bbox,
|
|
1170
|
-
bbox = [int(b) for b in bbox]
|
|
1171
|
+
for i, (label, bbox, text) in enumerate(zip(labels, boxes, texts)):
|
|
1171
1172
|
if color_type == "class":
|
|
1172
|
-
c = color if color else
|
|
1173
|
+
c = color if color else color_label.get_color(label) # 相同类别相同颜色
|
|
1173
1174
|
else:
|
|
1174
|
-
c = color if color else colors[(i + 1) %
|
|
1175
|
-
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,
|
|
1176
1177
|
drawType=drawType, top=top)
|
|
1177
1178
|
return image
|
|
1178
1179
|
|
|
@@ -1255,28 +1256,34 @@ def show_image_rects_texts(title, image, rects, texts, color=None, thickness=0,
|
|
|
1255
1256
|
return image
|
|
1256
1257
|
|
|
1257
1258
|
|
|
1258
|
-
def
|
|
1259
|
-
|
|
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):
|
|
1260
1261
|
"""
|
|
1261
|
-
|
|
1262
|
-
:param
|
|
1263
|
-
: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:
|
|
1264
1274
|
:return:
|
|
1265
1275
|
"""
|
|
1266
1276
|
if isinstance(labels, np.ndarray): labels = labels.astype(np.int32).reshape(-1).tolist()
|
|
1267
|
-
for
|
|
1268
|
-
|
|
1269
|
-
c = color
|
|
1270
|
-
if
|
|
1271
|
-
c = color_table[(int(label) + 1) % 20]
|
|
1272
|
-
label = class_name[int(label)]
|
|
1273
|
-
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)]
|
|
1274
1281
|
image = draw_image_bbox_text(image, bbox, str(label), color=c, thickness=thickness, fontScale=fontScale,
|
|
1275
|
-
drawType=drawType, top=top)
|
|
1282
|
+
alpha=alpha, drawType=drawType, top=top)
|
|
1276
1283
|
return image
|
|
1277
1284
|
|
|
1278
1285
|
|
|
1279
|
-
|
|
1286
|
+
draw_image_bboxes_labels = draw_image_boxes_labels
|
|
1280
1287
|
|
|
1281
1288
|
|
|
1282
1289
|
def draw_image_rects_labels(image, rects, labels, class_name=None, color=None, thickness=0, fontScale=0):
|
|
@@ -1469,71 +1476,22 @@ def draw_text(image, point, text, color=(255, 0, 0), fontScale=0, thickness=0, d
|
|
|
1469
1476
|
:param image:
|
|
1470
1477
|
:param point:
|
|
1471
1478
|
:param text:
|
|
1472
|
-
:param drawType:
|
|
1479
|
+
:param drawType: en/ch/simple
|
|
1473
1480
|
:return:
|
|
1474
1481
|
"""
|
|
1475
1482
|
point = (int(point[0]), int(point[1]))
|
|
1476
1483
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1477
1484
|
fontFace = cv2.FONT_HERSHEY_COMPLEX
|
|
1478
1485
|
if drawType == "custom" or drawType == "en":
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
cv2.putText(image, str(text), (text_loc[0], text_loc[1] + baseline), fontFace, fontScale, (255, 255, 255),
|
|
1485
|
-
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)
|
|
1486
1491
|
elif drawType == "simple":
|
|
1487
1492
|
cv2.putText(image, str(text), (point[0], point[1]), fontFace, fontScale, color=color, thickness=abs(thickness))
|
|
1488
|
-
if drawType == "chinese" or drawType == "ch":
|
|
1489
|
-
cv2_putText(image, str(text), point, color=color, fontScale=fontScale, thickness=abs(thickness))
|
|
1490
|
-
return image
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
def draw_image_bbox_text_bk(image, bbox, text, color, thickness=2, fontScale=0.8, alpha=0, drawType="custom", top=True):
|
|
1494
|
-
"""
|
|
1495
|
-
:param image:
|
|
1496
|
-
:param bbox:
|
|
1497
|
-
:param color:
|
|
1498
|
-
:param text:
|
|
1499
|
-
:param drawType:
|
|
1500
|
-
:param top:
|
|
1501
|
-
:return:
|
|
1502
|
-
"""
|
|
1503
|
-
text = str(text)
|
|
1504
|
-
if alpha > 0:
|
|
1505
|
-
bgimg = draw_image_bbox_text(image.copy(), bbox, text=text, color=color, thickness=thickness,
|
|
1506
|
-
fontScale=fontScale, drawType=drawType, top=top, alpha=0)
|
|
1507
|
-
image[:] = cv2.addWeighted(bgimg, 1 - alpha, image, alpha, 0)
|
|
1508
|
-
return image
|
|
1509
|
-
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1510
|
-
# text_loc = (bbox[0], bbox[1]) if top else (bbox[0], bbox[3])
|
|
1511
|
-
if not text: drawType = "simple"
|
|
1512
|
-
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1513
|
-
if top:
|
|
1514
|
-
# text_loc = (bbox[0], bbox[1] + text_wh[1]) # 在左上角下方绘制文字
|
|
1515
|
-
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1516
1493
|
else:
|
|
1517
|
-
|
|
1518
|
-
if drawType == "chinese" or drawType == "ch":
|
|
1519
|
-
if not top: text_loc = (text_loc[0], text_loc[1] - baseline)
|
|
1520
|
-
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1521
|
-
cv2_putText(image, str(text), text_loc, color=color, fontScale=fontScale, thickness=abs(thickness))
|
|
1522
|
-
elif drawType == "simple" or drawType == "en":
|
|
1523
|
-
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness, 8, 0)
|
|
1524
|
-
cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
|
|
1525
|
-
elif drawType == "custom":
|
|
1526
|
-
text_loc = (bbox[0], bbox[1] + text_wh[1] + baseline // 2) # 在左上角下方绘制文字
|
|
1527
|
-
# text_loc = (bbox[0], bbox[1] + baseline) # 在左上角上方绘制文字
|
|
1528
|
-
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
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的宽度
|
|
1532
|
-
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
|
|
1533
|
-
cv2.rectangle(image, bg1, bg2, color, -1)
|
|
1534
|
-
# draw score value
|
|
1535
|
-
cv2.putText(image, str(text), (text_loc[0], text_loc[1]), cv2.FONT_HERSHEY_COMPLEX, fontScale,
|
|
1536
|
-
(255, 255, 255), abs(thickness))
|
|
1494
|
+
cv2.putText(image, str(text), (point[0], point[1]), fontFace, fontScale, color=color, thickness=abs(thickness))
|
|
1537
1495
|
return image
|
|
1538
1496
|
|
|
1539
1497
|
|
|
@@ -1547,6 +1505,7 @@ def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, a
|
|
|
1547
1505
|
:param top:
|
|
1548
1506
|
:return:
|
|
1549
1507
|
"""
|
|
1508
|
+
bbox = [int(b) for b in bbox]
|
|
1550
1509
|
text = str(text)
|
|
1551
1510
|
if alpha > 0:
|
|
1552
1511
|
bgimg = draw_image_bbox_text(image.copy(), bbox, text=text, color=color, thickness=thickness,
|
|
@@ -1554,52 +1513,54 @@ def draw_image_bbox_text(image, bbox, text, color, thickness=2, fontScale=0.8, a
|
|
|
1554
1513
|
image[:] = cv2.addWeighted(bgimg, 1 - alpha, image, alpha, 0)
|
|
1555
1514
|
return image
|
|
1556
1515
|
if drawType == "ch" or drawType == "chinese":
|
|
1557
|
-
image =
|
|
1516
|
+
image = draw_bbox_text_ch(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
|
|
1558
1517
|
elif drawType == "simple":
|
|
1559
1518
|
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1560
1519
|
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1561
1520
|
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness, 8, 0)
|
|
1562
1521
|
cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_COMPLEX, fontScale, color, abs(thickness))
|
|
1563
1522
|
else: # custom ,en
|
|
1564
|
-
image =
|
|
1523
|
+
image = draw_bbox_text_en(image, bbox, text, color, thickness=thickness, fontScale=fontScale)
|
|
1565
1524
|
return image
|
|
1566
1525
|
|
|
1567
1526
|
|
|
1568
|
-
def
|
|
1527
|
+
def draw_bbox_text_ch(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
1569
1528
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1570
1529
|
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_COMPLEX, fontScale, abs(thickness))
|
|
1571
|
-
|
|
1530
|
+
baseline = baseline + 1
|
|
1531
|
+
text_wh = (text_wh[0], int(text_wh[1] * 0.8)) # 与draw_bbox_text_en区别,底纹缩小80%
|
|
1572
1532
|
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1573
1533
|
text_bgy = text_loc[1] - text_wh[1] - baseline // 2
|
|
1574
1534
|
if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
|
|
1575
1535
|
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
1536
|
bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
|
|
1578
1537
|
bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1579
1538
|
# 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
|
-
|
|
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)) # 调整字体位置
|
|
1583
1543
|
cv2_putText(image, str(text), text_loc, color=(255, 255, 255), fontScale=fontScale, thickness=abs(thickness))
|
|
1584
1544
|
return image
|
|
1585
1545
|
|
|
1586
1546
|
|
|
1587
|
-
def
|
|
1547
|
+
def draw_bbox_text_en(image, bbox, text, color, thickness=2, fontScale=0.8):
|
|
1588
1548
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1589
|
-
text_wh, baseline = cv2.getTextSize(str(text), cv2.
|
|
1549
|
+
text_wh, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, abs(thickness))
|
|
1550
|
+
baseline = baseline + 1
|
|
1590
1551
|
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1591
1552
|
text_bgy = text_loc[1] - text_wh[1] - baseline // 2
|
|
1592
1553
|
if text_bgy < 0: # 如果文字超出图片范围,切换到下方绘制
|
|
1593
1554
|
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
1555
|
bg1 = (text_loc[0], text_loc[1] - text_wh[1] - baseline // 2)
|
|
1596
1556
|
bg2 = (text_loc[0] + text_wh[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1597
1557
|
# 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
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
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))
|
|
1603
1564
|
return image
|
|
1604
1565
|
|
|
1605
1566
|
|
|
@@ -2769,7 +2730,9 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
|
|
|
2769
2730
|
"""
|
|
2770
2731
|
colors = [(0, 0, 0)] + colors if colors else color_table
|
|
2771
2732
|
for i in range(0, len(contours)):
|
|
2772
|
-
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)] # 相同类别相同颜色
|
|
2773
2736
|
t = str(texts[i]) if texts else ""
|
|
2774
2737
|
p = np.asarray(contours[i], dtype=np.int32)
|
|
2775
2738
|
b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))
|
|
@@ -2783,6 +2746,9 @@ def draw_image_contours(image, contours: List[np.ndarray], texts=[], color=(), a
|
|
|
2783
2746
|
return image
|
|
2784
2747
|
|
|
2785
2748
|
|
|
2749
|
+
draw_image_contours_texts = draw_image_contours
|
|
2750
|
+
|
|
2751
|
+
|
|
2786
2752
|
def draw_image_contours_labels_texts(image, contours: List[np.ndarray], labels=[], texts=[], color=(), alpha=0.5,
|
|
2787
2753
|
thickness=1, fontScale=0.8, drawType="ch", colors=None):
|
|
2788
2754
|
"""
|
|
@@ -2795,9 +2761,8 @@ def draw_image_contours_labels_texts(image, contours: List[np.ndarray], labels=[
|
|
|
2795
2761
|
:param thickness:轮廓线宽
|
|
2796
2762
|
:return:
|
|
2797
2763
|
"""
|
|
2798
|
-
colors = [(0, 0, 0)] + colors if colors else color_table
|
|
2799
2764
|
for i in range(0, len(contours)):
|
|
2800
|
-
c = color if color else
|
|
2765
|
+
c = color if color else color_label.get_color(labels[i]) # 相同类别相同颜色
|
|
2801
2766
|
t = str(texts[i]) if texts else ""
|
|
2802
2767
|
p = np.asarray(contours[i], dtype=np.int32)
|
|
2803
2768
|
b = (min(p[:, 0]), min(p[:, 1]), max(p[:, 0]), max(p[:, 1]))
|
|
@@ -24,6 +24,37 @@ from multiprocessing import Pool, Process
|
|
|
24
24
|
thread_lock = threading.Lock()
|
|
25
25
|
|
|
26
26
|
|
|
27
|
+
class ThreadLock:
|
|
28
|
+
"""A decorator class for ensuring thread-safe execution of a function or method.
|
|
29
|
+
This class can be used as a decorator to make sure that if the decorated function is called from multiple threads,
|
|
30
|
+
only one thread at a time will be able to execute the function.
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
lock (threading.Lock): A lock object used to manage access to the decorated function.
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
>>> from ultralytics.utils import ThreadingLocked
|
|
37
|
+
>>> @ThreadLock()
|
|
38
|
+
... def my_function():
|
|
39
|
+
... # Your code here
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(self):
|
|
43
|
+
"""Initialize the decorator class with a threading lock."""
|
|
44
|
+
self.lock = threading.Lock()
|
|
45
|
+
|
|
46
|
+
def __call__(self, f):
|
|
47
|
+
"""Run thread-safe execution of function or method."""
|
|
48
|
+
from functools import wraps
|
|
49
|
+
|
|
50
|
+
@wraps(f)
|
|
51
|
+
def decorated(*args, **kwargs):
|
|
52
|
+
"""Apply thread-safety to the decorated function or method."""
|
|
53
|
+
with self.lock:
|
|
54
|
+
return f(*args, **kwargs)
|
|
55
|
+
|
|
56
|
+
return decorated
|
|
57
|
+
|
|
27
58
|
def thread_safety(func, *args, **kwargs):
|
|
28
59
|
"""
|
|
29
60
|
使用以下加锁方式
|
|
@@ -217,6 +217,8 @@ test_py/aije/convert_cvat2labelme.py
|
|
|
217
217
|
test_py/aije/convert_labelme2coco.py
|
|
218
218
|
test_py/aije/convert_labelme2voc.py
|
|
219
219
|
test_py/aije/copy_move.py
|
|
220
|
+
test_py/aije/demo_labelme_class_counts.py
|
|
221
|
+
test_py/aije/demo_labelme_crop_aicq.py
|
|
220
222
|
test_py/aije/demo_labelme_crop_aije.py
|
|
221
223
|
test_py/aije/demo_labelme_crop_ailt.py
|
|
222
224
|
test_py/aije/demo_labelme_shock.py
|
|
@@ -71,6 +71,7 @@ def readme2rst(in_file='README.md'):
|
|
|
71
71
|
encoding:指定编码集
|
|
72
72
|
outputfile:目标文件,比如test.html(注意outputfile的后缀要和to一致)
|
|
73
73
|
"""
|
|
74
|
+
import pypandoc
|
|
74
75
|
# 修复中文乱码问题: <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
|
|
75
76
|
pypandoc.convert_file(in_file, 'html', format='md', outputfile="README.html", encoding='utf-8')
|
|
76
77
|
pypandoc.convert_file(in_file, 'rst', format='md', outputfile="README.rst", encoding='utf-8')
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""
|
|
2
|
+
# --------------------------------------------------------
|
|
3
|
+
# @Author : Pan
|
|
4
|
+
# @E-mail :
|
|
5
|
+
# @Date : 2026-10-09 20:29:58
|
|
6
|
+
# @Brief :
|
|
7
|
+
# --------------------------------------------------------
|
|
8
|
+
"""
|
|
9
|
+
from pybaseutils.dataloader import parser_labelme
|
|
10
|
+
|
|
11
|
+
if __name__ == "__main__":
|
|
12
|
+
# TODO 统计labelme数据集每个类别的样本数量
|
|
13
|
+
# example_for_segment()
|
|
14
|
+
# example_for_keypoints()
|
|
15
|
+
datasets = [
|
|
16
|
+
'/home/PKing/edudata/dataset/AICQ/dataset/data-2026-10-06/images',
|
|
17
|
+
'/home/PKing/edudata/dataset/AICQ/dataset/data-2026-09-30/images',
|
|
18
|
+
]
|
|
19
|
+
counts = parser_labelme.get_class_counts(datasets)
|
|
20
|
+
print(counts)
|