Caffe实战(三):Caffe环境准备及依赖库介绍

关于Caffe的介绍:http://caffe.berkeleyvision.org/
Caffe源码地址:https://github.com/BVLC/caffe
 
(如果需要使用GPU,还需要下载英伟达显卡驱动,CUDA Toolkit和cuDNN加速库)
 

Caffe 个版本介绍

 
【官方版本】伯克利BVLC(Berkeley Vision And Learning Center) 版
这个是Caffe的主版本,由伯克利大学维护。其他所有的Caffe版本都是由这个版本分支出去的。这个版本Caffe可以编译出Linux和Windows*版本,支持Nvidia的CUDA加速,但是对CPU的优化不好,而且有关安装和配置的文档很少。从这个版本编译Caffe,需要很强的自我学习和解决问题能力。
 
【微软的Windows*版本】
微软自己维护的一个版本。这个版本简化了Caffe在Windows*下的步骤,自带了一个VS的Solution项目。这个版本同样支持基于CPU和CUDA的算法实现。
 
【Intel Caffe优化版】
Intel维护的版本,这个版本优化了Intel CPU的实现算法,同时提供对Intel Xeon CPU多核和多节点的支持。这个版本里有些算法库对Windows*支持不太好,所以这个分支编译出的Caffe主要还是运行在Linux的服务器平台上做训练工作。
 
【Intel clCaffe 核显OpenCL优化版】
Intel维护的另一个版本,相对于官网BVLC Caffe上的OpenCL分支,优化了基于Intel 核显GPU的OpenCL加速算法。这个版本同时支持Windows* 和Linux平台,适合在有Intel核显的CPU上做一些推理(Inference)场景的工作。
 
关于BCLV官方版本的环境配置及编译可以参考:Caffe学习笔记 第一部分 - Windows*下BVLC Caffe的安装与配置
 

Linux环境准备

(1)caffe运行环境首先需要一些依赖库

 
# centos
sudo yum install protobuf-devel leveldb-devel snappy-devel opnecv-devel boost-devel hdf5-devel atlas-devel
sudo yum install gflags-devel glog-devel lmdb-devel

# ubuntu 16.04
sudo apt-get install git
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install python-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

# 由于需要用到这些库用于开发(头文件,库文件),因此需要安装这些库的开发版本,即xxx-dev;
 
gflags,glog,lmdb下载地址:
 
特别注意:在旧的系统上,如CentOS6.7下,通过yum找不到protobuf,leveldb,gflags,glog,lmdb等,则需要下载,手动编译安装。在下载时一定要选择与相应系统支持的版本。
在Linux下安装需要注意两点:(1)软件的版本与系统版本匹配;(2)软件依赖库要相互匹配。(自己常常用yum命令一步到位,很方便;但是好多软件或库需要手动下载安装,而自己在安装上面的依赖包时就耽误了好长时间,说明对Linux下的软件安装不熟悉)
 
既然安装这些依赖包这么麻烦,有没有一种办法可以快速移植到另一台机器(最好是同系统的)?可以将依赖包安装到指定的目录下,这样做的好处是便于迁移。在一台机器上安装好的Caffe及其依赖,能迅速迁移到另一台机器上而无须重复编译、安装。
# caffe及软件依赖包安装路径配置
./configure --prefix=/home/yourname/local_install/
make
make install

# 添加环境变量中(系统能够找到该库)
export PATH=~/loca1_insta1l/bin/:$PATH

可以将其写入/home/yourname/.bashrc ,以实现建立会话时自动配置环境。
 
gflags的安装有点不同
 
(2)下载Caffe源码
 
git clone https://github.com/BVLC/caffe.git
cd caffe/
mv Makefile.config.example Makefile.config
 
(3)修改Makefile.config
 
如果电脑中没有GPU(特指英伟达显卡,能够运行CUDA),则只能利用CPU进行训练,测试。
# 仅CPU模式开关,打开该选项(去掉“#”)表示caffe编译时仅支持CPU,不支持GPU
CPU_ONLY := 1

# 添加头文件路径和库路径,编译时需要(如果依赖库安装到指定目录下)
在INCLUDE_DIRS 后面加入~/local_install/include 
在LIBRARY_DlRS后面加入~/1ocal_install/lib.
 
(4)执行make进行编译
 
# -j选项表示使用多线程编译,利用所有可用的CPU,加快编译速度
# 也可指定数字,如-j8表示开启8个线程编译
$ make -j
 
