『计算机视觉_转载』深度学习中的数据加强

连接:https://zhuanlan.zhihu.com/p/61759947

最近被人问到SSD中的数据加强手段,因为我是由《tensorflow实战google深度学习框架》这本书入门的,其在介绍图像数据加强的章节中使用的流程和SSD的预处理过程及其类似,这致使我在学习SSD的时候以为SSD的预处理很常规,彻底没有出乎我预料的地方(哭死),因此特意找一些数据加强的科普性文章转载学习一下,系统的了解不一样的深度学习任务中经常使用的加强手段有哪些。python

1 什么是数据加强?

数据加强也叫数据扩增,意思是在不实质性的增长数据的状况下,让有限的数据产生等价于更多数据的价值。git

好比上图,第1列是原图,后面3列是对第1列做一些随机的裁剪、旋转操做得来。github

每张图对于网络来讲都是不一样的输入,加上原图就将数据扩充到原来的10倍。假如咱们输入网络的图片的分辨率大小是256×256,若采用随机裁剪成224×224的方式,那么一张图最多能够产生32×32张不一样的图,数据量扩充将近1000倍。虽然许多的图类似度过高,实际的效果并不等价,但仅仅是这样简单的一个操做,效果已经非凡了。算法

若是再辅助其余的数据加强方法,将得到更好的多样性,这就是数据加强的本质。网络

数据加强能够分为,有监督的数据加强和无监督的数据加强方法。其中有监督的数据加强又能够分为单样本数据加强和多样本数据加强方法,无监督的数据加强分为生成新的数据和学习加强策略两个方向。框架

2 有监督的数据加强

有监督数据加强,即采用预设的数据变换规则,在已有数据的基础上进行数据的扩增,包含单样本数据加强和多样本数据加强,其中单样本又包括几何操做类,颜色变换类。性能

2.1. 单样本数据加强学习

所谓单样本数据加强,即加强一个样本的时候,所有围绕着该样本自己进行操做,包括几何变换类,颜色变换类等。测试

(1) 几何变换类优化

几何变换类即对图像进行几何变换,包括翻转,旋转,裁剪,变形,缩放等各种操做,下面展现其中的若干个操做。

水平翻转和垂直翻转

随机旋转

随机裁剪

变形缩放

翻转操做和旋转操做,对于那些对方向不敏感的任务,好比图像分类,都是很常见的操做,在caffe等框架中翻转对应的就是mirror操做。

翻转和旋转不改变图像的大小,而裁剪会改变图像的大小。一般在训练的时候会采用随机裁剪的方法,在测试的时候选择裁剪中间部分或者不裁剪。值得注意的是,在一些竞赛中进行模型测试时,通常都是裁剪输入的多个版本而后将结果进行融合,对预测的改进效果很是明显。

以上操做都不会产生失真,而缩放变形则是失真的。

不少的时候,网络的训练输入大小是固定的,可是数据集中的图像却大小不一,此时就能够选择上面的裁剪成固定大小输入或者缩放到网络的输入大小的方案,后者就会产生失真,一般效果比前者差。

(2) 颜色变换类

上面的几何变换类操做,没有改变图像自己的内容,它多是选择了图像的一部分或者对像素进行了重分布。若是要改变图像自己的内容,就属于颜色变换类的数据加强了,常见的包括噪声、模糊、颜色变换、擦除、填充等等。

基于噪声的数据加强就是在原来的图片的基础上,随机叠加一些噪声,最多见的作法就是高斯噪声。更复杂一点的就是在面积大小可选定、位置随机的矩形区域上丢弃像素产生黑色矩形块,从而产生一些彩色噪声,以Coarse Dropout方法为表明,甚至还能够对图片上随机选取一块区域并擦除图像信息。

添加Coarse Dropout噪声

颜色变换的另外一个重要变换是颜色扰动,就是在某一个颜色空间经过增长或减小某些颜色份量,或者更改颜色通道的顺序。

颜色扰动

还有一些颜色变换,本文就再也不详述。

几何变换类,颜色变换类的数据加强方法细致数来还有很是多,推荐给你们一个git项目:

https://github.com/aleju/imgaug

预览一下它能完成的数据加强操做吧。

2.2. 多样本数据加强

不一样于单样本数据加强,多样本数据加强方法利用多个样原本产生新的样本,下面介绍几种方法。

(1) SMOTE[1]

SMOTE即Synthetic Minority Over-sampling Technique方法,它是经过人工合成新样原本处理样本不平衡问题,从而提高分类器性能。

类不平衡现象是很常见的,它指的是数据集中各种别数量不近似相等。若是样本类别之间相差很大,会影响分类器的分类效果。假设小样本数据数量极少,如仅占整体的1%,则即便小样本被错误地所有识别为大样本,在经验风险最小化策略下的分类器识别准确率仍能达到99%,但因为没有学习到小样本的特征,实际分类效果就会不好。

SMOTE方法是基于插值的方法,它能够为小样本类合成新的样本,主要流程为:

