Caffe-Windows訓練自己數據 + 遷移學習

一:目的

用配置好的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!


參考:

Caffe訓練自己數據官方指導

如何將別人訓練好的model用到自己的數據上

Caffe學習:Caffe下用自己的數據訓練和測試過程詳解  

在caffe上跑自己的數據

caffe簡易上手指南(二)—— 訓練我們自己的數據

windows-caffe入門之用CPU訓練自己的數據

caffe調用之前的權重和接着斷點繼續訓練




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章