(5)测试caffe
# 添加库路径,链接库时需要(如果依赖库安装在指定的目录下)
$ export LD_LIBRARY_PATH=/home/yourname/local_install/lib:$LD_LIBRARY_PATH
$ export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

# 编译,运行测试代码
make test
make runtest

# 如果希望Python和matlab调用caffe,则需要编译外壳
make pycaffe
make matcaffe

# 还可以编译生成可发布安装包,用来交付给其他调用方
make distribute

 

Windous环境准备

 
Microsoft为Windous用户提供了一套Caffe for Windous分支:https://github.com/microsoft/caffe
  • 操作系统: 推荐Windows Server 2012 R2 64bit 或Windows 7 SPl 64bit 以上
  • 编译环境(必选): Visual Studio 2013 Ultimate 版(可以查看Caffe.sln文件,获得需要的vs版本)
 
备注:后来BVLC也提供了windows版本的分支 https://github.com/BVLC/caffe/tree/windows,不过需要通过cmake生成vs版本(对我这种不熟悉cmake操作的可能有点麻烦),而且vs2013版本只支持cpu,python2.7;不过支持vs2015
 
下载Microsoft/caffe,进入../caffe/windows目录下,将文件CommonSettings.props.example重命名为CommonSettings.props。如果只需要编译CPU模式下的Caffe,则需要对CommonSettings.props进行修改,修改内容如下
 
 
打开Caffe windous工程(Caffe.sln),其中包含16个项目,最重要的是生成libcaffe.lib库(静态库),其它的项目主要是一些示例程序(.exe),工具(.dll)等(目前还不清楚,以后再细细查看)。
 
在编译阶段,visual studio 2013会通过NuGet工具自动获取预编译caffe依赖包,放在NugetPackages目录下,与Linux下依赖的相同。不过,在windous下这些依赖包占用约1GB的空间,在Linux下不到200MB。
 
编译成功后生成的文件(caffe.exe,libcaffe.lib)存放在../caffe/Build/x64/Release下。(在Debug模式下编译时,有时会出错,还不清楚原因,可能下载的这些依赖库都是Release版本的)
 

依赖库解析及手动安装

 
ubuntu apt-get默认安装位置:/usr/bin; /usr/lib; /usr/share; /etc
ubuntu apt-get默认下载位置:/var/cache/apt/archives
 
手动安装caffe依赖库,虽然麻烦,但是可以指定安装路径,便于迁移。
下面以在ubuntu 16.04上安装各种依赖库为例,详细介绍各个库的安装过程。安装路径为:/home/gd/local_install(当然也可以指定其它路径/home/yourname/local_install)

ProtoBuffer

ProtoBuffer是由Google开发的一种可以实现内存与非易失存储介质(如硬盘文件〉交换的协议接口。Caffe源码中大量使用ProtoBuffer作为权值和模型参数的载体。一般不一致的参数管理带来很多问题,有人用Txt文件便于修改,有人用BIN文件高效读写等。ProtoBuffer工具完美地解决了这个问题,用户只需要建立统一的参数描述文件(proto) ,然后利用.protoc 编译就能让协议细节等关键部分代码自动生成,节省了大量的开发、调试时间。使用ProtoBuffer 还可以跨语言(C++/Java/Python)传递相同的数据结构,让团队协作更有效率。
 
注意:有时旧版本的ProtoBuffer生成的文件在新版本中使用会有各种不易排查的错误信息,所以推荐在需要运行Caffe的环境下都使用同一版本ProtoBuffer。
 
例如,在Caffe源码框架中找到models/bvlc_reference_caffenet/solver.prototxt文件,这里面记录了一些模型训练所需的超参数(Hyper-Parameter),用Caffe训练时会首先读取该文件,获得其中特定字段的数值,并据此设置内存中模型训练时的超参数变量值,从文件读取到内存的过程就是由ProtoBuffer工具协助完成的。利用该工具,使得Caffe 具有灵活性好、可扩展性强的特点。
 
在caffe/src/proto/和caffe/include/proto中,caffe.pb.b 和caffe.pb.cc 就是用于解析Caffe 参数配置文件、将模型权值序列化/反序列化到磁盘的协议接口。(简单说就是google的ProtoBuffer提供了一种内存和硬盘文件交换的协议接口,而Caffe在此基础上又封装了用于解析Caffe参数配置文件的API)
 
【安装C++库】
$ tar zxvf protobuf-2.5.0.tar.gz
$ cd protobuf-2.5.0
$ ./configure --prefix=/home/gd/local_install/
$ make
$ make install
 
【安装python库】
注意,还没有结束。这里只是编译生成protobuf C++库,caffe.bin可以直接调用。caffe还提供python接口,需要调用protobuf python接口。例如,caffe团队提供画网络模型的工具./python/draw.py,在执行时会导入google.protobuf模块,如果没有安装该模块,则会提示如下错误:
 
在python/下确实没有找到该模块。于是到protobuf源目录去查找(编译的源文件目录),其中有python目录,并且有编译生成google.protobuf模块。按照该目录下的README文件安装即可:
 
1)install setuptools:如果没有安装,会自动下载安装。不过提示“SSL is required”之类的错误,如下所示
 
提示中有链接地址,可以手动下载,只要将http-->https即可解决该问题:
wget https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg
 
2)build and run tests:
python setup.py build
python setup.py test
 
3)install
python setup.py install
 
这样就将protobuf的python接口安装到python路径下,系统可以导入该模块。

Boost

在Caffe 中主要使用了Boost中的智能指针,其自带引用计数功能,可避免共享指针时造成内存泄漏或多次释放,另外, pycaffe使用Boost Pytbon 实现C/C++和Python语言的连接,方便Python调用C/C++设计的模块。
 
tar jxvf boost_1_56_0.tar.bz2
cd boost_1_56_0/
./bootstrap.sh --with-libraries=system,thread,python,filesystem  # 这里只编译caffe需要的相关库,如果全部编译耗时长
./b2
 
cp -r boost/ /home/gd/local_install/include/
cp stage/lib/* /home/gd/local_install/lib/

GFLAGS

GFLAGS 在Caffe中主要起到命令行参数解析的作用,这与ProtoBuffer功能类似,只是参数输入源不同。GFLAGS 的使用方法可参考Caffe源码中的tools/caffe.cpp.
 
unzip gflags-2.1.1.zip
cd gflags-2.1.1/
mkdir build && cd build/    # 创建一个build目录,编译的输出文件生成到此目录下
cmake ..    # 注意CMakeLists.txt文件在上一级目录
ccmake ..  # 启动CCMAKE配置界面,将BUILD_SHARED_LIBS设置为ON;CMAKE_INSTALL_PREFIX指定安装路径
                 # 修改完之后,先按C键,再按G键,生成Makefile文件
make
make install

GLOG

GLOG库是Google开发的用于记录应用程序日志的实用库,提供基于C++标准输入输出梳形式的接口,记录时可选择不同的日志级别,方便将重要日志和普通日志分开。
 
GLOG 在Caffe 中主要起到记录日志的作用,便于开发者查看Caffe 训练、中产生的中间输出,并根据这些信息决定如何调整参数来控制收敛。从日志文件我们能非常方便地看到程序运行的流程,便于跟踪源码、定位问题。GLOG 的使用方法可参考Caffe 源码中的tools/caffe.cpp.
 
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3/
./configure --prefix=/home/gd/local_install/
make 
make install

 

编译错误提示:
 
这里错误的原因是指针和字符判断比较导致的,修改为:
src/demangle.cc:170:16
    if(*str == '\0'){
        ...
或者
   if(str[0] == '\0'){
        ...
 
同理:
src/demangle.cc:226:29
    if(state->mangled_cur[0] == '\0') {

BLASE

卷积神经网络中用到的数学计算主要是矩阵、向量的计算, Caffe中调用了BLAS (Basic Linear Algebra Subprogram 基本钱性代数子程序〉中的相应方法。最常用的BLAS 实现有Intel MKL 、ATLAS 、OpenBLAS 等,Caffe可以选择其中任一种。打开Makefile.config ,
 
οpenBLAS 在Caffe 中主要负责CPU 端的数值计算(如矩阵乘法)。由于调用量相当大,该库的性能直接影响Caffe的运行性能。如果你已经购买了MKL,则不必再用OpenBLAS. 另外,在GPU 端的数值计算则由对应的cuBLAS 完成,其API 接口与OpenBLAS类似。
 
为什么没有 igemm 函数?
igemm 表示整型普通矩阵乘法,矩阵每个元素都是 int。在矩阵乘计算过程中,int 类型容易发生溢出,导致计算结果错误。一般数学库(MKL, OpenBLAS)都是面向科学计算领域,允许结果存在一定误差,但不能出现错误。
 
tar zxvf OpenBLAS-0.2.14.tar.gz
cd OpenBLAS-0.2.14/
make -j
make PREFIX=/home/gd/local_install/

HDF

HDF (Hierarcbical Data File) 是美国国家高级计算应用中心(NCSA)为了满足各种领域研究需求而研制的一种能高效存储和分发科学数据的新型数据格式。它可以存储不同类型的图像和数码数据的文件,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库。Caffe训练模型可以选择保存为HDF5格式或(默认的) ProtoBuffer格式。
 
tar zxvf hdf5-1.8.9.tar.gz
cd hdf5-1.8.9
./configure --prefix=/home/gd/local_install/
make -j && make install

 

编译错误提示:
 
这里只需要将注释符“//”改为“/* */”即可
 

