关于数据增强
为什么需要大量的数据?
- 网络模型的参数越多,需要给你的模型足够比例的样本
- 需要的参数的个数与任务的复杂度成比例
如何获得更多的数据?
- 不需要新奇的图片,神经网络在开始的时候并不是那么聪明,比如,一个欠训练的神经网络会认为如下的网球是不同、独特的图片。
相同的网球,但被移位(translated)了 - 对现有的数据集进行微小的改变
- 翻转(flips)、移位(translations)、旋转(rotations)等
- 一个卷积神经网络,如果能够对物体即使它放在不同的地方也能稳健的分类,就被称为具有不变性的属性。更具体的,CNN可以对移位(translation)、视角(viewpoint)、大小(size)、照明(illumination)(或者以上的组合)具有不变性。
- 算法会去寻找最能区分两个类别的、最明显的特征
你的神经网络会与你喂给它的数据质量一样好或坏
通过执行数据增强,你可以阻止神经网络学习不相关的特征,从根本上提升整体性能。
数据增强的类别
- 线下增强(offline augmentation):适用于较小的数据集(smaller dataset),最终会增加一定的倍数的数据集。
e.g.焊缝缺陷识别任务
- 线上增强(online augmentation) :适用于较大的数据集(larger datasets),因为你无法承受爆炸性增加的规模。
e.g.yolov3中对于图片进行的小批量的转换
焊缝缺陷数据集扩充
常见的数据扩充方法
- 一定程度内的随机旋转、平移、缩放、裁剪、填充、左右翻转;
- 对图像中的像素添加噪声扰动。常见的有椒盐噪声、高斯白噪声;
- 颜色变换。在图像的RGB颜色空间上添加增量;
- 改变图片的亮度、清晰度、对比度、锐度等;
- 除此之外,还有采样算法SMTE,生成对抗网络GAN等都可以进行图像扩充
对于我们的项目,主要用到裁剪和缩放
数据集扩充
翻转
1 | def Image_flip(img): |
平移
1 | def Image_traslation(img): |
warpAffine 仿射变换
仿射变换是指在向量空间中进行一次线性变换(乘以一个矩阵)并加上一个平移(加上一个向量),变换为另一个向量空间的过程。
仿射变换可以通过一系列的原子变换的复合来实现包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和错切(Shear)
- 参数
1 | void cv::warpAffine ( InputArray src, # 输入图像 |
旋转
1 | def Image_rotate(img): |
高斯噪声与椒盐噪声
1 | def Image_noise(img): |
裁剪
1 | def Image_random_crop(image, min_ratio=0.6, max_ratio=1.0): |
扩充数据集的同时对标签进行操作
github下载速度慢
- chrome下载github加速插件
数据增强
References
- 数据增强(Data Augmentation) https://zhuanlan.zhihu.com/p/41679153
- 图像采集数据集整理和扩充方案 https://blog.csdn.net/Celibrity/article/details/106297733
- python图片随机缩放和随机裁剪 https://blog.csdn.net/weixin_44936889/article/details/103607064
- 深度学习模型训练痛点及解决方法 https://blog.csdn.net/qq_37764129/article/details/89362949 这篇特别好