Caffe-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)与训练记录

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

  1. 选择python2的环境
  2. 下载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
  • 1

然后再分别写入下面两个命令就可以了。

    python setup.py test
    python setup.py intall
  • 1
  • 2

最后在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
  • 1
  • 2
  • 3

记得修改train和test两个prototxt里面的source路径

运行后会报错,如下错误 
Check failed: a<=b(0 vs -1.19209-007)

sgd_solver.cpp:106] Iteration 13100,lr = 0.001
math_functions.cpp:250] Check failed: a <= b <0 vs -1.19209e-007>
*** Check failure stack trace ***.
  • 1
  • 2
  • 3

解决方法是找到对应的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>());*/
  • 1
  • 2
  • 3
  • 4
  • 5

这个问题是由于前面的编译没注意导致的。最后编译成功后,训练时的正确结果是: 
这里写图片描述 
我设置的最大轮数是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的常识,多少也算有点用处。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值