LMDB & LEVELDB

 
LMDB (Lîghtning Memory-Mapped Database Manager) 一一闪电般的内存映射型数据库管理器,在Caffe中的作用主要是提供数据管理,将形形色色的原始数据(JPEG 图片、二进制数据〉转换为统一的Key-Value 存储,便于Caffe的DataLayer 获取这些数据。LEVELDB 库是Caffe早期版本使用的数据存储方式,由Google 开发。它是一种持续的键值对存储方式,键和值可以为任意字节数组。键的存储顺序可由用户定义的比较函数决定。目前大部分例程都已经使用LMDB代替了LEVELDB ,但是为了与以前的版本兼容,仍然将这个依赖库编译到Caffe中。
 
# LMDB
# 下载LMDB源码,无须配置,直接编译:
make 
# 编译成功后将头文件和库文件拷贝到指定的目录下
cp lmdb.h /home/gd/local_install/include/
cp liblmdb.so /home/gd/local_install/lib/
 
# 安装leveldb
tar zxvf leveldb-1.7.0.tar.gz
cd leveldb-1.7.0/
make
cp -r include/leveldb /home/gd/local_install/include/
cp libleveldb.so* /home/gd/local_install/lib/
 

Snappy

Snappy 是一个用来压缩和解压缩的C++库,旨在提供较高的压缩速度和合理的压缩率。Snappy 比zlib 更快,但文件相对要大20%~100% 。
 
tar zxvf snappy-1.1.1.tar.gz
cd snappy-1.1.1/
./configure --prefix=/home/gd/local_install/
make && make install

OpenCV

OpenCV是世界上最流行的开源计算机视觉库,包含大量图像处理函数。Caffe使用OpenCV完成一些图像存取和预处理功能。由于Caffe里面用到的OpenCV模块非常有限,仅限于图片读取、图像缩放等CPU上模块,完全可以禁用无关模块以节省编译时间。
 
第一次在ubuntu 16.04上安装opencv,尝试了几个版本(2.4.11,3.x.x)都失败了,才发现在Linux上安装opencv是很麻烦的,配置很复杂,稍微配置不正确就会导致安装失败。最后,参考ubuntu16.04 安装opencv3.4.0这篇文章才算安装成功。
 
【第一步:配置环境】这一步很重要,如果配置不完全或者不正确,很难安装成功。
$ sudo apt-get install build-essential
$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev # 处理图像所需的包
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
$ sudo apt-get install libxvidcore-dev libx264-dev # 处理视频所需的包
$ sudo apt-get install libatlas-base-dev gfortran # 优化opencv功能
$ sudo apt-get install ffmpeg
 
【第二步:下载OpenCV】
这里需要下载opencv和opencv_contrib(后者会在cmake配置的时候用到),这是因为opencv3以后SIFT和SURF之类的属性被移到了contrib中。
由于在Caffe中只是需要基础的图像处理操作,可以不下载opencv_contrib
$ wget https://github.com/opencv/opencv/archive/3.4.0.zip # 从github上直接下载或者clone也可
$ wget https://github.com/opencv/opencv_contrib/archive/3.4.0.zip

 

【第三步:配置编译opencv】
$ unzip 3.4.0.zip
$ cd opencv-3.4.0
$ mkdir bilud
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/home/gd/local_install \
-D WITH_IPP=OFF \    # ippicv下载很慢,常常导致下载超时导致编译失败;因此可以关闭此项
-D WITH_QT=OFF \     # 未安装QT时可关闭
-D WITH_OPENGL=OFF   # 不需要opengl可关闭
 
$ make -j
$ make install
 
备注:ippicv下载很慢,常常导致下载超时导致编译失败;因此可以关闭此项。若需要安装此项时,可以离线下载该文件,将下载的ippicv文件直接拷贝进入opencv源码的下面这个目录:
opencv/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e(注意最后一级目录要跟实际情况而定)

posted on 2021-04-10 19:12  悬崖边上打坐  阅读(848)  评论(0)    收藏  举报

导航