SSD安裝及訓練自己的數據集

最近一直在搞object detection玩,之前用的是faster-rcnn,準確率方面73.2%,效果還不錯,但是識別速度有點欠缺,我用的GPU是GTX980ti, 識別速度大概是15fps.最近發現SSD(single shot multibox detector) 這篇論文效果和速度都不錯,我自己實驗了一下,速度確實比faster-rcnn快不少。下面分兩部分來介紹。第一部分介紹SSD的安裝,第二部分介紹如何基於SSD訓練自己的數據集。

第一部分 SSD安裝

系統:ubuntu 14.04
語言:python
ssd項目主頁:https://github.com/weiliu89/caffe/tree/ssd
首先,我們把項目代碼clone下來, 然後編譯:

git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd

接下來,我們開始編譯caffe,編譯caffe非常容易,這裏我們濾過,如若感興趣,可參考我之前的博客:http://blog.csdn.net/zhang_shuai12/article/details/52289825,此篇講的是caffe + cpu + ubuntu14.04的安裝, GPU版安裝需修改Makefile.config文件, 修改完成後:

make 
make py

到這裏我們就完成了SSD的安裝,接下來我們講一下如何訓練自己的數據集。

第二部分 訓練自己的數據集

首先我們不妨先跑一下項目的demo, 需要下載數據集,提前訓練好的數據集等。
下載預訓練的模型,鏈接:https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6,下載完成後保存在:

caffe/models/VGGNet/

下載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

創建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

訓練和測試:

python examples/ssd/ssd_pascal.py

論文中,作者已經預訓練好模型,下載鏈接: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

把/data/VOC0712目錄下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 這三個文件拷貝到/mydataset下:

cp data/create* ./mydataset
cp data/label* ./mydataset

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

其中Annotations中存放一些列XML文件,包含object的bbox,name等;
ImageSets中三個子目錄下均存放train.txt, val.txt, trainval.txt, test.txt這幾個文件,文件內容爲圖片的文件名(不帶後綴);
JPEGImages存放所有的圖片;

在/examples下創建mydataset文件夾:

mkdir mydataset

文件夾內存放生成的lmdb文件。

上述文件夾創建好後, 開始生成lmdb文件, 在創建之前需要修改相關路徑:

./data/mydataset/create_list.sh
./data/mydataset/create_data.sh

此時,在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:測試集圖片數目

另外, 如果你只有一個GPU, 需要修改285行:
gpus=”0,1,2,3” ===> 改爲”0”
否則,訓練的時候會出錯。
修改完後運行

python ./examples/ssd/ssd_pascal.py 

訓練完, 修改ssd_detector.py中模型路徑, 任意找一張圖片識別,看看效果怎麼樣。

如果在這過程中有什麼問題, 可隨時私信我。

參考:
【1】《SSD: Single Shot MultiBox Detector》 By Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, Alexander C. Berg.
【2】https://github.com/weiliu89/caffe/tree/ssd

發佈了66 篇原創文章 · 獲贊 17 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章