在訓練圖像識別的深度神經網絡時,使用大量更多的訓練數據,可能會使網絡獲得更好的性能,例如提升網絡的分類準確率,防止過擬合等。獲取更多的訓練樣本實際上是很好的想法。可是,這個方法的代價很大,在實踐中經常是很難達到的。不過還有一種方法可以得到相似的效果,那就是人爲擴展訓練數據(Artificially expanding the training data)。python
對於圖像數據咱們能夠經過旋轉,轉換,扭曲圖像等方式來擴展訓練數據,人爲擴展訓練數據時對數據的操做最好能反映真實世界的變化。例如在2003年Patrice Simard等人所著的一篇論文中[1]他們把MNIST手寫數字數據集經過旋轉,轉換和扭曲進行擴展。經過在這個擴展後的數據集上的訓練,他們把MNIST手寫數字識別的準確率提高到了98.9%。而後還在「彈性扭曲」的數據集上進行了實驗,這是一種特殊的爲了模仿手部肌肉的隨機抖動的圖像扭曲方法。經過使用彈性扭曲擴展的數據,他們最終達到了99.3%的分類準確率。數組
本文會先對兩個類別圖像數據進行不一樣形式的拓展,而後用拓展後的兩個類別的數據在超參數調整穩定的深度神經網絡上訓練,用獲得的分類準確率和未拓展的數據訓練獲得的分類準確率作對比。若是分類準確率有明顯的提高,說明咱們對數據所作的拓展操做是良性的,可以「反映真實世界的變化」,就會被用到整個數據集的擴展。反之,則說明不能用此操做對數據集進行拓展。網絡
固然,咱們選擇的圖像操做也是有必定的現實意義的。因爲原有數據集中的圖像是漁船的監控畫面圖像,經過對大部分圖像的觀察咱們考慮下面幾種圖像操做的方式做爲人爲擴展訓練數據集的方法。固然這些方法只是咱們最初的選擇,而這些選擇只是根據我對數據集的初級理解,方法的正確與否咱們還要通過試驗來進行判斷。dom
1.鏡像翻轉:能夠很清楚的看到圖像上下翻轉確定是行不通的,因此咱們選擇圖像的左右翻轉做爲第一種擴展數據集的方法。性能
2.添加椒鹽噪聲:能夠給圖像添加一些椒鹽噪聲來擴展數據。ui
python 代碼:spa
#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代碼:code
#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