问题描述
数据增强是一种通过使用裁剪、填充、翻转等技术来增加数据量的策略。数据增强使模型对微小变化更为稳健,从而防止模型过度拟合。将扩充后的数据存储在内存中既不实用也不高效,这就是keras中的imagedatagenerator类(也包括在tensorflow的高级api:tensorflow.keras中)发挥作用的地方。imagedatagenerator通过实时数据扩充生成成批张量图像数据。由生成器生成的输出图像将具有与输入图像相同的输出尺寸
解决方案
下面是一个辅助脚本,我们将使用它来直观地显示使用ImageDataGenerator类可以实现的所有内容。
from tensorflow.keras.preprocessing.image import ImageDataGenerator from matplotlib.pylot 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)
fig, rows = subplots(nrows=1, ncols=4 , figsize=(18,18)) for row in rows: row.imshow(image_iterator.next()[0].astype('int')) row.asis('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(image[0]) show() |
1、旋转(Rotation)
通过指定rotation_range(旋转角度),生成的数据的随机旋转角度范围在+rotation range 到 -rotation_ range(以度为单位)。
data_generator = ImageDataGenerator(rotation_range=90) plot(data_generator) |
2.宽度偏移(Width Shifting)width_ shift_ range(宽度移位)范围是一个介于0.0和1.0之间的浮点数,它指定图像将随机向左或向右移位的总宽度部分的上限。
data_generator = ImageDataGenerator(width_shift_range=0.3) plot(data_generator) |
3、高度偏移(Height Shifting)
与宽度移动完全相同,只是图像是垂直移动而不是水平移动。
data_generator = ImageDataGenerator(height_shift_range=0.3) plot(data_generator) |
4、亮度(Brightness)
brightness_ range(亮度范围)指定从中随机选取亮度偏移值的范围。0的亮度相当于绝对没有亮度,1对应于最大亮度。
data_generator = ImageDataGenerator(brightness_range=(0.1,0.9)) plot(data_generator) |
5、剪切(Shear Intensity)
剪切变换使图像的形状倾斜。这与旋转中的不同,在剪切变换中,我们固定一个轴并将图像以一定的角度拉伸,称为剪切角。这会在图像中创建一种“拉伸”,这在旋转中是看不到的。shear_range以度为单位指定倾斜角度。
data_generator = ImageDataGenerator(shear_range=45.0) plot(data_generator) |
6、缩放(Zoom)
通过zoom_range参数获得随机缩放。小于1.0的缩放将放大图像,大于1.0的缩放将缩小图像。
data_generator = ImageDataGenerator(zoom_range=[0.5,1.5]) plot(data_generator) |
7、通道位移(Channel Shift)
通道移位通过从channel _shift_range(通道移位范围)指定的范围中选择的随机值随机移位通道值。
data_generator = ImageDataGenerator(channel_shift_range=150.0) plot(data_generator) |
8、水平翻转(Horizontal Flip)
生成器将生成图像,这些图像将随机水平翻转。
data_generator = ImageDataGenerator(horizontal_flip=True) plot(data_generator) |
9、垂直翻转(Vertical Filp)
与水平翻转相反,我们也可以应用垂直翻转
data_generator = ImageDataGenerator(vertical_flip=True) plot(data_generator) |
结语
如何填充没有的区域?
有几个选择,其中我们可以选择如何填补这些地区
1、相似填充(Nearest)
这是默认选项,其中选择最接近的像素值并对所有空值重复。(例如aaaaaa|abcd|dddddd)
data_generator = ImageDataGenerator(width_shift_range=0.3,fill_mode='nearest') plot(data_generator) |
2、反射填充(Reflect)
此模式创建“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='nearest',cval=190) plot(data_generator) |
更多
你可以直接利用这个类,有一些额外的优势。
例如
1.数据归零(featurewise_center,samplewise_center)
2.规范化(featurewise_std_normalization, samplewise_std_normalization)。
可以通过将这些变量的布尔值传递给ImageDataGenerator类来设置这些变量。
还可以通过指定rescale参数来重新缩放值,该参数乘以所有值。