实践二: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

猜你喜欢

转载自blog.csdn.net/qq_27163197/article/details/80882175