您的位置:首页 > Web前端

Windows_X64 + ATI显卡 + VS2013 安装Caffe

2015-08-20 11:27 513 查看
主要内容参考的 windows+caffe+vs2013+cuda6.5配置记录 ,对其中的一些笔误做了修正,遇到了些别的错误,一并解决

1. 依赖库

boost

原文使用的安装包,很方便:boost_1.56_0-msvc-12.0-64.exe

Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas

原文提供了一个编译好的包,所有东西一并解决:3rdparty

想起了前两天用cmake一个一个编译的苦逼样。。。给大神们跪一个

cuda

虽然我显卡不支持,但还是需要安装,不然编译不通过

找了个cuda6.5,官方推荐用更新的cuda7.0,没有测试

OpenCV

手头有个OpenCV2.4.1的包,打开一看,仅支持到vc10

只好下了个OpenCV2.4.9

2. 建立Caffe工程

首先当然是下载Caffe的源代码

系统环境变量设置

其实可以在VS里通过绝对路径设置的,但不知道为什么,OpenCV如果不设置变量,dll文件死活找不到

我的设置是:PATH: D:\Opencv-2.4.9\opencv\build\x64\vc12\bin;

D:\Opencv-2.4.9\opencv\build;

E:\TestProject\caffe\caffe_windows\caffe-master\3rdparty\3rdparty\bin;

BOOST_156: D:\boost_1_56_0;

PATH的第三项是caffe源代码的路径,在其目录下添加之前下好的3rdparty包

VS2013建立Caffe工程

建立一个win32 console application空项目,位置在哪无所谓,项目路径设置对就可以了

1)项目——属性——C/C++——常规——附加包含目录

caffe源码路径/include;

caffe源码路径/src

caffe源码路径/3rdparty/include;

caffe源码路径/3rdparty;

caffe源码路径/3rdparty/include;

caffe源码路径/3rdparty/include/openblas;

caffe源码路径/3rdparty/include/hdf5;

caffe源码路径/3rdparty/include/lmdb;

caffe源码路径/3rdparty/include/leveldb;

caffe源码路径/3rdparty/include/gflag;

caffe源码路径/3rdparty/include/glog;

caffe源码路径/3rdparty/include/google/protobuf;

2)项目——属性——VC++目录——包含目录

D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v6.5\include;

D:\Opencv-2.4.9\opencv\build\include;

D:\Opencv-2.4.9\opencv\build\include\opencv;

D:\Opencv-2.4.9\opencv\build\include\opencv2;

D:\boost_1_56_0

我这里用的绝对路径,也可以用之前设置的环境变量

3)项目——属性——链接器——常规——附加库目录

D:\CUDA\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib\$(PlatformName);

D:\Opencv-2.4.9\opencv\build\x64\vc12\lib;

D:\boost_1_56_0\lib64-msvc-12.0;

Caffe源码路径\3rdparty\lib;

4)项目——属性——链接器——输入——附加依赖项

Debug添加

opencv_ml249d.lib

opencv_calib3d249d.lib

opencv_contrib249d.lib

opencv_core249d.lib

opencv_features2d249d.lib

opencv_flann249d.lib

opencv_gpu249d.lib

opencv_highgui249d.lib

opencv_imgproc249d.lib

opencv_legacy249d.lib

opencv_objdetect249d.lib

opencv_ts249d.lib

opencv_video249d.lib

opencv_nonfree249d.lib

opencv_ocl249d.lib

opencv_photo249d.lib

opencv_stitching249d.lib

opencv_superres249d.lib

opencv_videostab249d.lib

cudart.lib

cuda.lib

nppi.lib

cufft.lib

cublas.lib

curand.lib

gflagsd.lib

libglog.lib

libopenblas.dll

libprotobufd.lib

libprotoc.lib

leveldbd.lib

lmdbd.lib

libhdf5_D.lib

libhdf5_hl_D.lib

Shlwapi.lib

gflags.lib

libprotobuf.lib

leveldb.lib

lmdb.lib

libhdf5.lib

libhdf5_hl.lib

Release一样,仅是OpenCV的dll去掉后面的d

编译Caffe

1)编译caffe-master\src\caffe下的文件

首先将该目录下的所有cpp文件添加进工程,依次编译每个文件

几个可能的错误:

1. blob.cpp

提示缺少 caffe\proto\caffe.pb.h

下载个GeneratePB.bat,放在caffe-master\scripts目录下,之前下的3rdparty\bin下应该有个protoc.exe

运行bat就生成所需文件了

2. common.cpp

报getpid的错误

添加#include <process.h>

项目——属性——C/C++——预处理器——预处理器定义,添加 _CRT_SECURE_NO_WARNINGS 和 _SCL_SECURE_NO_WARNINGS

