pybaseutils 1.2.0__tar.gz → 2.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/PKG-INFO +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/__init__.py +1 -1
- pybaseutils-2.0.0/pybaseutils/converter/build_cvat.py +53 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_cvat2labelme.py +3 -3
- pybaseutils-2.0.0/pybaseutils/converter/convert_labelme2cvat.py +39 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_labelme2voc.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/coords_utils.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cvutils/video_utils.py +69 -58
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/parser_labelme.py +3 -2
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/parser_voc.py +1 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/parser_yolo.py +1 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/font_utils.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/image_utils.py +213 -147
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/word_utils.py +2 -2
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils.egg-info/PKG-INFO +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils.egg-info/SOURCES.txt +3 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/demo_labelme_crop.py +4 -4
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/AffectNet.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/AsianMovie.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/WaterMeters1.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/WaterMeters2.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/convert_cvat2labelme.py +3 -3
- pybaseutils-2.0.0/test_py/converter/convert_labelme2cvat.py +23 -0
- pybaseutils-2.0.0/test_py/demo1.py +82 -0
- pybaseutils-2.0.0/test_py/demo2.py +25 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_gif_video.py +6 -5
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_image_crop.py +1 -1
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_lableme_vis.py +2 -1
- pybaseutils-1.2.0/test_py/demo1.py +0 -51
- pybaseutils-1.2.0/test_py/demo2.py +0 -39
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/LICENCE +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/README.md +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/audio/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/audio/audio_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/audio/pyaudio_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/audio/vad_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/base64_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/batch_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/build_utils/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/build_utils/cython_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/build_utils/pyarmor_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cluster/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cluster/kmean.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cluster/maxmin_distance.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cluster/similarity.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/color_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/config_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/build_coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/build_labelme.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/build_voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/concat_coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_coco2labelme.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_coco2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_labelme2yolo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_voc2coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_voc2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_voc2yolo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/converter/convert_yolo2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cvutils/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cvutils/corner_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cvutils/monitor.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/cvutils/mouse_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/base_coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/base_dataset.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/parser_coco_det.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/parser_coco_ins.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/parser_coco_kps.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/dataloader/voc_seg_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/file_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/filter/QueueTable.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/filter/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/filter/demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/filter/kalman_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/filter/mean_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/filter/motion_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/filter/pose_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/font_style/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/geometry_tools.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/heatmap_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/json_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/log.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/logger.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/metrics/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/metrics/accuracy.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/metrics/average_meter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/metrics/class_report.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/metrics/plot_pr.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/metrics/plot_roc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/numpy_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pandas_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/plot_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pose/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pose/bones_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pose/human_pose.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pose/pose_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pycpp/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pycpp/demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/pycpp/main.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/server/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/server/apm_server.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/setup_config.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/singleton_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/thread_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/time_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracemalloc_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracemalloc_utils2.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracking/QueueTable.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracking/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracking/demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracking/kalman_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracking/mean_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracking/motion_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/tracking/pose_filter.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/transforms/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/transforms/affine_transform.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/transforms/face_alignment.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/transforms/transform_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/worker.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils/yaml_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils.egg-info/dependency_links.txt +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils.egg-info/not-zip-safe +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/pybaseutils.egg-info/top_level.txt +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/setup.cfg +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/setup.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/WebCrawler/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/WebCrawler/search_image.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/WebCrawler/search_image_for_baidu.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/convert_labelme2coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/convert_labelme2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/copy_move.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/demo_video_aije.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/demo_voc_crop.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/demo_voc_vis.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/aije/video_demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/audio/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/audio/demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/audio/main.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/audio/main_read.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/audio/segment.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/audio/speechbrain_asr_indoor_prod.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/audio/speechbrain_demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/captcha/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/captcha/demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/class_attribute.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/class_names.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/BITVehicle2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/BSTLD2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/CCPD.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/CCPD2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/FL3D_dataset.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/FreiHAND2coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/MTFL2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/TT100K.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/concat_coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/convert_coco2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/convert_gesture2hand.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/convert_labelme2coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/convert_labelme2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/convert_voc2labelme.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/fatigue_driving.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/fdd_dataset.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/handpose2coco.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/insects_for_aichallenger.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/tt100k_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/ua_detrac2voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/converter/voc_sbd2labelme.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/build_cython.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/build_pyarmor.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/cryptography_demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/fun_sum.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/main.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/model_des_enctypt.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/cython_build/model_enctypt.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo3.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_async_await1.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_async_await2.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_coco_vis.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_copy_files.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_copy_files_for_voc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_ffmpy.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_for_pair_file.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_for_polygon.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_for_trt.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_get_file_list.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_gif.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_labelme.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_labelme_crop.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_metrics.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_mouse.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_nii.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_pandas.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_plot.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_rename.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_standard_image .py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_standard_video .py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_taichi.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_video.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_voc_crop.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_voc_vis.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_word_similar.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_worker1.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/demo_worker2.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/detector/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/detector/demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/detector/detect_face_person.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/detector/predet_labelme.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/edit_distance/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/edit_distance/demo.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/edit_distance/text_matching.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/edit_distance/text_utils.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/flask_demo/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/flask_demo/func.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/flask_demo/server.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/image_correction/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/image_correction/demo_correction_v1.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/image_correction/demo_correction_v2.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/image_correction/demo_correction_v3.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/kafka_worker.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/men_tracemalloc.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/performance.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/pose/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/pose/human_pose.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/registry/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/registry/base.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/registry/component.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/registry/main.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/registry/register.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/test_fr/__init__.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/test_fr/demo11.py +0 -0
- {pybaseutils-1.2.0 → pybaseutils-2.0.0}/test_py/test_fr/idcardocr.py +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : Pan
|
|
4
|
+
@E-mail : 390737991@qq.com
|
|
5
|
+
@Date : 2022-09-05 19:48:52
|
|
6
|
+
@Brief :
|
|
7
|
+
"""
|
|
8
|
+
import os
|
|
9
|
+
import numpy as np
|
|
10
|
+
import cv2
|
|
11
|
+
from pybaseutils import image_utils, file_utils
|
|
12
|
+
import xmltodict
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def maker_cvat(xml_file, points, labels, image_name, image_size):
|
|
16
|
+
"""
|
|
17
|
+
制作CVAT数据格式
|
|
18
|
+
:param xml_file: 保存xml文件路径
|
|
19
|
+
:param points: (num_labels,num_points,2), points = image_utils.boxes2polygons(boxes)
|
|
20
|
+
:param labels: (num_labels,)
|
|
21
|
+
:param image_name: 图片名称,如果存在则进行拷贝到json_file同一级目录
|
|
22
|
+
:param image_size: (W,H)
|
|
23
|
+
:return:
|
|
24
|
+
"""
|
|
25
|
+
assert len(points) == len(labels)
|
|
26
|
+
file_utils.create_file_path(xml_file)
|
|
27
|
+
objects = []
|
|
28
|
+
for idx, (point, label) in enumerate(zip(points, labels)):
|
|
29
|
+
if isinstance(point, np.ndarray): point = point.tolist()
|
|
30
|
+
if not isinstance(point[0], list): point = [point]
|
|
31
|
+
pt = [{'x': p[0], 'y': p[1]} for p in point]
|
|
32
|
+
item = {'name': label,
|
|
33
|
+
'deleted': '0',
|
|
34
|
+
'verified': '0',
|
|
35
|
+
'occluded': 'no',
|
|
36
|
+
'date': None,
|
|
37
|
+
'id': idx,
|
|
38
|
+
'parts': {'hasparts': None, 'ispartof': None},
|
|
39
|
+
'polygon': {'pt': pt, 'username': None},
|
|
40
|
+
'attributes': None}
|
|
41
|
+
objects.append(item)
|
|
42
|
+
data_info = {
|
|
43
|
+
"annotation": {
|
|
44
|
+
'filename': os.path.basename(image_name),
|
|
45
|
+
'folder': "",
|
|
46
|
+
'source': {'sourceImage': None, 'sourceAnnotation': 'Datumaro'},
|
|
47
|
+
'imagesize': {'nrows': image_size[1], 'ncols': image_size[0]},
|
|
48
|
+
'object': objects
|
|
49
|
+
}}
|
|
50
|
+
xml_info = xmltodict.unparse(data_info)
|
|
51
|
+
with open(xml_file, 'w') as xml_file:
|
|
52
|
+
xml_file.write(xml_info)
|
|
53
|
+
return data_info
|
|
@@ -41,13 +41,13 @@ def parser_annotations(xml_file):
|
|
|
41
41
|
def convert_cvat2labelme(anno_dir, image_dir="", vis=False):
|
|
42
42
|
"""
|
|
43
43
|
将CVAT标注格式(LabelMe 3.0)转换labelme通用格式
|
|
44
|
-
:param
|
|
45
|
-
:param image_dir:
|
|
44
|
+
:param anno_dir: 标注文件目录,输出json文件与anno_dir同目录
|
|
45
|
+
:param image_dir: 图片文件目录
|
|
46
46
|
:param vis:
|
|
47
47
|
:return:
|
|
48
48
|
"""
|
|
49
49
|
xml_list = file_utils.get_files_lists(anno_dir, postfix=["*.xml"])
|
|
50
|
-
for xml_file in xml_list:
|
|
50
|
+
for xml_file in tqdm(xml_list):
|
|
51
51
|
image_name, annos, w, h = parser_annotations(xml_file)
|
|
52
52
|
points = [an['points'] for an in annos if len(an['points']) > 0]
|
|
53
53
|
labels = [an['label'] for an in annos if an['label']]
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# -*-coding: utf-8 -*-
|
|
2
|
+
"""
|
|
3
|
+
@Author : Pan
|
|
4
|
+
@E-mail : 390737991@qq.com
|
|
5
|
+
@Date : 2022-10-12 16:21:55
|
|
6
|
+
@Brief :
|
|
7
|
+
"""
|
|
8
|
+
import os
|
|
9
|
+
import numpy as np
|
|
10
|
+
import cv2
|
|
11
|
+
from tqdm import tqdm
|
|
12
|
+
from pybaseutils.dataloader import parser_voc, parser_labelme
|
|
13
|
+
from pybaseutils.converter import build_voc, build_labelme, build_cvat
|
|
14
|
+
from pybaseutils import file_utils, image_utils, json_utils
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def convert_labelme2cvat(anno_dir, image_dir="", vis=False):
|
|
18
|
+
"""
|
|
19
|
+
将labelme文件转换为CVAT标注格式(LabelMe 3.0)
|
|
20
|
+
:param anno_dir: 标注文件目录,
|
|
21
|
+
:param image_dir: 图片文件目录,输出xml文件与anno_dir同目录
|
|
22
|
+
:param vis:
|
|
23
|
+
:return:
|
|
24
|
+
"""
|
|
25
|
+
image_list = file_utils.get_images_list(image_dir)
|
|
26
|
+
for image_file in tqdm(image_list):
|
|
27
|
+
image_name = os.path.basename(image_file)
|
|
28
|
+
json_file = os.path.join(anno_dir, image_name.split(".")[0] + ".json")
|
|
29
|
+
xml_file = os.path.join(image_dir, image_name.split(".")[0] + ".xml")
|
|
30
|
+
boxes, labels, points, groups = parser_labelme.parser_labelme(json_file, class_dict={})
|
|
31
|
+
image = cv2.imread(image_file)
|
|
32
|
+
h, w = image.shape[:2]
|
|
33
|
+
build_cvat.maker_cvat(xml_file, points, labels, image_name, image_size=[w, h])
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
image_dir = "/home/PKing/Downloads/dataset-label/image"
|
|
38
|
+
anno_dir = "/home/PKing/Downloads/dataset-label/json"
|
|
39
|
+
convert_labelme2cvat(image_dir=image_dir, anno_dir=anno_dir, vis=False)
|
|
@@ -106,7 +106,7 @@ class Labelme2VOC(object):
|
|
|
106
106
|
for i, item in enumerate(objects):
|
|
107
107
|
label = item["name"]
|
|
108
108
|
box = item["bndbox"]
|
|
109
|
-
img = image_utils.
|
|
109
|
+
img = image_utils.get_box_crop(image, box=box)
|
|
110
110
|
file = os.path.join(out_dir, str(label), "{}_{}_{:0=3d}.jpg".format(image_id, label, i))
|
|
111
111
|
file_utils.create_file_path(file)
|
|
112
112
|
cv2.imwrite(file, img)
|
|
@@ -328,7 +328,7 @@ def show_image(name, image, boxes, labels, center2bboxes=False, untranspose=Fals
|
|
|
328
328
|
boxes = cxcywh2xyxy(boxes)
|
|
329
329
|
if untranspose:
|
|
330
330
|
image = image_utils.untranspose(image)
|
|
331
|
-
image = image_utils.
|
|
331
|
+
image = image_utils.show_image_boxes_texts(name, image, boxes, labels, delay=waitKey)
|
|
332
332
|
return image
|
|
333
333
|
|
|
334
334
|
|
|
@@ -244,17 +244,8 @@ def resize_video(video_file, save_video, size=(), start=0, interval=1, vis=True,
|
|
|
244
244
|
video_writer.release()
|
|
245
245
|
|
|
246
246
|
|
|
247
|
-
def
|
|
248
|
-
|
|
249
|
-
delay = kwargs.get("delay", 0)
|
|
250
|
-
title = kwargs.get("title", "image")
|
|
251
|
-
cv2.imshow(title, frame)
|
|
252
|
-
cv2.moveWindow(title, 0, 0)
|
|
253
|
-
cv2.waitKey(delay)
|
|
254
|
-
return frame
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
def video_capture(video_file: int or str, save_video: str = None, interval=1, task: Callable = video_task, **kwargs):
|
|
247
|
+
def video_capture(video_file: int or str, save_video: str or int = None, interval=1, task: Callable = None,
|
|
248
|
+
vis=True, **kwargs):
|
|
258
249
|
"""
|
|
259
250
|
读取摄像头或者视频流
|
|
260
251
|
:param video_file: String 视频文件,如*.avi,*.mp4,...
|
|
@@ -267,66 +258,86 @@ def video_capture(video_file: int or str, save_video: str = None, interval=1, ta
|
|
|
267
258
|
title: 控制显示窗口名
|
|
268
259
|
:return:
|
|
269
260
|
"""
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
width, height,
|
|
261
|
+
video_cap = image_utils.get_video_capture(video_file)
|
|
262
|
+
width, height, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
263
|
+
# video_writer = get_video_writer(save_video, width, height, fps)
|
|
273
264
|
video_writer = None
|
|
274
|
-
# fps = max((fps + interval - 1) // interval, 2)
|
|
275
265
|
fps = max(fps // interval, 2)
|
|
276
|
-
|
|
277
|
-
# freq = int(fps / detect_freq)
|
|
278
|
-
count = 0
|
|
266
|
+
count = int(kwargs.get("start", 0) * fps)
|
|
279
267
|
while True:
|
|
280
|
-
if count % interval == 0:
|
|
268
|
+
# if count % interval == 0:
|
|
269
|
+
if count % interval == 0 and count >= 0:
|
|
281
270
|
# 设置抽帧的位置
|
|
282
271
|
if isinstance(video_file, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
283
272
|
isSuccess, frame = video_cap.read()
|
|
284
273
|
if not isSuccess or 0 < num_frames < count: break
|
|
285
274
|
if task: frame = task(frame, **kwargs)
|
|
275
|
+
height, width = frame.shape[:2]
|
|
276
|
+
if vis: image_utils.cv_show_image(kwargs.get("title", "video"), frame, delay=kwargs.get("delay", 10))
|
|
286
277
|
if save_video:
|
|
278
|
+
if not video_writer: video_writer = image_utils.get_video_writer(save_video, width, height, fps)
|
|
287
279
|
video_writer.write(frame)
|
|
288
280
|
count += 1
|
|
289
281
|
video_cap.release()
|
|
282
|
+
if video_writer:
|
|
283
|
+
print("save video:{}".format(save_video))
|
|
284
|
+
video_writer.release()
|
|
290
285
|
|
|
291
286
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
start
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
#
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
287
|
+
def video_iterator(video_file: int or str, save_video: str or int = None, interval=1, task: Callable = None,
|
|
288
|
+
vis=False, **kwargs):
|
|
289
|
+
"""
|
|
290
|
+
读取摄像头或者视频流迭代器
|
|
291
|
+
Usage:
|
|
292
|
+
from pybaseutils.cvutils import video_utils
|
|
293
|
+
video_cap = video_utils.video_iterator(video_file, save_video, start=4, end=10)
|
|
294
|
+
for data_info in video_cap:
|
|
295
|
+
frame = data_info["frame"]
|
|
296
|
+
...
|
|
297
|
+
:param video_file: String 视频文件,如*.avi,*.mp4,...
|
|
298
|
+
Int 摄像头ID,如0,1,2
|
|
299
|
+
:param save_video: 保存task视频处理后的结果
|
|
300
|
+
:param interval: 抽帧处理间隔,当interval=-1,表示当interval=fps,即一秒一帧
|
|
301
|
+
:param task: 回调函数: def task(frame, **kwargs)
|
|
302
|
+
:param kwargs:回调函数输入参数,
|
|
303
|
+
delay: 控制显示延时,默认10S
|
|
304
|
+
title: 控制显示窗口名,默认video
|
|
305
|
+
start: 开始播放时间,单位S
|
|
306
|
+
end: 结束播放时间,单位S
|
|
307
|
+
speed: 播放速度
|
|
308
|
+
:return: frame, count, w, h, fps =data_info['frame'],data_info['count'],data_info['w'],data_info['h'],data_info['fps']
|
|
309
|
+
"""
|
|
310
|
+
video_cap = image_utils.get_video_capture(video_file)
|
|
311
|
+
w, h, num_frames, fps = image_utils.get_video_info(video_cap)
|
|
312
|
+
start = int(kwargs.get("start", 0) * fps)
|
|
313
|
+
end = int(kwargs.get("end", num_frames / fps) * fps)
|
|
314
|
+
end = min(end, num_frames)
|
|
315
|
+
interval = fps if interval == -1 else interval # 当interval=-1,表示interval=fps,即一秒一帧
|
|
316
|
+
save_fps = max(kwargs.get("speed", 1) * fps // interval, 1)
|
|
317
|
+
count = start
|
|
318
|
+
video_writer = None
|
|
319
|
+
while True:
|
|
320
|
+
# if count % interval == 0:
|
|
321
|
+
if count % interval == 0 and count >= 0:
|
|
322
|
+
# 设置抽帧的位置
|
|
323
|
+
if isinstance(video_file, str): video_cap.set(cv2.CAP_PROP_POS_FRAMES, count)
|
|
324
|
+
isSuccess, frame = video_cap.read()
|
|
325
|
+
if not isSuccess or 0 < end < count or frame is None: break
|
|
326
|
+
if task: frame = task(frame, **kwargs)
|
|
327
|
+
data_info = {"frame": frame, "count": count, "w": w, "h": h, "fps": fps}
|
|
328
|
+
# TODO 返回data_info
|
|
329
|
+
yield data_info
|
|
330
|
+
frame = data_info["frame"]
|
|
331
|
+
h, w = frame.shape[:2]
|
|
332
|
+
if vis: image_utils.cv_show_image(kwargs.get("title", "video"), frame, delay=kwargs.get("delay", 10))
|
|
333
|
+
if save_video:
|
|
334
|
+
if not video_writer: video_writer = image_utils.get_video_writer(save_video, w, h, save_fps)
|
|
335
|
+
video_writer.write(frame)
|
|
336
|
+
count += 1
|
|
337
|
+
video_cap.release()
|
|
338
|
+
if video_writer:
|
|
339
|
+
print("save video:{}".format(save_video))
|
|
340
|
+
video_writer.release()
|
|
330
341
|
|
|
331
342
|
|
|
332
343
|
def resize_task(frame, **kwargs):
|
|
@@ -342,7 +353,7 @@ def rotation_task(frame, **kwargs):
|
|
|
342
353
|
angle = angle + angle[::-1]
|
|
343
354
|
h, w = frame.shape[:2]
|
|
344
355
|
frame = image_utils.image_rotation(frame, angle=alpha * angle[count % len(angle)])
|
|
345
|
-
frame = image_utils.
|
|
356
|
+
frame = image_utils.get_box_crop(frame, box=[0, 70, w, h - 70])
|
|
346
357
|
return frame
|
|
347
358
|
|
|
348
359
|
|
|
@@ -155,6 +155,7 @@ class LabelMeDataset(Dataset):
|
|
|
155
155
|
image_ids = [os.path.basename(f) for f in image_ids]
|
|
156
156
|
# assert os.path.exists(image_dir), Exception("no directory:{}".format(image_dir))
|
|
157
157
|
# assert os.path.exists(anno_dir), Exception("no directory:{}".format(anno_dir))
|
|
158
|
+
assert len(image_ids) > 0, f"image_dir={image_dir} is empty"
|
|
158
159
|
return data_root, anno_dir, image_dir, image_ids
|
|
159
160
|
|
|
160
161
|
def __getitem__(self, index):
|
|
@@ -380,12 +381,12 @@ def parser_labelme(anno_file, class_dict={}, shape=None):
|
|
|
380
381
|
return bboxes, labels, points, groups
|
|
381
382
|
|
|
382
383
|
|
|
383
|
-
def show_target_image(image, bboxes, labels, points):
|
|
384
|
+
def show_target_image(image, bboxes, labels, points, color=()):
|
|
384
385
|
# image = image_utils.draw_image_bboxes_text(image, bboxes, labels, color=(255, 0, 0),
|
|
385
386
|
# thickness=2, fontScale=1.2, drawType="chinese")
|
|
386
387
|
# image = image_utils.draw_landmark(image, points, color=(0, 255, 0))
|
|
387
388
|
# image = image_utils.draw_key_point_in_image(image, points)
|
|
388
|
-
image = image_utils.draw_image_contours(image, points, labels)
|
|
389
|
+
image = image_utils.draw_image_contours(image, points, labels, color=color, thickness=1)
|
|
389
390
|
image_utils.cv_show_image("det", image)
|
|
390
391
|
|
|
391
392
|
|
|
@@ -147,6 +147,7 @@ class VOCDataset(Dataset):
|
|
|
147
147
|
|
|
148
148
|
files = self.get_file_list(image_dir, postfix=file_utils.IMG_POSTFIX, basename=False)
|
|
149
149
|
self.postfix = os.path.basename(files[0]).split(".")[-1] if files else "jpg"
|
|
150
|
+
assert len(image_ids) > 0, f"image_dir={image_dir} is empty"
|
|
150
151
|
return data_root, anno_dir, image_dir, image_ids
|
|
151
152
|
|
|
152
153
|
def convert_target(self, boxes, labels):
|
|
@@ -204,6 +204,7 @@ class YOLODataset(Dataset):
|
|
|
204
204
|
image_ids = [os.path.basename(f) for f in image_ids]
|
|
205
205
|
# assert os.path.exists(image_dir), Exception("no directory:{}".format(image_dir))
|
|
206
206
|
# assert os.path.exists(anno_dir), Exception("no directory:{}".format(anno_dir))
|
|
207
|
+
assert len(image_ids) > 0, f"image_dir={image_dir} is empty"
|
|
207
208
|
return data_root, anno_dir, image_dir, image_ids
|
|
208
209
|
|
|
209
210
|
def __getitem__(self, index):
|
|
@@ -122,7 +122,7 @@ def draw_font(text, style="楷体", scale=1.0, size=20, c1=(255, 255, 255), c2=(
|
|
|
122
122
|
if np.sum(image) < 1: return None
|
|
123
123
|
mask = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|
124
124
|
box = image_utils.get_mask_boundrect_cv(mask, binarize=True, shift=10)
|
|
125
|
-
image = image_utils.
|
|
125
|
+
image = image_utils.get_box_crop(image, box)
|
|
126
126
|
image = image_utils.resize_image_padding(image, size=(size, size), color=(0, 0, 0))
|
|
127
127
|
else:
|
|
128
128
|
image = image_utils.create_image(shape=(size, size, 3), color=c2)
|