影象資料增強方法一覽(附python程式碼)
在影象分類任務中,影象資料增強一般是大多數人會採用的方法之一,這是由於深度學習對資料集的大小有一定的要求,若原始的資料集比較小,無法很好地滿足網路模型的訓練,從而影響模型的效能,而影象增強是對原始影象進行一定的處理以擴充資料集,能夠在一定程度上提升模型的效能。本文是我目前正在研究一項內容,總結影象資料增強的一些方法及其有效性。本研究的目的是學習如何增加訓練資料集的大小,通過有限或少量資料來訓練獲得具有魯棒性的卷積網路模型。
這項研究要求列出我們可以想到的所有影象增強方法,並列舉出所有這些組合,以嘗試和改善影象分類模型的效能。那麼,能夠想到的一些最簡單的增強方法有翻轉、平移、旋轉、縮放,分離單個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,但實際上,將其送進數字手寫體分類器中,它們並不能被識別為對應的數字。
感謝你閱讀本文,希望你現在知道如何實現對基本資料進行擴充,以改進自己搭建的分類模型!
ofollow,noindex" target="_blank">數十款阿里雲產品限時折扣中,趕緊點選領劵開始雲上實踐吧!
作者資訊
Connor Shorten,對深度學習、演算法理論和生物資訊學感興趣
本文由阿里云云棲社群組織翻譯。
文章原標題《Image Augmentation Examples in Python》,譯者:海棠,審校:Uncle_LLD。
文章為簡譯,更為詳細的內容,請檢視原文 。