pybaseutils 2.2.12__tar.gz → 2.2.16__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.2.12 → pybaseutils-2.2.16}/PKG-INFO +10 -4
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/README.md +3 -1
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/file_utils.py +1 -1
- pybaseutils-2.2.16/pybaseutils/font_style/__init__.py +73 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/font_utils.py +30 -24
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/image_utils.py +63 -54
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/numpy_utils.py +35 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/plot_utils.py +4 -1
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/time_utils.py +15 -2
- pybaseutils-2.2.16/pybaseutils/web/__init__.py +7 -0
- pybaseutils-2.2.16/pybaseutils/web/st_image_web.py +111 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils.egg-info/PKG-INFO +10 -4
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils.egg-info/SOURCES.txt +5 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/setup.py +56 -56
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/audio/speechbrain_asr_indoor_prod.py +737 -737
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/camera/demo.py +147 -147
- pybaseutils-2.2.16/test_py/date_dataset.py +138 -0
- pybaseutils-2.2.16/test_py/date_demo.py +18 -0
- pybaseutils-2.2.16/test_py/datedataset_bk.py +102 -0
- pybaseutils-2.2.16/test_py/demo1.py +48 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_voc_vis.py +1 -1
- pybaseutils-2.2.12/pybaseutils/font_style/__init__.py +0 -21
- pybaseutils-2.2.12/test_py/demo1.py +0 -17
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/LICENCE +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/log.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/setup.cfg +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/audio/main.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/class_names.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo2.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo3.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_video.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/flask_demo/func.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/flask_demo/server.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/performance.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/registry/base.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/registry/component.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/registry/main.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/registry/register.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.2.12 → pybaseutils-2.2.16}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.16
|
|
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
9
|
License-File: LICENCE
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: author-email
|
|
12
|
+
Dynamic: description
|
|
13
|
+
Dynamic: home-page
|
|
14
|
+
Dynamic: license
|
|
15
|
+
Dynamic: summary
|
|
10
16
|
|
|
11
17
|
base-utils
|
|
12
18
|
==========
|
|
@@ -30,8 +36,8 @@ pybaseutils(Python)
|
|
|
30
36
|
|
|
31
37
|
pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
32
38
|
|
|
33
|
-
- 安装方法1:pip install
|
|
34
|
-
|
|
39
|
+
- 安装方法1:pip install
|
|
40
|
+
- pybaseutils (有延时,可能不是最新版本)
|
|
35
41
|
- 安装方法2:pip install –upgrade -i https://pypi.org/simple
|
|
36
42
|
pybaseutils (从pypi源下载最新版本)
|
|
37
43
|
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
## base_utils(C++)
|
|
8
8
|
|
|
9
|
+
|
|
9
10
|
base_util是个人开发常用的C++库,集成了C/C++ OpenCV等常用的算法
|
|
10
11
|
|
|
11
12
|
- 增加了debug测试宏定义,如时间测试,LOG信息等
|
|
@@ -17,7 +18,8 @@ base_util是个人开发常用的C++库,集成了C/C++ OpenCV等常用的算
|
|
|
17
18
|
|
|
18
19
|
pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
19
20
|
|
|
20
|
-
- 安装方法1:pip install
|
|
21
|
+
- 安装方法1:pip install
|
|
22
|
+
- pybaseutils (有延时,可能不是最新版本)
|
|
21
23
|
- 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
|
|
22
24
|
|
|
23
25
|
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : Pan
|
|
4
|
+
@E-mail : 390737991@qq.com
|
|
5
|
+
@Date : 2019-05-07 17:40:27
|
|
6
|
+
"""
|
|
7
|
+
import os
|
|
8
|
+
|
|
9
|
+
# TODO 如果字体缺失,可以把字体拷贝到系统字体目录:cp -r fonts/* ~/.local/share/fonts/
|
|
10
|
+
# windows: C:\Windows\Fonts可查看系统支持的字体
|
|
11
|
+
# Linux : /usr/share/fonts/truetype 或者~/.local/share/fonts中 可查看系统支持的字体
|
|
12
|
+
|
|
13
|
+
BASE_FONT = os.path.dirname(__file__)
|
|
14
|
+
|
|
15
|
+
# 可能的字体路径列表
|
|
16
|
+
FONT_ROOT = [
|
|
17
|
+
os.path.expanduser("~/.local/share/fonts"),
|
|
18
|
+
os.path.expanduser("~/.local/share/truetype"),
|
|
19
|
+
os.path.expanduser("~/.fonts"), # 用户字体目录
|
|
20
|
+
BASE_FONT, # 用户字体目录
|
|
21
|
+
"/usr/share/fonts",
|
|
22
|
+
"/usr/share/fonts/truetype",
|
|
23
|
+
"/usr/share/fonts/opentype",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def get_all_files(file_dir, postfix=[]):
|
|
28
|
+
"""获取file_dir目录下,所有文本路径,包括子目录文件"""
|
|
29
|
+
file_list = []
|
|
30
|
+
for walk in os.walk(file_dir):
|
|
31
|
+
# paths = [os.path.join(walk[0], file).replace("\\", "/") for file in walk[2]]
|
|
32
|
+
paths = [os.path.join(walk[0], file) for file in walk[2]]
|
|
33
|
+
file_list.extend(paths)
|
|
34
|
+
if not file_list: return file_list
|
|
35
|
+
out_list = []
|
|
36
|
+
for file in file_list:
|
|
37
|
+
p = f"*.{os.path.basename(file).split('.')[-1]}"
|
|
38
|
+
if p in postfix: out_list.append(file)
|
|
39
|
+
return out_list
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def get_system_fonts(root=[]):
|
|
43
|
+
"""
|
|
44
|
+
获得字体路径
|
|
45
|
+
默认字体:ImageFont.load_default()
|
|
46
|
+
:param root: 字体路径
|
|
47
|
+
:return:
|
|
48
|
+
"""
|
|
49
|
+
if root and isinstance(root, str): root = [root]
|
|
50
|
+
font_root = root if root else FONT_ROOT
|
|
51
|
+
font_tables = {
|
|
52
|
+
"楷体": os.path.join(BASE_FONT, "simkai.ttf"),
|
|
53
|
+
"simkai": os.path.join(BASE_FONT, "simkai.ttf"),
|
|
54
|
+
"宋体": os.path.join(BASE_FONT, "simsun.ttc"),
|
|
55
|
+
"simsun": os.path.join(BASE_FONT, "simsun.ttc"),
|
|
56
|
+
"仿宋": os.path.join(BASE_FONT, "simfang.ttf"),
|
|
57
|
+
"simfang": os.path.join(BASE_FONT, "simfang.ttf"),
|
|
58
|
+
"黑体": os.path.join(BASE_FONT, "simhei.ttf"),
|
|
59
|
+
"simhei": os.path.join(BASE_FONT, "simhei.ttf"),
|
|
60
|
+
"方正": os.path.join(BASE_FONT, "方正粗黑宋简体.ttf"),
|
|
61
|
+
# "等线": os.path.join(FONT_ROOT, "Deng.ttf"),
|
|
62
|
+
}
|
|
63
|
+
for dir in font_root:
|
|
64
|
+
files = get_all_files(dir, postfix=['*.ttf', '*.ttc', '*.otf'])
|
|
65
|
+
for file in files:
|
|
66
|
+
name = os.path.basename(file).split(".")[0]
|
|
67
|
+
font_tables[name] = file
|
|
68
|
+
for name in list(font_tables.keys()):
|
|
69
|
+
if not os.path.exists(font_tables[name]): font_tables.pop(name)
|
|
70
|
+
return font_tables
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
FONT_TABLES = get_system_fonts()
|
|
@@ -9,20 +9,22 @@
|
|
|
9
9
|
import os
|
|
10
10
|
import cv2
|
|
11
11
|
import re
|
|
12
|
+
import glob
|
|
12
13
|
import PIL
|
|
13
14
|
import platform
|
|
14
15
|
import numpy as np
|
|
15
16
|
from PIL import Image, ImageDraw, ImageFont
|
|
16
|
-
from pybaseutils import image_utils
|
|
17
|
-
from pybaseutils.font_style import
|
|
17
|
+
from pybaseutils import image_utils
|
|
18
|
+
from pybaseutils.font_style import FONT_TABLES, get_system_fonts
|
|
18
19
|
from fontTools.ttLib import TTFont
|
|
19
20
|
|
|
20
21
|
ROOT = os.path.dirname(__file__)
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
class FontType(object):
|
|
24
|
-
def __init__(self, root=
|
|
25
|
+
def __init__(self, root=[], style="DejaVuSans", size=20):
|
|
25
26
|
"""
|
|
27
|
+
Linux ~/.local/share/fonts
|
|
26
28
|
:param root: 安装字体的路径
|
|
27
29
|
:param style: 选择字体风格
|
|
28
30
|
:param size: 旋转字体大小
|
|
@@ -30,10 +32,13 @@ class FontType(object):
|
|
|
30
32
|
self.font_root = root
|
|
31
33
|
self.font_style = style
|
|
32
34
|
self.font_size = size
|
|
33
|
-
self.
|
|
34
|
-
self.
|
|
35
|
-
|
|
35
|
+
self.font_table = get_system_fonts(root=root)
|
|
36
|
+
self.font_file = self.font_table.get(style, "")
|
|
37
|
+
try:
|
|
36
38
|
self.font_type = ImageFont.truetype(self.font_file, size=self.font_size, encoding="utf-8")
|
|
39
|
+
except:
|
|
40
|
+
print(f"字体{style}{self.font_file}加载失败,使用系统默认字体")
|
|
41
|
+
self.font_type = ImageFont.load_default()
|
|
37
42
|
|
|
38
43
|
def set_root(self, root):
|
|
39
44
|
"""设置字体的路径"""
|
|
@@ -53,7 +58,7 @@ class FontType(object):
|
|
|
53
58
|
return self.font_type
|
|
54
59
|
|
|
55
60
|
|
|
56
|
-
font_type = FontType()
|
|
61
|
+
# font_type = FontType()
|
|
57
62
|
|
|
58
63
|
|
|
59
64
|
def get_font_type(size, font=""):
|
|
@@ -72,10 +77,9 @@ def get_font_type(size, font=""):
|
|
|
72
77
|
elif platform.system().lower() == 'windows':
|
|
73
78
|
font = ImageFont.truetype("simhei.ttf", size, encoding="utf-8") # simsun.ttc 宋体
|
|
74
79
|
elif platform.system().lower() == 'linux':
|
|
75
|
-
|
|
76
|
-
font = ImageFont.truetype("NotoSansCJK-Regular.ttc", size, encoding="utf-8")
|
|
80
|
+
font = ImageFont.truetype(FONT_TABLES['simhei'], size, encoding="utf-8") # simsun.ttc 宋体
|
|
77
81
|
else:
|
|
78
|
-
font = ImageFont.
|
|
82
|
+
font = ImageFont.load_default()
|
|
79
83
|
return font
|
|
80
84
|
|
|
81
85
|
|
|
@@ -104,32 +108,32 @@ def draw_image_text(image, point, text, style="楷体", size=20, color=(255, 255
|
|
|
104
108
|
return image
|
|
105
109
|
|
|
106
110
|
|
|
107
|
-
def draw_font(text, style="楷体", scale=1.0, size=20,
|
|
111
|
+
def draw_font(text, style="楷体", scale=1.0, size=20, fg=(255, 255, 255), bg=(0, 0, 0), center=True):
|
|
108
112
|
"""
|
|
109
113
|
绘制汉字
|
|
110
114
|
:param text:
|
|
111
115
|
:param style: 字体风格
|
|
112
116
|
:param scale: 缩放因子
|
|
113
117
|
:param size: 字体大小
|
|
114
|
-
:param
|
|
115
|
-
:param
|
|
118
|
+
:param fg:字体颜色
|
|
119
|
+
:param bg:背景颜色
|
|
116
120
|
:param center: 是否居中显示
|
|
117
121
|
:return:
|
|
118
122
|
"""
|
|
119
123
|
if center:
|
|
120
|
-
image = image_utils.create_image(shape=(size * 2, size * 2, 3), color=
|
|
121
|
-
image = draw_image_text(image, (0, 0), text, style=style, size=size, color=
|
|
124
|
+
image = image_utils.create_image(shape=(size * 2, size * 2, 3), color=bg)
|
|
125
|
+
image = draw_image_text(image, (0, 0), text, style=style, size=size, color=fg)
|
|
122
126
|
if np.sum(image) < 1: return None
|
|
123
127
|
mask = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|
124
128
|
box = image_utils.get_mask_boundrect_cv(mask, binarize=True, shift=10)
|
|
125
129
|
image = image_utils.get_box_crop(image, box)
|
|
126
|
-
image = image_utils.resize_image_padding(image, size=(size, size), color=
|
|
130
|
+
image = image_utils.resize_image_padding(image, size=(size, size), color=bg)
|
|
127
131
|
else:
|
|
128
|
-
image = image_utils.create_image(shape=(size, size, 3), color=
|
|
129
|
-
image = draw_image_text(image, (0, 0), text, style=style, size=size, color=
|
|
132
|
+
image = image_utils.create_image(shape=(size, size, 3), color=bg)
|
|
133
|
+
image = draw_image_text(image, (0, 0), text, style=style, size=size, color=fg)
|
|
130
134
|
if np.sum(image) < 1: return None
|
|
131
135
|
if scale < 1.0:
|
|
132
|
-
image = image_utils.get_scale_image(image, scale=scale, offset=(0, 0), color=
|
|
136
|
+
image = image_utils.get_scale_image(image, scale=scale, offset=(0, 0), color=bg)
|
|
133
137
|
return image
|
|
134
138
|
|
|
135
139
|
|
|
@@ -210,10 +214,11 @@ def get_font_char(font_file, only_chinese=False):
|
|
|
210
214
|
def draw_font_example():
|
|
211
215
|
size = 512
|
|
212
216
|
string = "我"
|
|
213
|
-
for style, path in
|
|
214
|
-
style
|
|
215
|
-
image = draw_font(string, style=style, size=size, scale=0.8,
|
|
217
|
+
for style, path in FONT_TABLES.items():
|
|
218
|
+
print(style, path)
|
|
219
|
+
image = draw_font(string, style=style, size=size, scale=0.8, fg=(255, 255, 255), bg=(128, 128, 128))
|
|
216
220
|
image_utils.cv_show_image("style", image, use_rgb=False)
|
|
221
|
+
# cv2.imwrite("./style.png", image)
|
|
217
222
|
|
|
218
223
|
|
|
219
224
|
def re_example():
|
|
@@ -225,5 +230,6 @@ def re_example():
|
|
|
225
230
|
|
|
226
231
|
|
|
227
232
|
if __name__ == "__main__":
|
|
228
|
-
|
|
229
|
-
|
|
233
|
+
draw_font_example()
|
|
234
|
+
# get_system_fonts()
|
|
235
|
+
# re_example()
|
|
@@ -22,6 +22,7 @@ from typing import List, Dict, Tuple
|
|
|
22
22
|
from PIL import ImageDraw, ImageFont
|
|
23
23
|
from math import cos, sin
|
|
24
24
|
from pybaseutils import file_utils, color_utils
|
|
25
|
+
from pybaseutils import font_style
|
|
25
26
|
from pybaseutils.coords_utils import *
|
|
26
27
|
from pybaseutils.cvutils import corner_utils
|
|
27
28
|
|
|
@@ -46,29 +47,6 @@ mpii_skeleton = [[0, 1], [1, 2], [3, 4], [4, 5], [2, 6], [6, 3], [12, 11], [7, 1
|
|
|
46
47
|
[11, 10], [13, 14], [14, 15], [8, 9], [8, 7], [6, 7], [7, 13]]
|
|
47
48
|
|
|
48
49
|
|
|
49
|
-
def get_font_type(size, font=""):
|
|
50
|
-
"""
|
|
51
|
-
Windows字体路径 : /usr/share/fonts/楷体.ttf
|
|
52
|
-
Linux(Ubuntu)字体路径:/usr/share/fonts/楷体.ttf
|
|
53
|
-
>> fc-list 查看所有的字体
|
|
54
|
-
>> fc-list :lang=zh 查看所有的中文字体
|
|
55
|
-
:param size: 字体大小
|
|
56
|
-
:param font: simsun.ttc 宋体;simhei.ttf 黑体
|
|
57
|
-
:return:
|
|
58
|
-
"""
|
|
59
|
-
# 参数1:字体文件路径,参数2:字体大小;Windows系统“simhei.ttf”默认存储在路径:
|
|
60
|
-
if font:
|
|
61
|
-
font = ImageFont.truetype(font, size, encoding="utf-8")
|
|
62
|
-
elif platform.system().lower() == 'windows':
|
|
63
|
-
font = ImageFont.truetype("simhei.ttf", size, encoding="utf-8") # simsun.ttc 宋体
|
|
64
|
-
elif platform.system().lower() == 'linux':
|
|
65
|
-
# font = ImageFont.truetype("uming.ttc", size, encoding="utf-8")
|
|
66
|
-
font = ImageFont.truetype("NotoSansCJK-Regular.ttc", size, encoding="utf-8")
|
|
67
|
-
else:
|
|
68
|
-
font = ImageFont.truetype(os.path.join(root, "font_style/simhei.ttf"), size, encoding="utf-8")
|
|
69
|
-
return font
|
|
70
|
-
|
|
71
|
-
|
|
72
50
|
def create_image(shape, color=(255, 255, 255), dtype=np.uint8, use_rgb=False):
|
|
73
51
|
"""
|
|
74
52
|
生成一张图片
|
|
@@ -697,16 +675,17 @@ def resize_image(image, size: Tuple, interpolation=cv2.INTER_LINEAR):
|
|
|
697
675
|
def image_boxes_resize_padding(image, input_size, boxes=None, points=None, color=(0, 0, 0)):
|
|
698
676
|
"""
|
|
699
677
|
等比例图像resize,保持原始图像内容比,避免失真,短边会0填充
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
678
|
+
>> example:
|
|
679
|
+
input_size = [300, 300]
|
|
680
|
+
image_path = "../data/test_image/grid1.png"
|
|
681
|
+
boxes = [[120, 50, 250, 180]]
|
|
682
|
+
boxes = np.asarray(boxes)
|
|
683
|
+
image0 = read_image(image_path)
|
|
684
|
+
show_image_boxes("image0", image0, boxes, color=(255, 0, 0), delay=3)
|
|
685
|
+
image1 = image_boxes_resize_padding(image0, input_size, boxes)
|
|
686
|
+
show_image_boxes("image1", image1, boxes, color=(0, 255, 0), delay=3)
|
|
687
|
+
boxes = image_boxes_resize_padding_inverse((image0.shape[1], image0.shape[0]), input_size, boxes)
|
|
688
|
+
show_image_boxes("image2", image0, boxes, color=(0, 0, 255))
|
|
710
689
|
:param size:
|
|
711
690
|
"""
|
|
712
691
|
height, width = image.shape[:2]
|
|
@@ -1417,9 +1396,16 @@ def draw_image_box_text(image, bbox, color, text, thickness=2, fontScale=0.8, dr
|
|
|
1417
1396
|
:return:
|
|
1418
1397
|
"""
|
|
1419
1398
|
thickness, fontScale = get_linesize(max(image.shape), thickness=thickness, fontScale=fontScale)
|
|
1420
|
-
text_loc = (bbox[0], bbox[1]) if top else (bbox[0], bbox[3])
|
|
1399
|
+
# text_loc = (bbox[0], bbox[1]) if top else (bbox[0], bbox[3])
|
|
1421
1400
|
if not text: drawType = "simple"
|
|
1401
|
+
text_size, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, thickness)
|
|
1402
|
+
if top:
|
|
1403
|
+
# text_loc = (bbox[0], bbox[1] + text_size[1]) # 在左上角下方绘制文字
|
|
1404
|
+
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1405
|
+
else:
|
|
1406
|
+
text_loc = (bbox[0], bbox[3] + text_size[1] + baseline // 2)
|
|
1422
1407
|
if drawType == "chinese" or drawType == "ch":
|
|
1408
|
+
if not top: text_loc = (text_loc[0], text_loc[1] - baseline)
|
|
1423
1409
|
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1424
1410
|
cv2_putText(image, str(text), text_loc, color=color, fontScale=fontScale, thickness=thickness)
|
|
1425
1411
|
elif drawType == "simple" or drawType == "en":
|
|
@@ -1427,13 +1413,7 @@ def draw_image_box_text(image, bbox, color, text, thickness=2, fontScale=0.8, dr
|
|
|
1427
1413
|
cv2.putText(image, str(text), text_loc, cv2.FONT_HERSHEY_SIMPLEX, fontScale, color, thickness)
|
|
1428
1414
|
elif drawType == "custom":
|
|
1429
1415
|
cv2.rectangle(image, (bbox[0], bbox[1]), (bbox[2], bbox[3]), color, thickness)
|
|
1430
|
-
|
|
1431
|
-
if top:
|
|
1432
|
-
# text_loc = (bbox[0], bbox[1] + text_size[1]) # 在左上角下方绘制文字
|
|
1433
|
-
text_loc = (bbox[0], bbox[1] - baseline // 2) # 在左上角上方绘制文字
|
|
1434
|
-
else:
|
|
1435
|
-
text_loc = (bbox[0], bbox[3])
|
|
1436
|
-
bg1 = (text_loc[0], text_loc[1] - text_size[1])
|
|
1416
|
+
bg1 = (text_loc[0], text_loc[1] - text_size[1] - baseline // 2)
|
|
1437
1417
|
bg2 = (text_loc[0] + text_size[0], text_loc[1] + baseline // 2) # 底纹等于字体的宽度
|
|
1438
1418
|
# bg2 = (max(bbox[2], text_loc[0] + text_size[0]), text_loc[1] + baseline // 2) # 底纹等于box的宽度
|
|
1439
1419
|
cv2.rectangle(image, bg1, bg2, color, thickness) # 先绘制框,再填充
|
|
@@ -1484,12 +1464,36 @@ def draw_text_pil(image, point, text, size=10, color_color=(255, 0, 0)):
|
|
|
1484
1464
|
return image
|
|
1485
1465
|
|
|
1486
1466
|
|
|
1467
|
+
def get_font_type(size, font=""):
|
|
1468
|
+
"""
|
|
1469
|
+
Windows字体路径 : /usr/share/fonts/楷体.ttf
|
|
1470
|
+
Linux(Ubuntu)字体路径:/usr/share/fonts/楷体.ttf
|
|
1471
|
+
>> fc-list 查看所有的字体
|
|
1472
|
+
>> fc-list :lang=zh 查看所有的中文字体
|
|
1473
|
+
:param size: 字体大小
|
|
1474
|
+
:param font: simsun.ttc 宋体;simhei.ttf 黑体
|
|
1475
|
+
:return:
|
|
1476
|
+
"""
|
|
1477
|
+
# 参数1:字体文件路径,参数2:字体大小;Windows系统“simhei.ttf”默认存储在路径:
|
|
1478
|
+
if font:
|
|
1479
|
+
font = ImageFont.truetype(font, size, encoding="utf-8")
|
|
1480
|
+
elif platform.system().lower() == 'windows':
|
|
1481
|
+
font = ImageFont.truetype("simhei.ttf", size, encoding="utf-8") # simsun.ttc 宋体
|
|
1482
|
+
elif platform.system().lower() == 'linux':
|
|
1483
|
+
font = ImageFont.truetype(font_style.FONT_TABLES['simhei'], size, encoding="utf-8") # simsun.ttc 宋体
|
|
1484
|
+
# font = ImageFont.load_default()
|
|
1485
|
+
else:
|
|
1486
|
+
font = ImageFont.load_default()
|
|
1487
|
+
return font
|
|
1488
|
+
|
|
1489
|
+
|
|
1487
1490
|
def cv2_putText(img, text, point, fontFace=None, fontScale=0.8, color=(255, 0, 0), thickness=None):
|
|
1488
1491
|
# cv2.putText(img, str(text), point, fontFace, fontScale, color=color, thickness=thickness)
|
|
1492
|
+
text_size, baseline = cv2.getTextSize(str(text), cv2.FONT_HERSHEY_SIMPLEX, fontScale, thickness)
|
|
1489
1493
|
pilimg = Image.fromarray(img) # Image.fromarray()将数组类型转成图片格式,与np.array()相反
|
|
1490
1494
|
draw = ImageDraw.Draw(pilimg) # PIL图片上打印汉字
|
|
1491
|
-
size =
|
|
1492
|
-
point = (point[0], point[1] -
|
|
1495
|
+
size = text_size[1] # 字体大小
|
|
1496
|
+
point = (point[0], point[1] - text_size[1] + baseline // 2)
|
|
1493
1497
|
font = get_font_type(size=size)
|
|
1494
1498
|
draw.text(point, text, color, font)
|
|
1495
1499
|
img[:] = np.asarray(pilimg)
|
|
@@ -1841,7 +1845,8 @@ def softmax(x, axis=1):
|
|
|
1841
1845
|
# 计算每行的最大值
|
|
1842
1846
|
row_max = x.max(axis=axis)
|
|
1843
1847
|
# 每行元素都需要减去对应的最大值,否则求exp(x)会溢出,导致inf情况
|
|
1844
|
-
row_max = row_max.reshape(-1, 1)
|
|
1848
|
+
# row_max = row_max.reshape(-1, 1)
|
|
1849
|
+
row_max = row_max[:, :, np.newaxis]
|
|
1845
1850
|
x = x - row_max
|
|
1846
1851
|
# 计算e的指数次幂
|
|
1847
1852
|
x_exp = np.exp(x)
|
|
@@ -1850,6 +1855,10 @@ def softmax(x, axis=1):
|
|
|
1850
1855
|
return s
|
|
1851
1856
|
|
|
1852
1857
|
|
|
1858
|
+
def sigmoid(x):
|
|
1859
|
+
return 1 / (1 + np.exp(-x))
|
|
1860
|
+
|
|
1861
|
+
|
|
1853
1862
|
def convert_anchor(anchors, height, width):
|
|
1854
1863
|
"""
|
|
1855
1864
|
height, width, _ = image.shape
|
|
@@ -2996,13 +3005,13 @@ def get_video_writer(video_file, width, height, fps):
|
|
|
2996
3005
|
if __name__ == "__main__":
|
|
2997
3006
|
# from utils import image_utils
|
|
2998
3007
|
|
|
2999
|
-
input_size = [
|
|
3000
|
-
image_path = "
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
image1
|
|
3006
|
-
|
|
3007
|
-
boxes = image_boxes_resize_padding_inverse((
|
|
3008
|
-
show_image_boxes("
|
|
3008
|
+
input_size = [300, 300]
|
|
3009
|
+
image_path = "../data/test_image/grid1.png"
|
|
3010
|
+
boxes = [[120, 50, 250, 180]]
|
|
3011
|
+
boxes = np.asarray(boxes)
|
|
3012
|
+
image0 = read_image(image_path) # (800, 490, 3)
|
|
3013
|
+
show_image_boxes("image0", image0, boxes, color=(255, 0, 0), delay=3)
|
|
3014
|
+
image1 = image_boxes_resize_padding(image0, input_size, boxes)
|
|
3015
|
+
show_image_boxes("image1", image1, boxes, color=(0, 255, 0), delay=3)
|
|
3016
|
+
boxes = image_boxes_resize_padding_inverse((image0.shape[1], image0.shape[0]), input_size, boxes)
|
|
3017
|
+
show_image_boxes("image2", image0, boxes, color=(0, 0, 255))
|
|
@@ -11,6 +11,41 @@ from sklearn import metrics, preprocessing
|
|
|
11
11
|
import heapq
|
|
12
12
|
|
|
13
13
|
|
|
14
|
+
def softmax(x, axis=1):
|
|
15
|
+
# 计算每行的最大值
|
|
16
|
+
row_max = x.max(axis=axis)
|
|
17
|
+
# 每行元素都需要减去对应的最大值,否则求exp(x)会溢出,导致inf情况
|
|
18
|
+
# row_max = row_max.reshape(-1, 1)
|
|
19
|
+
row_max = row_max[:, :, np.newaxis]
|
|
20
|
+
x = x - row_max
|
|
21
|
+
# 计算e的指数次幂
|
|
22
|
+
x_exp = np.exp(x)
|
|
23
|
+
x_sum = np.sum(x_exp, axis=axis, keepdims=True)
|
|
24
|
+
s = x_exp / x_sum
|
|
25
|
+
return s
|
|
26
|
+
|
|
27
|
+
def sigmoid(x):
|
|
28
|
+
return 1 / (1 + np.exp(-x))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def gaussian_impulse(x, c=0, sigma=0.1):
|
|
32
|
+
"""
|
|
33
|
+
高斯脉冲
|
|
34
|
+
:param x: 输入数据x
|
|
35
|
+
:param c: 脉冲中心点
|
|
36
|
+
:param sigma:标准差,越小脉冲越尖锐
|
|
37
|
+
:return: 生成高斯脉冲
|
|
38
|
+
"""
|
|
39
|
+
y = np.exp(-((x - c) ** 2) / (2 * sigma ** 2))
|
|
40
|
+
return y
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def power(x, n=1):
|
|
44
|
+
"""幂函数"""
|
|
45
|
+
y = np.power(x, n)
|
|
46
|
+
return y
|
|
47
|
+
|
|
48
|
+
|
|
14
49
|
def feature_norm(x, axis=-1):
|
|
15
50
|
"""
|
|
16
51
|
特征归一化,会使得特征L2之和为1, 即||y||=L2(y,axis=-1)
|
|
@@ -7,12 +7,15 @@
|
|
|
7
7
|
@Date : 2019-07-13 16:30:10
|
|
8
8
|
"""
|
|
9
9
|
import os
|
|
10
|
+
import matplotlib
|
|
10
11
|
import numpy as np
|
|
11
12
|
import matplotlib.pyplot as plt
|
|
12
13
|
import PIL.Image as Image
|
|
13
14
|
import platform
|
|
14
15
|
from matplotlib.font_manager import FontProperties
|
|
15
16
|
|
|
17
|
+
matplotlib.use('TkAgg')
|
|
18
|
+
|
|
16
19
|
ROOT = os.path.dirname(__file__)
|
|
17
20
|
|
|
18
21
|
|
|
@@ -91,7 +94,7 @@ def plot_bar(x, y, xlabel="X", ylabel="Y", title="bar", bin_width=1, vis=True, s
|
|
|
91
94
|
font = get_font_type(size=14)
|
|
92
95
|
# 准备数据
|
|
93
96
|
# 用 Matplotlib 画条形图
|
|
94
|
-
plt.bar(x=x, height=y, width=bin_width, align="center", yerr=0.000001,)
|
|
97
|
+
plt.bar(x=x, height=y, width=bin_width, align="center", yerr=0.000001, )
|
|
95
98
|
# plt.xlim([0.0, 1.0])
|
|
96
99
|
# plt.ylim([0.0, 1.05])
|
|
97
100
|
# 设置横纵坐标的名称以及对应字体格式
|
|
@@ -6,10 +6,21 @@
|
|
|
6
6
|
@Brief :
|
|
7
7
|
"""
|
|
8
8
|
import time
|
|
9
|
+
from datetime import datetime
|
|
9
10
|
import numpy as np
|
|
10
11
|
from typing import Dict, List
|
|
11
12
|
|
|
12
13
|
|
|
14
|
+
def date2stamp(date, format='%Y-%m-%d %H:%M:%S'):
|
|
15
|
+
"""将日期格式转换为时间戳"""
|
|
16
|
+
return time.mktime(time.strptime(date, format))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def stamp2date(stamp, format='%Y-%m-%d %H:%M:%S'):
|
|
20
|
+
"""将时间戳转换为日期格式"""
|
|
21
|
+
return datetime.fromtimestamp(stamp).strftime(format)
|
|
22
|
+
|
|
23
|
+
|
|
13
24
|
class Recorder(object):
|
|
14
25
|
def __init__(self):
|
|
15
26
|
self.content: Dict = {}
|
|
@@ -51,8 +62,10 @@ def performance(tag=""):
|
|
|
51
62
|
content["avg"],
|
|
52
63
|
content["total"],
|
|
53
64
|
content["count"])
|
|
54
|
-
|
|
55
|
-
|
|
65
|
+
if tag:
|
|
66
|
+
print("{:20s}{:20s} elapsed: {}".format(tag, func.__name__, elapsed))
|
|
67
|
+
else:
|
|
68
|
+
print("{:20s} elapsed: {}".format(func.__name__, elapsed))
|
|
56
69
|
return result
|
|
57
70
|
|
|
58
71
|
return wrapper
|