天天看點

圖像資料增強方法一覽(附python代碼)

       在圖像分類任務中,圖像資料增強一般是大多數人會采用的方法之一,這是由于深度學習對資料集的大小有一定的要求,若原始的資料集比較小,無法很好地滿足網絡模型的訓練,進而影響模型的性能,而圖像增強是對原始圖像進行一定的處理以擴充資料集,能夠在一定程度上提升模型的性能。本文是我目前正在研究一項内容,總結圖像資料增強的一些方法及其有效性。本研究的目的是學習如何增加訓練資料集的大小,通過有限或少量資料來訓練獲得具有魯棒性的卷積網絡模型。

       這項研究要求列出我們可以想到的所有圖像增強方法,并列舉出所有這些組合,以嘗試和改善圖像分類模型的性能。那麼,能夠想到的一些最簡單的增強方法有翻轉、平移、旋轉、縮放,分離單個r、g、b三個顔色通道以及添加噪聲。更激動人心的增強方法是比較熱門的使用生成對抗網絡模型,有時交替使用遺傳算法和生成對抗網絡。此外,還提出了一些創造性方法,例如将類似于Instagram中的高亮濾鏡應用于圖像、應用随機區域銳化濾鏡,以及基于聚類技術添加平均圖像等。本文将展示如何使用NumPy對圖像進行擴充。

       下面是上述提到的增強技術的總結及說明,如果你能想到其它任何方法來增強圖像,并可以提高圖像分類器的性能,請在留言區評論。

圖像資料增強方法一覽(附python代碼)
原始圖像

增強

       所有的資料增強都是在沒有OpenCV庫的情況下,使用Numpy完成。

# Image Loading Code used for these examples
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img = Image.open('./NIKE.png')
img = np.array(img)
plt.imshow(img)
plt.show()           

翻轉|Flipping

       對圖像進行翻轉是最流行的圖像資料增強方法之一。這主要是由于翻轉圖像操作的代碼簡單,以及對于大多數問題而言,對圖像進行翻轉操作能夠提升模型的性能。下面的模型可以被認為是看到左鞋而不是右鞋,是以通過這種資料增加,模型對于看到鞋的潛在變化會變得更加魯棒。

圖像資料增強方法一覽(附python代碼)
# Flipping images with Numpy
flipped_img = np.fliplr(img)
plt.imshow(flipped_img)
plt.show()           

平移|Translations

       很容易想象對完成檢測任務的分類器進行平移增強能夠提升其性能,好像這個分類模型試圖檢測鞋子何時在圖像中而不是是否在圖像中。這些平移操作将有助于它在無法看清整個鞋子的情況下認出鞋子來。

圖像資料增強方法一覽(附python代碼)

左移

# Shifting Left
for i in range(HEIGHT, 1, -1):
  for j in range(WIDTH):
     if (i < HEIGHT-20):
       img[j][i] = img[j][i-20]
     elif (i < HEIGHT-1):
       img[j][i] = 0
plt.imshow(img)
plt.show()           
圖像資料增強方法一覽(附python代碼)

右移

# Shifting Right
for j in range(WIDTH):
  for i in range(HEIGHT):
    if (i < HEIGHT-20):
      img[j][i] = img[j][i+20]
plt.imshow(img)
plt.show()           
圖像資料增強方法一覽(附python代碼)

上移

# Shifting Up
for j in range(WIDTH):
  for i in range(HEIGHT):
    if (j < WIDTH - 20 and j > 20):
      img[j][i] = img[j+20][i]
    else:
      img[j][i] = 0
plt.imshow(img)
plt.show()           
圖像資料增強方法一覽(附python代碼)

下移

#Shifting Down
for j in range(WIDTH, 1, -1):
  for i in range(278):
    if (j < 144 and j > 20):
      img[j][i] = img[j-20][i]
plt.imshow(img)
plt.show()           

加噪|Noise

       對圖像加噪音是一種有趣的圖像增強技術,現在我開始對這類操作變得更加熟悉。我已經看過很多關于對抗網絡訓練的有趣論文,當将一些噪音加入到圖像後,模型無法對圖像進行正确分類。我仍然在尋找能産生比下圖更好的加噪方法。添加噪聲可能有助于使得畸變更加明顯,并使得模型更加魯棒。

圖像資料增強方法一覽(附python代碼)

加噪

# ADDING NOISE
noise = np.random.randint(5, size = (164, 278, 4), dtype = 'uint8')

for i in range(WIDTH):
    for j in range(HEIGHT):
        for k in range(DEPTH):
            if (img[i][j][k] != 255):
                img[i][j][k] += noise[i][j][k]
plt.imshow(img)
plt.show()
           

生成對抗網絡|GAN:

       我閱讀了很多關于生成對抗網絡的文獻,文獻中很多都使用生成對抗網絡進行資料增強,我對此也比較感興趣,下面是我使用MNIST資料集生成的一些圖像。

圖像資料增強方法一覽(附python代碼)

GAN生成圖像

       正如我們從上圖中看到的,它們确實看起來像數字3、7和9,但實際上,将其送進數字手寫體分類器中,它們并不能被識别為對應的數字。

       感謝你閱讀本文,希望你現在知道如何實作對基本資料進行擴充,以改進自己搭建的分類模型!

作者資訊

Connor Shorten,對深度學習、算法理論和生物資訊學感興趣

本文由阿裡雲雲栖社群組織翻譯。

文章原标題《Image Augmentation Examples in Python》,譯者:海棠,審校:Uncle_LLD。

文章為簡譯,更為詳細的内容,

請檢視原文