由于最近想试一下牛掰的目标检测算法SSD。于是乎,自己做了几千张数据(实际只有几百张,利用数据扩充算法比如镜像,噪声,切割,旋转等扩充到了几千张,其实还是很不够)。于是在网上找了相关的介绍,自己处理数据转化为VOC数据集的格式,在转化为XML格式等等。具体方法可以参见以下几个博客。具体是window还是Linux请自行对号入座。
Linux:http://blog.sina.com.cn/s/blog_4a1853330102x7yd.html
window:http://blog.csdn.net/buaalei/article/details/55094879
数据转换好以后,接下来的工作就是在window下搭建SSD训练环境了,这里面有很多地雷,我本人也是反复尝试反复修改几天后才得以成功。
1 首先看你的电脑配置是否有GPU,如果没有GPU那就很好办了,首先下载SSD模型,链接:https://github.com/conner99/caffe,(当然也要的人是下载window-caffe的,然后再往里面添加SSD相关的文件,但是很明显多此一举了)。所以我们还是站在巨人的肩膀上吧。
2 下载好了ssd的caffe环境,接下来就是安装CUDNN,CUDA,PYTHON等的配置,这里参考的文献很多我就不再赘叙了,当然如果你是CPU环境,那么不需要配置CUDNN环境。
3 安装好了SSD环境后,由于SSD训练还需要第三方库,这里也有提供,链接:http://pan.baidu.com/s/1eSaP3rW 密码:nuja ,具体过程如下:
(1)在caffe-master\src\caffe下新建3rdparty文件夹,里面添加hungarian.cpp
(2)在caffe-master\include\caffe下新建3rdparty文件夹,里面添加hungarian.hpp
4 接下来这个一定要改,不改的话会反复出现类似于:error MSB3721: 命令“"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin\nvcc.exe" ....等错误。我本人在此被坑几天,头发都掉了一地,哎。这里的解决办法是在detection_output_layer.cu,detection_output_layer.cpp两个文件中注释掉所有出现的regex和rv的语句;然后再detection_output_layer.hpp中将语句#include <boost/regex.hpp>注释掉。此外,在libcaffe项目下的bbox_util.cu文件,注释掉thrust相关的内容,如下所示: //#include "thrust/functional.h" //#include "thrust/sort.h"
.....
//thrust::sort_by_key(&confidence[0],&confidence[0]+num_remain,&idx[0],
//thrurst::greater<Dtype>());*/
5 上面的执行完毕之后,恭喜你基本上可以生成libcaffe、caffe.exe文件,先编译libcaffe,再caffe(一般都是Release下)。
6 后面就简单了,写一个bat命令,设置好相应的solver.prototxt文件就可以开始训练了。
上面只要按照这个流程来,不要偷懒,基本上没什么大问题,而我总是感觉别人说的不一定对,抱着不装南墙不回头精神去配置,结果就是大几天时间挥霍掉了,希望大家谨慎对待,不过,说实在的自己实现这一过程,从数据采集,数据扩充,转化格式,再到配置SSD环境,再到开始训练,收获良多,或许这就是自己动手的好处吧。这里附上我正在训练的过程,GPU速度杠杠的。
期待能得到好的结果,也祝大家好运。有什么问题欢迎留言交流,哈哈。最后附上一些好的相关博客:
http://blog.csdn.net/gxb0505/article/details/73702451
http://blog.csdn.net/maweifei/article/details/76685755
https://github.com/weiliu89/caffe