安装依赖

  • 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_netsrcnn_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,主要包含VOCdevkitVOCdevkit/VOCcodeVOCdevkit/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.mimdb/roidb_from_voc.mimdb/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