图像数据增强是人工增加训练集的一种方式,主要是通过修改数据集中的图片达成。
更多的训练数据带来的是更有效的深度学习模型,同时,数据增强技术会产生更多的图片变体,这些变体会提高模型对新图片的泛化能力。
在 Keras 框架中,ImageDataGenerator 类提供了数据增强的相关功能。
在本教程中,你将学会如何在训练模型时使用图像数据增强技术。
在完成本教程后,你将明白下面几点:
- 图像数据增强是为了扩展训练数据集从而提高模型的精度和泛化能力。
- 在 Keras 框架中,你可以通过 ImageDataGenerator 类使用图像数据增强方法。
- 如何使用平移、翻转、亮度以及缩放的数据增强方法。
让我们开始吧。
教程总览
本教程被分为以下八个部分,他们分别是:
- 图像数据增强
- 样本图片
- 使用 ImageDataGenerator 进行数据增强
- 水平和垂直方向的平移增强
- 水平和垂直方向的翻转增强
- 随机旋转增强
- 随机亮度增强
- 随机缩放增强
数据增强
深度学习网络的表现总是和数据量成正比的。
数据增强是一种人工的在原有数据基础上增加新训练数据的方法,是利用特定领域的技术将训练集的数据转变成一个新的数据达成的。
图像数据增强大概是最众所周知的一种数据增强方法,主要是涉及创建一个和原始图片属于同一类别的变形后的图片。
从图像处理领域我们可以获得很多的变形方法,比如:平移、翻转、缩放等等。
这么做的主要意图是用合理的新数据去扩展训练数据。换句话说,我们可以让模型看到更多样性的训练数据。举个例子,如果我们对一只猫进行水平的翻转,这个是有意义的,因为摄像头的拍摄角度可能是左边也可能是右边。但是做垂直翻转就没什么意义并且不太适合,因为模型不太会接收到一个头上脚下的猫。
所以,我们应该明白,我们一定要根据训练数据和问题领域的具体场景来慎重的选择应用于训练集的数据增强方法。此外,有一种比较有效的方法,就是在小的原型数据集上做一些独立的实验来度量增强后的模型是否在性能上有所提升。
现代的深度学习方法,像卷积神经网络(CNN),都可以学习到图片中的位置无关性特征。数据增强可以帮助模型去学习这种性质并且可以使得模型对一些变化也不敏感,比如左到右和上到下的顺序、照片的光照变化等等。
这些图片数据的增强一般是应用于训练集而不是验证集和测试集。这些数据增强方法不同于那些需要在各个与模型交互的数据集上都保持一致的预处理方法,比如调整图片大小与缩放像素值等。
想要计算机视觉方向的结果?
现在就参加我的7天电子邮件速成课(包含示例代码)。
点击注册还有可以获得课程的免费 PDF 版本。
样本图片
我们需要一个样本图片来展示标准的数据增强技术。
本教程中,我们会用到一个已经获得使用许可,由 AndYaDontStop 拍摄,名为 Feathered Friend 的鸟类照片。
下载这张照片,并保存在你的工作目录命名为 ‘bird.jpg‘。
Feathered Friend,作者 AndYaDontStop。
保留部分权力.
使用 ImageDataGenerator 进行图像数据增强
Keras 框架可以在训练模型时,自动使用数据增强。
可以利用 ImageDataGenerator 类 达到这一目的。
首先,可以在类实例化时传入特定的参数到构造函数来配置对应的增强方法。
该类支持一系列的增强方法,包括像素值的缩放,但是我们只关注以下五种主要的图像数据增强方法:
- 通过
width_shift_range
和height_shift_range
参数设置图像平移。 - 通过 rotation_range 参数设置图像翻转。
- 通过 brightness_range 参数设置图像亮度。
- 通过 zoom_range 参数设置图像缩放。
一个通过构造函数实例化 ImageDataGenerator 的例子。
# 创建数据生成器
datagen = ImageDataGenerator()
复制代码
一旦构造完成,这个数据集的迭代器就被创建了。
这个迭代器每次迭代会返回一个批次的增强数据。
利用 flow() 函数可以将读入了内存的数据集创建为一个迭代器,示例代码如下:
# 读取图片数据集
X, y = ...
# 创建迭代器
it = dataset.flow(X, y)