几个前提
确认自己的机器上已经成功安装了NVIDIA driver、CUDA、cudnn
详细步骤可参考之前写的安装说明
说明
按照Caffe官方安装教程的说明,有两种安装方式,make(官方版)和cmake(社区支持),使用make过程中遇到不少坑,最终笔者使用cmake安装成功
开始
1.首先安装后续步骤需要的各种依赖包,依次输入以下命令
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
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install git cmake build-essential
需要确保以上依赖都安装成功。验证某条命令是否执行成功,可多次执行命令直至类似如下提示界面说明安装成功。
2.安装OpenCV3.X版本
安装caffe需要OpenCV的支持,推荐3.X版本,便于修改Makefile和Makefile.config文件。根据相关博客的描述,使用OpenCV4.X版本需要在配置文件中多修改一些常量,暂未尝试过。
进入OpenCV官网,选择合适版本的源码包进行下载,之后解压到你想安装的位置,进入解压后的目录,执行
mkdir build # 创建编译的文件目录
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j8 #编译
编译OpenCV成功后安装:
sudo make install #安装
安装完成后通过查看OpenCV版本验证是否安装成功:
pkg-config --modversion opencv
3.安装Caffe
在你准备安装的路径下clone一份源码:
git clone https://github.com/BVLC/caffe.git
进入caffe目录,将 Makefile.config.example 文件复制一份并更名为 Makefile.config
sudo cp Makefile.config.example Makefile.config
Makefile文件中如下行做改动
#注释的是模板默认的写法
#wmy
#NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
#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 opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
在Makefile.config中,做以下修改
(保持了使用系统默认的python2.7版本,有需要的读者可以尝试编译安装Python3.X版本,在该文件中修改相应的python依赖和路径即可)
3.1应用Cudnn
将
#USE_CUDNN := 1
修改成:
USE_CUDNN := 1
3.2 指明应用的openCV版本
将
#OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
3.3应用python接口
将
#WITH_PYTHON_LAYER := 1
修改为
WITH_PYTHON_LAYER := 1
3.4修改include路径和library路径(很关键)
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改为:
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial /usr/local/cuda /usr/bin/protoc /usr/include/opencv /usr/share/opencv
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial /usr/local/cuda/lib64
4.编译
有两种方式。
4.1使用Make
依序执行以下命令
cp Makefile.config.example Makefile.config # 上面已经完成过这个步骤
# Adjust Makefile.config (for example, if using Anaconda Python, or if cuDNN is desired)
make all
make test
make runtest
make all遇到的一些问题
问题一:fatal error: google/protobuf/port_def.inc: No such file or directory compilation terminated
出现该错误的原因是Makefile中指定的protoc版本与实际使用的版本(大概率是使用了Anaconda中的protoc)不一致导致。由于安装了anaconda,anaconda安装了更高版本的protobuf:protobuf.3.11,而在编译时makefile文件调用的是anaconda下的protobuf,而不是系统下的protobuf
可以通过以下命令查看软件包及其依赖库
whereis protoc
ldd $(which protoc)
之后将protobuf需要的版本配置到Makefile中
在Makefile中修改以下两行
# wmy
#$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --cpp_out=$(PROTO_BUILD_DIR) $<
# wmy
#$(Q)protoc --proto_path=$(PROTO_SRC_DIR) --python_out=$(PY_PROTO_BUILD_DIR) $<
$(Q)/usr/bin/protoc --proto_path=$(PROTO_SRC_DIR) --python_out