由于实验需要,要安装一下caffe,并集成进C++项目。当然,是通过CMake来管理的。接触的包越多,越感觉CMake方便好用。
导师让我去看一下Caffe,说是不难,然后我就去网上开始找,虽然之前也看过一下caffe的情况,但是需要安装配置的东西还是挺多的,而且很多我并不了解,所以还是一边安装,一边记录,弄一个汇总的东西,记录一下过程中我遇到的一些问题和心得,以后也好查看。
还有一个原因,我在弄OpenCV的时候,发现这个不像VTK,该库有一个不好的行为:VTK的cmake构建默认只有常规组件,可以选择不同的扩展。而OpenCV不然,就比如说,我电脑上有matlab,那cmake的时候,OpenCV会要求编译matlab的部件,再有,我装了cuda,也是要牵扯到,然后还有VTK,OpenCV会自动选中with_vtk。可我不需要这么多啊,尤其是matlab。
项目是医学图像相关,所以已经使用了VTK和ITK,这两个包也是给我构建的头大,好在已经有几年了,配置项早就烂熟于心了。
我的电脑上已经有的包库或者运行环境,我罗列一下(下面所说都是添加进了 环境变量PATH 的):
http://caffe.berkeleyvision.org/installation.html
这个是caffee的安装主页,首先看的时候,先看这个页面,然后在去最上面看相对应OS的具体页面。
https://github.com/BVLC/caffe/tree/windows
比如我的是windows下,先看到有这样几个依赖:
尴尬的是CUDA到底是可选还是必须???管他呢,反正我是已经装上了。
看了看大概,那么就有一些思路了:
首先确定的一点是,caffe一定是不能使用编译好的。因为我需要调试,需要集成进项目,不能没有源代码。其他的一些细枝末节,倒是可以考虑编译好的,比如openblas。
每搞定一个,用cmake测一下看能不能找到对应的模块。比如设置好了CUDA,我引入一下OpenCL,看看能不能找到CUDA的lib里面。以此类推,都这样搞一下,确保每步安装正确。
这个我之前就装上了,当时是为了OpenCL的头文件,想想啊当时也是挺醉的,为这么个小东西,装了个CUDA。但是单独的OpenCL库有很难找到。而且OpenCL在各个显卡实现不一样。
cuda倒是傻瓜式安装,点点鼠标,下一步下一步。cudnn是直接把文件拷贝到cuda的对应目录,感觉和搞破解似的=。=
记得检查CUDA是否在PATH环境变量里面有这个值,一般自动会加上。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\libnvvp
atlas我也下载了,但是atlas并木有适合CMake的,就是没有***Config.cmake文件,而且CMake\share\cmake-3.7\Modules中也没有FindAtlas.cmake,所以还是放弃吧。MKL没看,欢迎大家补正。
先上参考页:
http://blog.csdn.net/u013143795/article/details/51581512
http://www.openblas.net/ 官网
OpenBLAS,我一开始下载的是0.2.20(sourceforge),最新版,因为这种小的基础的依赖包,不太可能要单步debug,所以还是省点事。然鹅,没有发现文中说的windows安装包,只能下载到代码。然后是我辗转许久才发现,我到0.2.19文件夹(sourceforge)里面就看到了,我去。。。
我下载了两个东西:
一开始尝试的是2,尝试自己编译结果各种问题,推荐1。第一个打开就是lib,include,bin文件夹,然后在lib/cmake/openblas文件夹中有这个OpenBLASConfig.cmake以及OpenBLASConfigVersion.cmake。这就是cmake的接口了。所以不必去自己编译,编译好的也有cmake接口。
注意:参考文中提到说要MinGW,是因为官方的安装文档就这么说的。实测发现需要两个GNU组件sed.exe和awk.exe,但是蛋疼的是,这两个东西我单独安装之后,VS也并不能编译通过,似乎就是需要MinGW的编译才行。使用编译好的,就相当简单,解压就行。然鹅,cmake没有提供FindOpenBLAS.cmake,那么还是得在配置时候指定这个路径。
注意2:在caffe源代码的cmake文件夹中,我找到FindOpenBLAS.cmake这样一个文件,真棒。。。其实就是写inc和lib的位置,既然有写好的,那么在caffe引入的时候肯定会引入的,而且这个文件还可以单独拷贝出来,以备以后再用。另外,在caffe/cmake/Modules里面有好多找模块的Find文件。
这个头大了一下。首先是调参数。
我的电脑上还装了VS2015,所以默认的编译器是2015,但是我用的2013。所以要调一下编译器。
设置参数的参考:
http://www.boost.org/build/doc/html/index.html
这个是boost的官网配置指导,有精力可以慢慢寻找各种配置。然后Boost.Build, b2, bjam 和Perforce Jam不同也有说明,貌似都可以用来编译boost。
http://blog.csdn.net/zengraoli/article/details/70187556
这个说明比较清晰,使用的bjam
http://blog.csdn.net/wangxvfeng101/article/details/47002853
这个提到了64和32,用的b2
其实也可以使用–help来查看各种参数。两个exe输出的东西是一样的。
查了一下,发现boost之前有一个模块化项目,但是貌似废止了,大家都是用指定环境变量的形式,就是有一个Boost_DIR,指向根目录,查了一下CMake的FindBoost貌似也是就需要环境变量。。。
我尝试使用boost1.60(通过查FindBoost得知,还是搞一个存在定义的版本的比较靠谱,cmake3.7的是最高到1.61)。
boost_1_60_0
|
|----boost_1_60_0-源代码,b2在这里面
|----build-构建打算放在这,通过–build-dir指定
|----install-包括stage都放在这了,通过–prefix指定
bjam install stage --prefix=../install --toolset=msvc-12.0 --stagedir=../install/stage address-model=64 --build-dir=../build --build-type=complete link=shared runtime-link=shared threading=multi debug release
//解释:构建并安装,使用msvc-12.0(就是vs2013编译器),stage保存在../install/stage,使用64位模式,构建中间产物路径在../build,构建类型是完全(默认是最小库),链接方式为动态(还可以指定静态static),运行时链接也是动态,使用多线程模式,同时构建debug和release两个版本(也就是两种库,debug带d后缀,比如boost_atomic-vc120-mt-1_60和boost_atomic-vc120-mt-gd-1_60)。
有些错误,但大都成功,添加环境变量BOOST_ROOT(D:\cxxlib\boost_1_60_0\install),然后在其他项目中是可以找到对应模块的。
find_package(Boost COMPONENTS system REQUIRED)
但是,生成过程中产生了问题,说是C1001 编译器内部错误,我尝试只编译某一个库,比如thread,也是出这个错,看来躲不过去了。从网上查看之后,发现貌似是VS2013太老了,我需要一个超大的update5(5G+)。
链接从哪找的也忘了:
http://download.microsoft.com/download/A/F/9/AF95E6F8-2E6E-49D0-A48A-8E918D7FD768/vs2013.5.iso
错误解决的两个参考:
http://bbs.csdn.net/topics/391838028?page=1 一楼回答
http://www.mamicode.com/info-detail-1858755.html
这两个文章中说明了情况,我去下载了update5,等安装好我再跑一次boost。
最终…updated 13461 targets…,没有报错。
find_package(Boost COMPONENTS thread system filesystem program_options REQUIRED)
再次测试,是可以的,cmake输出:
Boost version: 1.60.0
Found the following Boost libraries:
thread
system
filesystem
program_options
chrono
date_time
atomic
参考:
http://blog.csdn.net/longji/article/details/77885076
主要是看的这个。。。还有要关掉几个选项:
BUILD_DOC 构造一个帮助文档,需要doxygen
BUILD_PACKAGE 构造一个exe的安装包,需要perl
各种TEST 测试,浪费时间。。。注意选择INSTALL目录
然后由于我电脑上有CUDA,要不是我不知道怎么关,我也会关掉的。CUDA给出的选项太多。
然后是61个项目,opencv3.3,编译挺费时间的。
先ALL_BUILD,然后INSTALL,生成并安装。添加环境变量OPENCV_ROOT(D:\cxxlib\opencv-330\install,就是cmake设置里面设置的cmake-install-prefix),也就是OpenCVConfig.cmake所在目录。在其他地方使用
find_package(OpenCV REQUIRED)
就可以找到了。
http://caffe.berkeleyvision.org/installation.html
我下载的是caffe-windows。点开brach那里,还有很多其他版本。这是Caffe的
https://github.com/BVLC/caffe/tree/windows
当然还有微软封装的,属于微软自己的项目
https://github.com/Microsoft/caffe
这个是微软封装过,直接就有Caffe.sln,可以在props文件中改属性,那是微软那一套了。
cmake时候发生一个问题:
CMake Error at cmake/WindowsDownloadPrebuiltDependencies.cmake:41 (message):
Could not find url for MSVC version = 1800 and Python version = 3.5.
我查了一下那个文件中的40行。发现了问题,是这样一个判断:
if(NOT DEFINED DEPENDENCIES_URL_${MSVC_VERSION}_${_pyver})
我输出看到MSVC_VERSION=1800,_pyver=35,也就是说,对应的python和VS都找到了,那是什么没找到呢?
我用VS2015就不会出这个错, 所以是VS2013没有找到python3支持?
如果不构建python,就没这事了,caffe会默认构建针对python2.7。
如果不构建python,直接就跳过这个,开始下载其他依赖库了。。。所以,我暂时跳过这个。
然鹅,等我等待下载完成后,发现除了CUDA,人家都是自己下载的>_<~,这。。。。。
我觉得心脏受到了暴击。。。最后瞎下载完成的列表:
BLAS : Yes (Open)
Boost : Yes (ver. 1.61)
glog : Yes
gflags : Yes
protobuf : Yes (ver. 3.1.0)
lmdb : Yes (ver. 0.9.70)
LevelDB : Yes (ver. 1.18)
Snappy : Yes (ver. 1.1.1)
OpenCV : Yes (ver. 3.1.0)
CUDA : Yes (ver. 8.0)
除了cuda是我的,其他的都是下载的。。。。好吧。。。那就这样吧。。。先编译了再说。。其实cuda也不需要,不要cuda,默认编译CPU_ONLY版本。
按理来说,到这里就算完成了,点开sln项目,编译,安装,就搞定了,但是,这里还有一些东西。。。我不甘心没有python。。。
直到我看到这个,我才理解错误的意思,就是说没有打包的支持包给我下载,对应版本是1800和py3.5。
http://blog.csdn.net/u011728480/article/details/78834630
如果怕下载慢,也可以去这个列表里面下载,具体的情况参考文章里面也有说明。
这里有一个caffe-windows可以下载的依赖包的列表:
https://github.com/willyd/caffe-builder/releases/
可以看到,python3,只有从14.0才开始支持,也就是目前来说,
要么用VS2015,要么python2。
没有python不行啊,还得从其他人那弄算法和做实验呢。
重新下载了Anaconda2 5,也是5,anaconda3也是5,但就为了不同python版本,分了两个。
这下,cmake caffe直接就可以过了。