學(xué)習(xí)caffe的目的,,不是簡(jiǎn)單的做幾個(gè)練習(xí),最終還是要用到自己的實(shí)際項(xiàng)目或科研中,。因此,,本文介紹一下,從自己的原始圖片到lmdb數(shù)據(jù),,再到訓(xùn)練和測(cè)試模型的整個(gè)流程,。 一、準(zhǔn)備數(shù)據(jù) 有條件的同學(xué),,可以去imagenet的官網(wǎng)http://www./download-images,,下載imagenet圖片來(lái)訓(xùn)練。但是我沒(méi)有下載,,一個(gè)原因是注冊(cè)賬號(hào)的時(shí)候,,驗(yàn)證碼始終出不來(lái)(聽(tīng)說(shuō)是google網(wǎng)站的驗(yàn)證碼,而我是上不了google的),。第二個(gè)原因是數(shù)據(jù)太大了,。,。。 我去網(wǎng)上找了一些其它的圖片來(lái)代替,,共有500張圖片,,分為大巴車(chē)、恐龍,、大象,、鮮花和馬五個(gè)類(lèi),,每個(gè)類(lèi)100張,。需要的同學(xué),可到我的網(wǎng)盤(pán)下載:http://pan.baidu.com/s/1nuqlTnN 編號(hào)分別以3,,4,5,,6,,7開(kāi)頭,各為一類(lèi),。我從其中每類(lèi)選出20張作為測(cè)試,,其余80張作為訓(xùn)練,。因此最終訓(xùn)練圖片400張,測(cè)試圖片100張,,共5類(lèi),。我將圖片放在caffe根目錄下的data文件夾下面。即訓(xùn)練圖片目錄:data/re/train/ ,測(cè)試圖片目錄: data/re/test/ 二,、轉(zhuǎn)換為lmdb格式 具體的轉(zhuǎn)換過(guò)程,,可參見(jiàn)我的前一篇博文:Caffe學(xué)習(xí)系列(11):圖像數(shù)據(jù)轉(zhuǎn)換成db(leveldb/lmdb)文件 首先,在examples下面創(chuàng)建一個(gè)myfile的文件夾,,來(lái)用存放配置文件和腳本文件,。然后編寫(xiě)一個(gè)腳本create_filelist.sh,用來(lái)生成train.txt和test.txt清單文件 # sudo mkdir examples/myfile # sudo vi examples/myfile/create_filelist.sh 編輯此文件,,寫(xiě)入如下代碼,,并保存 #!/usr/bin/env sh DATA=data/re/ MY=examples/myfile 然后,運(yùn)行此腳本 # sudo sh examples/myfile/create_filelist.sh 成功的話(huà),,就會(huì)在examples/myfile/ 文件夾下生成train.txt和test.txt兩個(gè)文本文件,里面就是圖片的列表清單,。 接著再編寫(xiě)一個(gè)腳本文件,,調(diào)用convert_imageset命令來(lái)轉(zhuǎn)換數(shù)據(jù)格式,。 # sudo vi examples/myfile/create_lmdb.sh 插入: #!/usr/bin/env sh MY=examples/myfile echo "Create train lmdb.." rm -rf $MY/img_train_lmdb build/tools/convert_imageset --shuffle --resize_height=256 --resize_width=256 /home/xxx/caffe/data/re/ $MY/train.txt $MY/img_train_lmdb echo "Create test lmdb.." rm -rf $MY/img_test_lmdb build/tools/convert_imageset --shuffle --resize_width=256 --resize_height=256 /home/xxx/caffe/data/re/ $MY/test.txt $MY/img_test_lmdb echo "All Done.." 因?yàn)閳D片大小不一,因此我統(tǒng)一轉(zhuǎn)換成256*256大小,。運(yùn)行成功后,,會(huì)在 examples/myfile下面生成兩個(gè)文件夾img_train_lmdb和img_test_lmdb,分別用于保存圖片轉(zhuǎn)換后的lmdb文件,。 三,、計(jì)算均值并保存 圖片減去均值再訓(xùn)練,會(huì)提高訓(xùn)練速度和精度,。因此,,一般都會(huì)有這個(gè)操作。 caffe程序提供了一個(gè)計(jì)算均值的文件compute_image_mean.cpp,,我們直接使用就可以了 # sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto compute_image_mean帶兩個(gè)參數(shù),,第一個(gè)參數(shù)是lmdb訓(xùn)練數(shù)據(jù)位置,第二個(gè)參數(shù)設(shè)定均值文件的名字及保存路徑,。 四,、創(chuàng)建模型并編寫(xiě)配置文件 模型就用程序自帶的caffenet模型,,位置在 models/bvlc_reference_caffenet/文件夾下, 將需要的兩個(gè)配置文件,復(fù)制到myfile文件夾內(nèi) # sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/ # sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/ 修改其中的solver.prototxt # sudo vi examples/myfile/solver.prototxt net: "examples/myfile/train_val.prototxt" test_iter: 2 test_interval: 50 base_lr: 0.001 lr_policy: "step" gamma: 0.1 stepsize: 100 display: 20 max_iter: 500 momentum: 0.9 weight_decay: 0.005 solver_mode: GPU 100個(gè)測(cè)試數(shù)據(jù),,batch_size為50,,因此test_iter設(shè)置為2,就能全cover了,。在訓(xùn)練過(guò)程中,,調(diào)整學(xué)習(xí)率,逐步變小,。 修改train_val.protxt,,只需要修改兩個(gè)階段的data層就可以了,其它可以不用管,。 name: "CaffeNet" layer { name: "data" type: "Data" top: "data" top: "label" include { phase: TRAIN } transform_param { mirror: true crop_size: 227 mean_file: "examples/myfile/mean.binaryproto" } data_param { source: "examples/myfile/img_train_lmdb" batch_size: 256 backend: LMDB } } layer { name: "data" type: "Data" top: "data" top: "label" include { phase: TEST } transform_param { mirror: false crop_size: 227 mean_file: "examples/myfile/mean.binaryproto" } data_param { source: "examples/myfile/img_test_lmdb" batch_size: 50 backend: LMDB } } 實(shí)際上就是修改兩個(gè)data layer的mean_file和source這兩個(gè)地方,,其它都沒(méi)有變化 。 五,、訓(xùn)練和測(cè)試 如果前面都沒(méi)有問(wèn)題,,數(shù)據(jù)準(zhǔn)備好了,配置文件也配置好了,,這一步就比較簡(jiǎn)單了,。 # sudo build/tools/caffe train -solver examples/myfile/solver.prototxt 運(yùn)行時(shí)間和最后的精確度,會(huì)根據(jù)機(jī)器配置,參數(shù)設(shè)置的不同而不同,。我的是gpu+cudnn運(yùn)行500次,,大約8分鐘,精度為95%,。
|
|