1. 程式人生 > >SSD區域檢測網路配置+訓練自己的資料

SSD區域檢測網路配置+訓練自己的資料

之前用了faster-rcnn訓練資料後,查資料的時候發現了ssd這種end-to-end的檢測網路,所以決定跑一跑之前製作好的資料集試試。網上教程不是很多,而且感覺步驟簡略,自己琢磨了一晚上走了很多彎路才勉強把網路跑起來,所以決定寫一個踩坑跳坑小教程。

SSD的安裝

安裝還是比較簡單的,直接從github上下載然後建立分支:

編譯ssd caffe

cd /home/usrname/caffe
cp Makefile.config.example Makefile.config

之前我在其他地方編譯過caffe,這裡再編譯一次,我就把已經寫好的Makefile.config檔案複製了一份,大概改的地方有這幾個,改的時候把前面的’#’去掉就行,首先是有GPU的,用cudnn加速,第5行、28行、36行、50行:

5  USE_CUDNN := 1
28 CUDA_DIR := /usr/local/cuda
36 CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
50 BLAS := atlas

Python我用的是anaconda庫的python2.7,所以要把預設的去掉,

68 #PYTHON_INCLUDE := /usr/include/python2.7 \
69 #        /usr/lib/python2.7/dist-packages/numpy/core/include
70 # Anaconda Python distribution is quite popular. Include path:
71 # Verify anaconda location, sometimes it's in root. 72 ANACONDA_HOME := $(HOME)/anaconda2 73 PYTHON_INCLUDE := $(ANACONDA_HOME)/include \ 74 $(ANACONDA_HOME)/include/python2.7 \ 75 $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include

還有

83 #PYTHON_LIB := /usr/lib
84 PYTHON_LIB := $(
ANACONDA_HOME)/lib

下面一步比較重要,要加上hdf的路徑,不然會報錯找不到

93 # Whatever else you find you need goes here.
94 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
95 LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

修改完畢Makefile.config之後,進行編譯,注意是在caffe的目錄底下進行,而且要用root模型,要不然會報錯:
對‘[email protected]_4.0’未定義的引用

sudo su
make all -j16
make test -j16

編譯caffe完成後是編譯pycaffe,需要退出之前的root模式,不然會報錯
‘找不到’Python.h’

make pycaffe -j16

製作自己資料

1、這裡我就不跑VOC2007和VOC2012了,直接上自己的資料集。製作自己資料的方法和faster-rcnn很相似,這方面的教程也很多,我主要用到的標籤標註軟體是labelImg,可以搜尋下該軟體怎麼下載使用。使用自己資料集的方法:

cd /data
mkdir mydataset
mkdir VOCdevkit
cd VOCdevkit
mkdir mydataset

2、在建立好的caffe/data/VOCdevkit/mydataset資料夾中拷貝Annotations,ImageSets,JPEGImages。沒有下圖的lmdb資料夾,這是後來生成lmdb資料生成的。
這裡寫圖片描述
其中Annotations放標註好的XML檔案,ImageSets放訓練和測試資料,JPEGImages是源圖片檔案

3、回到data資料夾下,再把/data/VOC0712目錄下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 這三個檔案拷貝到/mydataset下:

cp VOC0712/create* ./mydataset
cp VOC0712/label* ./mydataset

4、修改create_list.sh :

12 root_dir=$HOME/你的caffe路徑/data/VOCdevkit
13 for name in mydataset

如果自己資料集的圖片不是jpg格式是png格式的話還需要修改:

25 sed -i "s/$/.png/g" $img_file

5、修改create_data.sh:

7 data_root_dir="$HOME/你的caffe路徑/data/VOCdevkit"
8 dataset_name="mydataset"

png圖片的話還需要修改:

17 extra_cmd="--encode-type=png --encoded"

6、修改labelmap_voc.prototxt, 此檔案定義label
有些教程上沒有說修改這個檔案,導致我建立lmdb檔案的時候出現錯誤:

F1031 21:35:56.938661  4014 io.cpp:292] Unknown name: glasses
*** Check failure stack trace: ***
    @     0x7fc3963d05cd  google::LogMessage::Fail()
    @     0x7fc3963d2433  google::LogMessage::SendToLog()
    @     0x7fc3963d015b  google::LogMessage::Flush()
    @     0x7fc3963d2e1e  google::LogMessageFatal::~LogMessageFatal()
    @     0x7fc3969e2151  caffe::ReadXMLToAnnotatedDatum()
    @     0x7fc3969e3a38  caffe::ReadRichImageToAnnotatedDatum()
    @           0x4052b3  main
    @     0x7fc395312830  __libc_start_main
    @           0x406149  _start
    @              (nil)  (unknown)

這裡需要把這個檔案中的標籤改成你自己設定的標籤,第0個標籤background不需要修改。
7、執行生成lmdb檔案
先在example資料夾中建立mydataset資料夾存放lmdb檔案:

cd example
mkdir mydataset

回到caffe根目錄然後執行

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

執行的時候如果出現

Traceback (most recent call last):
    label_map = caffe_pb2.LabelMap()
AttributeError: 'module' object has no attribute 'LabelMap'

需要新增環境變數

sudo gedit ~/.bashrc
在最後一行新增:

export PYTHONPATH=$你的caffe路徑/python:$PYTHONPATH

source ~/.bashrc

成功的話會輸出
這裡寫圖片描述

這裡寫圖片描述

8、 下載預訓練模型VGG_ILSVRC_16_layers_fc_reduced.caffemodel
連結:http://pan.baidu.com/s/1miDE9h2 密碼:0hf2,下載完成後儲存在:

caffe/models/VGGNet/

9、資料集準備完畢後就是修改/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”

如果出現:

Check failed: error == cudaSuccess (2 vs. 0) out of memory

說明GPU記憶體不足,需要改小batch_size:

336 # Divide the mini-batch to different GPUs.
337 batch_size = 4
338 accum_batch_size = 4

如果還出現:

Train net output #0: mbox_loss = nan (* 1 = nan loss)

損失值溢位,需要修改base_lr,乘以0.1,改為0.0001,在ssd_pascal.py檔案中修改

365 solver_param = {
366    # Train parameters
367    'base_lr': base_lr*0.1,

把base_lr*0.1變成0.0001,ctrl+c中斷程式後,再重新執行,需要刪除/home/idc/deep/gjj/caffe/models/VGGNet/VOC0712/SSD_300x300路徑下的臨時檔案,不然會從中斷點繼續執行。

10、愉快地開始訓練
完成以上步驟後就可以看見GPU開始愉快地訓練地輸出了,訓練很慢。。。
這裡寫圖片描述