1. 程式人生 > >實踐二:caffe環境配置以及使用ssd-caffe訓練自己的資料集

實踐二:caffe環境配置以及使用ssd-caffe訓練自己的資料集

1:環境配置

首先,我們把專案程式碼clone下來, 然後編譯:

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

檢視有沒有安裝opencv

pkg-config --modversion opencv 

修改相關配置[注意python=2.7]

../caffe$ cp Makefile.config.example Makefile.config
../caffe$ vim Makefile.config
去掉三個地方#
USE_CUDNN := 1
CUSTOM_CXX := g++
USE_OPENCV := 1
OPENCV_VERSION := 3 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 修改為: INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

編譯

make -j8
make py
make test -j8
make runtest -j8

配置caffe的python介面
1、安裝一些依賴:

for req in $(cat requirements.txt); do pip install $req; done

2、修改bashrc
在最後新增caffe裡的python路徑:

export PYTHONPATH=/home/summer/caffe/python:$PYTHONPATH

4、在python中import caffe報錯:
ImportError: /home/summer/anaconda2/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found (required by /home/summer/caffe/python/caffe/_caffe.so)
解決方法:conda install libgcc

2:訓練自己的資料集

1、 預訓練模型下載
在ssd-caffe/models資料夾下新建資料夾,命名為VGGNet,將剛剛下載下來的檔案
《VGG_ILSVRC_16_layers_fc_reduced.caffemodel》放入這個VGGNet資料夾當中。
2、將VOC資料轉換成LMDB資料集
SSD提供了VOC資料到LMDB資料的轉換指令碼 data/VOC0712/create_list.sh 和 /data/VOC0712/create_data.sh,這兩個指令碼是完全針對VOC0712目錄下的資料進行的轉換。
這裡寫圖片描述
create_list.sh

03行:root_dir=$HOME/Desktop/github_code/caffe/data/VOCdevkit/
13行:for name in VOC2007
25行:sed -i "s/$/.png/g" $img_file

create_data.sh

data_root_dir="$HOME/Desktop/github_code/caffe/data/VOCdevkit"
dataset_name="VOC2007"

執行
./data/VOC2007/create_list.sh
./data/VOC2007/create_data.sh
在examples目率下生成
這裡寫圖片描述
2使用caffe-ssd進行訓練
網路的訓練需要相關的prototxt和預訓練好的caffemodel
1)複製./examples/ssd目錄下的ssd_pascal.py為ssd_pascal_kitti.py,修改如下幾點:
這裡寫圖片描述
然後執行
python examples/ssd/ssd_pascal_kitti.py
solver_param 中’max_iter’: 120000, 表示最大迭代次數
solver_param 中’test_interval’: 10000, 每次評估模型效果的間隔迭代次數,用於觀察是否收斂及過擬合
其他引數可酌情修改
梯度爆炸,可以參考下這個https://zhuanlan.zhihu.com/p/25110930
原因:梯度變得非常大,使得學習過程難以繼續
現象:觀察log,注意每一輪迭代後的loss。loss隨著每輪迭代越來越大,最終超過了浮點型表示的範圍,就變成了NaN。
措施:
1. 減小solver.prototxt中的base_lr,至少減小一個數量級。如果有多個loss layer,需要找出哪個損失層導致了梯度爆炸,並在train_val.prototxt中減小該層的loss_weight,而非是減小通用的base_lr。
2. 設定clip gradient,用於限制過大的diff
訓練完, 修改ssd_detector.py中模型路徑, 任意找一張圖片識別,看看效果怎麼樣。
3.測試
A.c++版本的測試
編譯完SSD後,C++版本的的可執行檔案存放目錄: .build_release/examples/ssd/ssd_detect.bin
/object_detect_video.bin –model_file –weights_file –detect_file
測試命令 ./.build_release/examples/ssd/ssd_detect.bin models/VGGNet/indoor/deploy.prototxt models/VGGNet/indoor/VGG_VOC0712_SSD_300x300_iter_60000.caffemodel pictures.txt
B.python版本的測試
(1)修改example/ssd/score_ssd_pascal.py檔案
修改方式與ssd_pascal.py相同,其中在det_eval_param新增’show_per_class_result’: True引數可現實每個類別的AP(average precision)
(2)進行測試
cd $CAFFE_ROOT
python example/ssd/score_ssd_pascal.py
python 版本的測試過程參見examples/detection.ipynb