(注:本文将着重介绍数据增强的方法,具体原理不再阐述)

数据增强介绍

使用机器学习方法,尤其时涉及到深度学习时,小数据集常常会导致我们的模型过度拟合,而不能获得较好的泛化能力,此时我们就需要借助一些特殊的方法来解决这个问题。在众多方法中,最简单且常用的就是数据增强技术了。

在计算机视觉领域,数据增强是一种非常强大的降低过拟合的技术。过拟合的原因一般都是可用于训练的样本数据太少,如果拥有无限多的数据,那么模型将可以学习到所有数据的分布,并且永远不会过拟合。数据增强就是由此入手,通过对原始图像数据的随机变换来生成更多的训练数据。

数据增强的目标是通过不同的方式来呈现训练数据,对于人类而言这是无效的,因为无论如何都是同一个东西,但是对于机器模型而言,从不同角度表示的图像就意味新的数据,由此可以数据增强其实是最大程度地利用了原始数据,来增强模型的泛化能力。

下面将介绍Keras中进行数据增强的方法。

Keras中的数据增强

Keras是深度学习经常用到的框架,因此对于数据增强来说是一个绝佳的实践场所。在Keras中,可以通过对ImageDataGenerator实例读取的图像执行多次随机变换来实现。举个例子。

datagen =ImageDataGenerator(

rotation_range=40,

width_shift_range=0.2,

height_shift_range= 0.2,

shear_range= 0.2,

zoom_range= 0.2,

horizontal_flip=True,

fill_mode= 'nearest')

rotation_range是角度值,表示图像随机旋转的角度范围

width_shift 和 height_shift是图像在水平或垂直方向上平移的范围(相对于总宽度或总高度的比例)

shear_range是随机错切变换的角度

zoom_range是图像随机缩放的范围

horizontal_flip是随机将一半的图像水平翻转

fill_mode是用于填充新创建像素的方法。

增强后效果如下:




图1  随机旋转                                   图2  水平平移                                            图3  垂直平移

       

           


图4  随机错切                                    图5  随机缩放                                            图6  水平翻转

具体操作代码如下:

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
datagen = ImageDataGenerator(
#rotation_range=40,
#width_shift_range=0.2,
#height_shift_range=0.2,
#shear_range=0.2,
#zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')

#如果指向执行一种数据增强方法只需选定一个方法就行,当全部选定时,生成的图片将满足所有的条件

img = load_img('cat.jpg') # 导入图片
x = img_to_array(img) # 将图像转换成一个numpy数组,其形状为(3, 150, 150)
x = x.reshape((1,) + x.shape) # numpy数组其形状为(1, 3, 150, 150)
# 生成的图片将保存在 'databag/' 目录下
i = 0
for batch in datagen.flow(x, batch_size=1,save_to_dir='databag'):
i += 1
if i > 1:# 一次只生成2张,这里可根据自己的情况调整

break # 生成器退出循环

下面将给出ImageDataGenerator中的剩余部分的参数,其使用方法与上述方法一直,具体的参数可以根据具体的场景调整,另外附上ImageDataGenerator的官方说明链接,可以深入了解。

datagen = ImageDataGenerator(
featurewise_center=False,
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
zca_epsilon=1e-6,
rotation_range=0.,
width_shift_range=0.,
height_shift_range=0.,
shear_range=0.,
zoom_range=0.,
channel_shift_range=0.,
fill_mode='nearest',
cval=0.,
horizontal_flip=False,
vertical_flip=False,
rescale=None,
preprocessing_function=None,
data_format=K.image_data_format())