下面开始正题,caffe的安装过程。因为出问题很多,所以实际上我是尝试了python2和python3两种python的接口。下面一并放出来。
1.安装build-essential
sudo apt-get install
build-essential
这个是一些基本的库,具体包括哪些,安装前确认时会显示,印象中有gcc等等。
2. boost安装
caffe官网给出的是sudo apt-get install
--no-install-recommends libboost-all-dev
我不知道他特意加个--no-install-recommends干啥。另外,在installation主页上标明了Boost>=1.55,但是如果用上面那条命令的话,默认装上的是1.54。我现在还不能完全确定1.54是不是不行,但是为了保险起见,请使用
sudo apt-get install libboost1.55-all-dev
关于boost在makefile.config中的配置,这是个坑,下面详细讲讲。
2.1. python2/Anaconda2
对于python2,只要执行完上面的安装就可以了,makefile中的配置项无需做特别设置。
2.2. python3/Anaconda3
对于python3,boost安装方面没啥要留意的。需要特别注意的是makefile.config中,有一行
# Uncomment to use Python 3 (default isPython
2)
PYTHON_LIBRARIES := boost_python-py34python3.5m
这一项很有迷惑性,而且我也迷糊了很久,因为相关有一项是PYTHON_LIB,一开始我以为是相同的重复项。但是如果这句stay
comment的话,make
caffe和pycaffe都能成功通过,但是使用时却会报错:
ImportError:
/home/zero/Documents/caffe-master/python/caffe/_caffe.so:undefined
symbol:
_ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
这个错误的意思是,boost版本不匹配。
boost.python是啥东西呢?我理解的是boost.python是一个类似翻译器的东西,所以如果你是python3的程序,却用了python2的翻译器,那语法、定义等等各方面必然会有冲突。我记得在某篇帖子中看到过,str、int等等的定义,在两者中是不同的,所以有时会有报错信息说找不到str啦int啦之类。当时没有把没一个错误都记下来。
然后,如果我们去makefile中查找这个变量PYTHON_LIBRARIES,会发现有这么一句:
PYTHON_LIBRARIES ?= boost_python python2.7
这句的意思是说,如果不出意外,使用的是2版本的python和boost.python。但是这里有个问题,如果把makefile.config里面那句uncomment,原来默认的是"PYTHON_LIBRARIES
:=boost_python3 python3.5m
",直接去掉的话会报错说找不到
-lboost_python3
。这里我无法解释原理,但是去/usr/lib/x86_64-linux-gnu/文件夹下面去找找,你会找到属于python3的boost版本,可能是33,也可能是34。确定后,把makefile中的名称换成相应名称就可以了。3.5m
的,我不了解为何要加m。修改后应该是:
PYTHON_LIBRARIES := boost_python-py34python3.5m
3. protobuf安装
protobuf官方产品默认是不支持python3的,所以通过默认的apt-get命令安装的libprotobuf和protobuf
complier仅适用于python2系列。
而对于python3,以前支持python3的是民间组织搞的一个protobuf-py3,似乎是基于2.5的一个改货。但是现在下不到了。试过pip3-protobuf,当时也不行。但是现在想来,我或许是之前装过protobuf2.5没卸载干净的关系,如果有兴趣的话,倒是可以试试pip3的方式。不过我这里还是建议手动安装。
有人在帖子中说protobuf-3.0.0
-alpha有问题,我试过也确实不行,但是当时尝试的环境依然是
protobuf2
没卸干净,所以到底alpha行不行,这里说不好,不过我确定beta是可以的,所以我们直接去下载protobuf-3.0.0-beta-2。注意分别下载cpp和python两个版本的。
https://github.com/google/protobuf/releases
解压后
./configure
--prefix=/path/protobuf
(这里指定的路径可以是任意)
make
make check
make install
然后配置路径,将protobuf下的lib和include加入makefile.config,同时,protobuf要加入bashrc里面。
export PATH=$PATH:/path/protobuf/bin
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/protobuf/lib
然后protoc–version查看版本是否正确。如果显示的是protoc2.5.0
,那是有问题的。我曾经执行apt-get
installlibprotobuf-dev,后来又purge卸载,但是执行protoc
--version后还是能看到2.5.0的信息。如果是默认系统执行命令后会提示没有protobuf,所以最好在安装前先查一下。万一有,怎么干净的卸载,这个我真不清楚。
关于系统权限问题
这里讲一下系统权限的问题,初入手ubuntu很容易迷糊,username账户、sudo、su这是三个不同的东西。bashrc配置过的路径仅针对username账户有效,怎么样能够全局有效?理论是是修改/etc/profile,但是实际测试过不太好用。sudo的权限是不同于su账户的,所以下一步安装python依赖我宁愿用su也不要用sudo。理论上修改sudo的配置文件/etc/sudoers就能够达到不清除用户账户环境配置的效果,但是实测无效。
然后是pip,系统关联anaconda3之后,默认pip是anaconda的pip,但是如果你执行sudo
pip的话执行的是系统默认python2的pip,这些地方一定要注意。所以后面很多路径配置后,执行sudo命令会提示找不到这个那个,原因是在做环境变量配置时仅针对当前用户做了配置。
另外有网优提到过,在caffemake的时候不要用sudo,不然后面会把部分文件加入权限限制,导致在make
pycaffe的时候出问题。
解压protobuf的Python版本,进入目录后
cd Documents/pyprotobuf/protobuf-3.0.0
-beta-2/python
python setup.py build
python setup.py test
python setup.py install
最后一步需要sudo或者su权限。我们还是把su也配置好anaconda,然后进入su账户执行安装。
这里一定要注意python的版本问题,如果装了anaconda3,那么username账户下面python进去后是3.5.1
,这时一定要注意,测试下su账户下python进去后是什么,如果不修改bashrc,那么进去后是2.7.6。可以直接从username下的bashrc中把anaconda的路径配置copy过去。
安装完python的protobuf后,进入python进行测试:
Import google.protobuf
from google.protobuf.internal
importenum_type_wrapper
3. hdf5
python2/3下照常安装就好,应该没什么太大问题。
sudo apt-get install libhdf5-serial-dev
anaconda自己自带hdf5,不需要安装,但是需要注意配置。在makefileconfig中,要把anaconda的lib和include加入路径配置当中,所以在make的时候,会依照该配置寻找anaconda中的动态链接库文件libhdf5.so.10,但是系统找不到,怎么办呢?这里有两种解决办法。
一种是在bashrc中加入anaconda的lib路径:
LD_LIBRARY_PATH=home/zero/anaconda3/lib:$LD_LIBRARY_PATH
exportLD_LIBRARY_PATH
但是这样会引发别的问题,make时,opencv方面会报错,
undefined reference
toTIFFRGBAImageOK@LIBTIFF_4.0'
按照晋倪的文章,这就需要手动安装opencv,并在配置时设置:
加上-DBUILD_TIFF=ON
但是我嫌麻烦,所以开辟新路径。
第二种方式就是对hdf本身动手脚,一种办法是在/usr/lib/x86_64-linux-gnu
文件夹下面找,看有libhdf5.so.x几,就把它链接为10,然后make时就找到啦。比如
sudo ln -s libhdf5.so.7 libhdf5.so.10
但是这不就是狸猫换太子?有网友说照着这个做,报错说libhdf5版本不对。所以可能9换7可以,10换8就不行。然后有个哥们比较逗的是,直接把so文件复制到/usr/lib/x86_64-linux-gnu文件夹下面,我试了下:
sudo cp
libhdf5_hl.so.10/usr/lib/x86_64-linux-gnu/
sudo cp libhdf5.so.10/usr/lib/x86_64-linux-gnu/
然后,似乎是可以的。
4. opencv
python2的我直接就禁用opencv了,所以有兴趣可以自己试试看。当时也是报错
undefined reference
toTIFFRGBAImageOK@LIBTIFF_4.0'
可能对于python2/3,真的要手动安装。
对于anaconda,直接照常安装就行了。
sudo apt-get install libopencv-dev
5.其他
sudo apt-get install
libleveldb-devlibsnappy-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libgflags-devlibgoogle-glog-dev
liblmdb-dev
这些似乎都不会出太大问题。
6.安装python依赖库
anaconda用户可以跳过此步,这一步仅针对原生python而言。
首先安装一些必备的编译器:
sudo apt-get install gcc-gfortran.x86_64
sudo apt-get install gfortran
然后安装pip(针对python2):
sudo apt-get install python-pip
或者(针对python3):
sudo apt-get install python3-pip
使用的时候是pip或者pip3,分别针对两个版本的python。
然后执行caffe的python下面的requirements.txt中的模块安装。
官网给出的命令:
for req in $(catrequirements.txt); do pip install
$req; done
执行此命令需要su权限,你可以先进入su账户,如果不用su而用sudo的话则命令改为:
for req in $(cat requirements.txt); do sudopip3 install
$req; done
不过网上还是看到有人说不要用他的文档,自己一个一个装比较好。确实在安装过程中会有不能完全安装而留意不到的情况,所以最好手动安装,没装完一个看返回信息是否是安装成功。例如:
sudo pip3 install
'python-gflags>=2.0'
需要选择版本的话记得加引号。
7.安装caffe及配置makefile文件
先下载Caffe。github上下载好caffe库:https://github.com/BVLC/caffe,复制到ubuntu下,解压。然后按照官网说法修改config
cd /home/zero/Documents/caffe-master
cp Makefile.config.example Makefile.config
直接用gedit打开
CPU_ONLY := 1
#这句要去掉comment。因为我们只用cpu
# USE_OPENCV := 0
#不用opencv的话也可以去掉,不过最好留着吧。我是在python2下面实在懒才去掉的。
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include
这两句,如果是要用python3或者anaconda,一概去掉,如果是原生python2.7,下面的要改为/usr/local/lib/python2.7/dist-packages/numpy/core/include
ANACONDA_HOME := /home/zero/anaconda3
PYTHON_INCLUDE := $(ANACONDA_HOME)/include\
$(ANACONDA_HOME)/include/python3.5m
\
$(ANACONDA_HOME)/lib/python3.5/site-packages/numpy/core/include\
注意是anaconda3,或者anaconda2,带了数字的
PYTHON_LIBRARIES := boost_python-py34python3.5m
这句前面讲过,boost版本的问题。
# PYTHON_LIB := /usr/lib
PYTHON_LIB := $(ANACONDA_HOME)/lib
默认就用上面的,anaconda就用下面的。
INCLUDE_DIRS := $(PYTHON_INCLUDE)/usr/local/include
/usr/local/protobuf/include
LIBRARY_DIRS := $(PYTHON_LIB)/usr/local/lib /usr/lib
/usr/local/protobuf/lib
注意后面手动添加protobuf的库。
8. make
在caffe根目录下
make
make test
make runtest
make pycaffe
make pytest
如果测试都通过,那就没问题了。注意配置文件里面有一个
WITH_PYTHON_LAYER := 1
如果这句的注释去掉就不能pytest了。记得googlegroup上有人这么说过。
9.配置环境变量:
export PATH=$PATH:/usr/local/protobuf/bin
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib
这两句是配置protobuf的,手动安装3beta2之后,要添加这两句,不然系统找不到你安装的protobuf。如果是2系列的不需要执行这一步。
# added by Anaconda34.0.0
installer
exportPATH="/home/zero/anaconda3/bin:$PATH"
上面这个是安装anaconda3的时候自动添加的,如果在问你要不要添加时你直接回车no了,那回头自己添上这一句。否则python进去的还是系统自带的python2。前面提到过,晋倪的文章中说建议
LD_LIBRARY_PATH=home/zero/anaconda3/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
说如果不加就会进不去系统。我没遇到进不去系统的情况。反而是加了这两句会导致opencv的报错。
exportPYTHONPATH=/home/zero/Documents/caffe-master/python:$PYTHONPATH
最后这句是caffe的配置,有人居然说可以配置为caffe/build/python,严重误导了我……
10.验证
最后还是需要仔细验证一下,不然可能空欢喜一场
python进去后
import caffe
如果不报错也别急着高兴
from caffe import layers as L
如果这句也不报错,那应该是不会有问题了。
万一第一句成功了结果第二句没成功,可能是路径配错了,用dir(caffe)看看caffe都有些啥。我第一次海市蜃楼的时候只有
['__doc__', '__loader__', '__name__','__package__',
'__path__', '__spec__']。说明是有问题的。
最后
虽然自己极尽所能想要做到没有遗漏,但是由于caffe安装过程本身重复了太多次,每次错误都不同,我没有时间一一记录和呈现。万一有所疏漏,请及时指出。
关于参考资料,看了太多的博文,没办法一一列出,而且根本系统、环境的不同,操作方法也有太多的不一样。这里要感谢google
user group上面的两位网友,针对我的问题他们直接给出了很好的建议。