[Caffe配置]SSD(Single Shot MultiBox Detector)在Windows下配置步骤

1.SSD简介

SSD全称Single Shot MultiBox Detector,是一个用于目标检测的深度学习框架。
By Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, Alexander C. Berg.

SSD是一个单一的网络对象检测的统一框架。你可以使用代码来训练/评估一个用于目标检测任务的网络。(http://arxiv.org/abs/1512.02325).

作者的Github上https://github.com/weiliu89/caffe 只给出了linux下的代码,下面内容是将代码移植到windows上的实现步骤。本文参考了samylee的博文Windows-SSD配置与测试,在此表示感谢。

2. 配置环境

windows7 + vs2013 + Cuda8.0


3. 所需文件

vs2013,windows-caffe,ubuntu-ssd,libboost,cudnn,OpenCV(可选)ssd_detect.cpp,io.cpp

windows-caffe地址: 链接:http://pan.baidu.com/s/1hrGRu1A 密码:j82rhttps://github.com/conner99/caffe,推荐使用后者。
ubuntu-ssd地址: 链接:http://pan.baidu.com/s/1mhYuf7y 密码:3jp2
libboost地址:链接:http://pan.baidu.com/s/1pLbBMpP 密码:41tq
cudnn地址:链接:http://pan.baidu.com/s/1o8vWBhw 密码:kdj4
opencv地址:链接:http://pan.baidu.com/s/1eSkHBj0 密码:nhch
ssd_detect.cpp地址:链接:http://pan.baidu.com/s/1nvwECNv 密码:e3yn
io.cpp地址:链接:http://pan.baidu.com/s/1i4CL7QP 密码:g623
signal_handler地址:链接:http://pan.baidu.com/s/1mhYuf7y 密码:iubq


4. 配置步骤和出现的问题

本人配置的是使用GPU的版本,以下为配置步骤和出现的问题:

  1. 从上述网址下载的windows-caffe使用的Cuda版本为7.5,我使用的Cuda版本为8.0,所以将其版本改为8.0,重命名.\caffe-master\windows\\路径下的CommonSettings.props.exampleCommonSettings.props,修改Cuda配置为<CudaVersion>8.0</CudaVersion>,此外设置<CpuOnlyBuild>true</CpuOnlyBuild><UseCuDNN>false</UseCuDNN>

  2. 编译项目,报错“未能生成object文件(视警告为错误)”,解决方法:右击选择属性->配置属性->c/c++->常规,将“警告视为错误”的选项改为“否”,若还报错,将math_functions.obj文件放到路径caffe-master\Build\Int\libcaffe\x64\[Release|Debug]下。

  3. 复制.\ssd_new下所有文件(除builddataexample以及models之外)至.\windows-caffe,替换原来文件夹中对应的文件。

  4. 编译文件,报错error C3861: “mkdir”: 找不到标识符。解决办法:在db_lmdb.cpp文件的

CHECK_EQ(mkdir(source.c_str(), 0744), 0) << "mkdir " << source << " failed";

语句上下添加语句,使得:

#ifdef MSC_VER
        CHECK_EQ(mkdir(source.c_str(), 0744), 0) << "mkdir " << source << " failed";
#endif
  1. 编译文件,报错error C2360: “occurrences_32”的初始化操作由“case”标签跳过。解决办法:在hdf5.cpp文件中将所有出错的case语句下的内容都括上大括号{ },比如,将语句
  case H5T_FLOAT:
      LOG_FIRST_N(INFO, 1) << "Datatype class: H5T_FLOAT";
      break;

改为:

  case H5T_FLOAT:
{
      LOG_FIRST_N(INFO, 1) << "Datatype class: H5T_FLOAT";
      break;
}
  1. 选择解决方案下的libcaffe项目,进入include/layers文件夹中,将路径.\caffe-master\include\caffe\layers下除了roi_pooling_layer.hpp的所有hpp文件添加到include/layers中。进入src/layers文件夹中,将路径.\caffe-master\src\caffe\layers下除了roi_pooling_layers.cpp的所有cpp文件添加到src/layers中。

  2. 编译项目,报错error C2065: “SIGHUP”: 未声明的标识符。解决办法:在common.cpp文件最上边一行添加语句

#include "process.h"
  1. 编译项目,报了都是关于signal_handler.cpp文件相关的错误,在本文章第三部分享文件中下载signal_handler.cpp文件替换即可。

  2. 编译项目,报错找不到boost库,在解决方案的caffeclassification项目下的VC++选项下,在包含目录中添加 ~/boost_1_59_0/,在库目录中添加~\boost_1_59_0\stage\lib

  3. 选择解决方案下的libcaffe项目,进入libcaffe/src/util文件夹中,将路径\ssd_new\src\caffe\util下的bbox_util.cpp文件添加到libcaffe/src/util中。

  4. 编译项目,报错找不到标识符"snprintf",解决办法:在bbox_util文件中,在标识符snprintf前面加上下划线_,修改为_snprintf

  5. 编译项目,报错:

error LNK2001: 无法解析的外部符号 "__declspec(dllimport) void __cdecl google::InstallFailureSignalHandler(void)"

采用了粗暴的解决方式,在common.cpp文件中,将出错的函数::google::InstallFailureSignalHandler()注释掉。

  1. 选择解决方案下的classification项目,将ssd_detect.cpp文件添加到项目中,去除注释,修改相应的模型文件和网络结构定义文件的路径。

至此,SSD目标检测的CPU版本,已经可以在windows下运行,接下来配置 SSD的GPU加速版本


  1. 在路径.\caffe-master\windows\\下进入CommonSettings.props配置文件中,设置<CpuOnlyBuild>false</CpuOnlyBuild><UseCuDNN>true</UseCuDNN>

  2. 进入.\caffe-master\windows\\路径下,启动Caffe工程,编译工程,报错:

error MSB3721: 命令“……”已退出,返回代码为1。

修改.\caffe-master\windows\\路径下的CommonSettings.props文件,修改对应内容为:

<CudaArchitecture>compute_30,sm_30;compute_50,sm_50</CudaArchitecture>
  1. 之后编译工程,报错:无法打开cudnn.h文件,从本博客第二部分下载cudnn,之后在项目工程的属性中的vc++包含目录中添加~/cuda/include路径。在库目录中添加~/cuda/lib/x64路径。
  2. 编译工程,报错:error : declaration is incompatible with "const char *cudnnGetErrorString(cudnnStatus_t)",解决方法:修改cudnn.hpp文件中
inline const char* cudnnGetErrorString(cudnnStatus_t status)

inline const char* CUDNNWINAPI cudnnGetErrorString(cudnnStatus_t status)
  1. 编译工程,报错:"::caffe::kBNLL_THRESHOLD" is undefined in device code",解决方法:修改bnll_layer.cu
Dtype expval = exp(min(in_data[index], Dtype(kBNLL_THRESHOLD)));

Dtype expval = exp(min(in_data[index], Dtype(50)));
  1. 编译工程,报错:error : too few arguments in function call. conv_layer.cu。修改conv_layer.cu文件中
this->forward_gpu_gemm(bottom_data + n * this->bottom_dim_, weight, top_data + n * this->top_dim_);

this->forward_gpu_gemm(bottom_data + n * this->bottom_dim_, weight, top_data + n * this->top_dim_, false);
  1. 编译项目,报错error MSB3073,解决办法:进入项目libcaffe的属性设置,设置生成事件 -> 预先生成事件 -> 在生成中使用 -> 否,设置生成事件 -> 后期生成事件 -> 在生成中使用 -> 否

  2. 编译项目,报与boost相关的regex正则表达式库出现问题,在项目中我们不需要正则表达式,所以将相关语句注释掉即可。进入项目libcaffe中,进入detection_output_layer.cu文件,将所有出现regexrv的语句注释掉。进入detection_output_layer.cpp文件,将所有出现regexrv的语句注释掉。进入detection_output_layer.hpp中,将语句#include <boost/regex.hpp>注释掉。

  3. 编译项目,报错:找不到".\caffe\3rdparty\hungarian.h"文件,在路径.\caffe-master\include\caffe\3rdparty\\下添加hungarian.h文件。编译项目,报错:找不到".\src\caffe\3rdparty\hungarian.cpp"文件,在路径.\caffe-master\\src\caffe\3rdparty\\下添加hungarian.cpp文件。

  4. 编译项目,报与thrust相关的错误,进入项目libcaffe中,注释掉

#include "thrust/functional.h"
#include "thrust/sort.h"
……
  thrust::sort_by_key(&confidences[0], &confidences[0] + num_remain, &idx[0],
  thrust::greater<Dtype>());

这些语句。

  1. 进入解决方案下的classification项目的ssd_detect.cpp文件中,去除注释,修改相应的模型文件和网络结构定义文件的路径。

至此,SSD目标检测的GPU版本,已经可以在windows下运行。


5. 感谢

感谢一直踩雷的妇老师,解决了上面提到的大部分错误。希望本篇文章可以给想要在windows环境下运行SSD的程序员们一些帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容