更新時間:2022-08-12 來源:黑馬程序員 瀏覽量:
大規(guī)模數(shù)據(jù)集是成功應用深度神經(jīng)網(wǎng)絡的前提。例如,我們可以對圖像進行不同方式的裁剪,使感興趣的物體出現(xiàn)在不同位置,從而減輕模型對物體出現(xiàn)位置的依賴性。我們也可以調整亮度、色彩等因素來降低模型對色彩的敏感度??梢哉f,在當年AlexNet的成功中,圖像增強技術功不可沒。
常用的圖像增強方法
圖像增強(image augmentation)指通過剪切、旋轉/反射/翻轉變換、縮放變換、平移變換、尺度變換、對比度變換、噪聲擾動、顏色變換等一種或多種組合數(shù)據(jù)增強變換的方式來增加數(shù)據(jù)集的大小。圖像增強的意義是通過對訓練圖像做一系列隨機改變,來產(chǎn)生相似但又不同的訓練樣本,從而擴大訓練數(shù)據(jù)集的規(guī)模,而且隨機改變訓練樣本可以降低模型對某些屬性的依賴,從而提高模型的泛化能力。
常見的圖像增強方式可以分為兩類:幾何變換類和顏色變換類
幾何變換類,主要是對圖像進行幾何變換操作,包括翻轉,旋轉,裁剪,變形,縮放等。
顏色變換類,指通過模糊、顏色變換、擦除、填充等方式對圖像進行處理。
實現(xiàn)圖像增強可以通過tf.image來完成,也可以通過tf.keras.imageGenerator來完成。
tf.image進行圖像增強
導入所需的工具包并讀取要處理的圖像:
# 導入工具包 import tensorflow as tf import matplotlib.pyplot as plt import numpy as np # 讀取圖像并顯示 cat = plt.imread('./cat.jpg') plt.imshow(cat)
翻轉和裁剪
左右翻轉圖像是最早也是最廣泛使用的一種圖像增廣方法。可以通過tf.image.random_flip_left_right來實現(xiàn)圖像左右翻轉。
# 左右翻轉并顯示 cat1 = tf.image.random_flip_left_right(cat)plt.imshow(cat1)
創(chuàng)建tf.image.random_flip_up_down實例來實現(xiàn)圖像的上下翻轉,上下翻轉使用的較少。
# 上下翻轉 cat2 = tf.image.random_flip_up_down(cat)plt.imshow(cat2)
隨機裁剪出一塊面積為原面積10%~100%10%~100%的區(qū)域,且該區(qū)域的寬和高之比隨機取自0.5~20.5~2,然后再將該區(qū)域的寬和高分別縮放到200像素。
# 隨機裁剪 cat3 = tf.image.random_crop(cat,(200,200,3)) plt.imshow(cat3)
顏色變換
另一類增廣方法是顏色變換。我們可以從4個方面改變圖像的顏色:亮度、對比度、飽和度和色調。接下來將圖像的亮度隨機變化為原圖亮度的50%50%(即1?0.51?0.5)~150%~150%(即1+0.51+0.5)。
cat4=tf.image.random_brightness(cat,0.5) plt.imshow(cat4)
類似地,我們也可以隨機變化圖像的色調:
cat5 = tf.image.random_hue(cat,0.5) plt.imshow(cat5)
使用ImageDataGenerator()進行圖像增強
ImageDataGenerator()是keras.preprocessing.image模塊中的圖片生成器,可以在batch中對數(shù)據(jù)進行增強,擴充數(shù)據(jù)集大小,增強模型的泛化能力。比如旋轉,變形等,如下所示:
keras.preprocessing.image.ImageDataGenerator( rotation_range=0, #整數(shù)。隨機旋轉的度數(shù)范圍。 width_shift_range=0.0, #浮點數(shù)、寬度平移 height_shift_range=0.0, #浮點數(shù)、高度平移 brightness_range=None, # 亮度調整 shear_range=0.0, # 裁剪 zoom_range=0.0, #浮點數(shù) 或 [lower, upper]。隨機縮放范圍 horizontal_flip=False, # 左右翻轉 vertical_flip=False, # 垂直翻轉 rescale=None # 尺度調整 )
來看下水平翻轉的結果:
# 獲取數(shù)據(jù)集 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 將數(shù)據(jù)轉換為4維的形式 x_train = X_train.reshape(X_train.shape[0],28,28,1) x_test = X_test.reshape(X_test.shape[0],28,28,1) # 設置圖像增強方式:水平翻轉 datagen = ImageDataGenerator(horizontal_flip=True) # 查看增強后的結果 for X_batch,y_batch in datagen.flow(x_train,y_train,batch_size=9): plt.figure(figsize=(8,8)) # 設定每個圖像顯示的大小 # 產(chǎn)生一個3*3網(wǎng)格的圖像 for i in range(0,9): plt.subplot(330+1+i) plt.title(y_batch[i]) plt.axis('off') plt.imshow(X_batch[i].reshape(28,28),cmap='gray') plt.show() break