ubuntu16.04中gpu版本的caffe-ssd模型訓練與測試

最近把一個ssd網絡的net..prototxt網絡結構和自己生成的hdf5格式數據一起做訓練時發現經常報錯,因爲ssd中一些層在caffe中並沒有實現,需要自己寫相應的.cpp,.cu文件重新編譯,比較麻煩,而大家通常訓練caffe-ssd都是基於原作者公開的代碼訓練的,該代碼中實現了這些層,於是把原作者代碼跑了一遍.

我的機器是ubuntu16.04,裝有兩塊GTX 1080TI 的顯卡,一共20多個G顯存,opencv是自己編譯的3..3.0版本.

因爲我機器主目錄下已經有個裝好的caffe了,所以再次在另一個目錄下載該源碼,該源碼下載後編譯也能import caffe,其他caffe項目也可以使用,如果沒有裝caffe,那就下載編譯這個源碼就能當做caffe使用,同時也能訓練ssd.

1,先進入我這次操作的主目錄(/home/user/yjf),下載源碼

git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd(切換到ssd分支)

這時候我的工作目錄爲 /home/user/yjf/caffe.然後執行如下操作

cp Makefile.config.example Makefile.config

然後參考我前面博客說過的如何搭建caffe環境文章中的說法更改Makefile和Makefile.config文件,並參照裏面提到的方法進行編譯(我感覺caffe不管是cpu還是gpu編譯起來其實很簡單的,我一般30分鐘就能弄好,沒有大家想象中的有難度或者難裝,我用的python2.7,opencv3.3.0,cudnn7.3, cuda8.0,我使用cuda9.0報錯,看來cuda9.0不匹配)

2,下載預訓練模型,這個模型在我們訓練ssd的時候作爲初始化模型,我放在百度雲了,https://pan.baidu.com/s/11JcopVftsLELIUSYmt-8Bw,大家下載即可.下載後放在/home/user/yjf/caffe/models/VGGNet目錄,如果沒有VGGNet目錄就新建一個.

3,下載VOC2007和VOC2012數據集,放到/caffe/data目錄下,並解壓(其實沒多大,幾個G而已)

cd data

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar

tar -xvf VOCtrainval_11-May-2012.tar

tar -xvf VOCtrainval_06-Nov-2007.tar

tar -xvf VOCtest_06-Nov-2007.tar

4,把下載的數據轉成訓練需要的lmdb文件,在/home/user/yjf/caffe目錄下執行

./data/VOC0712/create_list.sh當然,可以會報錯的,打開這個文件,把第一行的root_dir換成root_dir=/home/user/yjf/caffe/data/VOCdevkit(你下載的VOCdevkit在哪裏這個就換成那個目錄就好,其他地方不該)

然後進行重新執行.執行結束後把data/VOC0712/create_data.sh裏面的第七行data_root_dir換成data_root_dir=/home/user/yjf/caffe/data/VOCdevkit(和上面的改法一樣)

然後執行./data/VOC0712/create_data.sh

5.然後在caffe目錄下執行

python examples/ssd/ssd_pascal.py開始ssd訓練,(訓練過程可能報錯SSD from caffe.proto import caffe_pb2 ImportError: No module named caffe.proto,解決:打開 caffe/scripts/create_annoset.py 文件,在from caffe.proto import caffe_pb2這段話之前加上

import sys
sys.path.insert(0,'/home/user/yjf/caffe/python')(這是剛剛安裝的ssd-caffe的目錄下的python目錄)目標是讓程序知道caffe在哪裏.

另外,打開caffe/examples/ssd/ssd_pascal.py,看到gpus='0,1,2,3' 該成gpus='0',是指定訓練使用的gpu,我用的0

訓練過程如下圖

 (題外話:一般caffe需要net.prototxt和solver.prototxt,train.sh三個訓練模型對吧,這次好像沒看到,其實啊,caffe的這些net.prototxt網絡結構文件是一般通過.py文件生成的,該代碼中也是在訓練的代碼中先生成了這些東西,這些東西在/home/user/yjf/caffe/models/VGGNet/VOC0712/SSD_300x300目錄下放着,train.prototxt和test.prototxt就是訓練和測試的網絡結構,同時人家還生成了deploy.prototxt文件,而solver.prototxt中存放了訓練的超參數,snapshot: 8000指定訓練8000個iters保存一次,我嫌棄時間太長,我想100次保存一個先看下結果,不過沒到怎麼改,然後我就等訓練代碼跑起來後在把程序停掉,這樣就生成了這些文件,我直接在solver.prototx文件中改snapshot爲100,然後寫了一個train.sh文件,內容如下:

#!/usr/bin/env sh
set -e

# /home/user/caffe/build/tools/caffe train --solver=./solver.prototxt --gpu 1

/home/user/yjf/caffe/build/tools/caffe train --solver=./solver.prototxt --gpu 1

然後我在caffe/models/VGGNet/VOC0712/SSD_300x300目錄直接執行sh ./tran.sh就開始訓練了,訓練的模型根據指定目錄也在這個目錄,大家可以不用這樣,僅供參考

題外話結束####)

6,測試訓練結果

在caffe目錄執行

python examples/ssd/score_ssd_pascal.py,執行前先在該程序中的import caffe之前加上

import sys
caffe_root = '/home/user/yjf/caffe/'
sys.path.insert(0,caffe_root+'python')


目標是爲了讓程序找到caffe安裝目錄.測試結束如下

Test net outpu的值一般爲0.7左右吧,我這個值低是因爲我剛剛開始訓練,我跑了100個iters就把模型保存起來試了一下,使用效果肯定低,模型需要跑二十多萬個iters這個值就上去了.

源碼提供了在視頻和攝像頭上的測試,

在視頻上測試
python examples/ssd/ssd_pascal_video.py
在攝像頭上測試
python examples/ssd/ssd_pascal_webcam.py如果報錯就按照第6點在代碼中添加caffe的目錄就好

7,預測

caffe目錄執行python examples/ssd/ssd_detect.py --model_weights ../VGG_VOC0712_SSD_300x300_iter_120000.caffemodel(此處爲你訓練的模型地址) --image_files /home/user/yjf/caffe/examples/images/fish-bike.jpg即可在caffe目錄生成一個detect_result.jpg圖片爲檢測結果,預測之前在該代碼開頭部分參照第6點添加caffe目錄,要不然報錯

至此caffe-ssd測試結果,接下來將講解使用直接的數據訓練ssd

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