Introduction
数据扩充(data augmentation),又名 数据增强 / 数据增广。
其本质即:
缺少海量数据时,为了保证模型的有效训练,一分钱掰成两半花。
数据扩充方法包括:
简单方法 | 复杂方法 |
翻转、旋转、尺度变换、随机抠取、色彩抖动、高斯噪声、随机模糊、随机擦除 | Fancy PCA、监督式抠取、GAN生成 |
方法介绍
1. 翻转
包括:水平翻转、垂直翻转、水平垂直翻转。OpenCV中的 cv2.flip
接口可用于快速实现翻转操作:opencv: cv2.flip 图像翻转 进行 数据增强
原图像:
水平翻转:
垂直翻转:
水平垂直翻转:
2. 旋转
将原图按照一定角度旋转,作为新图像。
常取的旋转角度为 -30°、-15°、15°、30° 等较刚好的角度值。
3. 尺度变换
将图像分辨率变为原图的0.8、0.9、1.1、1.2等倍数,作为新图像。
4. 抠取
- 随机抠取:在原图的随机位置抠取图像块,作为新图像。
- 监督式抠取:只抠取含有明显语义信息的图像块。
5. 色彩抖动
对图像原有的像素值分布进行轻微扰动(即加入轻微噪声),作为新图像。
可抖动的维度包括:亮度、锐度、饱和度、对比度。
6. Fancy PCA
对所有训练数据的像素值进行主成分分析(PCA),根据得到的特征向量和特征值计算一组随机值,作为扰动加入到原像素值中。
Code
之前做项目时有写过简易的数据增强工具,已开源:图像算法工具箱。
其中包含了最常见的图像水平翻转、垂直翻转和水平垂直翻转。可将图像数据量扩充为原来的4倍。
Summary
在实际操作中,常将多种数据扩充操作叠加使用,比如,对原图像分别 (水平、垂直、水平垂直)翻转 和 (-30°、-15°、15°、30°)旋转 后,数据量扩充为原来的8倍。此时,再对这组数据统一各进行一次随机扣取,则数据量翻为原来的16倍。与此类同,我们可以将数据扩充为原来的n次方倍,数据量简直不要太海量。。。 ╮( ̄▽ ̄)╭
Note:
- 不是所有 数据扩充方法都可以一股脑儿随便用。比如对于人脸图片,垂直翻转就变得不可行了。因为现实中基本不会出现对倒过来的人脸进行识别,那么垂直翻转后产生的就几乎是对模型有害的噪声了,这会干扰到模型的正常收敛。
- 另外,如果是 预测位置有关的任务 ,记得 将 图像数据 和 标记数据 进行 同步扩充(比如图像翻转时,对应的标记坐标跟着做相应翻转)。这个不要忘了,否则扩充后的新图像对应的却是原图像的标记数据,你觉得这个模型还能训练么。。。 (→_→)