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

来源:互联网 发布:绿联 mac usb网卡驱动 编辑:程序博客网 时间:2024/06/08 18:50

作为一个不怎么用ubuntu的人,为了跑机器学习实验,还是尝试配置下caffe环境。
本来觉得按着不同博客的教程,总能一步一步配好,结果遇到一步一步的难题,总共用了两天才编译通过,所以借此把流程跟坑都记录下来,以便后面慢慢熟练!!!

第一步 下载caffe

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

在终端上打开你下的文件夹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的目录下):

 ./configuremakemake check

makemake 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-devsudo 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-rc1mkdir releasecd releasecmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..makesudo 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/serialexport 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.solocate 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!

1 0