R-CNN安装步骤
安装依赖
- MATLAB(64bit Linux 2012b以上)
- Caffe的相关依赖
Caffe安装
- R-CNN与Caffe v0.999版本兼容,在最新版本上可能会出错
- 最好安装在
external/caffe
目录下 - 确保编译:
make matcaffe
- 在
data/ilsvrc12
目录下下载文件 -
安装中可能出现的问题(只针对v0.999版本):
- Makefile.config与Makefile的修改,参照旧版本Caffe安装教程
- 在Makefile.config中,在
BLAS := mkl
后不能加空格,否则在Makefile中会判断错误,出现undefined reference to
cblas_dscal`等报错,参考解决方案 make all
过程中可能会报fatal error: gflags/gflags.h No such file or directory
,需安装gflags与lmdb,参考解决方案- 该版本中
include/caffe/util/math_function.hpp
有问题,在224行处,将using std::signbit;DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = signbit(x[i]))
修改\\std::signbit;DEFINE_CAFFE_CPU_UNARY_FUNC(sgnbit, y[i] = std::signbit(x[i]))
,参考解决方案 - 在
make runtest
阶段,如果报Check failed: error == cudaSuccess (8 vs. 0): invalid device function
错误,可能是由于该Caffe版本支持旧版本的CUDA,而目前的CUDA版本较新,不兼容冲突。在Makefile.config的CUDA_ARCH
中添加-gencode arch=compute_50, code=ms_50
,参照新版本Makefile.config的新内容,参考解决方案 make pycaffe
报错/usr/include/boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory, compilation terminated.
,则在终端输入CPLUS_INCLUDE_PATH=/usr/include/python2.7
,参考解决方案make matcaffe
报错Unknwon MEX argument '-o'
修改Makefile内容,参考解决方案
R-CNN安装
http://github.com/rbgirshick/rcnn
下载rcnn源码- 默认情况下caffe安装在
external/caffe
下,创建链接ln -sf $CAFFE_ROOT external/caffe
- 运行
selective_search/fetch_selective_search.sh
,下载selective search代码 - (Optional)在启动Matlab之前,设置
LD_LIBRARY_PATH
。如果出现类似Invalid MEX-file '/path/to/rcnn/external/caffe/matlab/caffe/caffe.mexa64': libmkl_rt.so: cannot open shared object file: No such file or directory
报错,则确保MKL和CUDA在LD_LIBRARY_PATH
的正确定义,例如export LD_LIBRARY_PATH=/opt/intel/mkl/lib/intel64:/usr/local/cuda/lib64
-
开启Matlab,进入rcnn目录
- 运行
startup.m
,返回R-CNN startup done
- 运行
rcnn_build()
,编译liblineary和Selective Search。对于编译liblinear过程的警告是正常的 - 确认Caffe与Matlab wrapper创建正确(代码运行没有错误)。
key=caffe('get_init_key')
,应该返回key=-2
- (在下载了rcnn_models和rcnn_selective_search的基础上)运行
rcnn_demo
- 运行
下载预训练模型
- 下载PASCAL VOC 2007 train+val, VOC 2012 train和ILSVRC13 train+val训练的检测器。运行rcnn根目录下
./data/fetch_models.sh
,将会在rcnn/data/
下生成caffe_nets
和rcnn_models
两个文件夹; - 预计算selective search box是基于VOC2007,VOC2912和ILSVRC13。运行rcnn根目录下
./data/fetch_selective_search_data.sh
,在rcnn/data
下创建selective_search_data
在PASCAL VOC上训练自己的R-CNN检测器
下载RASCAL VOC 2007
- 下载训练,验证,测试集与VOCdevkit
- 将所有tar文件解压到一个目录,名为VOCdevkit,主要包含
VOCdevkit
,VOCdevkit/VOCcode
和VOCdevkit/VOC2007
- 创建R-CNN与PASCAL VOC数据集链接
ln -sf /your/path/to/voc2007/VOCdevkit /path/to/rcnn/datasets/VOCdevkit2007
提取特征
- 运行
rcnn_exp_cache_features('train');rcnn_exp_cache_features('val');rcnn_exp_cache_features('test_1');rcnn_exp_cache_features('test_2');
训练R-CNN模型和测试
- 运行训练和测试代码
test_results = rcnn_exp_train_and_test()
。训练和测试过程默认将模型和结果保存在rcnn/cachedir
。可通过创建本地config文件rcnn_config_local.m
并定义实验目录变量EXP_DIR
来修改其路径。rcnn_config_local.example.m
为案例。
在其他数据集上训练R-CNN检测器
如果另一个数据集有完整的bounding box annotations(例如所有类别的例子都被标注),那么很容易在这个数据上训练R-CNN检测器。
为了应用在新的数据集,必须定义三个函数:一个函数返回物体label和图像list的结构体;一个函数返回regin of interest(roi)结构体,描述bounding box annotations;一个提供test evaluation函数。可参照PASCAL VOC的实现imdb/imdb_from_voc.m
,imdb/roidb_from_voc.m
和imdb/imdb_eval_voc.m
Fine-tuning 用caffe完成CNN 检测器
-
对VOC 2012 train和 VO 2012 test创建window文件
- 开启Matlab,进入rcnn目录
- 得到VOC 2012 train的imdb文件
imdb_train=imdb_from_voc('datasets/VOCdevkit2012','train')
- 得到VOC 2012 val的imdb文件
imdb_val=imdb_from_voc('datasets/VOCdevkit2012','val')
- 创建VOC 2012 train的window文件
rcnn_make_window_file(imdb_train, 'extranal/caffe/examples/pascal-finetuning')
- 创建VOC 2012 val的window文件
rcnn_make_window_file(imdb_val, 'extranal/caffe/examples/pascal-finetuning')
-
在Caffe运行fine-tuning
- 复制fine-tuning的prototxt文件
cp finetuning/voc_2012_prototxt.pascal_finetune_* external/caffe/examples/pascal-finetuning/
- 进入目录
external/caffe/examples/pascal-finetuning
- 运行fine-tuning代码
GLOG_logtostderr=1 ../../build/tools/finetune_net.bin pascal_finetune_solver.prototxt /path/to/rcnn/data/caffe_nets/ilsvrc_2012_train_iter_310k 2>&1 | tee log.txt
- 复制fine-tuning的prototxt文件