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

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

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

大規(guī)模數(shù)據(jù)集是成功應(yīng)用深度神經(jīng)網(wǎng)絡(luò)的前提。例如,我們可以對圖像進(jìn)行不同方式的裁剪,使感興趣的物體出現(xiàn)在不同位置,從而減輕模型對物體出現(xiàn)位置的依賴性。我們也可以調(diào)整亮度、色彩等因素來降低模型對色彩的敏感度。可以說,在當(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),裁剪,變形,縮放等。

幾何變換類圖像增強(qiáng)

顏色變換類,指通過模糊、顏色變換、擦除、填充等方式對圖像進(jìn)行處理。

顏色變換類

實(shí)現(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來實(shí)現(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實(shí)例來實(shí)現(xiàn)圖像的上下翻轉(zhuǎn),上下翻轉(zhuǎn)使用的較少。

# 上下翻轉(zhuǎn)
cat2 = tf.image.random_flip_up_down(cat)plt.imshow(cat2)
上下翻轉(zhuǎn)

隨機(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)
隨機(jī)裁剪

顏色變換

另一類增廣方法是顏色變換。我們可以從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)
隨機(jī)變化色調(diào)

使用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, #浮點(diǎn)數(shù)、寬度平移
               height_shift_range=0.0, #浮點(diǎn)數(shù)、高度平移
               brightness_range=None, # 亮度調(diào)整
               shear_range=0.0, # 裁剪
               zoom_range=0.0, #浮點(diǎn)數(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
分享到:
在線咨詢 我要報名
和我們在線交談!