在getpid的位置添加(原文漏掉了p,且ifndef写成了ifndef)

<span style="white-space:pre">	</span>#ifndef _MSC_VER
<span style="white-space:pre">	</span>pid = getpid();
<span style="white-space:pre">	</span>#else
<span style="white-space:pre">	</span>pid = _getpid();
<span style="white-space:pre">	</span>#endf
<span style="white-space:pre">	</span>//其实按我的理解,直接将getpid改成_getpid就可以了,后面很多情况我嫌麻烦直接这么干的
3. net.cpp

关于mkdtemp的错误

在io.hpp中添加 #include “mkstemp.h” (原文漏写成了mkstep.h)

在close()的位置添加(原文ifndef写成了ifndef)

<span style="white-space:pre">	</span>#ifndef _MSC_VER
<span style="white-space:pre">	</span>close(fd);
<span style="white-space:pre">	</span>#else
_<span style="white-space:pre">	</span>close(fd);
<span style="white-space:pre">	</span>#endif
在mktemp的位置修改

<span style="white-space:pre">	</span>#ifndef _MSC_VER
<span style="white-space:pre">	</span>char* mkdtemp_result = mkdtemp(temp_dirname_cstr);
<span style="white-space:pre">	</span>#else
<span style="white-space:pre">	</span>errno_t mkdtemp_result = _mktemp_s(temp_dirname_cstr, sizeof(temp_dirname_cstr));
<span style="white-space:pre">	</span>#endif
4. solver.cpp

关于snprintf的错误

添加 #include <cstdio>

添加

<span style="white-space:pre">		</span>#ifdef _MSC_VER
<span style="white-space:pre">		</span>#define snprinf sprintf_s
<span style="white-space:pre">		</span>#endif
2)编译caffe-master\src\layer下的文件

在工程中新建一个layer目录,将路径下所有cpp和cu文件添加进去

右键每个cu文件,点属性,常规-项类型 修改为 CUDA C/C++(如没有这个选项,右键工程名-生成依赖项-生成自定义,弹出框中勾选CUDA)

bnll_layer.cu文件,修改:float kBNLL_THRESHOLD = 50 ——> #define kBNLL_THRESHOLD 50.0

conv_layer.cu和deconv_layer.cu文件,forward_gpu_gemm()函数报错,少了一个参数,添加第4个参数:false

contrastrive_loss_layer.cpp文件,56行(类型不一致的错误)

Dtype dist = std::max(margin - sqrt(dist_sq_.cpu_data()[i]), 0.0);

<span style="white-space:pre">	</span>//改为
<span style="white-space:pre">	</span>Dtype dist = std::max(margin - sqrt(dist_sq_.cpu_data()[i]), Dtype(0.0));
3)编译caffe-master\src\util下的文件

跟layer一样,添加文件进项目,修改cu文件属性

1. io.cpp

ReadProtoFromBinaryFile

O_RDONLY ——> O_RDONLY | O_BINARY

修改所有的open()和close()为_open() 和 _close()

2. math_functions.cpp

添加

<span style="white-space:pre">	</span>#define __builtin_popcount __popcnt
<span style="white-space:pre">	</span>#define __builtin_popcountl __popcnt
3. db_lmdb.cpp(原文为db.cpp)

<span style="white-space:pre">	</span>#ifdef _MSC_VER
<span style="white-space:pre">	</span>#include <direct.h>
<span style="white-space:pre">	</span>#endif
修改CHECK_EQ

<span style="white-space:pre">	</span>#ifdef _MSC_VER
<span style="white-space:pre">	</span>CHECK_EQ(_mkdir(source.c_str()),0)<<”mkdir”<<source<<”failed”;
<span style="white-space:pre">	</span>#else
<span style="white-space:pre">	</span>CHECK_EQ(mkdir(source.c_str(),0744),0)<<”mkidr”<<source<<”failed”;
<span style="white-space:pre">	</span>#endif
4)编译caffe-master\src\proto下的文件

5)其他错误

convert_imageset.cpp:snprintf改为_snprintf,前面加 #include<stdio.h>

extract_features.cpp:shared_ptr用boost::限定,因为现在std也加入了该指针,会造成名称的不确定性错误

生成

将caffe-master\tools下的一个文件作为工程main文件即可生成相应的exe

如:将caffe.cpp作为main.cpp,可以生成caffe.exe,该程序集成了 train,test,device_query,time 4个主要功能

附一张训练mnist的截图:



参考资料

[1] windows+caffe+vs2013+cuda6.5配置记录
[2] VS2013配置Caffe卷积神经网络工具(64位Windows 7)——建立工程

更新

windows配置caffe还是用happynear的版本吧,一步到位,还支持matlab和python接口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: