天天看点

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
           

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

python setup.py test
    python setup.py intall
           

最后在python环境下,import caffe不报错就表明安装成功。显示如下:

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

然后再进行编译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-SSD(single-shot-multibox)在Windows平台下的配置(CPU和GPU)与训练记录

发现在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…. 如下:

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

解决方法:进入到对应的glog.0.3.3.0/build/native,打开glog.targets,到末尾注释掉这个有关的UsingTask和相应的ProtertyGroup下的内容:

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

这三个问题解决后,GPU版本的libcaffe就编译成功了

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

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的路径名称:

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

修改后,运行后得到生成test_name_size.txt文件。下面这个结果就是运行成功的结果:

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

create_data.bat

接着同样复制data/VOC0712下的create_data.bat文件到caffe的根目录,修改正确的路径,执行后得到lmdb的数据。下面这幅图就是生成成功的结果:

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

训练

这里有两种方法,一个用python接口调用VOC0712下ssd_pascal.py和score_ssd_pascal.py来生成相应的训练和测试网络文件,及是否采用GPU计算等参数的设置。另一个就是类似常用windows下实现minst的方法直接调用caffe.exe或者bat文件调用。不过都要准备两个东西:训练的prototxt和一个预训练的VGGNet的网络。

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

其中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,注释掉下面的语句:

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

之后就没问题问题了,开始训练:

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

GPU下的训练

将solver.prototxt里面的模式改成GPU,同样的运行ssd_pascal.bat就可以了。但是当时遇到了一个问题,训练过程中损失函数loss=1.#QNAN,这明显是错误的结果:

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

但是这个问题无法定位,所以最后采取的方法就是从作者的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>());*/
           

这个问题是由于前面的编译没注意导致的。最后编译成功后,训练时的正确结果是:

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

我设置的最大轮数是60000次,不过也要几个小时。

检测部分

检测有两种方法,一种用python接口,另一种就是工程下面的ssd_detect项目。前面训练好的模型会保存在以下位置:

models\VGGNet\VOC0712\SSD_300x300

第一种方法,因为前面已经编译了pycaffe模块很简单,打开jupyter notebook,进入到examples文件夹下,打开ssd_detect.ipynb,一路运行下去就可以了,最后的结果如下

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

第二种方法,需要对源文件做一点修改,分为下面两个步骤

编译ssd_detect模块

找到ssd_detect.cpp,添加如下显示检测结果的代码:

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

修改完后进行编译,得到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,并显示目标框。

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

如果是多张图片,就在test.txt里面依次写入图片路径即可,同样每一幅图片的结果都会显示出来

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

总结

整个过程真的很折磨,很多头疼的问题,总之还是觉得不要在windows下跑比较好,坑太多,ubuntu下更加友好。不过在整个过程中也算可以知道该如何准备数据和识别,以及了解一些Caffe的常识,多少也算有点用处。

继续阅读