1. 安装依赖库
执行以下命令:
1 | $sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler |
安装第一个就出问题:
1 | sudo apt-get install libprotobuf-dev |
返回错误:
由于解决问题后,将terminal的输出被clear掉了,所以用以下相似的问题来说明解决过程
1 | The following packages have unmet dependencies: |
解决方法:
- 安装
aptitude
:
1 | $sudo apt-get install aptitude |
- 找到已经安装的对应的
libxml2
包:
1 | $dpkg -l | grep libxml2 |
- 删除
libxml2
,并删除其他所有依赖包,--force-all
参数不能少:
1 | $sudo dpkg --purge --force-all libxml2 |
- 更正错误:
1 | $sudo apt-get -f install |
- 安装欠缺的包
1 | $sudo apt-get install libxml2-dev |
遇到相同的问题,将libxml2-dev
和libxml2
,替换成自己问题中的对应库。
2. 安装NVIDIA驱动和CUDA,openCV
早已安装完成
3. 下载caffe源码
从这里下载到home/XXX
。
修改Makefile.config
文件。先复制一份:
1 | cp Makefile.config.example Makefile.config |
后修改配置文件Makefile.config
,下面是我的修改:
hdf5
将hdf5的路径添加到
INCLUDE_DIRS
和LIBRARY_DIRS
之后:1
2INCLUDE_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/serialsm_version
由于我的机器的CUDA版本是9.0,所以要将下面的
sm_20
,sm_21
注释掉,低版本的一些指令对于高版本的不适用。如下:1
2
3
4
5
6
7
8
9CUDA_ARCH := -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_52,code=sm_52 \
-gencode arch=compute_60,code=sm_60 \
-gencode arch=compute_61,code=sm_61 \
-gencode arch=compute_61,code=compute_61 \
# -gencode arch=compute_20,code=sm_20 \
# -gencode arch=compute_20,code=sm_21 \OpenCV版本
去掉下面的注释,表示使用openCV 版本3:
1
OPENCV_VERSION := 3
CUDA路径
检查机器CUDA路径是否正确:
1
CUDA_DIR := /usr/local/cuda
4. 编译测试
配置完成之后编译,-j4
表示用4个核心执行任务:
1 | $sudo make all -j4 |
期待不出错。
如果有错,比如编译期间又修改了Makefile.config
文件,返回类似错误:
1 | undefined reference to `cv::imread(cv::String const&, int) |
可是OpenCV已经修改过了,此时的处理情况:
将编译了一半的build
文件夹删除,后重新编译:
1 | $sudo rm -rf ./build/* |
其中build/
文件夹是编译后得到的,
最终期望的是sudo make runtest -j4
运行无误,如果terminal最后返回:
表示caffe 安装配置成功完成(如果要使用python接口,还要其他操作,我使用CXX)。
5. 编译python接口
caffe使用python2.
第O步,使用linux自带python2,安装依赖库:
1
2sudo apt-get install python-pip
sudo apt-get install python-numpy在caffe根目录的python文件夹下,有一个
requirements.txt
的清单文件,上面列出了需要的依赖库,需要按照这个清单安装:1
2
3sudo apt-get install gfortran
cd ./python
sudo cat python/requirements.txt|xargs -L 1 sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple检查
1
sudo pip install -r python/requirements.txt
编译成功的会显示
Requirement already satisfied
,没有编译成功的会继续安装。第一步,执行命令:
1
$ make pycaffe -j4
第二步,在
~/.bashrc
或/etc/profile
中添加caffe中的python 路径:1
export PYTHONPATH=/home/junhui/caffe-master/python:$PYTHONPATH
第三步,source使之生效:
1
2$ source /etc/profile
$ source ~/.bashrc现在在python脚本中就可以
import caffe
了。
可能的出错:
numpy/arrayobject.h: missing
1
2
3
4
5
6
7
8junhui@gnome:~/caffe$ sudo make pytest –j4
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: No such file or directory
#include <numpy/arrayobject.h>
^
compilation terminated.
Makefile:517: recipe for target 'python/caffe/_caffe.so' failed
make: *** [python/caffe/_caffe.so] Error 1解决方法:
在Makefile.config文件中的这个地方:
1
2
3# We need to be able to find Python.h and numpy/arrayobject.h.
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include添加一行:
1
2
3
4# We need to be able to find Python.h and numpy/arrayobject.h.
PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include \
/usr/local/lib/python2.7/dist-packages/numpy/core/include再次编译成功
1
$ make pycaffe -j4
Python.h: No suchfile or directory
caffe 使用python2,需要在
./bashrc
中添加python2的路径:如果不是使用anaconda2中的python2,则添加如下第一句;如果使用用的anaconda2中的python2,则添加如下第二句
1
2export CPLUS_INCLUDE_PATH=/usr/include/python2.7:$CPLUS_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/junhui/anaconda2/include/python2.7/:$CPLUS_INCLUDE_PATHortprotobuf出错
使用anaconda时出的错:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CXX .build_release/src/caffe/proto/caffe.pb.cc
In file included from .build_release/src/caffe/proto/caffe.pb.cc:5:0:
.build_release/src/caffe/proto/caffe.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
#error This file was generated by a newer version of protoc which is
^
.build_release/src/caffe/proto/caffe.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
#error incompatible with your Protocol Buffer headers. Please update
^
.build_release/src/caffe/proto/caffe.pb.h:14:2: error: #error your headers.
#error your headers.
^
In file included from .build_release/src/caffe/proto/caffe.pb.cc:5:0:
.build_release/src/caffe/proto/caffe.pb.h:26:55: fatal error: google/protobuf/generated_enum_reflection.h: No such file or directory
#include <google/protobuf/generated_enum_reflection.h>
compilation terminated.
make: *** [.build_release/src/caffe/proto/caffe.pb.o] Error 1解决方法,将机器上的anaconda3删除,使用linux自带python2,并安装以来库。(其实可以使用anaconda2).
make clean
如果
make
中间出错,改错后,先make clean
,后重新make
import caffe 成功后测试pycaffe
在mnist数据集上运行lenet
1 | sudo ./data/mnist/get_mnist.sh |