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下來, 然后編譯:
- 1
- 2
- 3
接下來,我們開始編譯caffe,編譯caffe非常容易,這里我們濾過,如若感興趣,可參考我之前的博客:http://blog.csdn.net/zhang_shuai12/article/details/52289825,此篇講的是caffe + cpu + ubuntu14.04的安裝, GPU版安裝需修改Makefile.config文件, 修改完成后:
make make py- 1
- 2
到這里我們就完成了SSD的安裝,接下來我們講一下如何訓練自己的數據集。
第二部分 訓練自己的數據集
首先我們不妨先跑一下項目的demo, 需要下載數據集,提前訓練好的數據集等。
下載預訓練的模型,鏈接:https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6,下載完成后保存在:
- 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.tartar -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
創建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
訓練和測試:
python examples/ssd/ssd_pascal.py- 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目錄下創建一個自己的文件夾:
- 1
- 2
把/data/VOC0712目錄下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 這三個文件拷貝到/mydataset下:
cp data/create* ./mydataset cp data/label* ./mydataset- 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
其中Annotations中存放一些列XML文件,包含object的bbox,name等;
ImageSets中三個子目錄下均存放train.txt, val.txt, trainval.txt, test.txt這幾個文件,文件內容為圖片的文件名(不帶后綴);
JPEGImages存放所有的圖片;
在/examples下創建mydataset文件夾:
mkdir mydataset- 1
文件夾內存放生成的lmdb文件。
上述文件夾創建好后, 開始生成lmdb文件, 在創建之前需要修改相關路徑:
./data/mydataset/create_list.sh ./data/mydataset/create_data.sh- 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
另外, 如果你只有一個GPU, 需要修改285行:
gpus=”0,1,2,3” ===> 改為”0”
否則,訓練的時候會出錯。
修改完后運行
- 1
訓練完, 修改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
總結
以上是生活随笔為你收集整理的SSD安装及训练自己的数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 翻译SSD论文(Single Shot
- 下一篇: SSD 安装、训练