回答思路
常用的数据增强包括:
几何变换(Geometric Transformations)
颜色变换(Color Space)
旋转|反射变换(Rotation/Reflection)
噪声注入(Noise Injection)
混合图像(Mix)
随机擦除(Random Erasing)
缩放变换(Zoom)
翻转变换(Flipping)
裁剪(Cropping)
但这些常用的数据增广无法解决特定场景的复杂的问题,比如对于行人检测而言,我们白天采集数据,然后用白天采集的数据训练模型,把这个模型用到晚上,就会发现效果很差。于是,你不得不晚上再去采集数据。当然,AugGAN的存在让你不再需要晚上再去采集数据。这里有个原因是,白天数据和晚上数据其实冗余成分很大,只是数据域(domain)的不同。如果能把一个数据域的数据搬移到另一个数据域,是不是就增强了数据呢?我们可以通过白天的数据来生成晚上的数据;我们可以通过夏天的数据生成冬天的数据;我们也可以通过晴天的数据生成雾霾的数据……
也就是说,利用生成对抗网络,我们可以很方便地生成海量的复杂数据,有的放矢,有针对性地补足数据,提升模型性能。
这里也给出了一个数据增广的demo,以及对应的可视化结果。
import numpy as np import imgaug as ia import imgaug.augmenters as iaa images = np.array( [ia.quokka(size=(64, 64)) for _ in range(32)], dtype=np.uint8 ) seq = iaa.Sequential([ #随机水平翻转 iaa.Fliplr(0.5), #随机裁剪 iaa.Crop(percent=(0, 0.1)), #以50%的概率进行高斯模糊 iaa.Sometimes( 0.5, iaa.GaussianBlur(sigma=(0, 0.5)) ), #调整对比度 iaa.LinearContrast((0.75, 1.5)), #添加高斯噪声 iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5), #调整亮度 iaa.Multiply((0.8, 1.2), per_channel=0.2), #仿射变换 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=(-25, 25), shear=(-8, 8) ) ], random_order=True) #乱序 images_aug = seq(images=images) #画图import matplotlib.pyplot as plt %matplotlib inline for i in range(len(images_aug)): plt.subplot(4, 8, i+1) plt.axis('off') plt.imshow(images_aug[i]) plt.show()
数据增广的可视化结果,一张图瞬间变成了32份,有效提高模型的泛化能力