1在windows上面训练和测试ssd的方法很少,而且配置也相当之麻烦,搞了几天才调试成功。现在写一下过程分享到博客上,顺便也可以作为今后再次安装的参考。我的配置环境:
windows: 10
gpu: Titan X
cuda: 8.0
caffe: caffe-ssd-microsoft
python: 2.7.13
Caffe-SSD的编译与配置
编译这部分不打算详细展开,网上有很多教程,CPU的较多,下面会给出好用的参考教程。这里推荐一下caffe-ssd-microsoft版本而不是caffe-windows加上caffe-ssd的修改版(网上一些教程是这么改的),两个方法都可以,我这里采用的就是单用caffe-ssd-microsoft的版本。
caffe-ssd-microsoft下载:
https://github.com/conner99/caffe
配置的参考博客链接:
http://blog.csdn.net/buaalei/article/details/54668507
http://www.jianshu.com/p/9a84cc434e05
这两个可以配合着看,尤其GPU部分推荐看第二个博客。反正我前前后后不停地编译不停地改。
配置caffe-ssd-microsoft
编译libcaffe模块
这个就参考上面给的博客就可以了,我就遇到下面几个问题:
1. 添加3rdparty的hungarian.h和cpp
在这里找这个两个文件,链接:http://pan.baidu.com/s/1mhYuf7y 密码:3jp2
2. 注释掉 detection_output_layer.hpp和detection_output_layer.cu和detection_output_layer.cpp有关regex 的引用和语句
3. C/C++ –> 常规 里的将警告提示为错误修改 为 否
编译caffe模块
libcaffe编译成功后,再进行caffe的编译,注意点就是要添加opencv的引用目录和库目录。这个不难。
编译pycaffe模块
这个可选,如果想用python接口的话这个是必须编译的,注意的是首先要配置好下面两个库的引用和库目录
1. python库目录
2. opencv库目录
之后进行google的protobuf的配置,这个不配置会报错的。
配置protobuf
配置参考:
http://www.jianshu.com/p/0c563b2c0fdb
- 选择python2的环境
-
下载protobuf.3.0.0:
下载链接:
https://github.com/google/protobuf/releases/tag/v3.0.0
下载两个包:protobuf-python-3.0.0.zip 以及 protoc-3.0.0-win32.zip
protobuf-python-3.0.0为protobuf的安装包
protoc-3.0.0-win32包含protobuf的编译器protoc的win32版本,用以编译*.proto文件。
下载后将protoc-3.0.0-win32\bin\protoc.exe 复制到protobuf-3.0.0\src\
用cmd进入到protoc-3.0.0\python目录,运行 python setup.py build,生成大量*.py,如下命令
python setup.py build
然后再分别写入下面两个命令就可以了。
python setup.py test
python setup.py intall
最后在python环境下,import caffe不报错就表明安装成功。显示如下:
然后再进行编译pycaffe,编译成功后将Build/x64/Release/pycaffe下的caffe文件夹拷贝到Anancoda下面的Lib\site-packages下即可(因为我装的是Anancoda,其他的也可以找到对应的包目录)。
编译get_image_size和convert_annoset模块
跟前面类似,都是配置好opencv的引用就可以了,目的是为了之后VOC数据的训练准备用的工具。由于我都是单项目启动的,所以都是一个一个配置。
注意事项:
NuGet包里面的opencv默认是2.4.10,以及支持的python都是2.7版本的,如果是opencv3以上的,需要将NuGet包里对应的opencv卸载,重新搜素Opencv3进行配置。python的话最好是用python2,如果没有可以安装MiniAnaconda进行双环境配置,其实Ananconda也可以实现两个环境。
附送一个python2和python3环境可以切换的安装方法,是基于Ananconda的
http://blog.csdn.net/infin1te/article/details/50445217
至此前期的配置和准备都已经完成,下一部分是开始SSD的训练和检测部分。
GPU编译的一些问题
CPU照着之前给的教程能很顺利的通过编译,但是GPU我遇到了一些没有过的问题,有下面几个:
1.caffe.TransformationsParameters has no filed named “distort_param”。
发现在caffe_pd_h中,对比原Caffe-ssd分支项目中,确实没有两组参数DistortionParamter和ExpansionParameter。我的解决方法就是从caffe-ssd/src/proto中的caffe.pb.cc复制过去,然后会报错:
解决方法: 就是将报错的文件都从原ssd文件中赋值过去。这样就能编译通过了。
还有一种解决方法就是按照前面的第二个博客链接(Caffe-Windows+SSD)的方法进行,但是会有其他的一些问题。
2.cudnn路径没配置好导致的错误,在CommonSettings.props中,如果已经将cudnn的include和lib都已经合在Cuda中,则去掉Cudnn的路径;另一种方法就是写入正确的Cudnn路径。参考博客:
http://blog.csdn.net/zb1165048017/article/details/51549105
3.错误:error MSB4062:未能从程序集 C:\NuGetPackages\gflags.2.1.2.1 ….coapp.NuGetNativeMSBuildTask.dll 加载任务NuGetPackageOverlay…. 如下:
解决方法:进入到对应的glog.0.3.3.0/build/native,打开glog.targets,到末尾注释掉这个有关的UsingTask和相应的ProtertyGroup下的内容:
这三个问题解决后,GPU版本的libcaffe就编译成功了
SSD(single-shot-multibox)模型的训练和检测
这一部分的参考教程不多,这是其中一个:
http://blog.csdn.net/muwu5635/article/details/60874721
训练部分
VOC0712的lmdb数据准备
下载地址:
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
在data\VOC0712下按照上述的顺序依次解压VOC文件,得到当前目录下的VOC2007和VOC2012两个文件夹。
get_image_size.bat
从data\VOC0712下复制get_image_size.bat到caffe-ssd-microsoft根目录下,这里要修改对应的caffe的路径名称:
修改后,运行后得到生成test_name_size.txt文件。下面这个结果就是运行成功的结果:
create_data.bat
接着同样复制data/VOC0712下的create_data.bat文件到caffe的根目录,修改正确的路径,执行后得到lmdb的数据。下面这幅图就是生成成功的结果:
训练
这里有两种方法,一个用python接口调用VOC0712下ssd_pascal.py和score_ssd_pascal.py来生成相应的训练和测试网络文件,及是否采用GPU计算等参数的设置。另一个就是类似常用windows下实现minst的方法直接调用caffe.exe或者bat文件调用。不过都要准备两个东西:训练的prototxt和一个预训练的VGGNet的网络。
其中SSD_300x300包含:deploy.prototxt、solver.prototxt、train.prototxt和test.prototxt。
下载地址:
https://gist.github.com/weiliu89/2ed6e13bfd5b57cf81d6
下载后将网络模型放在下面的目录下:
caffe-ssd-microsoft/models/VGGNet/VOC0712/
然后同样在caffe目录下新建一个ssd_pascal.bat文件,内容如下:
Build\x64\Release\caffe.exe train --solver
=models\VGGNet\VOC0712\SSD_300x300\solver.prototxt -weights
=model\VGGNet\VOC0712\VGG_ILSVRC_16_layers_fc_reduced.caffemodel
记得修改train和test两个prototxt里面的source路径。
运行后会报错,如下错误
Check failed: a<=b(0 vs -1.19209-007)
sgd_solver.cpp:] Iteration ,lr =
math_functions.cpp:] Check failed: a <= b < vs ->
*** Check failure stack trace ***.
解决方法是找到对应的cpp,注释掉下面的语句:
之后就没问题问题了,开始训练:
GPU下的训练
将solver.prototxt里面的模式改成GPU,同样的运行ssd_pascal.bat就可以了。但是当时遇到了一个问题,训练过程中损失函数loss=1.#QNAN,这明显是错误的结果:
但是这个问题无法定位,所以最后采取的方法就是从作者的ssd文件中将layer相关的都替换了,但是又出现了新的问题:
caffe.pb.h中提示错误:error: expected an identifier.
这个错误是由于当时没在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>());*/
这个问题是由于前面的编译没注意导致的。最后编译成功后,训练时的正确结果是:
我设置的最大轮数是60000次,不过也要几个小时。
检测部分
检测有两种方法,一种用python接口,另一种就是工程下面的ssd_detect项目。前面训练好的模型会保存在以下位置:
models\VGGNet\VOC0712\SSD_300x300
第一种方法,因为前面已经编译了pycaffe模块很简单,打开jupyter notebook,进入到examples文件夹下,打开ssd_detect.ipynb,一路运行下去就可以了,最后的结果如下
第二种方法,需要对源文件做一点修改,分为下面两个步骤
编译ssd_detect模块
找到ssd_detect.cpp,添加如下显示检测结果的代码:
修改完后进行编译,得到exe文件。
ssd_detect.bat
跟前面的bat文件路径一致,添加如下内容
.\Build\x64\Release\ssd_detect.exe models\VGGNet\VOC0712\SSD_300x300\deploy.prototxt
models\VGGNet\VOC0712\SSD_300x300\VGG_VOC0712
_SSD_300x300_iter_60000.model
models\VGGNet\VOC012\SSD_300x300\test.txt
–file_type image
confidence_threshold 0.5
pause
这里要注意的是修改deploy.prototxt里面的output_directory路径,同时test.txt存的是检测图片的路径。
检测结果
最后会在cmd中显示目标的位置和confidence,并显示目标框。
如果是多张图片,就在test.txt里面依次写入图片路径即可,同样每一幅图片的结果都会显示出来
总结
整个过程真的很折磨,很多头疼的问题,总之还是觉得不要在windows下跑比较好,坑太多,ubuntu下更加友好。不过在整个过程中也算可以知道该如何准备数据和识别,以及了解一些Caffe的常识,多少也算有点用处。