1. 程式人生 > >影象資料增強實戰

影象資料增強實戰

 by 小韓 (翻譯自:https://towardsdatascience.com/image-augmentation-examples-in-python-d552c26f2873)

我目前正在做影象資料增強的深度和有效性的研究。 這項研究的目的是學習怎樣增加只有有限或少量資料的資料集大小,增強訓練的卷積網路模型的魯棒性。

需要列出所有可以想到的影象增強的方法,並將這些方法進行組合,嘗試和改善影象分類模型的效能。 一些較簡單的增強方法有翻轉,平移,旋轉,縮放,分離r,g,b顏色通道和新增噪聲。 更好一些的增強方法是生成對抗網路模型,有時交替使用遺傳演算法和生成對抗網路。 還有一些創造性的方法,比如將 Instagram 樣式的高亮濾鏡應用於影象,應用隨機區域銳化濾鏡,以及基於聚類技術新增平均影象。 本文將介紹怎樣使用 NumPy 對影象進行擴充。

下面列出了一些擴充技術的說明,如果你能想到任何其他方法來增強影象,提高影象分類器的質量,請留言一起討論。

增強

所有的程式碼都沒有使用 OpenCV 庫,只使用了 Numpy。

 

載入影象

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

翻轉影象是最流行的影象資料增強方法之一。 這主要是由於翻轉影象的程式碼比較簡單,而且對於大多數問題而言,翻轉影象會增強模型的效能。 下面的模型可以被認為是看到左鞋而不是右鞋,因此通過這種資料增加,模型對於看到鞋的潛在變化變得更加有魯棒性。

用 Numpy 翻轉

flipped_img = np.fliplr(img)

plt.imshow(flipped_img)

plt.show()

 

平移(Translations

很容易想象使用目標檢測的分類器進行平移可以增加它的效能。 好像這個分類模型試圖檢測鞋子何時在影象中而不是是否在影象中。 平移操作將有助於它看不到整個鞋子的情況下檢測出鞋子。

向左平移

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()

向右平移

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()

向上平移

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()

向下平移

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

噪聲是一種有趣的增強技術,我開始對這類操作變得更加熟悉。 我已經看過很多有趣的關於對抗網路訓練的論文,將一些噪聲加入到影象中,模型便無法正確分類。 我仍然在尋找能產生比下圖更好的新增噪聲的方法。 新增噪聲可能使畸變更明顯,並使模型更加穩健。

新增噪聲

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資料集生成的一些影象。

正如上圖看到的那樣,它們看起來確實像3,7和9。 我想擴充套件網路結構來支援的300x300x3尺寸的輸出,而不是28x28x1 MNIST的數字,但是遇到了一些麻煩。 但是,我對這項研究感到非常興奮,並期待繼續這項研究!

感謝您閱讀本文,希望您現在知道如何實現基本的資料擴充以改進您的分類模型!