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