caffe单独移植出来需要的工程配置和注意点,CPU版本和GPU版本!

来源:互联网 发布:网络教育学籍参军 编辑:程序博客网 时间:2024/06/05 19:06

转自:http://blog.csdn.net/yangdashi888/article/details/72900293

这个需要一定caffe基础的人才可以配置,入门者请先看如何把caffe-master给编译成功。

参考博客: Win7_64bit + VS2013 + CUDA7.5 + Opencv2.4.10 成功配置Caffe环境  其主要时GPU版的配置

          Cuda学习笔记(四)——在vs2010中配置.cpp和.cu文件    其时关于GPU版本时添加cu文件需要修改项类型的原因。

         windows下的caffe配置过程   GPU版本的配置,注意:其后面的3.4 修改部分在现在的新版本是不用修改了,这些bug已经被微软修复了。

A、caffe配置CPU版本。简单出错低!

其大概就是:

1.准备工作

我在自己的笔记本配置的caffe,配置的环境为:Windows7 64+ cuda8.0+ Opencv2413 + boost1.59+VS2013

1.1安装CUDA8.0

下载CUDA8.0: https://developer.nvidia.com/cuda-downloads,安装完成后会自动创建环境变量CUDA_PATH_V8_0 ,把bin路径添加到环境变量里

1.2安装boost1.59

下载boost1.56http://sourceforge.net/projects/boost/files/boost-binaries/1.56.0/,选择boost_1_56_0-msvc-12.0-64.exe,安装完成后手动创建环境变量BOOST_1_59_0。(创建变量只是为了后期包含库更方便)。把bin路径加到环境变量里,个人的百度盘为:http://pan.baidu.com/s/1kVwqMbX  密码:fep3

1.3安装opencv2413

下载OpenCV2413http://opencv.org/downloads.html,安装完成后把bin路径加到环境变量里

1.4第三方库

这一部分主要包括Glog+Gflag+Protobuf+LevelDB+HDF5+LMDB+Openblas,不容易下载。使用的是Neil Z. SHAO‘s Blog提供的编译好的。

下载地址:http://pan.baidu.com/s/1ge9FN71 密码是:434e 

下载完,解压得到3rdparty文件夹。其主要是x64平台的debug、release模式下的库跟dll,把bin路径添加到环境变量里

其实其就是:


是为了方便我们后期的环境配置而已。

1.5下载caffe源码:我使用的地址是:微软提供Windows工具包(caffe-master):https://github.com/Microsoft/caffe    百度云下载地址:链接:http://pan.baidu.com/s/1hs8ngpA 密码:ith0

特点是:比caffe官网的好,修复了很多bug

2、就可以自己创建一个工程,工程文件如下:


其中src、include是caffe里的,3rdparty是1.4步安装的第三方库。这些都是自己加的。

(1)、然后把与\src\caffe对应的所有文件及文件夹添加进工程源文件中,其大概如下:


任何版本的boost得头文件都相同,所以不用加F:\installed soft\boost_1_59_0\lib64-msvc-12.0里的头文件,因为已经有./3rdparty。接着就是配置工程环境(debug x64)其中的cuda也要加,否则会报错:

VC++目录->包含目录:

[cpp] view plain copy
  1. ./include  
  2. ./3rdparty  
  3. $(CUDA_PATH_V8_0)\include  
  4. ./3rdparty/include  
  5. ./3rdparty/include/openblas  
  6. ./3rdparty/include/hdf5  
  7. ./3rdparty/include/lmdb  
  8. ./3rdparty/include/leveldb  
  9. ./3rdparty/include/gflag  
  10. ./3rdparty/include/glog  
  11. ./3rdparty/include/google/protobuf  
  12. ./src  
库目录:

[cpp] view plain copy
  1. .\3rdparty\lib  
  2. $(CUDA_PATH_V8_0)\lib\$(PlatformName)  
  3. .\src\caffe\proto  
  4. F:\installed soft\boost_1_59_0\lib64-msvc-12.0  
其附加依赖项是:

[cpp] view plain copy
  1. gflagsd.lib  
  2. libglog.lib  
  3. libopenblas.dll.a  
  4. libprotobufd.lib  
  5. libprotoc.lib  
  6. libgflags.lib  
  7. leveldbd.lib  
  8. lmdbd.lib  
  9. libhdf5.lib  
  10. libhdf5_hl.lib  
预处理定义为:

[cpp] view plain copy
  1. WIN32  
  2. _DEBUG  
  3. _CONSOLE  
  4. _LIB  
  5. USE_OPENCV  
  6. CPU_ONLY  
其opencv需要自己另外配置上去就可,我使用的是脚本,所以可以很快。

(2)接着只要编译工程就可,即可成功,很少出错:

 原因:应为当预定义里定义了CPU_ONLY时,则这个那些cu文件就不会参与项目编译,我们只编译了一些cpp,hpp文件,故出错概率很低。成功如下:



