pybaseutils 2.3.8__tar.gz → 2.4.1__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.3.8 → pybaseutils-2.4.1}/PKG-INFO +10 -6
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/README.md +1 -1
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.4.1/pybaseutils/base/list_queue.py +116 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/base64_utils.py +17 -9
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cvutils/video_utils.py +1 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/file_utils.py +34 -23
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/http_utils.py +2 -2
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/image_utils.py +17 -11
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/time_utils.py +19 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils.egg-info/PKG-INFO +10 -6
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/setup.cfg +0 -0
- pybaseutils-2.4.1/test_py/demo1.py +9 -0
- pybaseutils-2.4.1/test_py/demo4.py +25 -0
- pybaseutils-2.3.8/pybaseutils/base/list_queue.py +0 -64
- pybaseutils-2.3.8/test_py/demo1.py +0 -13
- pybaseutils-2.3.8/test_py/demo4.py +0 -74
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/LICENCE +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/base/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/base/dict_queue.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/build_cvat.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_yolo2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/converter/prelabelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/coords_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/cvutils/nms_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/data_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/balanced_classes.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/data_resample.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_image_folder.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_image_text.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_labelme_crop.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/parser_yolo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/dict_uils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/font_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/log.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/log_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/media/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/media/ffmpeg_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/text_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/transforms/augment_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/web/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/web/app_gradio_image.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/web/app_stweb_image.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/web/app_webio_image.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/web/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/word_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/worker.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils.egg-info/SOURCES.txt +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/setup.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/Image_enhance/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/Image_enhance/dmeo01.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/WebCrawler/search_baidu.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/WebCrawler/search_biying.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/action_dataset.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/build_cython.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/build_pyarmor.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/build_service.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/demo_labelme_crop.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/demo_labelme_shock.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/get_pair_data.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/aije/video_convertor.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio/main.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio/main_read.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio/segment.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/audio_demo1.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/camera/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/camera/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/captcha/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/class_attribute.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/class_names.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/AffectNet.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/AsianMovie.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/WaterMeters1.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/WaterMeters2.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_cvat2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_labelme2cvat.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_labelme2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/get_pair_data.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/ucf101_dataset.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/main.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/date_dataset.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/date_demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/datedataset_bk.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo2.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo3.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_for_annular_to_rect.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_get_file_label.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_gif.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_gif_video.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_image_crop.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_kpts.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_lableme_vis.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_metrics.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_mosaic.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_mouse.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_nii.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_pandas.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_plot.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_prelabelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_rename.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_taichi.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_video.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_video_crop.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_worker1.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/demo_worker2.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/detector/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/detector/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/flask_demo/app.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/flask_demo/utils/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/flask_demo/utils/utils.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/get_file_list.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/gradio_app.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/gradio_app_v2.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/kafka_worker.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/milvus_demo/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/milvus_demo/demo01.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/milvus_demo/demo02.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/milvus_demo/hello_milvus.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/milvus_demo/milvus_client.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/model_process.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/performance.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/pose/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/redis_py/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/redis_py/knn_search.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/redis_py/redis_client.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/registry/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/registry/base.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/registry/component.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/registry/main.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/registry/register.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/single_class/GRU.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/single_class/TCN.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/single_class/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/single_class/demo.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/slowfastnet.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/test_fr/idcardocr.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/web_socket/__init__.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/web_socket/asr_clients.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/web_socket/asr_service.py +0 -0
- {pybaseutils-2.3.8 → pybaseutils-2.4.1}/test_py/web_socket/chat_service.py +0 -0
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
4
4
|
Summary: pybaseutils
|
|
5
5
|
Home-page: https://github.com/PanJinquan/base-utils
|
|
6
6
|
Author: PanJinquan
|
|
7
7
|
Author-email: 390737991@qq.com
|
|
8
8
|
License: MIT
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
License-File: LICENCE
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: author-email
|
|
12
|
+
Dynamic: description
|
|
13
|
+
Dynamic: home-page
|
|
14
|
+
Dynamic: license
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
Dynamic: summary
|
|
11
17
|
|
|
12
18
|
base-utils
|
|
13
19
|
==========
|
|
@@ -37,7 +43,7 @@ pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
|
37
43
|
- 安装方法2:pip install –upgrade -i https://pypi.org/simple
|
|
38
44
|
pybaseutils (从pypi源下载最新版本)
|
|
39
45
|
- 设置默认的镜像源:pip config set global.index-url
|
|
40
|
-
https://pypi.tuna.tsinghua.edu.cn/simple
|
|
46
|
+
https://pypi.tuna.tsinghua.edu.cn/simple
|
|
41
47
|
- 超时异常:pip –default-timeout=1000000000
|
|
42
48
|
|
|
43
49
|
一些问题修复说明
|
|
@@ -142,5 +148,3 @@ base_utils(C++)
|
|
|
142
148
|
DEBUG_IMSHOW("image", image);
|
|
143
149
|
return 0;
|
|
144
150
|
}
|
|
145
|
-
|
|
146
|
-
|
|
@@ -20,7 +20,7 @@ pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
|
20
20
|
|
|
21
21
|
- 安装方法1:pip install --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple pybaseutils (有延时,可能不是最新版本)
|
|
22
22
|
- 安装方法2:pip install --upgrade -i https://pypi.org/simple pybaseutils (从pypi源下载最新版本)
|
|
23
|
-
- 设置默认的镜像源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
|
23
|
+
- 设置默认的镜像源:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
|
|
24
24
|
- 超时异常:pip --default-timeout=1000000000
|
|
25
25
|
|
|
26
26
|
## 一些问题修复说明
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-07-15 10:56:37
|
|
7
|
+
# @Brief : 列表队列
|
|
8
|
+
# --------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
import math
|
|
11
|
+
import queue
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Queue():
|
|
15
|
+
"""普通队列,多个POD请求时,无法实现同步数据"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, name="defaultlist", maxsize=10, **kwargs):
|
|
18
|
+
"""
|
|
19
|
+
queue是一个列表队列,队列大小由maxsize指定
|
|
20
|
+
:param name: 队列名称
|
|
21
|
+
:param maxsize:
|
|
22
|
+
"""
|
|
23
|
+
self.name = name
|
|
24
|
+
self.maxsize = maxsize
|
|
25
|
+
self.queue = queue.Queue(maxsize=maxsize)
|
|
26
|
+
|
|
27
|
+
def empty(self, ):
|
|
28
|
+
return self.queue.empty()
|
|
29
|
+
|
|
30
|
+
def __del__(self):
|
|
31
|
+
if not self.queue.empty(): self.queue.queue.clear()
|
|
32
|
+
|
|
33
|
+
def get_queue(self, ):
|
|
34
|
+
return self.queue.queue
|
|
35
|
+
|
|
36
|
+
def set_queue(self, queue):
|
|
37
|
+
self.queue = queue
|
|
38
|
+
|
|
39
|
+
def qsize(self) -> int:
|
|
40
|
+
return self.queue.qsize()
|
|
41
|
+
|
|
42
|
+
def pop(self, block=True, timeout=None):
|
|
43
|
+
"""
|
|
44
|
+
Remove and return an item from the queue,index=0
|
|
45
|
+
:param block: 是否阻塞等待
|
|
46
|
+
:param timeout: 超时时间
|
|
47
|
+
:return: 弹出的队列数据
|
|
48
|
+
"""
|
|
49
|
+
out = self.queue.get(block=block, timeout=timeout)
|
|
50
|
+
return out
|
|
51
|
+
|
|
52
|
+
def pop_items(self, nums=1, block=True, timeout=None):
|
|
53
|
+
"""
|
|
54
|
+
弹出队列的多个项
|
|
55
|
+
:param nums: 弹出队列的数量
|
|
56
|
+
:param block: 是否阻塞等待
|
|
57
|
+
:param timeout: 超时时间
|
|
58
|
+
:return: 弹出的队列数据
|
|
59
|
+
"""
|
|
60
|
+
items = [self.pop(block=block, timeout=timeout) for i in range(nums)]
|
|
61
|
+
return items
|
|
62
|
+
|
|
63
|
+
def get(self, index=0):
|
|
64
|
+
"""get an item from the queue,index=0"""
|
|
65
|
+
return self.queue.queue[index]
|
|
66
|
+
|
|
67
|
+
def get_items(self, nums=1, index: list = []):
|
|
68
|
+
"""
|
|
69
|
+
获取队列的多个项
|
|
70
|
+
:param nums: 获取队列的数量
|
|
71
|
+
:param index: 获取队列的索引
|
|
72
|
+
:return: 获取的队列数据
|
|
73
|
+
"""
|
|
74
|
+
if index:
|
|
75
|
+
items = [self.queue.queue[i] for i in index]
|
|
76
|
+
else:
|
|
77
|
+
items = [self.queue.queue[i] for i in range(nums)]
|
|
78
|
+
return items
|
|
79
|
+
|
|
80
|
+
def put(self, item, block=False, timeout=None):
|
|
81
|
+
"""
|
|
82
|
+
Put an item into the queue,index=n
|
|
83
|
+
:param item: 要放入队列的项
|
|
84
|
+
:param block: True当队列满了,阻塞等待插入数据; False,不等待,直接弹出队头数据再插入数据
|
|
85
|
+
:param timeout: 超时时间
|
|
86
|
+
:return:
|
|
87
|
+
"""
|
|
88
|
+
while self.qsize() >= self.maxsize and not block: self.pop()
|
|
89
|
+
return self.queue.put(item, block=block, timeout=timeout)
|
|
90
|
+
|
|
91
|
+
def get_window(self, winsize=1, overlap=0.0, block=True, timeout=None):
|
|
92
|
+
"""
|
|
93
|
+
获取队列的窗口数据
|
|
94
|
+
:param winsize: 窗口大小
|
|
95
|
+
:param overlap: 窗口重叠率
|
|
96
|
+
:return: 队列窗口数据
|
|
97
|
+
"""
|
|
98
|
+
size = int(winsize * overlap)
|
|
99
|
+
data1 = self.pop_items(nums=winsize - size, block=block, timeout=timeout)
|
|
100
|
+
data2 = self.get_items(nums=size)
|
|
101
|
+
return data1 + data2
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if __name__ == '__main__':
|
|
105
|
+
q = Queue(maxsize=3)
|
|
106
|
+
q.put({"file": "1.jpg"})
|
|
107
|
+
q.put({"file": "2.jpg"})
|
|
108
|
+
q.put({"file": "3.jpg"})
|
|
109
|
+
q.put({"file": "4.jpg"})
|
|
110
|
+
q.put({"file": "5.jpg"})
|
|
111
|
+
print(q.get_queue())
|
|
112
|
+
print(q.get(0))
|
|
113
|
+
print(q.get_queue())
|
|
114
|
+
print(q.pop(3))
|
|
115
|
+
print(q.get_queue())
|
|
116
|
+
print(1 / 2)
|
|
@@ -14,7 +14,7 @@ import base64
|
|
|
14
14
|
import numpy as np
|
|
15
15
|
from typing import Any
|
|
16
16
|
|
|
17
|
-
IMG_PREFIX = "image/
|
|
17
|
+
IMG_PREFIX = "image/jpg" # 图片base64字符串前缀
|
|
18
18
|
precision = 6 # 小数点精度
|
|
19
19
|
|
|
20
20
|
|
|
@@ -35,7 +35,7 @@ def base642image(bs64, prefix=IMG_PREFIX, use_rgb=False) -> np.ndarray:
|
|
|
35
35
|
bs64 = bs64[len(prefix):]
|
|
36
36
|
bs64 = bytes(bs64, 'utf-8')
|
|
37
37
|
image = base64.b64decode(bs64)
|
|
38
|
-
image = np.
|
|
38
|
+
image = np.frombuffer(image, np.uint8)
|
|
39
39
|
image = cv2.imdecode(image, flags=cv2.IMREAD_UNCHANGED)
|
|
40
40
|
# image = cv2.imdecode(image, cv2.IMREAD_COLOR)
|
|
41
41
|
if use_rgb:
|
|
@@ -63,7 +63,8 @@ def image2base64(image: np.ndarray, prefix=IMG_PREFIX, use_rgb=False) -> str:
|
|
|
63
63
|
if len(img.shape) == 3 and use_rgb:
|
|
64
64
|
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
|
|
65
65
|
ext = prefix.split("/")
|
|
66
|
-
ext = "." + ext[1] if len(ext) == 2 else ".png"
|
|
66
|
+
# ext = "." + ext[1] if len(ext) == 2 else ".png" # TODO libpng error: bad parameters to zlib
|
|
67
|
+
ext = "." + ext[1] if len(ext) == 2 else ".jpg"
|
|
67
68
|
img = cv2.imencode(ext, img)[1]
|
|
68
69
|
bs64 = prefix + base64.b64encode(img).decode()
|
|
69
70
|
return bs64
|
|
@@ -142,10 +143,17 @@ def base642array(data: Any, prefix=IMG_PREFIX, use_rgb=False) -> Any:
|
|
|
142
143
|
|
|
143
144
|
serialization = array2base64 # 序列化
|
|
144
145
|
deserialization = base642array # 反序列化
|
|
145
|
-
|
|
146
146
|
if __name__ == "__main__":
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
147
|
+
from pybaseutils import file_utils, image_utils
|
|
148
|
+
|
|
149
|
+
image_dir = "/home/PKing/Downloads/image"
|
|
150
|
+
image_dir = "/media/PKing/dev1/SDK/base-utils/data/labelme/JPEGImages"
|
|
151
|
+
image_list = file_utils.get_images_list(image_dir)
|
|
152
|
+
for image_file in image_list:
|
|
153
|
+
print(image_file)
|
|
154
|
+
src = image_utils.read_image(image_file, use_rgb=True)
|
|
155
|
+
image_utils.show_image("src", src, delay=10)
|
|
156
|
+
data = {"image": src, "file": image_file}
|
|
157
|
+
data = serialization(data)
|
|
158
|
+
data = deserialization(data)
|
|
159
|
+
print(data.keys())
|
|
@@ -279,6 +279,7 @@ def video_iterator(video_file: int or str, save_video: str or int = None, interv
|
|
|
279
279
|
speed: 播放速度
|
|
280
280
|
:return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
|
|
281
281
|
"""
|
|
282
|
+
if isinstance(video_file, str) and len(video_file) == 1: video_file = int(video_file)
|
|
282
283
|
if isinstance(video_file, str): assert os.path.exists(video_file), f"video_file={video_file}"
|
|
283
284
|
video_cap = image_utils.get_video_capture(video_file, fps=None)
|
|
284
285
|
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
@@ -31,6 +31,31 @@ VIDEO_POSTFIX = ['*.mp4', '*.avi', '*.mov', "*.flv", "*.dav"]
|
|
|
31
31
|
AUDIO_POSTFIX = ['*.mp3', '*.wav']
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
def check_postfix(file, postfix=IMG_POSTFIX):
|
|
35
|
+
"""
|
|
36
|
+
判断文件是否是指定的后缀名
|
|
37
|
+
:param file:
|
|
38
|
+
:param postfix:
|
|
39
|
+
:return:
|
|
40
|
+
"""
|
|
41
|
+
return any(file.endswith(p[1:]) for p in postfix)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def is_image(file):
|
|
45
|
+
"""判断文件是否是图片"""
|
|
46
|
+
return check_postfix(file, postfix=IMG_POSTFIX)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def is_video(file):
|
|
50
|
+
"""判断文件是否是视频"""
|
|
51
|
+
return check_postfix(file, postfix=VIDEO_POSTFIX)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def is_audio(file):
|
|
55
|
+
"""判断文件是否是音频"""
|
|
56
|
+
return check_postfix(file, postfix=AUDIO_POSTFIX)
|
|
57
|
+
|
|
58
|
+
|
|
34
59
|
def str2bool(v):
|
|
35
60
|
if v.lower() in ('yes', 'true', 't', 'y', '1'):
|
|
36
61
|
return True
|
|
@@ -188,31 +213,19 @@ class WriterTXT(object):
|
|
|
188
213
|
|
|
189
214
|
def parser_classes(class_name):
|
|
190
215
|
"""
|
|
191
|
-
|
|
192
|
-
:param class_name:
|
|
193
|
-
str : class file
|
|
194
|
-
list: ["face","person"]
|
|
195
|
-
dict: 可以自定义label的id{'BACKGROUND': 0, 'person': 1, 'person_up': 1, 'person_down': 1}
|
|
216
|
+
TODO 很多模型使用parser_classes,不要做任何修改!!!
|
|
196
217
|
:return:
|
|
197
218
|
"""
|
|
198
219
|
if isinstance(class_name, str):
|
|
199
220
|
class_name = read_data(class_name, split=None)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
elif isinstance(class_name, dict) and len(class_name) > 0:
|
|
221
|
+
elif isinstance(class_name, numbers.Number):
|
|
222
|
+
class_name = [i for i in range(int(class_name))]
|
|
223
|
+
if isinstance(class_name, list):
|
|
224
|
+
class_dict = {class_name: i for i, class_name in enumerate(class_name)}
|
|
225
|
+
elif isinstance(class_name, dict):
|
|
206
226
|
class_dict = class_name
|
|
207
|
-
class_name = list(class_dict.keys())
|
|
208
227
|
else:
|
|
209
228
|
class_dict = None
|
|
210
|
-
if class_dict and not class_name:
|
|
211
|
-
# class_dict = json_utils.dict_sort(class_dict, reverse=False)
|
|
212
|
-
class_name = {}
|
|
213
|
-
for n, i in class_dict.items():
|
|
214
|
-
class_name[i] = "{},{}".format(class_name[i], n) if i in class_name else n
|
|
215
|
-
class_name = list(class_name.values())
|
|
216
229
|
return class_name, class_dict
|
|
217
230
|
|
|
218
231
|
|
|
@@ -1546,8 +1559,6 @@ def zip_file(src, dst=None, s=None):
|
|
|
1546
1559
|
if __name__ == '__main__':
|
|
1547
1560
|
from pybaseutils import time_utils
|
|
1548
1561
|
|
|
1549
|
-
path =
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
p = get_files_name(path, dirname=None)
|
|
1553
|
-
print(p)
|
|
1562
|
+
path = '/tmp/gradio/b988f43f2c87669461bbb6c831c5b3801017bc02cf6076c57ad1f4d581f76b35/image01.j'
|
|
1563
|
+
print(is_image(path))
|
|
1564
|
+
|
|
@@ -21,7 +21,7 @@ extensions = {"application/json": "json",
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
|
|
24
|
-
def post(url, params=None, headers=None, timeout=
|
|
24
|
+
def post(url, params=None, headers=None, timeout=None, max_retries=1, **kwargs):
|
|
25
25
|
"""
|
|
26
26
|
:param url: 请求URL
|
|
27
27
|
:param params: 请求参数
|
|
@@ -52,7 +52,7 @@ def post(url, params=None, headers=None, timeout=6, max_retries=1, **kwargs):
|
|
|
52
52
|
return result
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
def get(url, params=None, headers=None, timeout=
|
|
55
|
+
def get(url, params=None, headers=None, timeout=None, max_retries=1, **kwargs):
|
|
56
56
|
"""
|
|
57
57
|
type = r.headers.get('Content-Type', '').lower() # 数据类型
|
|
58
58
|
:param url: 请求URL
|
|
@@ -1916,7 +1916,8 @@ def image2base64(image: np.ndarray, prefix="", use_rgb=False) -> str:
|
|
|
1916
1916
|
if len(img.shape) == 3 and use_rgb:
|
|
1917
1917
|
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
|
|
1918
1918
|
ext = prefix.split("/")
|
|
1919
|
-
ext = "." + ext[1] if len(ext) == 2 else ".png"
|
|
1919
|
+
# ext = "." + ext[1] if len(ext) == 2 else ".png" # TODO libpng error: bad parameters to zlib
|
|
1920
|
+
ext = "." + ext[1] if len(ext) == 2 else ".jpg"
|
|
1920
1921
|
img = cv2.imencode(ext, img)[1]
|
|
1921
1922
|
bs64 = prefix + base64.b64encode(img).decode()
|
|
1922
1923
|
return bs64
|
|
@@ -1931,21 +1932,26 @@ def base642image(image_bs64, use_rgb=False) -> np.ndarray:
|
|
|
1931
1932
|
"""
|
|
1932
1933
|
image_bs64 = bytes(image_bs64, 'utf-8')
|
|
1933
1934
|
image = base64.b64decode(image_bs64)
|
|
1934
|
-
image = np.
|
|
1935
|
+
image = np.frombuffer(image, np.uint8)
|
|
1935
1936
|
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
|
|
1936
1937
|
if use_rgb:
|
|
1937
1938
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
|
|
1938
1939
|
return image
|
|
1939
1940
|
|
|
1940
1941
|
|
|
1941
|
-
def read_image_base64(image_file, size=None):
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1942
|
+
def read_image_base64(image_file: str, size=None):
|
|
1943
|
+
"""
|
|
1944
|
+
读取图片并转换为base64编码
|
|
1945
|
+
:param image_file: 图片文件路径
|
|
1946
|
+
:param size: 图片大小, (width,height)
|
|
1947
|
+
:return: base64编码字符串
|
|
1948
|
+
"""
|
|
1949
|
+
if size:
|
|
1950
|
+
bgr = read_image(image_file, size=size, use_rgb=False)
|
|
1951
|
+
image_base64 = image2base64(bgr)
|
|
1946
1952
|
else:
|
|
1947
|
-
|
|
1948
|
-
|
|
1953
|
+
with open(image_file, 'rb') as f:
|
|
1954
|
+
image_base64 = base64.b64encode(f.read()).decode('utf-8')
|
|
1949
1955
|
return image_base64
|
|
1950
1956
|
|
|
1951
1957
|
|
|
@@ -2871,7 +2877,7 @@ def fig2data(fig):
|
|
|
2871
2877
|
|
|
2872
2878
|
# Get the RGBA buffer from the figure
|
|
2873
2879
|
w, h = fig.canvas.get_width_height()
|
|
2874
|
-
buf = np.
|
|
2880
|
+
buf = np.frombuffer(fig.canvas.tostring_argb(), dtype=np.uint8)
|
|
2875
2881
|
buf.shape = (w, h, 4)
|
|
2876
2882
|
|
|
2877
2883
|
# canvas.tostring_argb give pixmap in ARGB mode. Roll the ALPHA channel to have it in RGBA mode
|
|
@@ -3132,7 +3138,7 @@ def get_video_info(video_cap: cv2.VideoCapture, vis=True):
|
|
|
3132
3138
|
:param video_cap:视频对象 或者视频文件路径
|
|
3133
3139
|
:return:
|
|
3134
3140
|
"""
|
|
3135
|
-
isfile = isinstance(video_cap, str)
|
|
3141
|
+
isfile = isinstance(video_cap, str) or isinstance(video_cap, int)
|
|
3136
3142
|
if isfile: video_cap = get_video_capture(video_cap)
|
|
3137
3143
|
width = int(video_cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
3138
3144
|
height = int(video_cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
@@ -13,6 +13,25 @@ import numpy as np
|
|
|
13
13
|
from typing import Dict, List
|
|
14
14
|
|
|
15
15
|
|
|
16
|
+
def get_time(format="p"):
|
|
17
|
+
"""
|
|
18
|
+
:param format:
|
|
19
|
+
:return:
|
|
20
|
+
"""
|
|
21
|
+
if format.lower() == "s": # 精确到秒
|
|
22
|
+
# time = datetime.strftime(datetime.now(), '%Y%m%d%H%M%S')
|
|
23
|
+
time = datetime.now().strftime("%Y%m%d%H%M%S")
|
|
24
|
+
elif format.lower() == "p": # 精确到微妙
|
|
25
|
+
# time = datetime.strftime(datetime.now(), '%Y%m%d_%H%M%S_%f') # 20200508_143059_379116
|
|
26
|
+
time = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
|
|
27
|
+
time = time[:-2]
|
|
28
|
+
elif format.lower() == "y": # 2025-06-18 11:02:05
|
|
29
|
+
# time = datetime.strftime(datetime.now(), "%Y-%m-%d %H:%M:%S") #
|
|
30
|
+
time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
31
|
+
else:
|
|
32
|
+
time = (str(datetime.now())[:-10]).replace(' ', '-').replace(':', '-')
|
|
33
|
+
return time
|
|
34
|
+
|
|
16
35
|
def date2stamp(date, format='%Y-%m-%d %H:%M:%S') -> float:
|
|
17
36
|
"""
|
|
18
37
|
将日期格式转换为时间戳
|
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pybaseutils
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
4
4
|
Summary: pybaseutils
|
|
5
5
|
Home-page: https://github.com/PanJinquan/base-utils
|
|
6
6
|
Author: PanJinquan
|
|
7
7
|
Author-email: 390737991@qq.com
|
|
8
8
|
License: MIT
|
|
9
|
-
Platform: UNKNOWN
|
|
10
9
|
License-File: LICENCE
|
|
10
|
+
Dynamic: author
|
|
11
|
+
Dynamic: author-email
|
|
12
|
+
Dynamic: description
|
|
13
|
+
Dynamic: home-page
|
|
14
|
+
Dynamic: license
|
|
15
|
+
Dynamic: license-file
|
|
16
|
+
Dynamic: summary
|
|
11
17
|
|
|
12
18
|
base-utils
|
|
13
19
|
==========
|
|
@@ -37,7 +43,7 @@ pybaseutils是个人开发常用的python库,集成了python等常用的算法
|
|
|
37
43
|
- 安装方法2:pip install –upgrade -i https://pypi.org/simple
|
|
38
44
|
pybaseutils (从pypi源下载最新版本)
|
|
39
45
|
- 设置默认的镜像源:pip config set global.index-url
|
|
40
|
-
https://pypi.tuna.tsinghua.edu.cn/simple
|
|
46
|
+
https://pypi.tuna.tsinghua.edu.cn/simple
|
|
41
47
|
- 超时异常:pip –default-timeout=1000000000
|
|
42
48
|
|
|
43
49
|
一些问题修复说明
|
|
@@ -142,5 +148,3 @@ base_utils(C++)
|
|
|
142
148
|
DEBUG_IMSHOW("image", image);
|
|
143
149
|
return 0;
|
|
144
150
|
}
|
|
145
|
-
|
|
146
|
-
|
|
File without changes
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
# --------------------------------------------------------
|
|
4
|
+
# @Author : Pan
|
|
5
|
+
# @E-mail :
|
|
6
|
+
# @Date : 2025-07-08 14:10:15
|
|
7
|
+
# @Brief : 转换labelme标注数据为voc格式
|
|
8
|
+
# --------------------------------------------------------
|
|
9
|
+
"""
|
|
10
|
+
import os
|
|
11
|
+
import numpy as np
|
|
12
|
+
import cv2
|
|
13
|
+
from pybaseutils.converter import convert_labelme2voc
|
|
14
|
+
from pybaseutils import time_utils, image_utils,file_utils
|
|
15
|
+
|
|
16
|
+
if __name__ == "__main__":
|
|
17
|
+
image_dir = "/home/PKing/Downloads/image"
|
|
18
|
+
image_list = file_utils.get_images_list(image_dir)
|
|
19
|
+
for image_file in image_list:
|
|
20
|
+
src = image_utils.read_image(image_file, use_rgb=True)
|
|
21
|
+
image_utils.show_image("src", src, delay=10)
|
|
22
|
+
src = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) # 将BGR转为RGB
|
|
23
|
+
bs6 = image_utils.image2base64(src, use_rgb=True)
|
|
24
|
+
out = image_utils.base642image(bs6, use_rgb=True)
|
|
25
|
+
image_utils.show_image("out", out)
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
"""
|
|
3
|
-
# --------------------------------------------------------
|
|
4
|
-
# @Author : Pan
|
|
5
|
-
# @E-mail :
|
|
6
|
-
# @Date : 2025-07-15 10:56:37
|
|
7
|
-
# @Brief : 列表队列
|
|
8
|
-
# --------------------------------------------------------
|
|
9
|
-
"""
|
|
10
|
-
import queue
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class Queue():
|
|
14
|
-
"""普通队列,多个POD请求时,无法实现同步数据"""
|
|
15
|
-
|
|
16
|
-
def __init__(self, name="defaultlist", maxsize=10, **kwargs):
|
|
17
|
-
"""
|
|
18
|
-
queue是一个列表队列,队列大小由maxsize指定
|
|
19
|
-
:param name: 队列名称
|
|
20
|
-
:param maxsize:
|
|
21
|
-
"""
|
|
22
|
-
self.name = name
|
|
23
|
-
self.maxsize = maxsize
|
|
24
|
-
self.queue = queue.Queue(maxsize=maxsize)
|
|
25
|
-
|
|
26
|
-
def empty(self, ):
|
|
27
|
-
return self.queue.empty()
|
|
28
|
-
|
|
29
|
-
def __del__(self):
|
|
30
|
-
if not self.queue.empty(): self.queue.queue.clear()
|
|
31
|
-
|
|
32
|
-
def get_queue(self, ):
|
|
33
|
-
return self.queue.queue
|
|
34
|
-
|
|
35
|
-
def set_queue(self, queue):
|
|
36
|
-
self.queue = queue
|
|
37
|
-
|
|
38
|
-
def qsize(self) -> int:
|
|
39
|
-
return self.queue.qsize()
|
|
40
|
-
|
|
41
|
-
def pop(self, block=True, timeout=None):
|
|
42
|
-
"""Remove and return an item from the queue,index=0"""
|
|
43
|
-
return self.queue.get(block=block, timeout=timeout)
|
|
44
|
-
|
|
45
|
-
def get(self, index):
|
|
46
|
-
"""Remove and return an item from the queue,index=0"""
|
|
47
|
-
return self.queue.queue[index]
|
|
48
|
-
|
|
49
|
-
def put(self, item, block=True, timeout=None):
|
|
50
|
-
"""Put an item into the queue,index=n"""
|
|
51
|
-
while self.qsize() >= self.maxsize: self.pop()
|
|
52
|
-
return self.queue.put(item, block=block, timeout=timeout)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if __name__ == '__main__':
|
|
56
|
-
q = Queue(maxsize=3)
|
|
57
|
-
q.put(10)
|
|
58
|
-
q.put(11)
|
|
59
|
-
q.put(12)
|
|
60
|
-
q.put(13)
|
|
61
|
-
q.put(14)
|
|
62
|
-
print(q.get_queue())
|
|
63
|
-
print(q.get(0))
|
|
64
|
-
print(q.get_queue())
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import numpy as np
|
|
2
|
-
from pybaseutils import file_utils, image_utils
|
|
3
|
-
from collections import defaultdict
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
if __name__ == "__main__":
|
|
7
|
-
inp_tensor = np.random.random(size=(10, 3, 224, 224))
|
|
8
|
-
out_tensor = defaultdict(list) # TODO CPU模式逐个推理,比批量推理快
|
|
9
|
-
for i in range(len(inp_tensor)):
|
|
10
|
-
out = [np.mean()]
|
|
11
|
-
for k in range(len(out)):
|
|
12
|
-
out_tensor[k].append(out[k])
|
|
13
|
-
out_tensor = [np.concatenate(v, axis=0) for k, v in out_tensor.items()]
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
"""
|
|
3
|
-
# --------------------------------------------------------
|
|
4
|
-
# @Author : Pan
|
|
5
|
-
# @E-mail :
|
|
6
|
-
# @Date : 2025-07-08 14:10:15
|
|
7
|
-
# @Brief : 转换labelme标注数据为voc格式
|
|
8
|
-
# --------------------------------------------------------
|
|
9
|
-
"""
|
|
10
|
-
import os
|
|
11
|
-
import numpy as np
|
|
12
|
-
from pybaseutils.converter import convert_labelme2voc
|
|
13
|
-
from pybaseutils import time_utils
|
|
14
|
-
|
|
15
|
-
import numpy as np
|
|
16
|
-
from collections import deque
|
|
17
|
-
from scipy.signal import convolve
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def get_valid_range(data, v=0):
|
|
21
|
-
"""
|
|
22
|
-
获得值大于v的最大区间
|
|
23
|
-
:param data:
|
|
24
|
-
:param v:
|
|
25
|
-
:return: [index0,index1) 左包含,右不包含
|
|
26
|
-
"""
|
|
27
|
-
if not isinstance(data, np.ndarray): data = np.array(data)
|
|
28
|
-
index = np.where(data > v)[0]
|
|
29
|
-
ranges = (0, 0)
|
|
30
|
-
if len(index) > 0:
|
|
31
|
-
ranges = (index[0], index[-1] + 1)
|
|
32
|
-
return ranges
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def get_window_sum(score, times, stage_time, ksize=5):
|
|
36
|
-
"""
|
|
37
|
-
:param score:
|
|
38
|
-
:param ksize:
|
|
39
|
-
:return:
|
|
40
|
-
"""
|
|
41
|
-
score = np.array(score)
|
|
42
|
-
# i1, i2 = get_valid_range(score, v=0)
|
|
43
|
-
ksize = np.ones(ksize) # 创建滑动窗口核
|
|
44
|
-
# 使用卷积计算滑动窗口和,'same'模式保持输出长度与输入相同
|
|
45
|
-
result = convolve(score, ksize, mode='same')
|
|
46
|
-
# result = result * (score != 0) # 只有当data[i]不为0时才保留窗口和
|
|
47
|
-
n = len(result)
|
|
48
|
-
area = 0
|
|
49
|
-
time = stage_time
|
|
50
|
-
i = 0
|
|
51
|
-
while i < n:
|
|
52
|
-
if result[i] > 0:
|
|
53
|
-
c0 = i
|
|
54
|
-
while i < n and result[i] > 0: # 找到事件的开始和结束
|
|
55
|
-
i += 1
|
|
56
|
-
c1 = i
|
|
57
|
-
wsum = sum(result[c0:c1]) # [c0,c1), 左包含,右不包含
|
|
58
|
-
print(wsum, (c0, c1))
|
|
59
|
-
if wsum > area:
|
|
60
|
-
time = (times[c0], times[c1 - 1])
|
|
61
|
-
area = wsum
|
|
62
|
-
i += 1
|
|
63
|
-
print("time={}".format(time))
|
|
64
|
-
return time, result
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if __name__ == "__main__":
|
|
68
|
-
score = [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0, 0, 1]
|
|
69
|
-
score = np.asarray(score, dtype=np.float32)
|
|
70
|
-
times = np.arange(len(score))
|
|
71
|
-
stage_time = (0, len(score) - 1)
|
|
72
|
-
ksize = 2
|
|
73
|
-
print("function:", get_window_sum(score, times, stage_time=stage_time, ksize=ksize))
|
|
74
|
-
print("原始数据 :", score)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|