[1] 图像分割任务中的图像增强
说明:
- 实例化 iaa.Sequential(),里面包含多种变换
- 输入 图像数据+标注mask数据,进行对应的增强处理
注意:对于图像数据,直接转为 numpy.array 既可
对于标注mask数据,需要通过 SegmentationMapsOnImage 进行处理 - 每张图片增强10次,产生10个不同的图片
举例:
from imgaug import augmenters as iaa
from imgaug.augmentables.segmaps import SegmentationMapsOnImage
from PIL import Image
import numpy as np
import cv2, os
img_size = 512
sometimes = lambda aug: iaa.Sometimes(0.5, aug)
seq = iaa.Sequential(
[ sometimes(iaa.Affine(
scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
rotate=(-45, 45),
shear=(-16, 16),
order=[0, 1],
cval=(0, 255),
mode="constant")),
iaa.SomeOf((0, 3),
[iaa.Add((-5, 5), per_channel=0.5),
iaa.Grayscale(alpha=(0.0, 1.0), from_colorspace='BGR'),
sometimes(iaa.PiecewiseAffine(scale=(0.01, 0.05)))
],
random_order=True
)
],
random_order=True
)
src_img_dir = "03_model_dataset_split/01_images/"
src_seg_dir = "03_model_dataset_split/03_labels_louti/"
dst_img_dir = "04_model_dataset_augmentation/02_louti/01_images/"
dst_seg_dir = "04_model_dataset_augmentation/02_louti/02_labels_louti/"
for file in os.listdir(src_img_dir):
src_img_path = os.path.join(src_img_dir, file)
src_seg_path = os.path.join(src_seg_dir, file)
img = Image.open(src_img_path)
img_arr = np.array(img)
seg = Image.open(src_seg_path)
seg_arr = np.array(seg)
# segmentation_maps 数据格式需要是 (512, 512, 1)
# seg_arr 为 (512, 512),下面是输入 seq 函数的必须格式
seg_map = SegmentationMapsOnImage(np.expand_dims(seg_arr, axis=-1), shape=(img_size, img_size, 3))
for i in range(10):
# 原始图片 image 与 标注 segmentation_maps 一起变化
i_aug, s_aug = seq(image = img_arr,
segmentation_maps = seg_map)
dst_img_path = os.path.join(dst_img_dir, "{}-{}.png".format(file.split(".")[0], i))
dst_seg_path = os.path.join(dst_seg_dir, "{}-{}.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_aug.get_arr().reshape((img_size, img_size))).save(dst_seg_path)