B、GPU的版本的配置:

 注意:这一步出现的错误会挺多的做好心理准备。


3.3 编译源码

3.3.1 建立项目

(1)、打开Visual Studio在caffe根目录下新建一个项目名为caffe的空项目。并设置为x64 Release平台,

(2)、然后把与\src\caffe对应的所有文件及文件夹添加进工程源文件中(test文件夹可以不加)


3.3.2 配置属性

(1)、右键项目名>生成依赖项->生成自定义:勾选CUDA 8.0


2)、VC++目录->包含目录:

[cpp] view plain copy
  1. ./include  
  2. ./3rdparty  
  3. $(CUDA_PATH_V8_0)\include  
  4. ./3rdparty/include  
  5. ./3rdparty/include/openblas  
  6. ./3rdparty/include/hdf5  
  7. ./3rdparty/include/lmdb  
  8. ./3rdparty/include/leveldb  
  9. ./3rdparty/include/gflag  
  10. ./3rdparty/include/glog  
  11. ./3rdparty/include/google/protobuf  
  12. ./src  

如图:


3)、VC++目录->库目录:

.\3rdparty\lib

[cpp] view plain copy
  1. $(CUDA_PATH_V8_0)\lib\$(PlatformName)  
  2. .\src\caffe\proto  
  3. F:\installed soft\boost_1_59_0\lib64-msvc-12.0  

如图:


4)、链接器->输入->附加依赖项:

cuda.lib
cudnn.lib
cudart.lib
curand.lib
gflags.lib
cublas.lib
libglog.lib
libprotoc.lib
libprotobuf.lib
libopenblas.dll.a
libgflags.lib
lmdb.lib
leveldb.lib
libhdf5.lib
libhdf5_hl.lib

如图:


5)、C/C++->预处理器->预处理器定义:

USE_LMDB

USE_OPENCV

USE_LEVELDB

_CRT_SECURE_NO_WARNINGS

_SCL_SECURE_NO_WARNINGS

(注意:caffe代码默认是不使用LEVELDB的,如果加了USE_LEVELDB的话3rdparty里的leveldbd.lib与LevelDb.lib需要进行更换,因为他们是依赖boost.1.56的,需要把其更换为NugetPackages\LevelDB-vc120.1.2.0.0\build\native\lib\x64\v120里的库文件,它们是静态库)错误如下:



如图:


6)、CUDAC/C++ -> Common -> Target Machine Platform:64-bit

如图:

a

7)、CUDAC/C++ ->Device -> Code Generation:

compute_20,sm_20 

这个一般默认产生的。

8)、把F:\VSWorkSpace\caffe\3rdparty\bin加入到系统环境变量path中!!!

9)、接下来把源文件中所有的.cu文件,右键点击属性,在常规中的项类型中把“不参与生成”改成“CUDA C/C++”,在对每一个.cu文件进行单独编译。

这里我没有找到简便方法,(工作量比较大)就是说直接配置.cu文件的属性-常规-项类型,则所有的.cu文件都可以变成“CUDA C/C++”

如图:



如果上面这个步骤没有做,会出现下面图中的问题,因为默认的是.cu文件是“不参与生成”:如下:

[cpp] view plain copy
  1. error LNK2019: 无法解析的外部符号 "void __cdecl caffe::caffe_gpu_axpy<double>(int,double,double const *,double *)" (??$caffe_gpu_axpy@N@caffe@@YAXHNPEBNPEAN@Z),该符号在函数 "public: void __cdecl caffe::Blob<double>::Update(void)" (?Update@?$Blob@N@caffe@@QEAAXXZ) 中被引用   H:\VCproject\caffe_classification\classification\classification\blob.obj    classification  
  2. error LNK2001: 无法解析的外部符号 "void __cdecl caffe::caffe_gpu_axpy<double>(int,double,double const *,double *)" (??$caffe_gpu_axpy@N@caffe@@YAXHNPEBNPEAN@Z)    H:\VCproject\caffe_classification\classification\classification\sgd_solver.obj  classification  
  3. error LNK2019: 无法解析的外部符号 "void __cdecl caffe::caffe_gpu_asum<double>(int,double const *,double *)" (??$caffe_gpu_asum@N@caffe@@YAXHPEBNPEAN@Z),该符号在函数 "public: double __cdecl caffe::Blob<double>::asum_data(void)const " (?asum_data@?$Blob@N@caffe@@QEBANXZ) 中被引用 H:\VCproject\caffe_classification\classification\classification\blob.obj    classification  
如图:

然后就可以编译成功。太perfect了。


加入cu文件的改进方法:

    

对应文件右键,然后按J键进行添加到项目中,则工程会自动识别并编译。可以快好多。


阅读全文
0 0
原创粉丝点击