首先,我想说的是如果想用VS2015或者更高版本的童鞋放弃吧,别入坑了。。。。
一开始就是用的VS2015+Cuda 8.0+Cudnn V5,弄到最后发现它本身是用VS2015之前的版本写的,带的库是vc12(VS2013),而VS2015则是vc14.(相信很多用VS的会遇到平台版本这个问题)
举个栗子:
LNK1104 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib”
所以到最后跳到虚拟机里进行编译,环境是:Win7+VS2013+Cuda 7.5+Cudnn V4
(回来修改:阿勒,虚拟机跑不了,虚拟机的显卡驱动的虚拟的,不是Nvidia的)
下载不说了,到官网下载,直接搜Cuda或者Cudnn,去官网下相应的版本
Caffe-SSD的microsoft版本:https://github.com/conner99/caffe
一、配置CPU版本的
这个相对来说比较简单,是很容易成功的(如果是上面的环境的话)
1、解压github上下的文件caffe-ssd-microsoft.zip,进入~\caffe-ssd-microsoft\windows下。
找到文件CommonSettings.props.example,修改其名称为:CommonSettings.props
打开该文件:修改下面
<CpuOnlyBuild>true</CpuOnlyBuild>
<UseCuDNN>false</UseCuDNN>
其实这里就可以编译(这里只讲编译libcaffe,其他类似)了,但是接下来会报一些稀奇古怪的错,我整理了一下,全放在文章末尾,因为我根本不记得顺序了QAQ。
二、配置GPU版本的
修改CommonSettings.props
<CpuOnlyBuild>false</CpuOnlyBuild>
<UseCuDNN>true</UseCuDNN>
<CudaVersion>7.5</CudaVersion>
解压官网下的cudnn-7.0-win-x64-v4.0.zip,里面有个cuda文件夹,把该文件夹放到自己定义的路径下,如我的是:
D:\SoftWare\Caff_Enviro\cudnn
修改CommonSettings.props
<!-- CuDNN 3 and 4 are supported -->
<CuDnnPath>D:\SoftWare\Caff_Enviro\cudnn\</CuDnnPath>
右键libcaff,生成,不要以为一下就能成功,bug都在文章末尾。
不过,最后弄出来的时候感觉世界都明亮了。。。。
下面就是一大波僵尸bug来袭了,我尽力回忆。。
Bug1、
这是代码有错误,慢慢修改
一定要注释掉 detection_output_layer.hpp和detection_output_layer.cu和detection_output_layer.cpp有关regex 和rv的引用和语句
error MSB3721: 命令“……”已退出,返回代码为2
Bug2、
无法打开cudnn.h,这个是你配置GPU的时候修改的CommonSettings.props路径是否正确了,一定是cuda文件的上一级路径。
Bug3、
编译项目,报错“未能生成object文件(视警告为错误)”
,解决方法:右击选择属性->配置属性->c/c++->常规
,将“警告视为错误”
的选项改“否”
Bug4、
GLOG_NO_ABBREVIATED_SEVERITIES
解决:在工程加上预编译宏GLOG_NO_ABBREVIATED_SEVERITIES
C/C++ --> 预处理器 --> 预处理器定义 --> 加上GLOG_NO_ABBREVIATED_SEVERITIES
Bug5、
找不到".\caffe\3rdparty\hungarian.h"文件
解决:在路径.\caffe-master\include\caffe\3rdparty\下添加hungarian.h文件。编译项目,报错:找不到".\src\caffe\3rdparty\hungarian.cpp"文件,在路径.\caffe-master\src\caffe\3rdparty\下添加hungarian.cpp文件
在这里找这个文件,链接:http://pan.baidu.com/s/1mhYuf7y 密码:3jp2
Bug6、
expected an identifier in caffe.pb.h
解决:修改bbox_util.cu,注释掉所有带thrust的语句
修改detection_output_layer.cu和detection_output_layer.cpp文件,注释掉所有regex和rv的语句
//boost::regex exp("\"(null|true|false|-?[0-9]+(\\.[0-9]+)?)\"");
//std::string rv = boost::regex_replace(ss.str(), exp, "$1");
//outfile << rv.substr(rv.find("["), rv.rfind("]") - rv.find("["))
// << std::endl << "]" << std::endl;
修改detection_output_layer.hpp,注释#include“boost/regex.hpp”
//#include <boost/regex.hpp>