数据扩充是一种用于通过使用裁剪、填充、翻转等技术来增加数据量的策略。
数据扩充使模型对较小的变化更鲁棒,因此可以防止模型过度拟合。将扩充后的数据存储在内存中既不实际也不高效,这就是Keras的Image Data Generator类(也包含在TensorFlow的高级API:tensorflow.keras中)发挥作用的地方。
Image Data Generator生成具有实时数据增强功能的批量tensor 图像数据。最好的部分是什么?只需一行代码!
生成器生成的输出图像将具有与输入图像相同的输出维度。下面是一个辅助脚本,我们将使用它来可视化显示使用Image Data Generator类可以实现的所有功能。
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from matplotlib.pyplot import imread, imshow, subplots, show
def plot(data_generator):
"""
Plots 4 images generated by an object of the ImageDataGenerator class.
"""
data_generator.fit(images)
image_iterator = data_generator.flow(images)
# Plot the images given by the iterator
fig, rows = subplots(nrows=1, ncols=4, figsize=(18,18))
for row in rows:
row.imshow(image_iterator.next()[0].astype('int'))
row.axis('off')
show()
image = imread("image.jpeg")
# Creating a dataset which contains just one image.
images = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
imshow(images[0])
show()
1.Rotation
data_generator = ImageDataGenerator(rotation_range=90)
plot(data_generator)
通过指定rotation_range,生成的数据可以随机旋转一个角度,范围为从+ rotation_range到-rotation_range(以度为单位)。
2.Width Shifting
data_generator = ImageDataGenerator(width_shift_range=0.3)
plot(data_generator)
width_shift_range是一个介于0.0到1.0之间的浮点数,它指定图像要向左或向右随机移动的总宽度分数的上限。
3.Height Shifting
data_generator = ImageDataGenerator(height_shift_range=0.3)
plot(data_generator)
就像宽度移动一样,只是图像是垂直移动而不是水平移动。
4.Brightness
data_generator = ImageDataGenerator(brightness_range=(0.1, 0.9))
plot(data_generator)
Brightness_range指定用于随机选择一个亮度偏移值的范围。0.0的亮度对应的是绝对没有亮度,而1.0对应的是最大亮度。
5.Shear Intensity
data_generator = ImageDataGenerator(shear_range=45.0)
plot(data_generator)
Shear Intensity使图像的形状倾斜。这与旋转不同,因为在Shear Intensity中,我们固定一根轴,将图像按照一定的角度进行拉伸,即Shear Intensity。这会在图像中产生某种“拉伸”,这在旋转中是无法看到的。 shear_range以度为单位指定倾斜角度。
6.Zoom
data_generator = ImageDataGenerator(zoom_range=[0.5, 1.5])
plot(data_generator)
通过zoom_range参数获得随机缩放。小于1.0的变焦会放大图像,而大于1.0的变焦会缩小图像。
7.Channel Shift
data_generator = ImageDataGenerator(channel_shift_range=150.0)
plot(data_generator)
Channel Shift将通道值随机移位一个随机值,该值是从channel_shift_range指定的范围中选择的。
8.Horizontal Flip
data_generator = ImageDataGenerator(horizontal_flip=True)
plot(data_generator)
generator将生成图像,这些图像将水平翻转。
9.Vertical Flip
data_generator = ImageDataGenerator(vertical_flip=True)
plot(data_generator)
除了水平翻转外,我们还可以应用垂直翻转。但是那些没有任何价值的点呢?
我们有几个选项,可以选择如何填充这些区域。
1.Nearest
这是默认选项,其中选择最接近的像素值并对所有空值重复该值。(例如,aaaaaaaa | abcd | dddddddd)
data_generator = ImageDataGenerator(width_shift_range=0.3, fill_mode='nearest')
plot(data_generator)
2.Reflect
此模式会创建“反射”,并以与已知值相反的顺序填充空值。(例如abcddcba | abcd | dcbaabcd)
data_generator = ImageDataGenerator(width_shift_range=0.3, fill_mode='reflect')
plot(data_generator)
3.Wrap
除了反射效果,我们还可以通过将已知点的值复制到未知点中,从而保持顺序不变来创建“Wrap”效果。(例如abcdabcd | abcd | abcdabcd)
data_generator = ImageDataGenerator(width_shift_range=0.3, fill_mode='wrap')
plot(data_generator)
4.Constant
如果我们想用常数值填充输入边界之外的所有点,则此模式可以帮助我们准确地实现这一点。常量值由cval参数指定。
data_generator = ImageDataGenerator(width_shift_range=0.3,
fill_mode='constant',
cval=190)
plot(data_generator)
此外,还有一些其他好处。一些示例例如数据归零(featurewise_center,samplewise_center)和归一化(featurewise_std_normalization,samplewise_std_normalization)。可以通过将其布尔值传递给Image Data Generator类来设置这些变量。我们还可以通过指定rescale参数来对值进行重新缩放,该参数将与所有值相乘。
另外,还有一个参数preprocessing_function,您可以使用该参数指定自己的自定义函数来执行图像处理。