一:目的
用配置好的Windows版本Caffe(no GPU),使用caffe自帶的ImageNet網絡結構進行訓練和測試。訓練自己的數據;
用caffe團隊採用imagenet圖片進行訓練的參數結果,進行遷移學習;
二:訓練與測試
1. 數據集下載與處理
(1) 下載數據集。這裏找了一份網上的數據集,共有500張圖片,分爲大巴車、恐龍、大象、鮮花和馬五個類,每個類100張。編號分別以3,4,5,6,7開頭,各爲一類。我從其中每類選出20張作爲測試,其餘80張作爲訓練。因此最終訓練圖片400張,測試圖片100張,共5類。
其中,訓練和測試的輸入是用train.txt和val.txt描述的,這些文檔列出所有文件和他們的標籤。下載完成後,文件的組織形式如下。
(2) 在caffe-windows\data文件夾下新建mydata文件夾,在該文件夾分別新建train和test兩個目錄,將下載文件夾中的數據拷貝其中。在這裏,我將3,4,5,6,7文件夾中的數據全部取出放到了train和test文件夾,如圖所示。
(3) 編寫腳本文件,在caffe-windows\data\mydata文件夾下分別生成train.txt和test.txt
import os if __name__ == "__main__": data_dir = 'E:/Caffe/using/caffe-windows/data/mydata/train/' fid = open("E:/Caffe/using/caffe-windows/data/mydata/train2.txt","w") files = os.listdir(data_dir) index = 0 for ii, file in enumerate(files,1): fid.write("{0}{1}\t{2}\n".format("train/",file, int(file[0])-3)) index = index + 1 if index%100 == 0: print("{0} images processed!".format(index)) print("All images processed!") fid.close()
通過上述腳本可以生成對應的train.txt和test.txt(位於caffe-windows\data\mydata文件夾下),文件內容如下
值得注意的是,我在這裏將3,4,5,6,7分類轉成了0,1,2,3,4分類,這是爲了後續train_val.prototxt的修改,這裏也可以按照3,4,5,6,7進行分類,不過後續的內容需要進行相應的調整。(4) 新建caffe-windows\mybat\mydata文件夾,在該文件夾下新建mydata_convention.bat,對數據進行轉換,內容如下
..\..\Build\x64\Release\convert_imageset.exe --resize_height=256 --resize_width=256 --shuffle --backend=leveldb ..\..\data\mydata\ ..\..\data\mydata\train.txt ..\..\data\mydata\trainldb ..\..\Build\x64\Release\convert_imageset.exe --resize_height=256 --resize_width=256 --shuffle --backend=leveldb ..\..\data\mydata\ ..\..\data\mydata\test.txt ..\..\data\mydata\valldb pause
其中,resize_height和resize_width表示將原圖像resize爲相應的大小,選擇256是因爲我們選取的網絡(ImageNet)的要求,shuffle是將數據隨機打亂的意思,backend表示將數據轉換的格式,之前文章介紹過,這裏不再介紹了。雙擊運行後,在caffe-windows\data\mydata下生成對應的trainldb和valldb
(5) 在caffe-windows\mybat\mydata文件夾下新建mydata_mean.bat,生成對應的均值文件。
..\..\Build\x64\Release\compute_image_mean ..\..\data\mydata\trainldb --backend=leveldb ..\..\data\mydata\train_mean.binaryproto ..\..\Build\x64\Release\compute_image_mean ..\..\data\mydata\valldb --backend=leveldb ..\..\data\mydata\val_mean.binaryproto pause
其中backend要與步驟(4)中保持一致,運行完成後,會在caffe-windows\data\mydata文件夾下生成train_mean.binaryproto和val_mean.binaryproto文件
2. 訓練數據
首先將caffe-windows\models\bvlc_reference_caffenet文件夾下的deploy.prototxt、solver.prototxt和train_val.prototxt拷貝到caffe-windows\data\mydata下。
(1) 訓練模型文件(train_val.prototxt)的配置
在這裏對trian文件進行修改,主要有source,batch_size,backend和mean_file,其中batch_size這裏我設置的較小,如果計算機配置較高,可以設大一點,訓練結果會稍微好一些。
在這裏對test文件進行修改,主要有source,batch_size,backend和mean_file。
在文件的最後,對num_output進行修改,因爲我前面將其改爲了0,1,2,3,4分類,所以這裏寫5就可以,因爲它是從0開始計算的,所以如果保留3,4,5,6,7分類,這裏至少要爲8,否則會出錯。其實這裏的1000分類也可以不進行改動,但對應需要調整的地方就是最後的label.txt。
(2) 訓練參數文件(solver.prototxt)的配置
主要修改net,snapshot_prefix和solver_mode三個參數,其餘參數的修改可以參照之前的博客。
(3) 在 caffe-windows\mybat\mydata文件夾下新建mydata_train.bat,對數據進行訓練,內容如下
..\..\Build\x64\Release\caffe.exe train --solver=..\..\data\mydata\solver.prototxt pause
雙擊運行,運行結束後結果如下
可以看到能達到93%的正確率,其實將train_val.prototxt文件中train部分的batch_size改爲256可以達到95%左右的正確率。運行結束後,在caffe-windows\data\mydata文件夾下會生成caffenet_train_iter_500.solverstate和caffenet_train_iter_500.caffemodel文件,其中solvestate文件是狀態恢復文件,如果因爲一些原因我們中斷了訓練,下次想從中斷的地方繼續進行訓練,可以通過--snapshot=xxx.solverstate命令進行繼續訓練。
3. 測試
(1) 修改E:\Caffe\using\caffe-windows\data\mydata\deploy.prototxt文件,因爲我們之前的num_output爲5,這裏也將其改爲5
(2) 在caffe-windows\data\mydata文件夾下新建labels.txt文件,內容爲以上五類目標的英文名。
(3) 在caffe-windows\mybat\mydata文件夾新建mydata_test.bat,對圖像進行測試,內容如下
..\..\Build\x64\Release\classification ..\..\data\mydata\deploy.prototxt ..\..\data\mydata\caffenet_train_iter_500.caffemodel ..\..\data\mydata\val_mean.binaryproto ..\..\data\mydata\labels.txt ..\..\data\mydata\test\500.jpg pause
500.jpg如下
檢測結果如下:
檢測出來的也是大象,finished!
三:遷移學習
有時候我們進行訓練的圖像較少,收斂速度較慢,並且有時候還難以收斂,達不到我們想要的效果。此時,可以利用別的用戶之前訓練好的數據進行fine-tuning,借用訓練好的參數,往往可以更快的收斂,達到較好的訓練效果。在這裏,我們對第二章節的訓練進行遷移學習。
(1) 下載model參數
在這裏,我們選用了一組caffe團隊用imagenet圖片進行訓練,迭代30多萬次,訓練出來的一個model。這個model將圖片分爲1000類,應該是目前爲止最好的圖片分類model了。
下載地址爲:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
文件名稱爲:bvlc_reference_caffenet.caffemodel,文件大小爲230M左右,將這個caffemodel文件下載到caffe-windows\data\mydata文件夾下。
(2) 在caffe-windows\data\mydata文件夾下,將第二章節中用到的train_val.prototxt和solver.prototxt備份一下,分別重命名爲train_val_transform.prototxt和solver_transform.prototxt。
在train_val_transform.prototxt中,修改其fc8層爲fc8_re,在solver_transform.prototxt,修改對應的train_val_transform.prototxt路徑
(3) 在caffe-windows\mybat\mydata文件夾下新建mydata_train_with_weights.bat,內容如下
..\..\Build\x64\Release\caffe.exe train --solver=..\..\data\mydata\solver_transform.prototxt --weights=..\..\data\mydata\bvlc_reference_caffenet.caffemodel pause
雙擊運行即可,可以看出來,收斂速度較快
運行結束後同樣在caffe-windows\data\mydata文件夾下生成caffenet_train_iter_500.solverstate和caffenet_train_iter_500.caffemodel文件
準確率達到了1,也可能跟我們的測試數據不多有關係,不過準確率的確提高了不少。
(4) 測試
備份caffe-windows\data\mydata\deploy.prototxt,將備份文件重命名爲caffe-windows\data\mydata\deploy_transform.prototxt,修改其對應的name爲fc8_re
在caffe-windows\mybat\mydata文件夾下新建mydata_test_transform.bat,內容如下
..\..\Build\x64\Release\classification ..\..\data\mydata\deploy_transform.prototxt ..\..\data\mydata\caffenet_train_iter_500.caffemodel ..\..\data\mydata\val_mean.binaryproto ..\..\data\mydata\labels.txt ..\..\data\mydata\test\500.jpg pause
測試準確率更高!
finished! enjoy!
參考: