1. 程式人生 > >caffe隨記(七)---訓練和測試自己的圖片

caffe隨記(七)---訓練和測試自己的圖片


前面也介紹了tools工具,今天來試著自己跑一下影象分類的例項

1、下載資料

我沒有用imagenet的資料,因為太大了不想下,而且反正也只是當作例程跑一下而已,所以我用的是另一位博主分享的網盤上的資料,共有500張圖片,分為大巴車、恐龍、大象、鮮花和馬五個類,每個類100張。需要的同學,可到網盤下載:http://pan.baidu.com/s/1nuqlTnN
然後順便帖一發這個博主的那頁部落格以示尊重版權:
http://www.cnblogs.com/denny402/p/5083300.html,
他那個網盤裡的資料似乎重複了以便,其實裡面的那個re資料夾內容是一樣的,刪掉就可以,所以就是re裡面的train和test資料夾留著用就行。


然後我把這個影象資料放在了caffe/data/mytest 資料夾中,至於怎麼拷過去,無非就是用linux的cp或者scp,命令了,百度之。


如圖所示

2、轉換影象格式

我在caffe/examples/中新建了一個資料夾mytest,mkdir  examples/myfile,資料夾用來存放配置和指令碼檔案。

那麼現在開始來建立一個指令碼,生成影象檔名的指令碼清單txt

vim examples/mytest/create_filelist.sh

#!/usr/bin/env sh
DATA=./data/mytest
MYTEST=./examples/mytest

echo "create train.txt ..."
rm -rf $MYTEST/train.txt
for i in 3 4 5 6 7
do
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 |sed "s/$/ $i/">>$MYTEST/train.txt
done
echo "create test.txt..."
rm -rf $MYTEST/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MYTEST/test.txt
done
echo "All done"


之後在當前資料夾下執行如下命令:
chmod u+x create_filelist.sh
這個其實就是改一下許可權什麼的,使得在caffe根目錄能夠執行


然後回到caffe 根目錄執行:
./build/examples/mytest/create_filelist.sh


如果之前那個指令碼沒有出現什麼問題,就會成功得到兩個txt檔案,開啟看一下,我截取了部分內容如下:


然後就又編寫一個指令碼檔案vimcreate_lmdb.sh  來呼叫tools中的工具進行轉換:

#!/usr/bin/env sh
MYTEST=examples/mytest

echo "create train lmdb..."
rm -rf $MYTEST/my_train_lmdb
build/tools/convert_imageset \
-shuffle \
-resize_height=256 \
-resize_width=256 \
/home/Teeyo/caffe/data/mytest/ \
$MYTEST/train.txt \
$MYTEST/my_train_lmdb
echo "train done"

echo "create test lmdb..."
rm -rf $MYTEST/my_test_lmdb
build/tools/convert_imageset \
-shuffle \
-resize_height=256 \
-resize_width=256 \
/home/Teeyo/caffe/data/mytest/ \
$MYTEST/test.txt \
$MYTEST/my_test_lmdb

echo "All done."


然後同樣來一下chmod  u+x create_lmdb.sh使得在caffe目錄下能直接呼叫

在caffe根目錄下執行:

./build/examples/mytest/create_lmdb.sh

如果指令碼沒有問題的話,顯示如下內容


成功轉換

看一下我們的mytest資料夾


那個.binaryproto 的檔案本來是沒有的,因為我寫博文的時候已經執行了下面一個步驟所以才有的。

3、計算均值並儲存

這個工具在上一篇博文我也講過了,直接來用吧

然後就會順利得到我上幅圖中所說的train_mean.binaryproto


4、模型和配置檔案

模型我們就用caffenet,這個模型的描述是在caffe/models目錄下:



就是第三個資料夾bvlc_reference_caffenet,來進去看一下有什麼東西

注:本來是沒有第一個檔案*.caffemodel的,那是我自己下載的model檔案
vim開啟 readme.md,如下所示:


這裡面主要就是提供了caffemodel下載連結:

然後簡述了一下caffenet,這個caffenet其實就是由Alnexnet做了一點小小改動得來,

這幾個改動的細節在裡面詳細描述了,這裡我就略過了,各位自行閱讀

主要是把我需要的solver.prototxt 和train_val.prototxt複製到我的mytest資料夾中去,

cp models/bvlc_reference_caffenet/solver.prototxt   examples/mytest/

cp models/bvlc_reference_caffenet/train_val.prototxt   examples/mytest/

然後到我的mytest資料夾中去修改,不要把別人model裡的修改了哦。


net: "examples/mytest/train_val.prototxt"  //模型網路改了
test_iter: 5                               //test迭代次數改了
test_interval: 20                          //迭代間隔改了
base_lr: 0.001                               
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 10
max_iter: 600                             //最大迭代次數改了
momentum: 0.9
weight_decay: 0.005
solver_mode: GPU
總之做了一些改動

再修改train_val.prototxt
這裡主要修改兩個datalayer 中的meanfile和source兩個路徑

以及train和test的兩個batch_size!!!



-----------------------------------------------------------------------------------------------------這些引數的詳細解讀------------------------------------------------------------------------------------------------------

之前我本來按照提供資料的那個博主的博文來設定的引數。

他的train的batch_size是256,然後我第一次跑的時候就提示了out of memory!

這一般就是batch_size設定大了的問題,跟GPU的效能已經是否在同時跑其他的程式有關,

我那個時候伺服器還有別人在跑另一個很大的例程,所以就只能把batch_size調小一些了、

我的train net的batch_size = 25,考慮到我這裡一共有500個train資料,所以我就把solver 中的 test_interval 設定為20

這樣就剛好能跑完20*25=500張train圖片,這樣就稱為1個epoch

然後我的test net 是 batch_size = 20,考慮到我這裡一共有100個test資料,所以把solver 中的test_iter設定為 5

這樣5*20=100張train圖片,這樣我在1個epoch之內也剛好覆蓋完了所有的test資料

我的max_iter = 500,這樣就一共經過了 500÷20 =25個epoch

這個max_iter 其實是一個需要自己試的引數,過大或者過小都不好,

這個例子中你可以設定為400或者600分別對應20或者30個epoch。區別不是特別大

5、訓練和測試

最後一步就只有一個命令,也是我在之前講過的caffe.bin工具

./build/tools/caffe train --solver=examples/mytest/solver.prototxt

然後就開始訓練和測試了

先把solver中的配置打印出來

然後就是列印train網路和test網路,這個我就不往外貼了,太長了

然後貼一下迭代過程:


可以看到,每隔10次Iteration它列印一次,因為我的solver中的display引數設定的是10

然後只要是20的倍數就會多上幾行,仔細看是Test net的輸出會輸出 accuracy,因為我的test_interval=20,就是每20次train迭代就要進行test

最後500次之後結束


得到caffemodel和sovlerstate