下載caffeNet模型
下載的caffe-master文件中,/models/bvlc_reference_caffenet 文件夾不包含bvlc_reference_caffenet.caffemodel,下載地址:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel 也可以用腳本方式下載。
準備數據—生成lmdb/leveldb
我在這裏使用的是bat命令行的方式,也有很多博主上使用shell文件(create_imagenet.sh)。使用sh文件網上也已經有很多的代碼,在Windows系統命令行中,可在命令行執行sh create_imagenet.sh
如果要使用.bat文件,代碼:
SET GLOG_logtostderr=1
D:/CAFFE/caffe-master/Build/x64/Release/convert_imageset.exe --resize_width=200 --resize_height=200 --shuffle --backend=lmdb D:/CAFFE/caffe-master/examples/hello_caffe/data/train/ D:/CAFFE/caffe-master/examples/hello_caffe/train.txt D:/CAFFE/caffe-master/examples/hello_caffe/train_lmdb
D:/CAFFE/caffe-master/Build/x64/Release/convert_imageset.exe --shuffle --backend=lmdb D:/CAFFE/caffe-master/examples/hello_caffe/data/val/ D:/CAFFE/caffe-master/examples/hello_caffe/val.txt D:/CAFFE/caffe-master/examples/hello_caffe/val_lmdb
pause
這裏我使用的是絕對路徑,需要的東西有:(按順序)
convert_imageset.exe轉換圖像爲lmdb/leveldb格式
訓練數據集位置:D:/CAFFE/caffe-master/examples/hello_caffe/data/train/
訓練數據集標籤:D:/CAFFE/caffe-master/examples/hello_caffe/train.txt
訓練數據集lmdb文件存放位置:D:/CAFFE/caffe-master/examples/hello_caffe/train_lmdb
同理,測試數據集轉換需要:convert_imageset.exe、測試數據集位置、lmdb文件存放位置。
--resize_width –resize_height設置圖像的寬度和高度
--shuffle 打亂數據順序,不然lossaccuracy曲線會震盪
--backend 生成數據的格式,代碼中爲生成lmdb格式,如果要生成leveldb也可以改爲leveldb
注:如果生成失敗,需要將已經生成的lmdb文件夾刪除,不然會報錯
計算圖像均值
計算圖像均值使用的是compute_image_mean.exe
D:/CAFFE/caffe-master/Build/x64/Release/compute_image_mean.exe --backend=lmdb D:/CAFFE/caffe-master/examples/hello_caffe/train_lmdb D:/CAFFE/caffe-master/examples/hello_caffe/mean.binaryproto
Pause
compute_image_mean.exe 計算圖像均值
訓練數據集的位置: D:/CAFFE/caffe-master/examples/hello_caffe/train_lmdb
生成均值文件及位置: D:/CAFFE/caffe-master/examples/hello_caffe/mean.binaryproto
--backend 輸入文件類型
網絡定義
選擇你要用的網絡模型,我這裏用的是caffenet,複製原來的train_val.prototext、solver.prototxt、deploy.prototxt到你要建模型的位置,修改相應參數:
train_val.prototext修改:
設置訓練數據和測試數據的相應位置以及全連接層輸出。
原來的caffenet能夠輸出1000個類別,但我只需要輸出9個類別。在num_output位置設爲9,即網絡輸出類別數量。(TIPS:修改輸出標籤數量,需要修改全連接層的名稱,在這裏我加上了_new,例如fc6改爲fc6_new。否則會在自己分類時,出現<9 vs 1000>之類的錯誤)
訓練模型
D:/CAFFE/caffe-master/Build/x64/Release/caffe.exe train -solver=D:/CAFFE/caffe-master/examples/hello_caffe/caffemodel/solver.prototxt --weights D:/CAFFE/caffe-master/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel
Pause
Caffe.exe 調用caffe
solver.prototxt 設置輸入網絡配置
bvlc_reference_caffenet.caffemodel 需要調整的網絡模型
solver.Prototxt修改net和snapshot_prefix兩個位置,根據需要修改迭代次數、訓練模式等等,以下爲solver.prototxt文件:
net: "D:/CAFFE/caffe-master/examples/hello_caffe/caffemodel/train_val.prototxt"
test_iter: 6
test_interval: 20
base_lr: 0.001
lr_policy: "fixed"
gamma: 0.1
stepsize: 100000
display: 20
max_iter: 4000
momentum: 0.9
weight_decay: 0.0005
snapshot: 1000
snapshot_prefix: "D:/CAFFE/caffe-master/models/bvlc_reference_caffenet/caffenet_train"
solver_mode: GPU
運行bat文件後,就生成了model文件:
測試生成的模型
D:/CAFFE/caffe-master/Build/x64/Release/classification.exe D:/CAFFE/caffe-master/examples/hello_caffe/caffemodel/deploy.prototxt D:/CAFFE/caffe-master/examples/hello_caffe/caffemodel/11.20/caffenet_train_iter_4000.caffemodel D:/CAFFE/caffe-master/examples/hello_caffe/mean.binaryproto D:/CAFFE/caffe-master/examples/hello_caffe/label.txt D:/CAFFE/dataset/12class_tif/water/0186.tif
Pause
我是參照mnist數據集的分類寫出來的,其中:
classification.exe爲分類器
deploy.Prototxt文件: 將caffe-master/models/bvlc_reference_caffenet目錄下的deploy.Prototxt複製修改,這裏改了輸出層的標籤數量(num_output)和全卷積層名稱(與前面的train_val.prototxt文件全卷積層名稱一致)。
caffenet_train_iter_4000.caffemodel:爲訓練生成的模型
label.txt:類別對應的標籤,輸出了9個類別,分別設置每一個類別對應的標籤(根據自己需要,可以爲字符串)
0186.tif:測試的圖像
結果展示
分類結果,得到該圖像爲水體的概率爲0.9999,爲harbor的概率爲0.0001