在圖像分類任務中,圖像資料增強一般是大多數人會采用的方法之一,這是由于深度學習對資料集的大小有一定的要求,若原始的資料集比較小,無法很好地滿足網絡模型的訓練,進而影響模型的性能,而圖像增強是對原始圖像進行一定的處理以擴充資料集,能夠在一定程度上提升模型的性能。本文是我目前正在研究一項内容,總結圖像資料增強的一些方法及其有效性。本研究的目的是學習如何增加訓練資料集的大小,通過有限或少量資料來訓練獲得具有魯棒性的卷積網絡模型。
這項研究要求列出我們可以想到的所有圖像增強方法,并列舉出所有這些組合,以嘗試和改善圖像分類模型的性能。那麼,能夠想到的一些最簡單的增強方法有翻轉、平移、旋轉、縮放,分離單個r、g、b三個顔色通道以及添加噪聲。更激動人心的增強方法是比較熱門的使用生成對抗網絡模型,有時交替使用遺傳算法和生成對抗網絡。此外,還提出了一些創造性方法,例如将類似于Instagram中的高亮濾鏡應用于圖像、應用随機區域銳化濾鏡,以及基于聚類技術添加平均圖像等。本文将展示如何使用NumPy對圖像進行擴充。
下面是上述提到的增強技術的總結及說明,如果你能想到其它任何方法來增強圖像,并可以提高圖像分類器的性能,請在留言區評論。

增強
所有的資料增強都是在沒有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
對圖像進行翻轉是最流行的圖像資料增強方法之一。這主要是由于翻轉圖像操作的代碼簡單,以及對于大多數問題而言,對圖像進行翻轉操作能夠提升模型的性能。下面的模型可以被認為是看到左鞋而不是右鞋,是以通過這種資料增加,模型對于看到鞋的潛在變化會變得更加魯棒。
# Flipping images with Numpy
flipped_img = np.fliplr(img)
plt.imshow(flipped_img)
plt.show()
平移|Translations
很容易想象對完成檢測任務的分類器進行平移增強能夠提升其性能,好像這個分類模型試圖檢測鞋子何時在圖像中而不是是否在圖像中。這些平移操作将有助于它在無法看清整個鞋子的情況下認出鞋子來。
左移
# 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()
右移
# 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()
上移
# 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()
下移
#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
對圖像加噪音是一種有趣的圖像增強技術,現在我開始對這類操作變得更加熟悉。我已經看過很多關于對抗網絡訓練的有趣論文,當将一些噪音加入到圖像後,模型無法對圖像進行正确分類。我仍然在尋找能産生比下圖更好的加噪方法。添加噪聲可能有助于使得畸變更加明顯,并使得模型更加魯棒。
加噪
# 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資料集生成的一些圖像。
GAN生成圖像
正如我們從上圖中看到的,它們确實看起來像數字3、7和9,但實際上,将其送進數字手寫體分類器中,它們并不能被識别為對應的數字。
感謝你閱讀本文,希望你現在知道如何實作對基本資料進行擴充,以改進自己搭建的分類模型!
作者資訊
Connor Shorten,對深度學習、算法理論和生物資訊學感興趣
本文由阿裡雲雲栖社群組織翻譯。
文章原标題《Image Augmentation Examples in Python》,譯者:海棠,審校:Uncle_LLD。
文章為簡譯,更為詳細的内容,
請檢視原文。