caffe版本的faster-RCNN配置全过程
写在前面的话
本文章主要是对在服务器上配置caffe版本的 faster-RCNN 的全过程以及问题总结,最后达到的目标是将代码中的tools/demo.py成功运行起来。总的来收非常痛苦,能碰到的坑几乎全给我碰上了。不过,兵来将挡水来土掩吧。在配置之前要做好可能会遇见各种乱七八糟的情况的准备,非常糟心。
软件配置
本次配置是通过ssh连接到服务器上实现的,从头到尾没有图形化界面,全程只靠命令行
ubuntu 16.04
CUDA 9.2 (这里是有问题的,最后换到CUDA8.0版本,解决了一个致命问题)
python 2.7(这里是使用anaconda配置的环境,中间的包和文件详细内容下文中有提到)
配置过程
1.github上下载代码
在需要下载代码的文件夹目录下输入
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
这里加上–recursive的目的是将FRCNN主目录下一个叫caffe-fast-rcnn的目录给下载下来。运行完成之后就可以看见一个叫做py-faster-rcnn的目录。通过对文件目录的查看我们可以知道,实际上这一整个工程中,在caffe-fast-rcnn中是一个caffe的结构,而在这个文件夹外是通过python去运行的,也就是C++和python都被使用到了
遵照rgb原文的说法We’ll call the directory that you cloned Faster R-CNN into FRCN_ROOT,我们在这里也将刚刚下载的py-faster-rcnn的主目录叫做FRCN_ROOT好了
cd $FRCN_ROOT/lib
make
2. py部分模块的加载
进入lib目录,执行make指令。在lib目录下可以看见有一个makefile,其中的内容实际上是执行一个setup.py文件
all:
python setup.py build_ext --inplace
rm -rf build
所以实际上需要执行py文件,所以需要准备好相关的py环境,这里推荐使用anaconda来进行配置。由于之前曾经安装和配置过一个比较成熟的anaconda的环境,这里运行倒是没有什么问题。但是这里在后续运行demo.py代码时出现了一个致命错误,导致我必须从CUDA9.2转到CUDA8.0。详见问题部分的解释
我的anaconda包环境如下
make完成后会生成几个 .so 文件
3.对caffe部分进行make
cd $FRCN_ROOT/caffe-fast-rcnn
cp Makefile.config.example Makefile.config
这里需要对Makefile.config进行设置,我使用的是vim,gedit也行,爱用啥用啥。
首先对以下两行
# USE_CUDNN := 1
# WITH_PYTHON_LAYER := 1
去掉前面的#号以取消注释,使代码支持CUDNN以及python层
# NOTE: this is required only if you will compile the python interface.
# 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
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
# ANACONDA_HOME := $(HOME)/anaconda
# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
# $(ANACONDA_HOME)/include/python2.7 \
# $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
在以上的代码中,如果我们使用的是anaconda,那么注释掉原本的PYTHON_INCLUDE:=/usr/include/python2.7
/usr/lib/python2.7/dist-packages/numpy/core/include
将下面的ANACONDA_HOME给取消注释,并将其后面的部分修改成自己的anaconda目录下你所使用的env的环境,我的是
ANACONDA_HOME := /root/anaconda3/envs/zzycaffe
同时将后面的
PYTHON_INCLUDE := $(ANACONDA_HOME)/include
$(ANACONDA_HOME)/include/python2.7
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include
都给取消注释
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /root/anaconda3/envs/zzycaffe/lib /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
将INCLUDE_DIRS和LIBRARY_DIRS两行取消注释,同时添加上关于hdf5的文件夹,否则在编译时会出现hdf5.h file cannot find的问题
# USE_OPENCV := 0
# OPENCV_VERSION := 3
将以上两行取消注释,然后将USE_OPENCV后面的数字改为1,将OPENCV_VERSION后面的数字改为你所使用的opencv的版本,我的conda中安装的是3.4.2的opencv,所以我这里的数字是3
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
-gencode arch=compute_20,code=sm_21 \
-gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=sm_50 \
-gencode arch=compute_50,code=compute_50
CUDA_ARCH由于原来的代码最早版本时是有相关的架构的,现在设备基本都升级了,所以将前两行,arch=compute_20的代码给去掉,只保留arch=compute_30后面的行
重要的关键点
https://github.com/rbgirshick/py-faster-rcnn/issues/237
来自于以上issues的关键解决方案,由于之前的代码版本太低,在$FRCN_ROOT目录下执行该问题下的命令
cd caffe-fast-rcnn
git remote add caffe https://github.com/BVLC/caffe.git
git fetch caffe
git merge -X theirs caffe/master
来对caffe的代码进行更新,使得代码支持更高版本的CUDA,同时这个方法能够解决很大一部分的问题。
在merge之后,找到caffe-fast-rcnn/include/caffe/layers/python_layer.hpp,将
self_.attr(“phase”) = static_cast(this->phase_);
这一行给注释掉就可以了
然后我们就可以执行以下指令,在$FRCN_ROOT/caffe-fast-rcnn目录下
make -j8
make pycaffe
执行make指令时遇到了以下的错误
#error This file was generated by a newer version of protoc which is
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
通过更换protobuf文件解决了该问题,在解决问题部分会提到
make执行完成后就可以准备运行demo了
4.下载已经训练好的网络模型
这里官方提供了一个.sh文件来对模型进行下载。但是速度会很慢,所以找的一个百度云连接来下载了模型。我也是在其他的CSDN文章中招的百度云的连接下载的模型的
cd $FRCN_ROOT
./data/scripts/fetch_faster_rcnn_models.sh
这是官方提供的运行.sh的命令
如果是自己下载的模型,就将你下载的.tgz压缩文件放到$FRCN_ROOT/data目录下并直接解压就好
5.运行demo.py文件
运行该文件,请在$FRCN_ROOT目录下进行运行,不要到tools文件夹下去运行,同时要记得打开自己的conda环境
执行命令
./tools/demo.py
运行成功的话,会出现开始识别的代码。但是如果你是通过命令行链接到远程服务器上的,且没有桌面的话,会出现display报错,这里建议使用MobaXterm_Personal来远程ssh链接到服务器,会将display的图片直接显示到你的机器上,而不是在服务器中显示。
遇到的问题汇总
这里对配置过程中遇到的所有问题进行个总结,有一些问题可能会困扰逆非常久的一段时间,同时你还不知道要怎么样去解决
在lib中编译Cython模块的问题
1. no module named setuptools
找不到对应的python模块,这里建议启动自己的conda环境,或者conda环境没有配置好相应的py包。解决方法是启动自己的conda环境,安装上缺少的包文件
2. undefined symbol: __cudaPopCallConfiguration
这个问题不会出现在你编译Cython模块时,是会出现在你编译好的.so文件中。当你运行demo.py时可能会出现。查询资料得知如果CUDA版本在编译和运行时不一致就会有这个问题。但实际上我使用CUDA9.2就几乎肯定会出现这个问题。解决方案是将系统的CUDA版本装为8.0,所以就需要对CUDA版本进行重装。原版的9.2也可以不用卸载,对原来的cuda软连接重新连接到8.0的文件夹中就可以了。
在caffe-fast-rcnn中编译caffe的问题
1. 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
#error incompatible with your Protocol Buffer headers. Please update
#error your headers.
主要是因为你使用的环境中的protobuf版本不对。如果你现在使用的环境是之前有装过tensorflow的话那么这个问题八成会出现。需要的protoc的版本是2.6.1但是现在大部分的环境的protoc版本都大于3。我的系统中自带的protoc版本是2.6.1的,所以就将系统中的protoc文件替换掉我的anaconda的环境中的对应的protoc文件,再重启服务器和环境,新建一个shell,问题得到了解决
** 2. fatal error: hdf5.h: No such file or directory**
找不到hdf5.h文件,解决方案是在Makefile.config中添加上对应的项
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /root/anaconda3/envs/zzycaffe/lib /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial
如上内容所示。其中/root/anaconda3/envs/zzycaffe/lib是我使用的conda环境中的lib。
3. nvcc fatal : Unsupported gpu architecture ‘compute_20’
主要是现在的计算和gpu已经不使用这种结构了,所以解决方案也是对Makefile.config进行修改,CUDA_ARCH原来的代码最早版本时是有相关的架构的,现在设备基本都升级了,所以将前两行,arch=compute_20的代码给去掉,只保留arch=compute_30后面的行
4. libcudart.so.9.2: cannot open shared object file: No such file or directory
这个问题出现在我重新安装好CUDA8.0之后。解决方案是再次确认自己的CUDA安装路径和软连接已经连接正确,然后重启shell
建议在/usr/lib文件夹下建立一个叫cuda的软连接,通过这个软连接指向自己实际使用的CUDA版本的文件夹。在Makefile.config中就可以
# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda
这里的CUDA_DIR就直接指向叫做cuda的软连接就可以了,包括其他可能使用到cuda文件夹的地方,也是建议直接指向cuda,而不是指向/usr/lib中的cuda-9.2 , cuda-8.0这种文件夹
5. undefined symbol: _ZN5boost6python6detail11init_moduleER11PyModuleDefPFvvE
原因是boost_python的版本不匹配,默认python版本为3.5,而boost_python为2.7。这个问题出现在我编译环境时conda中的python版本出了问题,不知道怎么回事切到了3.7的版本。如果编译全程统一让python版本为2.7,统一在一个py2.7的环境下运行(更极端一点可以把服务器自身的python版本都切成2.7的)应该是大概率能够解决这个问题的
6. fatal error: pyconfig.h: No such file or directory
找不到pyconfig.h文件夹,这里我们想要让编译指定找到我们conda环境中的pyconfig.h的文件,所以在运行make -j8前,执行一个指令
export CPLUS_INCLUDE_PATH=/root/anaconda3/envs/zzycaffe/include/python2.7
这样就可以在编译过程中顺利的找到pyconfig.h文件了
7. error: too few arguments to function ‘cudnnStatus_t cudnnSetConvolution2dDe
这个错误实在是太长了这里就不全记下来了,是说函数的参数问题,错误信息中有好几个int,int,int,int的八成就是它了。最好的解决方案见上文,更新caffe-fast-rcnn中的文件,就是
cd caffe-fast-rcnn
git remote add caffe https://github.com/BVLC/caffe.git
git fetch caffe
git merge -X theirs caffe/master
一系列指令,对文件夹中的文件进行更新,与时俱进,就可以解决这种问题了。
**8. recipe for target ‘.build_release/lib/libcaffe.so.1.0.0’ failed **
这种问题和上面的问题其实出现的都毫无头绪,一样地更新代码,确认库文件配置正确,Makefile.config中的各种LIB都写进去了之后,问题就解决了
9. fatal error: cudnn.h: No such file or directory
CUDA的问题,在重装cuda之后,重启一下服务器,或者新建一个shell(不知道是哪个手段让重装生效了)之后问题得到了解决。当然必须要确定的是你的CUDA进行了正确的安装,不然肯定没法解决的,找不到就是找不到。
10. warning: libjpeg.so.9, needed by /root/anaconda3/envs/zzycaffe/lib/libopencv
opencv的配置问题,编译的时候opencv找不到自己需要的.so文件了,但实际上这些文件就放在你conda安装了opencv的环境的文件夹中,所以就需要让代码“强行”认识到这个库的存在,这里你可以直接搜索这几个.so文件,然后把它们的绝对路径写入到Makefile.config中,就像我在问题2中对LIBRARY_DIRS做出的修改一样,把conda中的那个lib文件夹路径强行写了进去,问题得到了解决。当然,前提条件是Makefile.config中你得对使用OPENCV进行修改,如之前配置所说的那样
运行demo.py的问题
1. ImportError: No module named skimage.io
缺少scikit-image包,在启动conda环境的情况下用pip安装好就可以
2. AttributeError: ‘module’ object has no attribute ‘nancumprod’
这是在安装完skimage之后出现的问题。运行到该包对应的代码时,会出现一个神奇的问题,莫名其妙地,寻找包的路径转移到了系统自带的python2.7的环境当中,而且我确定我是开启了conda环境的,而转移到系统自带的环境当中后,其中的dask包是很落后且有错误的,于是我只好进入到了系统py2.7的对应的目录下,把这个dask文件夹给压缩起来,删掉原文件夹,代码找不到系统自己的dask,就找到了conda环境中的dask了…(这一段真的很迷)
3. undefined symbol: __cudaPopCallConfiguration
这个问题在编译模块的时候提到过,见上文就好。主要是在换了CUDA8.0版本后,要把原来生成的.so文件给删除,之后再make一遍,就可以了
总结:
整体来说,要运行一份数年前的代码确实很困难,不仅各种依赖错误,还会磨炼你的耐性。非常容易半途而废。下一步是将数据集放到代码中进行训练,得到自己的网络模型(预训练模型打算使用VGG16的)