首頁人工智能常見問題正文

人工智能開發(fā):圖像增強的常用方法

更新時間:2022-08-12 來源:黑馬程序員 瀏覽量:

大規(guī)模數(shù)據(jù)集是成功應用深度神經(jīng)網(wǎng)絡的前提。例如,我們可以對圖像進行不同方式的裁剪,使感興趣的物體出現(xiàn)在不同位置,從而減輕模型對物體出現(xiàn)位置的依賴性。我們也可以調(diào)整亮度、色彩等因素來降低模型對色彩的敏感度。可以說,在當年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個方面改變圖像的顏色:亮度、對比度、飽和度和色調(diào)。接下來將圖像的亮度隨機變化為原圖亮度的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)
顏色變換

類似地,我們也可以隨機變化圖像的色調(diào):

cat5 = tf.image.random_hue(cat,0.5)
plt.imshow(cat5)
隨機變化色調(diào)

使用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, # 亮度調(diào)整
               shear_range=0.0, # 裁剪
               zoom_range=0.0, #浮點數(shù) 或 [lower, upper]。隨機縮放范圍
               horizontal_flip=False, # 左右翻轉
               vertical_flip=False, # 垂直翻轉
               rescale=None # 尺度調(diào)整
            )

來看下水平翻轉的結果:

# 獲取數(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
分享到:
在線咨詢 我要報名
和我們在線交談!