数据增强的作用/为啥要进行数据增强
- 避免过拟合。当数据集具有某种明显的特征,例如数据集中图片基本在同一个场景中拍 摄,使用 Cutout 方法和风格迁移变化等相关方法可避免模型学到跟目标无关的信息。
- 提升模型鲁棒性,降低模型对图像的敏感度。当训练数据都属于比较理想的状态,碰到 一些特殊情况,如遮挡,亮度,模糊等情况容易识别错误,对训练数据加上噪声,掩码等方 法可提升模型鲁棒性。
- 增加训练数据,提高模型泛化能力。
- 避免样本不均衡。在工业缺陷检测方面,医疗疾病识别方面,容易出现正负样本极度不 平衡的情况,通过对少样本进行一些数据增强方法,降低样本不均衡比例。
- 理论上来说,用于训练的数据集越多越好。
数据增强分类
在线增强
在训练前对数据集进行处理,往往能得到多倍的数据集。
离线增强
在线增强是在训练时对加载数据进行预处理,不改变训练数据的数量。
常用的方法
比较常用的几何变换方法主要有:翻转,旋转,裁剪,缩放,平移,抖动。
值得注意的是,在某些具体的任务中,当使用这些方法时需要主要标签数据的变化,如目标检测中若使用翻转,则需要将 gt 框进行相应的调整。
比较常用的像素变换方法有:加椒盐噪声,高斯噪声,进行高斯模糊,调整 HSV 对比度,调节亮度,饱和度,直方图均衡化,调整白平衡等。
设0.5的概率翻转:
if random.random() >= 0.5:
image = image[::-1]
label = label[::-1]
这些常用方法都比较简单,这里不多赘述。下面是一些比较特殊的数据增强方法。
随机裁剪:
从320×320的图片中随机裁剪出288×288的图片
# h=w=320 new_h=new_w=288
top = np.random.randint(0, h - new_h)
left = np.random.randint(0, w - new_w)
image = image[top: top + new_h, left: left + new_w]
label = label[top: top + new_h, left: left + new_w]
Coutout(2017)
该方法来源于论文《Improved Regularization of Convolutional Neural Networks with Cutout》
在一些人体姿态估计,人脸识别,目标跟踪,行人重识别等任务中常常会出现遮挡的情 况,为了提高模型的鲁棒性,提出了使用 Cutout 数据增强方法。该方法的依据是 CutOut 能 够让 CNN 更好地利用图像的全局信息,而不是依赖于一小部分特定的视觉特征。
做法:对一张图像随机选取一个小正方形区域,在这个区域的像素值设置为 0 或其它统 一的值。
注:存在 50%的概率不对图像使用 Cutout。
效果图如下:
官方代码:https://github.com/uoguelph-mlrg/Cutout
Random Erasing(2017)
该方法来源于论文《Random Erasing Data Augmentation》。 这个方法有点类似于 Cutout,这两者同一年发表的。与 Cutout 不同的是,Random Erasing 掩码区域的长宽,以及区域中像素值的替代值都是随机的,Cutout 是固定使用正方形,替代 值都使用同一个。 具体算法如下:
效果图:
官方代码: https://github. com/zhunzhong07/Random-Erasing
Mixup(2018)
该方法来源于论文《mixup: BEYOND EMPIRICAL RISK MINIMIZATION》。 主要思想是将在数据集中随机选择两张图片按照一定比例融合,包括标签值。在论文中 给出了代码,看一眼代码即可很好的理解。
通过beta分布得到一个随机数lam,然后用lam*x1加上(1-lam)*x2得到一张融合的新图
效果图如下: 一张海上帆船与熊猫的融合。
官方代码:https://github.com/facebookresearch/mixup-cifar10
渐进式采样
我们先diss一下传统的过采样与欠采样(按深度之的主播就其个人经验来说,几乎没有用)
而渐进式采样提升0.6%左右
用大白话来讲,就是随着训练代数的增多,样本数量多的取的越来越少,样本数量少的取的越来越多
多尺度训练
多尺度训练是一种 「直接有效」 的方法,通过输入不同尺度的图像数据集,因为神经网络卷积池化的特殊性,这样可以让神经网络充分地学习不同分辨率下图像的特征,可以提高机器学习的性能。
也可以用来处理过拟合效应,在图像数据集不是特别充足的情况下,可以先训练小尺寸图像,然后增大尺寸并再次训练相同模型,这样的思想在Yolo-v2的论文中也提到过:
需要注意的是:多尺度训练并不是适合所有的深度学习应用,多尺度训练可以算是特殊的数据增强方法,在图像大小这一块做了调整。如果有可能最好利用可视化代码将多尺度后的图像近距离观察一下, 「看看多尺度会对图像的整体信息有没有影响」,如果对图像信息有影响的话,这样直接训练的话会误导算法导致得不到应有的结果。