指南:使用Keras和TensorFlow探索数据增强

  • 2019 年 10 月 26 日
  • 笔记

数据扩充是一种用于通过使用裁剪、填充、翻转等技术来增加数据量的策略。

数据扩充使模型对较小的变化更鲁棒,因此可以防止模型过度拟合。将扩充后的数据存储在内存中既不实际也不高效,这就是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,您可以使用该参数指定自己的自定义函数来执行图像处理。