前言
本人之前上课模式分类(Pattern Classification)读过一篇论文(Region-Based Convolutional Networks for
Accurate Object Detection and Segmentation),我个人觉得RCNN很有意思想尝试运行当中的代码。但由于之前一直忙与项目和课程,所以没时间去找RCNN相关的代码并且运行它。现在终于有时间实现我自己的心愿。这里我使用的是Caffe的faster-rcnn,使用的语言是python3。(我这里使用的CPU运行,我真的很穷啊。所以大家有空施舍一下我吧)
编译
这里可以参考里面的README.md或者我之前写的Caffe[穷人版]——Ubuntu 16.04 CPU版本安装。因为内容很相似
1. 下载py-faster-rcnn的代码
在github上拉下相应的代码
git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
假如说你想用matlab写的话,可以在这里下载
git clone --recursive https://github.com/ShaoqingRen/faster_rcnn.git
我们把这个py-faster-rcnn的目录记作:$FRCN_ROOT
,方便我们后面说明。
2. 下载相关的python模块
进入caffe-fast-rcnn/python
,然后按照requirements.txt
里面的要求内容安装相关的python模块。
cd $FRCN_ROOT/caffe-fast-rcnn/python
for req in $(cat requirements.txt); do sudo pip3 install $req; done
3. 修改Makefile.config
我们进入caffe-fast-rcnn/python
,并复制Makefile.config.example
为Makefile.config
。
cd $FRCN_ROOT/caffe-fast-rcnn
cp Makefile.config.example Makefile.config
接着修改Makefile.config
文件。我这里就不复述一次啦,因为我在Caffe[穷人版]——Ubuntu 16.04 CPU版本安装写的很清楚了。因为这里使用Python调用caffe的库。所以我们必须编译caffe。你也可以看README.md的内容。
4. 编译lib
进入$FRCN_ROOT/lib
,修改setup.py
的内容(因为我这里使用CPU,假如使用GPU的话可以忽略),编译faster-rcnn的相关函数库。
cd $FRCN_ROOT/lib
vim setup.py
(使用CPU)修改setup.py内容,将# ONLY CPU
下一行的代码注释。
...
# ONLY CPU
# CUDA = locate_cuda()
...
def _compile(obj, src, ext, cc_args, extra_postargs, pp_opts):
...
# ONLY CPU
# self.set_executable('compiler_so', CUDA['nvcc'])
...
ext_modules = [
....
# ONLY CPU
# Extension('nms.gpu_nms',
# ['nms/nms_kernel.cu', 'nms/gpu_nms.pyx'],
# library_dirs=[CUDA['lib64']],
# libraries=['cudart'],
# language='c++',
# runtime_library_dirs=[CUDA['lib64']],
# # this syntax is specific to this build system
# # we're only going to use certain compiler args with nvcc and not with
# # gcc the implementation of this trick is in customize_compiler() below
# extra_compile_args={'gcc': ["-Wno-unused-function"],
# 'nvcc': ['-arch=sm_35',
# '--ptxas-options=-v',
# '-c',
# '--compiler-options',
# "'-fPIC'"]},
# include_dirs = [numpy_include, CUDA['include']]
# ),
....
然后编译lib
的内容
make
5. 编译caffe
进入$FRCN_ROOT/caffe-fast-rcnn
,并且编译代码
cd $FRCN_ROOT/caffe-fast-rcnn
make -j8 && make pycaffe
假如没什么报错,应该是没问题的了。
运行demo
在运行demo前,我们还差重要的模型还没有。假如你想自己通过train来获得也行,但我只是用CPU跑代码计算资源有限,所以就暂时不做training,直接下载模型就运行啦。假如想自己做的话,可以看看Beyond the demo: installation for training and testing models。
我们在进入$FRCN_ROOT/caffe-fast-rcnn
后,执行下载脚本:
cd $FRCN_ROOT
./data/scripts/fetch_faster_rcnn_models.sh
脚本会自动下载和解压到data目录下。你会看到有一个faster_rcnn_models
的目录,里面有两个模型文件VGG16_faster_rcnn_final.caffemodel
和ZF_faster_rcnn_final.caffemodel
。要注意的是,我们身处与天朝当中,而模型压缩包在dropbox,所以....你懂得。
运行代码前,我们要修改lib里面的一些地方,主要是因为我是用CPU跑的,所以要注释一些使用gpu的代码,不然代码会报错:
在$FRCN_ROOT/lib/fast_rcnn/nms_wrapper.py
里面修改:
from fast_rcnn.config import cfg
# from nms.gpu_nms import gpu_nms
from nms.cpu_nms import cpu_nms
def nms(dets, thresh, force_cpu=True):
"""Dispatch to either CPU or GPU NMS implementations."""
if dets.shape[0] == 0:
return []
# if cfg.USE_GPU_NMS and not force_cpu:
# return gpu_nms(dets, thresh, device_id=cfg.GPU_ID)
else:
return cpu_nms(dets, thresh)
另外,我现在使用的python3运行,而代码是Py2.7写的,所以我们需要将部分语法变为Py3。这里我就不多讲哪些地方做修改了,因为都基础语法而已。
最后运行
cd $FRCN_ROOT/
python3 ./tools/demo.py --cpu
因为里面用nms
将score比较低的目标过滤掉,我这里设置的0.7的thresh。然后我们就只会看到0.7以上的目标。显然作者训练的模型还是有所欠缺的,作者在README.md里面也写到了,我们可以通过其他的数据集做进一步的优化。
相关参考
- http://blog.csdn.net/yiweibian/article/details/54018142
- https://github.com/rbgirshick/py-faster-rcnn/blob/master/README.md
- http://blog.sina.com.cn/s/blog_679f93560102wpyf.html
- https://github.com/rbgirshick/py-faster-rcnn/issues/8
- https://github.com/rbgirshick/py-faster-rcnn/issues/8#issuecomment-226997357
感谢阅读,差不多要睡觉啦!早唞!好梦!