指南:使用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,您可以使用該參數指定自己的自定義函數來執行影像處理。