对于上面关于 imgaug 包的描述,只能针对一套标注图片进行图像增强,不过对于一张图片有两种标注的情况无法实现,需要对两个标注生成一样的变换。
对于包含楼顶、楼体,需要同时调整变换的时候,内置的方法无法实现,因此我自己建立随机数据来实现,实现思路如下:
- 对于每一个方法构建随机数,并进行赋值
- 建立随机数,判断是和增强
- 对于每一组随机数只产生唯一的增强方案,并同时应用到两个标注上面
- 这样便产生了一一对应的标注增强方案
实现代码:
from imgaug import augmenters as iaa from imgaug.augmentables.segmaps import SegmentationMapsOnImage from PIL import Image import numpy as np import cv2, os, random def get_random(min_val, max_val): return random.random() * (max_val - min_val) + min_val img_size = 512 src_img_dir = "03_model_dataset_split/01_images/" src_seg_dir_louding = "03_model_dataset_split/02_labels_louding/" src_seg_dir_louti = "03_model_dataset_split/03_labels_louti/" dst_img_dir = "07_dataset_aug_512_both/01_images/" dst_seg_dir_louding = "07_dataset_aug_512_both/02_labels_louding/" dst_seg_dir_louti = "07_dataset_aug_512_both/03_labels_louti/" for file in os.listdir(src_img_dir): src_img_path = os.path.join(src_img_dir, file) src_seg_path_louding = os.path.join(src_seg_dir_louding, file) src_seg_path_louti = os.path.join(src_seg_dir_louti, file) img = Image.open(src_img_path) img_arr = np.array(img) seg_louding = Image.open(src_seg_path_louding) seg_arr_louding = np.array(seg_louding) seg_louti = Image.open(src_seg_path_louti) seg_arr_louti = np.array(seg_louti) # segmentation_maps 数据格式需要是 (512, 512, 1) # seg_arr 为 (512, 512),下面是输入 seq 函数的必须格式 seg_map_louding = SegmentationMapsOnImage(np.expand_dims(seg_arr_louding, axis=-1), shape=(img_size, img_size, 3)) seg_map_louti = SegmentationMapsOnImage(np.expand_dims(seg_arr_louti, axis=-1), shape=(img_size, img_size, 3)) for i in range(10): # 原始图片 image 与 标注 segmentation_maps 一起变化 # s_augs 是一个 list,包含两个 labels scale_x = get_random(0.8, 1.2) scale_y = get_random(0.8, 1.2) translate_percent_x = get_random(-0.2, 0.2) translate_percent_y = get_random(-0.2, 0.2) rotate_ = get_random(-45, 45) shear_ = get_random(-16, 16) order_ = round(random.random()) sometimes_ = round(random.random()) if sometimes_: seq = iaa.Sequential( [iaa.Affine( scale={"x": (scale_x), "y": (scale_y)}, # 图像缩放因子 translate_percent={"x": (translate_percent_x), "y": (translate_percent_y)}, # 平移比例 rotate=(rotate_), # 平移角度 shear=(shear_), # 错切的程度 order=[order_], # 插值顺序 cval=(0), # 没有值的地方填充的像素点值 mode="constant") # 填充模式,常量填充 ]) else: seq = iaa.Sequential([]) i_aug, s_aug1 = seq(image = img_arr, segmentation_maps = seg_map_louding) i_aug, s_aug2 = seq(image = img_arr, segmentation_maps = seg_map_louti) dst_img_path = os.path.join(dst_img_dir, "{}-{}.png".format(file.split(".")[0], i)) dst_seg_path_louding = os.path.join(dst_seg_dir_louding, "{}-{}.png".format(file.split(".")[0], i)) dst_seg_path_louti = os.path.join(dst_seg_dir_louti, "{}-{}.png".format(file.split(".")[0], i)) Image.fromarray(i_aug).save(dst_img_path) # 需要将得到的 s_aug.get_arr() 是 (512, 512, 1) # 需要转换为 (512, 512) 来显示 Image.fromarray(s_aug1.get_arr().reshape((img_size, img_size))).save(dst_seg_path_louding) Image.fromarray(s_aug2.get_arr().reshape((img_size, img_size))).save(dst_seg_path_louti)