Windows_X64 + ATI显卡 + VS2013 安装Caffe

最近更新:微软对CAFFE做了官方支持

1. 依赖

1)需要VS2013+CUDA7.5 或VS2015+CUDA8.0

2)CuDNN,需要注册下载,仅仅是一个库,解压缩就可以了

3)其他依赖项在工程编译时会自动通过NuGet安装


2. 工程配置

首先下载官方维护的CAFFE源码

用notepad++打开caffe-windows/windows/CommonSettings.props.example,修改相关配置:

1)修改<CpuOnlyBuild>为false,<UseCuDNN>为true,<PythonSupport>和<MatlabSupport>看需求改

2)修改<CuDnnPath>为CuDNN的解压路径(解压默认文件夹为cuda,不用包含该级)

3)如果添加了python和matlab支持,修改<PythonDir>和<MatlabDir>

如果添加了python支持,需要pip安装 numpy、scipy、matplotlib、scikit-image、protobuf


使用vs2013打开caffe-windows/windows/Caffe.sln,看libcaffe和test_all有没有成功导入

我的导入失败,因为没找到CUDA 7.5.props,应该是先安装的CUDA再装VS2013导致的问题,参考文章《Windows-7下安装配置Caffe并支持GPU加速》

拷贝CUDA安装目录下的CUDA 6.5.props、CUDA 7.5.targets、CUDA 7.5.xml、Nvda.Build.CudaTasks.v7.5.dll到目录C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\BuildCustomizations

新的错误出现了:未能从程序集。。。Nvda.Build.CudaTasks.v7.5.dll 加载任务

参考文章《CUDA7.5 和VS2013那些事儿》,应该是缺少.net 3.5,于是下载安装,重启机器后终于成功导入


右键libcaffe工程,选择“设为启动项目“。调试->libcaffe 属性->C/C++/常规,“将警告视为错误”改为否


右键libcaffe工程,选择“生成”,会首先通过NuGet还原依赖项,然后开始编译。

在这里我又出错了:alt_sstream_impl.hpp没有生成object文件

应该是编码的问题,解决很简单(参考《windows环境Caffe安装配置步骤(无GPU)及mnist训练》):双击错误,会打开该hpp文件,这时vs已经自动修改编码了,保存下即可

重新编译,成功


编译caffe工程。右击 解决方案->属性->通用属性->启动项目 选定“当前选定内容”,鼠标选定 caffe.cpp ,然后ctrl+f5编译。搞定



----------------------------------------------------------------------我是更新分割线---------------------------------------------------------------------------------


主要内容参考的 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接口

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值