SSD的配置及執行
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd(出現“分支”則說明copy-check成功)
- 1
- 2
- 3
- 進入下載好的caffe目錄,複製配置檔案
cd /home/usrname/caffe
cp Makefile.config.example Makefile.config
- 1
- 2
- 1
- 2
- 編譯caffe三部曲
make all -j16 //-j16根據本機的處理器配置,16是16核處理器的意思
make test -j16
make runtest -j16(這一步不是必須的)
- 1
- 2
- 3
- 1
- 2
- 3
- 額外編譯,根據需要(因為SSD利用python完成,需編譯pycaffe)
make pycaffe -j16
準備工作
-
下載VOC2007和VOC2012資料集,放到/home/data下。(請注意,這裡改變了目錄)
cd ..
mkdir data
cd data/
- 1
- 2
- 3
- 1
- 2
- 3
- 下載資料集
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
- 1
- 2
- 3
- 1
- 2
- 3
- 資料集解壓
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
- 1
- 2
- 3
- 1
- 2
- 3
- 將圖片轉化為LMDB檔案,用於訓練
cd ..
cd caffe/
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 這裡用的指令碼實現批處理,可能會出現:no module named caffe等錯誤,這是由於caffe的Python環境變數未配置好,可按照下面方法解決:
echo "export PYTHONPATH=/home/usrname/caffe/python" >> ~/.profile
source ~/.profile
echo $PYTHONPATH #檢查環境變數的值
訓練模型
- 在下載的caffe根目錄執行如下命令訓練,在examples/ssd下存在幾個.py檔案,訓練的時間較長,迭代60000次,博主訓練了一天!
python examples/ssd/ssd_pascal.py
- 1
- 1
實驗效果
(1)在圖片測試集上測試
python examples/ssd/score_ssd_pascal.py
- 1
- 1
利用它跑了一遍資料集,得出準確率可以達到百分之70多
(2)在視訊上測試
python examples/ssd/ssd_pascal_video.py
- 1
- 1
利用師兄的行人視訊做了測試,實時性高,但是漏檢率蠻嚴重的,這是不可避免的
當然,直接跑是他自帶的視訊,想跑自己的程式碼的話,要先用vim開啟該檔案,定位到51行,修改視訊路徑為已有本地視訊,這樣就可以暢快的跑自己的視訊
(3)在攝像頭上測試
python examples/ssd/ssd_pascal_webcam.py
- 1
- 1
博主移植到桌上型電腦上出現了問題,還沒有改好bug,改好了會分享給大家
後期工作
- 研究SSD的python原始碼,用來訓練和檢測交通標誌\文字檢測,人臉檢測等等
作者給定的預訓練模型
如果沒有好的機器配置或者省事一些的,可以使用作者給出的訓練好的模型:
最近一直在搞object detection玩,之前用的是faster-rcnn,準確率方面73.2%,效果還不錯,但是識別速度有點欠缺,我用的GPU是GTX980ti, 識別速度大概是15fps.最近發現SSD(single shot multibox detector) 這篇論文效果和速度都不錯,我自己實驗了一下,速度確實比faster-rcnn快不少。下面分兩部分來介紹。第一部分介紹SSD的安裝,第二部分介紹如何基於SSD訓練自己的資料集。
- 1
- 2
- 3
- 1
- 2
- 3
第二部分 訓練自己的資料集
caffe/models/VGGNet/
- 1
- 1
下載VOC2007和VOC2012資料集, 放在/data目錄下:
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
建立lmdb格式的資料:
cd caffe
./data/VOC0712/create_list.sh
# It will create lmdb files for trainval and test with encoded original image:
# - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb
# - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb
./data/VOC0712/create_data.sh
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
訓練和測試:
python examples/ssd/ssd_pascal.py
- 1
- 2
- 1
- 2
論文中,作者已經預訓練好模型,下載連結:http://www.cs.unc.edu/%7Ewliu/projects/SSD/models_VGGNet_VOC0712_SSD_300x300.tar.gz,我們不必自己再去訓練,
下載完成後放入指定的資料夾下。
測試時,我們使用/example/ssd/目錄裡的ssd_detect.ipynb,執行這個檔案,需要安裝ipython及ipython-notebook, 或者直接把裡面的程式碼拷貝出來,寫到一個新的python檔案裡,比如命名ssd_detector.py.
OK, 下面修改一系列檔案來訓練自己的資料集
兩種方案, 第一:保持原來的檔案目錄結構及檔名不變, 只替換裡面的資料。第二:重新新建一個與之前類似的目錄結構,改成自己命名的資料夾,第二種方法,有一定的風險性,需要修改程式裡涉及資料路徑的程式碼。在之前講解的faster-rcnnan那篇部落格中, 我們採用第一種方案。本次我們採用第二種方案。
在/data目錄下建立一個自己的資料夾:
cd /data
mkdir mydataset
- 1
- 2
- 1
- 2
把/data/VOC0712目錄下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 這三個檔案拷貝到/mydataset下:
cp data/create* ./mydataset
cp data/label* ./mydataset
- 1
- 2
- 1
- 2
labelmap_voc.prototxt, 此檔案定義label。
在/data/VOCdevkit目錄下建立mydataset, 並放入自己的資料集:
cd data/VOCdevkit
mkdir mydataset
cd mydataset
mkdir Annotations
mkdir ImageSets
mkdir JPEGImages
cd ImageSets
mkdir Layout
mkdir Main
mkdir Segmentation
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
其中Annotations中存放一些列XML檔案,包含object的bbox,name等;
ImageSets中三個子目錄下均存放train.txt, val.txt, trainval.txt, test.txt這幾個檔案,檔案內容為圖片的檔名(不帶字尾);
JPEGImages存放所有的圖片;
在/examples下建立mydataset資料夾:
mkdir mydataset
- 1
- 1
資料夾記憶體放生成的lmdb檔案。
上述資料夾建立好後, 開始生成lmdb檔案, 在建立之前需要修改相關路徑:
./data/mydataset/create_list.sh
./data/mydataset/create_data.sh
- 1
- 2
- 1
- 2
此時,在examples/mydataset/資料夾下可以看到兩個子資料夾, mydataset_trainval_lmdb, mydataset_test_lmdb;裡面均包含data.dmb和lock.dmb;
到此為止,我們的資料集就做好了。接下來就開始訓練了。訓練程式為/examples/ssd/ssd_pascal.py,執行之前,我們需要修改相關路徑程式碼:
cd /examples/ssd
vim sd_pascal.py, 修改如下:
57行: train_data路徑;
59行:test_data路徑;
197-203行:save_dir、snapshot_dir、job_dir、output_result_dir路徑;
216-220行: name_size_file、label_map_file路徑;
223行:num_classes 修改為1 + 類別數
315行:num_test_image:測試集圖片數目
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
另外, 如果你只有一個GPU, 需要修改285行:
gpus=”0,1,2,3” ===> 改為”0”
否則,訓練的時候會出錯。
修改完後執行
python ./examples/ssd/ssd_pascal.py
- 1
- 1
訓練完, 修改ssd_detector.py中模型路徑, 任意找一張圖片識別,看看效果怎麼樣。