pybaseutils 2.2.19__tar.gz → 2.2.21__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.19 → pybaseutils-2.2.21}/PKG-INFO +7 -3
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/README.md +3 -3
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/__init__.py +1 -1
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/file_utils.py +9 -9
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/font_style/__init__.py +1 -1
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/font_utils.py +19 -5
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/image_utils.py +35 -0
- pybaseutils-2.2.21/pybaseutils/web/app_flask_image.py +94 -0
- pybaseutils-2.2.19/pybaseutils/web/st_image_web.py → pybaseutils-2.2.21/pybaseutils/web/app_stweb_image.py +2 -1
- pybaseutils-2.2.21/pybaseutils/web/app_webio_image.py +94 -0
- pybaseutils-2.2.21/pybaseutils/web/demo.py +13 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/PKG-INFO +7 -3
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/SOURCES.txt +8 -3
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_labelme_crop.py +50 -14
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_video_aije.py +3 -3
- pybaseutils-2.2.21/test_py/audio_demo1.py +32 -0
- pybaseutils-2.2.21/test_py/demo1.py +14 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_lableme_vis.py +3 -3
- pybaseutils-2.2.21/test_py/flask_demo/app.py +93 -0
- pybaseutils-2.2.21/test_py/flask_demo/utils/__init__.py +7 -0
- pybaseutils-2.2.21/test_py/flask_demo/utils/utils.py +41 -0
- pybaseutils-2.2.19/test_py/demo1.py +0 -48
- pybaseutils-2.2.19/test_py/flask_demo/func.py +0 -18
- pybaseutils-2.2.19/test_py/flask_demo/server.py +0 -40
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/LICENCE +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/cvutils/video_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/http_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/log.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/setup.cfg +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/setup.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/main.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/class_names.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/date_demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo2.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo3.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_video.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/performance.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/base.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/component.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/main.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/registry/register.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.2.19 → pybaseutils-2.2.21}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.21
|
|
4
4
|
Summary: pybaseutils
|
|
5
5
|
Home-page: https://github.com/PanJinquan/base-utils
|
|
6
6
|
Author: PanJinquan
|
|
@@ -36,11 +36,15 @@ pybaseutils(Python)
|
|
|
36
36
|
|
|
37
37
|
pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
38
38
|
|
|
39
|
-
- 安装方法1:pip install
|
|
40
|
-
|
|
39
|
+
- 安装方法1:pip install –upgrade -i
|
|
40
|
+
https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils
|
|
41
|
+
(有延时,可能不是最新版本)
|
|
41
42
|
- 安装方法2:pip install –upgrade -i https://pypi.org/simple
|
|
42
43
|
pybaseutils (从pypi源下载最新版本)
|
|
43
44
|
|
|
45
|
+
(设置默认的镜像源:pip config set global.index-url
|
|
46
|
+
https://pypi.tuna.tsinghua.edu.cn/simple)
|
|
47
|
+
|
|
44
48
|
一些问题修复说明
|
|
45
49
|
----------------
|
|
46
50
|
|
|
@@ -18,10 +18,10 @@ base_util是个人开发常用的C++库,集成了C/C++ OpenCV等常用的算
|
|
|
18
18
|
|
|
19
19
|
pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
20
20
|
|
|
21
|
-
- 安装方法1:pip install
|
|
22
|
-
- pybaseutils (
|
|
23
|
-
- 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
|
|
21
|
+
- 安装方法1:pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils (有延时,可能不是最新版本)
|
|
22
|
+
- 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
|
|
24
23
|
|
|
24
|
+
(设置默认的镜像源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple)
|
|
25
25
|
|
|
26
26
|
## 一些问题修复说明
|
|
27
27
|
|
|
@@ -43,12 +43,11 @@ def get_time(format="p"):
|
|
|
43
43
|
:param format:
|
|
44
44
|
:return:
|
|
45
45
|
"""
|
|
46
|
-
if format.lower() == "s":
|
|
46
|
+
if format.lower() == "s": # 精确到秒
|
|
47
47
|
# time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S')
|
|
48
48
|
time = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')
|
|
49
|
-
elif format.lower() == "p":
|
|
50
|
-
# 20200508_143059_379116
|
|
51
|
-
time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f')
|
|
49
|
+
elif format.lower() == "p": # 精确到微妙
|
|
50
|
+
time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f') # 20200508_143059_379116
|
|
52
51
|
time = time[:-2]
|
|
53
52
|
else:
|
|
54
53
|
time = (str(datetime.now())[:-10]).replace(' ', '-').replace(':', '-')
|
|
@@ -108,14 +107,14 @@ def combine_flags(flags: list, use_time=True, info=True):
|
|
|
108
107
|
return out_flags
|
|
109
108
|
|
|
110
109
|
|
|
111
|
-
def write_file(file, data):
|
|
110
|
+
def write_file(file, data, mode='wb'):
|
|
112
111
|
"""写二进制数据"""
|
|
113
|
-
with open(file,
|
|
112
|
+
with open(file, mode) as f: f.write(data)
|
|
114
113
|
|
|
115
114
|
|
|
116
|
-
def read_file(file):
|
|
115
|
+
def read_file(file, mode='rb'):
|
|
117
116
|
"""读取二进制数据"""
|
|
118
|
-
with open(file,
|
|
117
|
+
with open(file, mode) as f: key = f.read()
|
|
119
118
|
return key
|
|
120
119
|
|
|
121
120
|
|
|
@@ -701,7 +700,7 @@ def create_file_path(filename):
|
|
|
701
700
|
return out_path
|
|
702
701
|
|
|
703
702
|
|
|
704
|
-
def get_sub_paths(input_dir):
|
|
703
|
+
def get_sub_paths(input_dir, abspath=False):
|
|
705
704
|
"""
|
|
706
705
|
当前路径下所有子目录
|
|
707
706
|
:param input_dir:
|
|
@@ -715,6 +714,7 @@ def get_sub_paths(input_dir):
|
|
|
715
714
|
# print(dirs) # 当前路径下所有子目录
|
|
716
715
|
# print(files) # 当前路径下所有非目录子文件
|
|
717
716
|
sub_list.sort()
|
|
717
|
+
if abspath: sub_list = [os.path.join(input_dir, p) for p in sub_list]
|
|
718
718
|
return sub_list
|
|
719
719
|
|
|
720
720
|
|
|
@@ -58,9 +58,6 @@ class FontType(object):
|
|
|
58
58
|
return self.font_type
|
|
59
59
|
|
|
60
60
|
|
|
61
|
-
# font_type = FontType()
|
|
62
|
-
|
|
63
|
-
|
|
64
61
|
def get_font_type(size, font=""):
|
|
65
62
|
"""
|
|
66
63
|
Windows字体路径 : /usr/share/fonts/楷体.ttf
|
|
@@ -101,8 +98,7 @@ def draw_image_text(image, point, text, style="楷体", size=20, color=(255, 255
|
|
|
101
98
|
font = ImageFont.truetype(style, size=size, encoding="utf-8")
|
|
102
99
|
else:
|
|
103
100
|
# simhei.ttf 是字体,你如果没有字体,需要下载
|
|
104
|
-
|
|
105
|
-
font = font_type.get_font_type()
|
|
101
|
+
font = get_font_type(size=size)
|
|
106
102
|
draw.text(point, text, fill=color, font=font)
|
|
107
103
|
image = np.asarray(image)
|
|
108
104
|
return image
|
|
@@ -211,6 +207,24 @@ def get_font_char(font_file, only_chinese=False):
|
|
|
211
207
|
return fonts
|
|
212
208
|
|
|
213
209
|
|
|
210
|
+
def set_pyplot_font(font="simhei"):
|
|
211
|
+
"""
|
|
212
|
+
设置 seaborn,matplotlib等默认字体
|
|
213
|
+
:param font: 字体路径或者名称,或者使用默认的,SimHei
|
|
214
|
+
:return:
|
|
215
|
+
"""
|
|
216
|
+
import seaborn
|
|
217
|
+
import matplotlib.pyplot as plt
|
|
218
|
+
import matplotlib.font_manager as fm
|
|
219
|
+
font_file = font if os.path.isfile(font) else FONT_TABLES[font]
|
|
220
|
+
font = os.path.basename(font_file).split(".")[0]
|
|
221
|
+
fm.fontManager.addfont(font_file)
|
|
222
|
+
plt.rcParams['font.sans-serif'] = [font]
|
|
223
|
+
plt.rcParams['axes.unicode_minus'] = False
|
|
224
|
+
seaborn.set_theme(font=font) # 增加一行代码, 设置 seaborn 使用的字体文件
|
|
225
|
+
return font_file
|
|
226
|
+
|
|
227
|
+
|
|
214
228
|
def draw_font_example():
|
|
215
229
|
size = 512
|
|
216
230
|
string = "我"
|
|
@@ -1794,6 +1794,17 @@ def nms_boxes_cv2(boxes: np.ndarray, scores: np.ndarray, labels: np.ndarray, sco
|
|
|
1794
1794
|
return index
|
|
1795
1795
|
|
|
1796
1796
|
|
|
1797
|
+
def image2bytes(image):
|
|
1798
|
+
"""将numpy数据转换为JPEG编码格式的字节数据"""
|
|
1799
|
+
_, image = cv2.imencode('.jpg', image)
|
|
1800
|
+
return image.tobytes()
|
|
1801
|
+
|
|
1802
|
+
|
|
1803
|
+
def bytes2image(bytes):
|
|
1804
|
+
image = cv2.imdecode(np.frombuffer(bytes, np.uint8), cv2.IMREAD_COLOR)
|
|
1805
|
+
return image
|
|
1806
|
+
|
|
1807
|
+
|
|
1797
1808
|
def file2base64(file):
|
|
1798
1809
|
image_base64 = base64.b64encode(open(file, 'rb').read()).decode()
|
|
1799
1810
|
return image_base64
|
|
@@ -2851,6 +2862,29 @@ def get_image_block(image, grid=[3, 3], same=False):
|
|
|
2851
2862
|
return image_block
|
|
2852
2863
|
|
|
2853
2864
|
|
|
2865
|
+
def apply_mosaic(image, boxes, radius=8, scale=[1.0, 1.0]):
|
|
2866
|
+
"""
|
|
2867
|
+
马赛克
|
|
2868
|
+
:param image: BGR image
|
|
2869
|
+
:param boxes: 人脸框(xmin,ymin,xmax,ymax)
|
|
2870
|
+
:param radius: 马赛克强度
|
|
2871
|
+
:param scale: 人脸框扩大范围
|
|
2872
|
+
:return:
|
|
2873
|
+
"""
|
|
2874
|
+
h, w = image.shape[:2]
|
|
2875
|
+
boxes = np.asarray(boxes, dtype=np.int32)
|
|
2876
|
+
boxes = extend_xyxy(boxes, scale=scale, valid_range=(0, 0, w, h))
|
|
2877
|
+
for box in boxes:
|
|
2878
|
+
x1, y1, x2, y2 = box
|
|
2879
|
+
roi = image[y1:y2, x1:x2]
|
|
2880
|
+
size = (max((x2 - x1) // radius, 5), max((y2 - y1) // radius, 5))
|
|
2881
|
+
img = cv2.resize(roi, size)
|
|
2882
|
+
# img = cv2.resize(roi, (radius, radius))
|
|
2883
|
+
img = cv2.resize(img, (x2 - x1, y2 - y1), interpolation=cv2.INTER_NEAREST)
|
|
2884
|
+
image[y1:y2, x1:x2] = img
|
|
2885
|
+
return image
|
|
2886
|
+
|
|
2887
|
+
|
|
2854
2888
|
def image_composite(image: np.ndarray, alpha: np.ndarray, bg_img=(219, 142, 67)):
|
|
2855
2889
|
"""
|
|
2856
2890
|
图像融合:合成图 = 前景*alpha+背景*(1-alpha)
|
|
@@ -3004,6 +3038,7 @@ def get_video_info(video_cap: cv2.VideoCapture, vis=True):
|
|
|
3004
3038
|
height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
3005
3039
|
num_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
3006
3040
|
fps = video_cap.get(cv2.CAP_PROP_FPS)
|
|
3041
|
+
fps = math.ceil(fps)
|
|
3007
3042
|
if vis: print("read video:width:{},height:{},fps:{},num_frames:{}".format(width, height, fps, num_frames))
|
|
3008
3043
|
return width, height, num_frames, fps
|
|
3009
3044
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-02-27 16:03:39
|
|
7
|
+
# @Brief : 基于pywebio实现图像处理web小工具
|
|
8
|
+
# 运行方法:python app_webio_image.py
|
|
9
|
+
# --------------------------------------------------------
|
|
10
|
+
"""
|
|
11
|
+
import os
|
|
12
|
+
import cv2
|
|
13
|
+
import numpy as np
|
|
14
|
+
from pywebio.input import file_upload, input_group, actions
|
|
15
|
+
from pywebio.output import put_image, put_buttons, put_row, put_column, use_scope, clear, put_text, put_scope
|
|
16
|
+
from pywebio.pin import pin, put_input
|
|
17
|
+
from pywebio.session import set_env
|
|
18
|
+
from pywebio.pin import *
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def blur_image(image_path):
|
|
22
|
+
# 读取图像
|
|
23
|
+
image = cv2.imread(image_path)
|
|
24
|
+
# 应用高斯模糊
|
|
25
|
+
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)
|
|
26
|
+
# 保存模糊后的图像
|
|
27
|
+
blurred_image_path = f"blurred_{os.path.basename(image_path)}"
|
|
28
|
+
cv2.imwrite(blurred_image_path, blurred_image)
|
|
29
|
+
return blurred_image_path
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def show_image(image_path):
|
|
33
|
+
with use_scope('image_display', clear=True):
|
|
34
|
+
put_image(open(image_path, 'rb').read())
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def handle_single_image(file_info):
|
|
38
|
+
file_name = file_info['filename']
|
|
39
|
+
file_content = file_info['content']
|
|
40
|
+
with open(file_name, 'wb') as f:
|
|
41
|
+
f.write(file_content)
|
|
42
|
+
blurred_image_path = blur_image(file_name)
|
|
43
|
+
show_image(blurred_image_path)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def handle_multiple_images(directory):
|
|
47
|
+
global current_image_index
|
|
48
|
+
current_image_index = 0
|
|
49
|
+
images = [os.path.join(directory, f) for f in os.listdir(directory) if
|
|
50
|
+
f.lower().endswith(('.png', '.jpg', '.jpeg'))]
|
|
51
|
+
if not images:
|
|
52
|
+
put_text("No images found in the selected directory.")
|
|
53
|
+
return
|
|
54
|
+
current_image_path = images[current_image_index]
|
|
55
|
+
blurred_image_path = blur_image(current_image_path)
|
|
56
|
+
show_image(blurred_image_path)
|
|
57
|
+
put_buttons(['Previous', 'Next'], onclick=[lambda: switch_image(images, -1), lambda: switch_image(images, 1)])
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def switch_image(images, direction):
|
|
61
|
+
global current_image_index
|
|
62
|
+
current_image_index += direction
|
|
63
|
+
current_image_index = max(0, min(current_image_index, len(images) - 1))
|
|
64
|
+
current_image_path = images[current_image_index]
|
|
65
|
+
blurred_image_path = blur_image(current_image_path)
|
|
66
|
+
show_image(blurred_image_path)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def main():
|
|
70
|
+
set_env(output_max_width='80%')
|
|
71
|
+
put_column([
|
|
72
|
+
put_row([
|
|
73
|
+
put_buttons(['选择图片'], onclick=lambda: pin.update(
|
|
74
|
+
name=file_upload(label='选择图片', accept='image/*', help_text='请选择一张图片'))),
|
|
75
|
+
put_buttons(['选择目录'], onclick=lambda: pin.update(name=input_group("选择目录", [
|
|
76
|
+
input('directory', type='text', name='directory', placeholder='请输入目录路径')]))),
|
|
77
|
+
]),
|
|
78
|
+
put_scope('image_display')
|
|
79
|
+
])
|
|
80
|
+
|
|
81
|
+
while True:
|
|
82
|
+
event = pin_wait_change('name')
|
|
83
|
+
if event['name'] == 'value':
|
|
84
|
+
value = event['value']
|
|
85
|
+
if isinstance(value, dict): # 单张图片
|
|
86
|
+
handle_single_image(value)
|
|
87
|
+
elif isinstance(value, str): # 目录
|
|
88
|
+
handle_multiple_images(value)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == '__main__':
|
|
92
|
+
from pywebio.platform.flask import start_server
|
|
93
|
+
|
|
94
|
+
start_server(main, port=8080, debug=True)
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-02-27 16:03:39
|
|
7
|
+
# @Brief : 基于pywebio实现图像处理web小工具
|
|
8
|
+
# 运行方法:python app_webio_image.py
|
|
9
|
+
# --------------------------------------------------------
|
|
10
|
+
"""
|
|
11
|
+
import os
|
|
12
|
+
import cv2
|
|
13
|
+
import numpy as np
|
|
14
|
+
from pywebio.input import file_upload, input_group, actions
|
|
15
|
+
from pywebio.output import put_image, put_buttons, put_row, put_column, use_scope, clear, put_text, put_scope
|
|
16
|
+
from pywebio.pin import pin, put_input
|
|
17
|
+
from pywebio.session import set_env
|
|
18
|
+
from pywebio.pin import *
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def blur_image(image_path):
|
|
22
|
+
# 读取图像
|
|
23
|
+
image = cv2.imread(image_path)
|
|
24
|
+
# 应用高斯模糊
|
|
25
|
+
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)
|
|
26
|
+
# 保存模糊后的图像
|
|
27
|
+
blurred_image_path = f"blurred_{os.path.basename(image_path)}"
|
|
28
|
+
cv2.imwrite(blurred_image_path, blurred_image)
|
|
29
|
+
return blurred_image_path
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def show_image(image_path):
|
|
33
|
+
with use_scope('image_display', clear=True):
|
|
34
|
+
put_image(open(image_path, 'rb').read())
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def handle_single_image(file_info):
|
|
38
|
+
file_name = file_info['filename']
|
|
39
|
+
file_content = file_info['content']
|
|
40
|
+
with open(file_name, 'wb') as f:
|
|
41
|
+
f.write(file_content)
|
|
42
|
+
blurred_image_path = blur_image(file_name)
|
|
43
|
+
show_image(blurred_image_path)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def handle_multiple_images(directory):
|
|
47
|
+
global current_image_index
|
|
48
|
+
current_image_index = 0
|
|
49
|
+
images = [os.path.join(directory, f) for f in os.listdir(directory) if
|
|
50
|
+
f.lower().endswith(('.png', '.jpg', '.jpeg'))]
|
|
51
|
+
if not images:
|
|
52
|
+
put_text("No images found in the selected directory.")
|
|
53
|
+
return
|
|
54
|
+
current_image_path = images[current_image_index]
|
|
55
|
+
blurred_image_path = blur_image(current_image_path)
|
|
56
|
+
show_image(blurred_image_path)
|
|
57
|
+
put_buttons(['Previous', 'Next'], onclick=[lambda: switch_image(images, -1), lambda: switch_image(images, 1)])
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def switch_image(images, direction):
|
|
61
|
+
global current_image_index
|
|
62
|
+
current_image_index += direction
|
|
63
|
+
current_image_index = max(0, min(current_image_index, len(images) - 1))
|
|
64
|
+
current_image_path = images[current_image_index]
|
|
65
|
+
blurred_image_path = blur_image(current_image_path)
|
|
66
|
+
show_image(blurred_image_path)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def main():
|
|
70
|
+
set_env(output_max_width='80%')
|
|
71
|
+
put_column([
|
|
72
|
+
put_row([
|
|
73
|
+
put_buttons(['选择图片'], onclick=lambda: pin.update(
|
|
74
|
+
name=file_upload(label='选择图片', accept='image/*', help_text='请选择一张图片'))),
|
|
75
|
+
put_buttons(['选择目录'], onclick=lambda: pin.update(name=input_group("选择目录", [
|
|
76
|
+
input('directory', type='text', name='directory', placeholder='请输入目录路径')]))),
|
|
77
|
+
]),
|
|
78
|
+
put_scope('image_display')
|
|
79
|
+
])
|
|
80
|
+
|
|
81
|
+
while True:
|
|
82
|
+
event = pin_wait_change('name')
|
|
83
|
+
if event['name'] == 'value':
|
|
84
|
+
value = event['value']
|
|
85
|
+
if isinstance(value, dict): # 单张图片
|
|
86
|
+
handle_single_image(value)
|
|
87
|
+
elif isinstance(value, str): # 目录
|
|
88
|
+
handle_multiple_images(value)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if __name__ == '__main__':
|
|
92
|
+
from pywebio.platform.flask import start_server
|
|
93
|
+
|
|
94
|
+
start_server(main, port=8080, debug=True)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-02-27 16:03:39
|
|
7
|
+
# @Brief : 基于pywebio实现图像处理web小工具
|
|
8
|
+
# 运行方法:python app_webio_image.py
|
|
9
|
+
# --------------------------------------------------------
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
if __name__ == '__main__':
|
|
13
|
+
pass
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.21
|
|
4
4
|
Summary: pybaseutils
|
|
5
5
|
Home-page: https://github.com/PanJinquan/base-utils
|
|
6
6
|
Author: PanJinquan
|
|
@@ -36,11 +36,15 @@ pybaseutils(Python)
|
|
|
36
36
|
|
|
37
37
|
pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
38
38
|
|
|
39
|
-
- 安装方法1:pip install
|
|
40
|
-
|
|
39
|
+
- 安装方法1:pip install –upgrade -i
|
|
40
|
+
https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils
|
|
41
|
+
(有延时,可能不是最新版本)
|
|
41
42
|
- 安装方法2:pip install –upgrade -i https://pypi.org/simple
|
|
42
43
|
pybaseutils (从pypi源下载最新版本)
|
|
43
44
|
|
|
45
|
+
(设置默认的镜像源:pip config set global.index-url
|
|
46
|
+
https://pypi.tuna.tsinghua.edu.cn/simple)
|
|
47
|
+
|
|
44
48
|
一些问题修复说明
|
|
45
49
|
----------------
|
|
46
50
|
|
|
@@ -119,8 +119,12 @@ pybaseutils/transforms/augment_utils.py
|
|
|
119
119
|
pybaseutils/transforms/face_alignment.py
|
|
120
120
|
pybaseutils/transforms/transform_utils.py
|
|
121
121
|
pybaseutils/web/__init__.py
|
|
122
|
-
pybaseutils/web/
|
|
122
|
+
pybaseutils/web/app_flask_image.py
|
|
123
|
+
pybaseutils/web/app_stweb_image.py
|
|
124
|
+
pybaseutils/web/app_webio_image.py
|
|
125
|
+
pybaseutils/web/demo.py
|
|
123
126
|
test_py/__init__.py
|
|
127
|
+
test_py/audio_demo1.py
|
|
124
128
|
test_py/class_attribute.py
|
|
125
129
|
test_py/class_names.py
|
|
126
130
|
test_py/date_dataset.py
|
|
@@ -245,8 +249,9 @@ test_py/edit_distance/__init__.py
|
|
|
245
249
|
test_py/edit_distance/demo.py
|
|
246
250
|
test_py/edit_distance/text_matching.py
|
|
247
251
|
test_py/flask_demo/__init__.py
|
|
248
|
-
test_py/flask_demo/
|
|
249
|
-
test_py/flask_demo/
|
|
252
|
+
test_py/flask_demo/app.py
|
|
253
|
+
test_py/flask_demo/utils/__init__.py
|
|
254
|
+
test_py/flask_demo/utils/utils.py
|
|
250
255
|
test_py/image_correction/__init__.py
|
|
251
256
|
test_py/image_correction/demo_correction_v1.py
|
|
252
257
|
test_py/image_correction/demo_correction_v2.py
|
|
@@ -12,7 +12,7 @@ from pybaseutils.dataloader import parser_labelme
|
|
|
12
12
|
from pybaseutils import image_utils, file_utils
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=False,
|
|
15
|
+
def save_object_crops(data_info, out_dir, class_name=None, target_name=None, scale=[], square=False,
|
|
16
16
|
padding=False, min_size=20 * 20 * 3, flag="", vis=False):
|
|
17
17
|
"""
|
|
18
18
|
对VOC的数据目标进行裁剪
|
|
@@ -51,22 +51,16 @@ def save_object_crops(data_info, out_dir, class_name=None, scale=[], square=Fals
|
|
|
51
51
|
name = class_name[int(labels[i])] if class_name else labels[i]
|
|
52
52
|
if out_dir:
|
|
53
53
|
file_name = "{}_{:0=4d}_{}.jpg".format(image_id, i, flag) if flag else "{}_{:0=4d}.jpg".format(image_id, i)
|
|
54
|
-
|
|
54
|
+
if target_name:
|
|
55
|
+
out_dir_ = out_dir if name in target_name else os.path.join(out_dir, "其他")
|
|
56
|
+
img_file = file_utils.create_dir(out_dir_, name, file_name)
|
|
57
|
+
else:
|
|
58
|
+
img_file = file_utils.create_dir(out_dir, name, file_name)
|
|
55
59
|
cv2.imwrite(img_file, img)
|
|
56
60
|
if vis: image_utils.cv_show_image("crop", img, use_rgb=False, delay=0)
|
|
57
61
|
|
|
58
62
|
|
|
59
|
-
|
|
60
|
-
"""
|
|
61
|
-
对VOC的数据目标进行裁剪
|
|
62
|
-
室内:['主杆', '从此进出标示牌', '其他鞋', '吊物绳', '在此工作标示牌', '垫子', '安全带', '安全帽', '安全绳',
|
|
63
|
-
'导线头', '尖嘴钳', '工具袋', '手', '扳手', '抹布', '未穿工作服','柱式绝缘子', '止步高压危险标示牌',
|
|
64
|
-
'绝缘手套', '绝缘鞋', '脚扣', '螺丝', '身穿工作服', '遮拦杆', '铁架', '铝扎线']
|
|
65
|
-
室外: []
|
|
66
|
-
"""
|
|
67
|
-
anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det/dataset-v31/images"
|
|
68
|
-
class_name = None # 室内\
|
|
69
|
-
out_dir = os.path.join(os.path.dirname(anno_dir), "crops")
|
|
63
|
+
def crop_dataset(anno_dir, out_dir=None, class_name=None, target_name=None):
|
|
70
64
|
dataset = parser_labelme.LabelMeDatasets(filename=None,
|
|
71
65
|
data_root=None,
|
|
72
66
|
anno_dir=anno_dir,
|
|
@@ -83,4 +77,46 @@ if __name__ == "__main__":
|
|
|
83
77
|
# scale = None
|
|
84
78
|
for i in tqdm(range(len(dataset))):
|
|
85
79
|
data_info = dataset.__getitem__(i)
|
|
86
|
-
save_object_crops(data_info, out_dir, class_name=class_name, scale=scale, flag=flag,
|
|
80
|
+
save_object_crops(data_info, out_dir, class_name=class_name, target_name=target_name, scale=scale, flag=flag,
|
|
81
|
+
vis=False)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def get_sub_dataset(data_root):
|
|
85
|
+
sub_paths = file_utils.get_sub_paths(data_root, abspath=True)
|
|
86
|
+
datasets = []
|
|
87
|
+
for sub_path in sub_paths:
|
|
88
|
+
data_list = file_utils.get_sub_paths(sub_path, abspath=True)
|
|
89
|
+
data_list = [os.path.join(p, "images") for p in data_list if os.path.exists(os.path.join(p, "images"))]
|
|
90
|
+
datasets += data_list
|
|
91
|
+
return datasets
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
"""
|
|
96
|
+
对labelme的数据目标进行裁剪,用于制作分类数据集
|
|
97
|
+
"""
|
|
98
|
+
|
|
99
|
+
target_name = ["身穿工作服", "未穿工作服",
|
|
100
|
+
"绝缘鞋", "脚穿绝缘鞋", "长筒靴", "脚穿长筒靴", "其他鞋", "脚穿其他鞋",
|
|
101
|
+
"手", "绝缘手套", "手穿绝缘手套", "棉纱手套", "手穿棉纱手套", "其他手套", "手穿其他手套",
|
|
102
|
+
"拨动开关分闸", "拨动开关合闸",
|
|
103
|
+
"电容柜开关合闸", "电容柜开关分闸",
|
|
104
|
+
"低压侧总刀闸合闸", "低压侧总刀闸分闸",
|
|
105
|
+
"面板单键开关断开", "面板单键开关合上",
|
|
106
|
+
"面板双键开关断开", "面板双键开关合上",
|
|
107
|
+
"表箱关", "表箱开", "手", "其他",
|
|
108
|
+
]
|
|
109
|
+
datasets = [
|
|
110
|
+
"/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/test-v2/dataset-v01/images",
|
|
111
|
+
"/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/test-v2/dataset-v02/images",
|
|
112
|
+
]
|
|
113
|
+
# dataroot = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det"
|
|
114
|
+
# datasets = get_sub_dataset(dataroot)
|
|
115
|
+
class_name = []
|
|
116
|
+
for anno_dir in datasets:
|
|
117
|
+
print(anno_dir)
|
|
118
|
+
out_dir = os.path.join(os.path.dirname(anno_dir), "crops")
|
|
119
|
+
if os.path.exists(out_dir) and out_dir.endswith("crops"): file_utils.remove_dir(out_dir)
|
|
120
|
+
file_utils.create_dir(out_dir)
|
|
121
|
+
file = file_utils.write_file(os.path.join(out_dir, "分类数据集,请勿删除.txt"), data="", mode="w")
|
|
122
|
+
crop_dataset(anno_dir, out_dir=out_dir, class_name=class_name, target_name=target_name)
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
import os
|
|
9
9
|
import cv2
|
|
10
10
|
import numpy as np
|
|
11
|
-
from xpinyin import Pinyin
|
|
12
11
|
from tqdm import tqdm
|
|
13
12
|
from pybaseutils import file_utils, image_utils
|
|
14
13
|
from pybaseutils.cvutils import video_utils, monitor
|
|
@@ -73,7 +72,8 @@ def video2frames_similarity(video_file, out_dir=None, func=None, interval=1, thr
|
|
|
73
72
|
|
|
74
73
|
# thresh_dict = {"1号视角": 0.5, "2号视角": 0.15, "3号视角": 0.3, "4号视角": 0.3}
|
|
75
74
|
# thresh_dict = {"一号位": 0.58, "平视": 0.35, "俯视": 0.35, "右视": 0.25, "左视": 0.3}
|
|
76
|
-
thresh_dict = {"第一视角": 0.50, "主视角": 0.50, "
|
|
75
|
+
thresh_dict = {"第一视角": 0.50, "主视角": 0.50, "主视": 0.50, "平视": 0.30, "俯视": 0.30, "右视": 0.35, "左视": 0.35,
|
|
76
|
+
"全景": 0.30}
|
|
77
77
|
|
|
78
78
|
|
|
79
79
|
# thresh_dict = {"1号位": 0.58, "平视": 0.35, "全景": 0.35, "俯视": 0.35, "右视": 0.25, "左视": 0.3}
|
|
@@ -92,7 +92,7 @@ def video2frames_demo(root, out, prefix="", thresh=0.2):
|
|
|
92
92
|
|
|
93
93
|
|
|
94
94
|
if __name__ == "__main__":
|
|
95
|
-
root = "/home/PKing/
|
|
95
|
+
root = "/home/PKing/Downloads/video/08-更换熔丝"
|
|
96
96
|
prefix = ""
|
|
97
97
|
out = root + "-train"
|
|
98
98
|
video2frames_demo(root, out, prefix=prefix)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : PKing
|
|
4
|
+
@E-mail :
|
|
5
|
+
@Date : 2024-02-05 18:19:18
|
|
6
|
+
@Brief :
|
|
7
|
+
"""
|
|
8
|
+
import cv2
|
|
9
|
+
import numpy as np
|
|
10
|
+
from pybaseutils import file_utils, image_utils, plot_utils, numpy_utils
|
|
11
|
+
from pybaseutils.audio import audio_utils
|
|
12
|
+
|
|
13
|
+
import pyaudio
|
|
14
|
+
import wave
|
|
15
|
+
import time
|
|
16
|
+
|
|
17
|
+
file = "/home/PKing/Videos/dde-introduction.wav"
|
|
18
|
+
# 打开WAV文档
|
|
19
|
+
wf = wave.open(file, "rb")
|
|
20
|
+
|
|
21
|
+
# 实例化一个PyAudio对象
|
|
22
|
+
pa = pyaudio.PyAudio()
|
|
23
|
+
# 打开声卡
|
|
24
|
+
stream = pa.open(format=pa.get_format_from_width(wf.getsampwidth()), # 从wf中获取采样深度
|
|
25
|
+
channels=wf.getnchannels(), # 从wf中获取声道数
|
|
26
|
+
rate=wf.getframerate(), # 从wf中获取采样率
|
|
27
|
+
output=True) # 设置为输出
|
|
28
|
+
count = 0
|
|
29
|
+
while count < 8 * 500:
|
|
30
|
+
time.sleep(0.001)
|
|
31
|
+
data = wf.readframes(15)
|
|
32
|
+
stream.write(data)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
from urllib.parse import urljoin, urlparse
|
|
3
|
+
from bs4 import BeautifulSoup
|
|
4
|
+
from pybaseutils import file_utils, json_utils
|
|
5
|
+
import glob
|
|
6
|
+
|
|
7
|
+
# 使用示例
|
|
8
|
+
if __name__ == "__main__":
|
|
9
|
+
data_root = "http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/*.json"
|
|
10
|
+
# data_root = "/media/PKing/新加卷/SDK/base-utils/data/person/*.json"
|
|
11
|
+
file = glob.glob(data_root)
|
|
12
|
+
print(file)
|
|
13
|
+
data =json_utils.read_json_data("http://aije-mvp-nginx.partner.dm-ai.com/req-resp/aije-job-m8ch701s-awbg/nlp-12.json")
|
|
14
|
+
print(data)
|
|
@@ -28,9 +28,9 @@ if __name__ == "__main__":
|
|
|
28
28
|
anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2-det/dataset-v25/json"
|
|
29
29
|
anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-negetive/dataset-v02/json"
|
|
30
30
|
# anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-date/date-det/dataset-v01/images"
|
|
31
|
-
anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-v2
|
|
31
|
+
anno_dir = "/home/PKing/nasdata/dataset-dmai/AIJE/dataset/aije-action-cvlm-v2/train-v2-其他/check-helmet/images"
|
|
32
32
|
names = None
|
|
33
|
-
# names = {'
|
|
33
|
+
# names = {'手拿安全帽帽撑': 0}
|
|
34
34
|
dataset = parser_labelme.LabelMeDatasets(filename=None,
|
|
35
35
|
data_root=None,
|
|
36
36
|
anno_dir=anno_dir,
|
|
@@ -51,6 +51,6 @@ if __name__ == "__main__":
|
|
|
51
51
|
if class_name: labels = [class_name[l] for l in labels]
|
|
52
52
|
image_file = data["image_file"]
|
|
53
53
|
anno_file = os.path.join("masker", "{}.json".format(os.path.basename(image_file).split(".")[0]))
|
|
54
|
-
print(image_file, labels
|
|
54
|
+
print(image_file, labels)
|
|
55
55
|
result = parser_labelme.show_target_image(image, bboxes, labels, points, thickness=2)
|
|
56
56
|
# image_utils.save_image("./"+os.path.basename(image_file), result)
|