您的位置:首页 > Web前端

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

2017-06-07 15:30 489 查看
这个需要一定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.56:http://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

下载OpenCV2413:http://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++目录->包含目录:

./include
./3rdparty
$(CUDA_PATH_V8_0)\include
./3rdparty/include
./3rdparty/include/openblas
./3rdparty/include/hdf5
./3rdparty/include/lmdb
./3rdparty/include/leveldb
./3rdparty/include/gflag
./3rdparty/include/glog
./3rdparty/include/google/protobuf
./src
库目录:

.\3rdparty\lib
$(CUDA_PATH_V8_0)\lib\$(PlatformName)
.\src\caffe\proto
F:\installed soft\boost_1_59_0\lib64-msvc-12.0
其附加依赖项是:

gflagsd.lib
libglog.lib
libopenblas.dll.a
libprotobufd.lib
libprotoc.lib
libgflags.lib
leveldbd.lib
lmdbd.lib
libhdf5.lib
libhdf5_hl.lib
预处理定义为:

WIN32
_DEBUG
_CONSOLE
_LIB
USE_OPENCV
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++目录->包含目录:

./include
./3rdparty
$(CUDA_PATH_V8_0)\include
./3rdparty/include
./3rdparty/include/openblas
./3rdparty/include/hdf5
./3rdparty/include/lmdb
./3rdparty/include/leveldb
./3rdparty/include/gflag
./3rdparty/include/glog
./3rdparty/include/google/protobuf
./src


如图:



3)、VC++目录->库目录:
.\3rdparty\lib

$(CUDA_PATH_V8_0)\lib\$(PlatformName)
.\src\caffe\proto
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
如图:



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文件是“不参与生成”:如下:

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
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
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键进行添加到项目中,则工程会自动识别并编译。可以快好多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: