在訓練圖像識別的深度神經網絡時,使用大量更多的訓練數據,可能會使網絡得到更好的性能,例如提高網絡的分類准確率,防止過擬合等。獲取更多的訓練樣本其實是很好的想法。但是,這個方法的代價很大,在實踐中常常是很難達到的。不過還有一種方法能夠獲得類似的效果,那就是人為擴展訓練數據(Artificially expanding the training data)。
對於圖像數據我們可以通過旋轉,轉換,扭曲圖像等方式來擴展訓練數據,人為擴展訓練數據時對數據的操作最好能反映真實世界的變化。例如在2003年Patrice Simard等人所著的一篇論文中[1]他們把MNIST手寫數字數據集通過旋轉,轉換和扭曲進行擴展。通過在這個擴展后的數據集上的訓練,他們把MNIST手寫數字識別的准確率提升到了98.9%。然后還在“彈性扭曲”的數據集上進行了實驗,這是一種特殊的為了模仿手部肌肉的隨機抖動的圖像扭曲方法。通過使用彈性扭曲擴展的數據,他們最終達到了99.3%的分類准確率。
本文會先對兩個類別圖像數據進行不同形式的拓展,然后用拓展后的兩個類別的數據在超參數調整穩定的深度神經網絡上訓練,用得到的分類准確率和未拓展的數據訓練得到的分類准確率做對比。如果分類准確率有明顯的提升,說明我們對數據所做的拓展操作是良性的,能夠“反映真實世界的變化”,就會被用到整個數據集的擴展。反之,則說明不能用此操作對數據集進行拓展。
當然,我們選擇的圖像操作也是有一定的現實意義的。由於原有數據集中的圖像是漁船的監控畫面圖像,通過對大部分圖像的觀察我們考慮下面幾種圖像操作的方式作為人為擴展訓練數據集的方法。當然這些方法只是我們最初的選擇,而這些選擇只是根據我對數據集的初級理解,方法的正確與否我們還要經過試驗來進行判斷。
1.鏡像翻轉:可以很清楚的看到圖像上下翻轉肯定是行不通的,所以我們選擇圖像的左右翻轉作為第一種擴展數據集的方法。
2.添加椒鹽噪聲:可以給圖像添加一些椒鹽噪聲來擴展數據。
鏡像翻轉
python 代碼:
#coding=utf-8 import os from PIL import Image import matplotlib.pyplot as plt dictOfFish={ 'ALB':'110000', 'BET':'210000', } for key in dictOfFish: a=os.listdir("./origin/"+key) count=1 for x in a: oldname="./origin/"+key+"/"+x img=Image.open(oldname) dst=img.transpose(Image.FLIP_LEFT_RIGHT)#左右互換 newname="./transpose"+"/"+key+"/"+str(int(dictOfFish[key])+count)+".jpg" dst.save(newname) count+=1
給圖像添加椒鹽噪聲
python代碼:
#coding=utf-8 import os from PIL import Image import numpy as np import matplotlib.pyplot as plt dictOfFish={ 'ALB':'120000', 'BET':'220000' } for key in dictOfFish: a=os.listdir("./origin/"+key) count=1 for dirx in a: oldname="./origin/"+key+"/"+dirx img=np.array(Image.open(oldname)) #隨機生成5000個椒鹽 rows,cols,dims=img.shape for i in xrange(5000): x=np.random.randint(0,rows) y=np.random.randint(0,cols) img[x,y,:]=255 img.flags.writeable = True # 將數組改為讀寫模式 dst=Image.fromarray(np.uint8(img)) newname="./transpose+30"+"/"+key+"/"+str(int(dictOfFish[key])+count)+".jpg" dst.save(newname) count+=1