1. 数据增强类型
1.1 经典图像数据增强类型
| 类型 | 具体方法 | 作用举例 |
|---|---|---|
| 几何变换 | 裁剪,翻转,旋转,缩放,扭曲变形 | 1. 应对测试集和训练集可能存在的位置偏差 2. 旋转,翻转操作对方向不敏感的任务,如图像分类 |
| 颜色变换 | 噪声,模糊,颜色变换,擦除,填充 | 1. 噪声常见高斯噪声 2. 擦除和填充可以选定一定面积大小的矩形块替换为黑色或其他随机分布的颜色 3. 颜色扰动可以在某些颜色空间增加或减少某些颜色分量,或改变颜色通道顺序 |
随机擦除的效果图
1.2 深度学习中额外的一些数据增强方法
这里主要包括基于合成方式的数据增强,基于神经网络自身生成数据,或基于强化学习策略性选择增强方式等
1.2.1 多样本合成
- mixup:基于邻域风险最小化原则,即通过先验知识构造训练样本的领域值来提高模型的泛化能力。
- remix:Rebalanced Mixup
mixup简言之就是对两个样本的输入(image)和label做线性插值,得到新的样本。remix在类别插值时,将权重偏向少样本的类别,主要针对分类中存在长尾效应的数据所设计。
- SMOTE:Synthetic Minority Over-sampling Technique
通过人工合成新的样本来处理样本不平衡问题
1.2.2 GAN
- 通过模型学习数据的分布,随机生成与训练数据分布一致的图片
1.2.3 Autoaugmentation
- AutoAugment是Google提出的自动选择最优数据增强方案。基本思路是使用增强学习从数据本身寻找最佳图像变换策略,对于不同的任务学习不同的增强方法,一般搜索空间大,对硬件资源要求高。
1.2.4 transfer learning
- 有时候,transfer learning会起到隐性数据增强的效果
2. imgaug使用
2.1 常用上层接口
from imgaug import augmenters as iaa
| 函数 | 参数说明 | 使用说明 |
|---|---|---|
| iaa.Sequential(children,random_order) | children一系列的子增强操作,random_order作为bool型决定是否不同batch图片采用随机顺序 | 基本的最常用的使用方法,选取一个列表的子增强操作 |
| iaa.someOf(n,children,random_order) | n可以是tuple,如(1,3)表示1到3个 | 选取其中n个子操作 |
| iaa.OneOf(children) | 选取其中一个子操作 | |
| iaa.Sometimes(p,then_list,else_list) | 以p概率对应then_list,1-p对应else_list | 对batch中的一部分图片应用一部分Augmenters,剩下的图片应用另外的Augmenters |
| iaa.WithColorspace() | to_colorspace: 要变换的颜色空间。有以下选择:RGB, BGR, GRAY, CIE, YCrCb, HSV, HLS, Lab, Luv。 from_colorspace: 原来的颜色空间, 默认RGB。 | 将图片从一个颜色空间变换到另一个颜色空间,然后在另一个颜色空间中对图像进行变换,最后再变换回原来的颜色空间 |
| iaa.WithChannels(channels,children) | channels: int或者int list。哪些channel要被用来变换。 children: channel被选出来之后要进行哪些变换。 | 从图片中挑选出一个Channel来进行变换,变换完了之后再将该channel merge回去。 |
| iaa.Noop() | 不进行任何变换。某些情况下只想使用一个Augmenter作为占位符,这样可以继续调用augment_image()函数,但实际不作变换。例如进行测试的时候可以使用这个 | |
| iaa.Lambda() | 自定义一些变换函数。 |
2.2 常用子操作接口
这里的子增强操作包括裁剪,对比度,像素扰动等
iaa.Crop(),iaa.ContrastNormalization(),iaa.Affine(),iaa.Sharpen(),iaa.Emboss(),iaa.AddToHueAndSaturation(),iaa.Add()可以作为children的元素参与增强pipeline。具体接口见官网imgaug.readthedocs.io/en/latest/s…
核心代码目录
2.3 数据增强的选择问题
数据增强的选择是个复杂的问题,不同的数据集,场景,算法模型对数据增强的要求都不一样,上文提到的Google的Autoaugmentation是个解决思路,通过在搜索空间里进行排列组合的方式来选择子集内的最优解,但离全局最优解仍有gap。在选择方法时个人总结有下面这些原则:
-
一是数据增强在增强数据多样性的同时要保证增强后的数据和应用场景有较为一致的分布,也就是不要增加非相关数据,否则并不一定能带来性能上的提升。
-
另一个原则是增强方法不能对我们原本的任务目标有干扰,比如目标是判断颜色类别,增强方式也是去改变色彩空间,这样影响了原本的数据分布,相比之下,我们去增强图像的纹理会更合理。
-
尽量多种增强方式联合使用,比单独使用一种效果会更好
2.4 一些要点
imgaug将其增强分为两种模式:随机模式和确定模式,在具体应用时可根据需求采用相应的模式,参见博客blog.csdn.net/lly1122334/…
注意在确定模式下,每一个batch的images对做的相同的增强操作,即便是对random_order=True的一个序列。如下图是第一个batch和第二个batch以下面的方式增强后的效果
import imgaug as ia
import imgaug.augmenters as iaa
import cv2
image = cv2.imread("/data/ckp/Zyo9WaMSjCrzVCfst0Qm6Q==.jpg")
batches = [[image] * 3, [image] * 3] # two batches of each three images
aug = iaa.Sequential([
iaa.Affine(translate_px=(-50, 50), rotate=(-40, 40), cval=255),
iaa.Emboss(alpha=(0, 1.0), strength=(0, 1.0)),
iaa.ContrastNormalization((0.75, 1.5),per_channel=True),
],random_order=True
)
aug_det = aug.to_deterministic()
images_deterministic = [aug_det.augment_images(batch) for batch in batches]