您的位置:首页 > Web前端

Ubuntu 15.04配置Caffe(cpu)_我遇到的坑

2016-06-02 18:50 393 查看
作为一个不怎么用ubuntu的人,为了跑机器学习实验,还是尝试配置下caffe环境。

本来觉得按着不同博客的教程,总能一步一步配好,结果遇到一步一步的难题,总共用了两天才编译通过,所以借此把流程跟坑都记录下来,以便后面慢慢熟练!!!

第一步 下载caffe

首先从github上下载好caffe库:https://github.com/BVLC/caffe,解压,得到这些东西



在终端上打开你下的文件夹caffe-master。然后在目录下将创建一个Makefile.config的副本(原本文件夹只有Makefile.config.example)

cp Makefile.config.example Makefile.config


接下来就是修改makefile.config,在这个文件里面对应的注释讲的很清楚,需要哪一项,吧对应那一项前面“#”去掉就好了。所以我改了这两项:

CPU_ONLY:=1 //把前面注释#去掉就好了
BLAS:=atlas //这个很重要


BLAS(Basic Linear Algebra Subprograms,基础线性代数程序集)是一个应用程序接口(API)标准。他的实现有很多,caffe用的是其中的三种实现ATLAS, MKL, or OpenBLAS。这里我准备使用atlas,因为很方便,所以把上面的config的BLAS改成了atals。(安装atals后面会讲)

第二步 编译以及安装protoc

实际上,有些教程是让人用apt安装
sudo apt-get install libprotobuf-dev
。我开始以为很方便,但实际上到最后回遇到一个问题,就是当你所有依赖库还有环境配好后,总是会遇到

.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...


这类的错误。所以,还是用源码包来编译安装才能把这个问题解决掉,因为只要在编译的时候出现这个问题,只要重新编译一次protobuf就ok了。

在安装之前需要先把工具automake给装了:

sudo apt-get install autoconf automake libtool


那接下来就下载protobuf吧,在github下载,解压https://github.com/google/protobuf

解压后,进入目录protobuf-master, 运行:

./autogen.sh


这是会提醒你的curl没有安装的错误。所以安装curl吧,不过没安装也ok,因为curl起到的作用就是下载文件,但https://googlemock.googlecode.com/files/gmock-1.7.0.zip这个东西还是要下,那就直接下载吧(翻墙下载)。下完后不用解压,直接把gtest-1.7.0.zip放到protobuf-master的目录下就ok了。vim打开autogen.sh 把有用到curl的地方注释掉就ok了。然后再次运行
./autogen.sh


运行成功后,依次输入命令(还是在protobuf-master的目录下):

./configure
make
make check


make
make check
都会费一点时间(如果你遇到很多次坑,每次都想重新编译protobuf的话记得make之前要make clean一下)。如果
make check
之后出现类似:



就可以开始

sudo make install


成功之后就继续装一些依赖库了。

第三步 一些依赖库

一口气可以用apt安装的依赖库:

sudo apt-get install libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev


第一步说到的altas,这里也可以一口气用apt安装。有些教程是编译atlas来安装,其实挺费波折的,因为编译atlas源码过程中还需要给CPU调频…这个过程还需要装个工具包,这条路我绕过我就不叙述了,太麻烦。直接apt,也不碍事:

apt-get install libatlas-dev
sudo apt-get install libatlas-base-dev
apt-get install liblapack-dev


第四步 配置opencv环境

网上很多caffe教程都是默认你装好opencv的,所以可能会忽略掉这个重要的步骤。这里我就用最简单的opencv教程来叙述。

首先是一些工具包和依赖:

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  //可选


从官网下载最新opencv源码(2.4以上)

http://sourceforge.net/projects/opencvlibrary/ 这里我下的是opencv3.0

编译opencv

先把下载的opencv源码包解压,然后在opencv源码目录下:

cd ~/opencv-3.0.0-rc1
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make
sudo make install


编译完,环境也自动加上了。

第五步 编译Caffe

前面的步骤完了之后,就可以返回到caffe-master的目录下了。

make clean  //记得每次编译前都要clean一下咯
make all


按理说,这就编译成功哦。。

但假如编译不成功,会遇到什么问题捏?

可能遇到的问题

问题一

/usr/include/hdf5.h:24:22: fatal error: H5public.h: 没有那个文件或目录


这是,因为hdf5包的头文件没有include到编译环境里。

这个时候,我找到H5public.h以及一大堆hdf5头文件都在
/usr/include/hdf5/serial
下,所以添加g++个gcc的include目录:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include/hdf5/serial
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/hdf5/serial


你可以直接在终端加,也可以加到
/etc/bashrc
/etc/profile
里面再source一下,但是关掉终端后还是会失效(我还没查到有什么方法,求指导),所以每次记得手动加咯…

问题二

/usr/bin/ld: cannot find -lhdf5_hl
/usr/bin/ld: cannot find -lhdf5


这是没有把hdf5的动态链接库加到路径里。首先,你要定位对应lib的so在哪里:

locate libhdf5_hl.so
locate libhdf5.so


然后发现它们都在
/usr/lib/x86_64-linux-gnu/hdf5/serial
里。

很多人教我几个方法:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu/hdf5/serial


我试了没用(不过你可以试试);或者想前面加环境路径一样,把它加到
/etc/bashrc
或者
/etc/profile
里面再source一下。我试了没用。

还有人教我的是ldconfig,就是先

cat /etc/ld.so.conf

vi /etc/ld.so.conf    //然后在文件里加入下面一行:
/usr/lib/x86_64-linux-gnu/hdf5/serial


保存并退出后,运行
ldconfig
让配置生效。

但我试了还是没用。所以我干脆把两个so文件直接复制到/usr/lib底下。虽然暴力,但是成功了,没有其他副作用:

cp -i /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5.so  /usr/lib/
cp -i /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_hl.so  /usr/lib/


问题三

就是刚刚说的问题,可能会随时遇到

.build_release/lib/libcaffe.so: undefined reference to google ::protobuf...


这个时候,只要把步骤二过一遍就ok了(当然记得要在make之前make clean一下)、

问题四

CXX/LD -o .build_release/tools/convert_imageset.bin
.build_release/lib/libcaffe.so: undefined reference to cv::imread(cv::String const&, int)'.build_release/lib/libcaffe.so: undefined reference tocv::imencode(cv::String const&, cv::_InputArray const&, std::vector >&, std::vector > const&)'


这个问题,是因为我装的是opencv3.0,opencv3.0把imread相关函数放到imgcodecs.lib中了,而非原来的imgproc.lib。

所以我要vi打开caffe-master目录下的
Makefile
(注意不是Makefile.config)

在位置

LIBRARIES += glog gflags protobuf leveldb snappy lmdb boost_system hdf5_hl hdf5 m
opencv_core opencv_imgproc opencv_imgcodecs
//在后面加入imgcodecs


然后再重新编译,就ok了

这几个是比较难发现的问题..中间还有无数个坑,只要你发现报错是那个依赖包的问题,就针对哪个依赖包重装或配环境就ok了。

done!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ubuntu 机器学习 cpu