安装Caffe之前得安装好支持环境,你可以在Linux下一个个地安装那些编译支持库包,但是那样太麻烦了,Anaconda提供了完整的支持库,下载Caffe源码后编译前修改配置文件,把支持库改为Anaconda的路径即可轻松build,省去按照出错提示一步步安装很多支持库的麻烦。
最新的Anaconda 5.1 支持Windows、MacOS和Linux,有Python 2.7 version和Python 3.6 version两个版本,分别支持Python 2.7和Python 3.6, 我使用的是64-bit Fedora Linux,并且我打算使用Python 3.6(我觉得Python 3.6的语法上比Python 2.7上更符合一般编程语言的语法描述习惯,另外Python 2.7在2020年将停止支持,所以建议还是使用Python 3.6),因此下载https://repo.anaconda.com/archive/Anaconda3-5.1.0-Linux-x86_64.sh到本地(anaconda.com网速超慢,可以使用国内清华的镜像网站下载,网址是 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive),然后执行
bash Anaconda3-5.1.0-Linux-x86_64.sh
即可把 anaconda3安装到/home/<username>下,如果你习惯使用Python 2.7,可以下载https://repo.anaconda.com/archive/Anaconda2-5.1.0-Linux-x86_64.sh并安装,安装完后会生成 /home/<username>/anaconda2,所以两个版本实际上是可以同时安装的,并不会冲突,在编译caffe等软件时根据你使用的版本的需要,修改路径配置,指向所需的ananconda版本即可。
安装好了anaconda3,再安装一些caffe的运行依赖包,Fedora/CentOS/RHEL linux下需安装这些:
sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel openblas-devel gflags-devel glog-devel lmdb-devel
对于Ubuntu,还需要安装git和python-dev, protobuf-compiler, 以及以上的库的名字前面须加前缀lib,devel改成dev,再就是libhdf5-serial-dev, libgoogle-glog-dev这几个包名跟Fedora下不一样。
安装完了依赖环境,下面下载Caffe源码。
一般书上推荐使用的git clone https://github.com/bvlc/caffe.git 命令很难把Caffe源码一次性下载下来,我两天内不同时段试了好几次都没成功,老是中途下载中断,于是参考了网上推荐的办法:
cd /home/<username>/
mkdir caffe #创建一个下载的工作目录
cd caffe
git init #创建git本地库
git fetch https://github.com/bvlc/caffe.git
如果中途下载中断,可以重复执行上面这个git fetch https://github.com/bvlc/caffe.git命令,虽然使用git fetch每次重新开始下载时也是从0%开始下载,但是前面下载过的部分的速度明显很快,我估计是并没有下载数据而是在核对本地已下载的数据和git repo里的数据,已经下载了就不再重传,因为中断之前已经下载的部分的进度比较快,比如说中断前已经下载了19%,再次执行上面的git fetch https://github.com/bvlc/caffe.git 命令,虽然进度仍然从0%开始,但是很快就达到了19%,然后后面下载的进度就慢了一些,应该就是在真正下载后面的未下载的数据了,我下载时中断了几次,重复执行git fetch命令终于成功下载完全部代码,全部下载完后显示 HEAD ->FETCH_HEAD,然后执行
git checkout FETCH_HEAD
可以看到/home/<username>/caffe/下面有了很多源码目录。
接下来以caffe提供的示例配置文件为基础创建配置文件:
cp Makefile.config.example Makefile.config
vi Makefile.config
在这个文件中,做如下修改:
CPU_ONLY := 1 #把这前面的注释去掉,先只使用CPU,对于使用GPU,后面熟练了再回头来安装CUDA后打开。
OPENCV_VERSION := 3 #把这前面的注释去掉,我使用最新的opencv3,没办法,我啥都喜欢用最新的版本尝鲜
BLAS := open #把这里的atlas改为open,意思是使用OpenBlas,因为它的性能比atlas好,几乎接近Intel的MKL并且是开源的
把指向Linux系统本身环境Python 2.7的PYTHON_INCLUD注释掉:
# PYTHON_INCLUDE := /usr/include/python2.7 \
# /usr/lib/python2.7/dist-packages/numpy/core/include
设置NANCONDA_HOME和指向ANACONDA里的PYTHON_INCLUDE, PYTHON_LIB:
ANACONDA_HOME := $HOME/anaconda3
PYTHON_INCLUDE := $ANACONDA_HOME/include \
$ANACONDA_HOME/include/python3.6m \
$ANACONDA_HOME/lib/python3.6/site-packages/numpy/core/include
# Uncomment to use Python 3 (default is Python 2)
PYTHON_LIBRARIES := boost_python3 python3.6m
注意保持把指向Linux系统本身环境里的PYTHON_INCLUDE和PYTHON_LIB路径设置注释掉,确保使用anaconda3里面的python
# PYTHON_INCLUDE := /usr/include/python3.6m \
# /usr/lib/python3.6/dist-packages/numpy/core/include
# PYTHON_LIB := /usr/lib
PYTHON_LIB := $ANACONDA_HOME/lib
# Whatever else you find you need goes here.
INCLUDE_DIRS := $PYTHON_INCLUDE /usr/local/include
LIBRARY_DIRS := $PYTHON_LIB /usr/local/lib /usr/lib
注意:以上标红色的部分原来都是使用的 $(var)形式取值, 必须改成 $var或者${var}形式,否则后面执行make runtest时总是报错,一些so库找不着,实际上是存在的,上面的路径设置也正确,但是$(x)是执行x命令而不是获取变量x的值,导致出错!这问题也是让我没少喝茶,后来回头仔细看Makefile.config,发现企图以这$()种形式取值是错误的,原因就在这里
多说一点,如果是Ubuntu,还得修改Makefile:
找到
LIBRARIES +=glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5
更改最后两项为:
LIBRARIES +=glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
这是因为Ubuntu下使用的包是libhdf5-serial-dev,如果不做以上修改,下面在运行 make runtest 时会报错:
make runtest
.build_release/tools/caffe
.build_release/tools/caffe: error while loading shared libraries: libhdf5_hl.so.10: cannot open shared object file: No such file or directory
Makefile.config配置文件建立和修改完毕后,执行下面的命令编译Caffe源码:
make -j # -j 使用多个CPU核同时编译,比不使用多核编译要快,没错误的话,在我本子上没几分钟就编译完了
这时可能报错: g++: command not found
这是因为gcc-c++没有安装,执行下面命令安装:
sudo yum install gcc-c++
然后执行
make -j
Caffe编译完后执行
make test
make runtest
假若执行make runtest时报错:
libhdf5.so, libhdf5_hl.so.100: cannot open shared object file: No such file or directory
这说明你忘了修改Makefile.config里面的$(var),所有$(var)形式取值, 必须改成 $var或者${var}形式,
改完后然后再执行:
make clean
make -j
make test
make runtest
没有错误的话则很多test case显示OK:
最后显示全部test cases的运行结果:
O了,后面有什么问题遇到再补充,修行取经路上妖魔鬼怪多着,后续路上一一除掉
关于如何把Caffe配置成GPU计算以及解决编译过程中出现的很多错误,请参见:
我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8
我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本
我的AI之路(6)--在Anaconda3 下安装PyTorch
我的AI之路(7)--安装OpenCV3_Python 3.4.1 + Contrib以及PyCharm
我的AI之路(8)--体验用OpenCV 3的ANN进行手写数字识别及解决遇到的问题
我的AI之路(10)--如何在Linux下安装CUDA和CUDNN
我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误
我的AI之路(12)--如何配置Caffe使用GPU计算并解决编译中出现的若干错误
我的AI之路(13)--解决编译gcc/g++源码过程中出现的错误
我的AI之路(14)--Caffe example:使用MNIST数据集训练和测试LeNet-5模型
我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决
我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境
我的AI之路(17)--Tensorflow和Caffe的API及Guide
我的AI之路(18)--Tensorflow的模型安装之object_detection
我的AI之路(19)--如何在Windows下安装pycocotools PythonAPI
我的AI之路(20)--用Tensorflow object_detection跑raccoon数据集
我的AI之路(21)--用Tensorflow object_detection跑PASCAL VOC 2012数据集
我的AI之路(22)--使用Object_Detection_Tensorflow_API
我的AI之路(23)--在Windows下编译Bazel和使用Bazel编译tensorflow