前言
最近本人想做做RCNN的实验,但是RCNN的主要源码都是用caffe实现的。由于鄙人没有GPU而且十分贫穷,所以只好用CPU来跑东西。
安装依赖
一开始我是看Caffe官网上面的安装教程。我看了一眼,就后悔为毛我前几天重装不装Ubuntu 17.04呢。这样就简单了。直接
sudo apt install caffe-cpu
或者
sudo apt install caffe-cuda
可是我的是16.04而且是CPU版本。所以就按照官网的教程安装相关的依赖。
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
可是我看漏了上面还有一个行字General dependencies。这只是通用的依赖,所以我就寻找其他教程安装相关的依赖了。
sudo apt-get install libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
加上这几个依赖就好了。(我没有认真调查过究竟是那个依赖有作用,只是直接安装计算了)
配置
这里我要先说明我使用的python版本是3.5,使用pip安装python的包。
首先我们要从github的远端下载caffe的源码:
git clone https://github.com/BVLC/caffe.git
进入caffe目录,然后复制Makefile.config.example为Makefile.config,并修改Makefile.config文件。
cd caffe
cp Makefile.config.example Makefile.config
vim Makefile.config
按照以下内容修改config文件:
# CPU_ONLY:=1改为CPU_ONLY:=1
注释(py2.7)
# PYTHON_INCLUDE := /usr/include/python2.7 \
# /usr/lib/python2.7/dist-packages/numpy/core/include
在INCLUDE_DIRS和LIBRARY_DIRS后面分别加上/usr/include/hdf5/serial和/usr/lib/x86_64-linux-gnu/hdf5/serial
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
我们需要创建py3.5的链接库
sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py35.so.1.5x.x /usr/local/lib/libboost_python3.so
配置文件中是默认调用py2.7的boost。假如你使用py3调用了py2.7的boost的话,就会出现这样的错误内容:
undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
这个错误内容在编译的时候是看不出的,因为编译跟py没有关系,只有在你调用的时候才会出现这些问题。
去掉注释(py3.5):
PYTHON_LIBRARIES := boost_python3 python3.5m
PYTHON_INCLUDE := /usr/include/python3.5m \
/usr/local/lib/python3.5/dist-packages/numpy/core/include
我们上步创建的py3.5的链接库,需要在配置文件中声明好。同时,我们要给出numpy的核心调用库(c语言的头文件)。假如不知道自己的py包安装在哪里,那就pip3 -V就会看到安装目录啦。
去掉# WITH_PYTHON_LAYER := 1的注释。
编译Caffe
在caffe的主目录下,依次执行:
sudo make all -j4
sudo make test -j4
sudo make runtest -j4
最后假如得到passed的话,那就代表你编译成功啦~
编译成功
安装所需的python包
在caffe的主目录下,进入python文件夹cd xxx/caffe/python。安装requirements.txt所需的包
for req in $(cat requirements.txt); do sudo pip3 install $req; done。
然后,我们还要升级里面的包,需要升级的包是matplotlib。不然当你最后在python里面import caffe时,会出现以下的问题:
File "/usr/local/lib/python3.4/dist-packages/matplotlib/pyplot.py", line 37, in
from matplotlib.figure import Figure, figaspect
File "/usr/local/lib/python3.4/dist-packages/matplotlib/figure.py", line 40, in
from matplotlib.axes import Axes, SubplotBase, subplot_class_factory
File "/usr/local/lib/python3.4/dist-packages/matplotlib/axes/__init__.py", line 4, in
from ._subplots import *
File "/usr/local/lib/python3.4/dist-packages/matplotlib/axes/_subplots.py", line 10, in
from matplotlib.axes._axes import Axes
File "/usr/local/lib/python3.4/dist-packages/matplotlib/axes/_axes.py", line 24, in
import matplotlib.dates as _ #
File "/usr/local/lib/python3.4/dist-packages/matplotlib/dates.py", line 125, in
from dateutil.rrule import (rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY,
File "/usr/local/lib/python3.4/dist-packages/dateutil/rrule.py", line 55
raise ValueError, "Can't create weekday with n == 0"
^
SyntaxError: invalid syntax
我也很绝望啊。。。
编译python接口
首先我们要假如caffe/python为我们的PYTHONPATH,所以我们要修改我们的环境变量。
打开.bashrc
vim ~/.bashrc
在最后一行加入:
export PYTHONPATH=/xxxxxx/caffe/python:$PYTHONPATH
然后运行一下:sudo ldconfig
进入caffe的主目录,开始编译
sudo make pycaffe
假如没有报错,那应该基本可以了。除非你跟我一样多灾多难。
验证
成功调用
References