第一步,定义好特征空间,将每一个样本对应到特征空间中的某一点,根据样本不平衡比例肯定好一个采样倍率N;

第二步,对每个小样本类样本(x,y),按欧氏距离找出K个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点做为新样本点,知足如下公式:

第三步,重复以上的步骤,直到大、小样本数量平衡。

该方法的示意图以下。

在python中,SMOTE算法已经封装到了imbalanced-learn库中,以下图为算法实现的数据加强的实例,左图为原始数据特征空间图,右图为SMOTE算法处理后的特征空间图。

(2) SamplePairing[2]

SamplePairing方法的原理很是简单,从训练集中随机抽取两张图片分别通过基础数据加强操做(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效。

经SamplePairing处理后可以使训练集的规模从N扩增到N×N。实验结果代表,因SamplePairing数据加强操做可能引入不一样标签的训练样本,致使在各数据集上使用SamplePairing训练的偏差明显增长,而在验证集上偏差则有较大幅度下降。

尽管SamplePairing思路简单,性能上提高效果可观,符合奥卡姆剃刀原理,但遗憾的是可解释性不强。

(3) mixup[3]

mixup是Facebook人工智能研究院和MIT在“Beyond Empirical Risk Minimization”中提出的基于邻域风险最小化原则的数据加强方法,它使用线性插值获得新样本数据。

令(xn,yn)是插值生成的新数据,(xi,yi)和(xj,yj)是训练集随机选取的两个数据,则数据生成方式以下

λ的取指范围介于0到1。提出mixup方法的做者们作了丰富的实验,实验结果代表能够改进深度学习模型在ImageNet数据集、CIFAR数据集、语音数据集和表格数据集中的泛化偏差,下降模型对已损坏标签的记忆,加强模型对对抗样本的鲁棒性和训练生成对抗网络的稳定性。

SMOTE,SamplePairing,mixup三者思路上有相同之处,都是试图将离散样本点连续化来拟合真实样本分布,不过所增长的样本点在特征空间中仍位于已知小样本点所围成的区域内。若是可以在给定范围以外适当插值,也许能实现更好的数据加强效果。

3 无监督的数据加强

无监督的数据加强方法包括两类:

(1) 经过模型学习数据的分布,随机生成与训练数据集分布一致的图片,表明方法GAN[4]。

(2) 经过模型,学习出适合当前任务的数据加强方法,表明方法AutoAugment[5]。

3.1 GAN

关于GAN(generative adversarial networks),咱们已经说的太多了。它包含两个网络,一个是生成网络,一个是对抗网络,基本原理以下:

(1) G是一个生成图片的网络,它接收随机的噪声z,经过噪声生成图片,记作G(z) 。

(2) D是一个判别网络,判别一张图片是否是“真实的”,便是真实的图片,仍是由G生成的图片。

GAN的以假乱真能力就很少说了。

3.2 Autoaugmentation[5]

AutoAugment是Google提出的自动选择最优数据加强方案的研究,这是无监督数据加强的重要研究方向。它的基本思路是使用加强学习从数据自己寻找最佳图像变换策略,对于不一样的任务学习不一样的加强方法,流程以下:

(1) 准备16个经常使用的数据加强操做。

(2) 从16个中选择5个操做,随机产生使用该操做的几率和相应的幅度,将其称为一个sub-policy,一共产生5个sub-polices。

(3) 对训练过程当中每个batch的图片,随机采用5个sub-polices操做中的一种。

(4) 经过模型在验证集上的泛化能力来反馈,使用的优化方法是加强学习方法。

(5) 通过80~100个epoch后网络开始学习到有效的sub-policies。

(6) 以后串接这5个sub-policies,而后再进行最后的训练。

总的来讲,就是学习已有数据加强的组合策略,对于门牌数字识别等任务,研究代表剪切和平移等几何变换可以得到最佳效果。

而对于ImageNet中的图像分类任务,AutoAugment学习到了不使用剪切,也不彻底反转颜色,由于这些变换会致使图像失真。AutoAugment学习到的是侧重于微调颜色和色相分布。

除此以外还有一些数据加强方法,篇幅有限不作过多解读,请持续关注。

4 思考

数据加强的本质是为了加强模型的泛化能力,那它与其余的一些方法好比dropout,权重衰减有什么区别?

(1) 权重衰减,dropout,stochastic depth等方法,是专门设计来限制模型的有效容量的,用于减小过拟合,这一类是显式的正则化方法。研究代表这一类方法能够提升泛化能力,但并不是必要,且能力有限,并且参数高度依赖于网络结构等因素。

(2) 数据加强则没有下降网络的容量,也不增长计算复杂度和调参工程量,是隐式的规整化方法。实际应用中更有意义,因此咱们常说,数据至上。

咱们老是在使用有限的数据来进行模型的训练,所以数据加强操做是不可缺乏的一环。从研究人员手工定义数据加强操做,到基于无监督的方法生成数据和学习加强操做的组合,这仍然是一个开放的研究领域,感兴趣的同窗能够自行了解更多。