系统环境为Ubuntu14.04, 已经安装好了CUDA和cuDNN以及Python等基础包。
$ git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
$ git submodule update --init --recursive 或者下载github上最新版本的caffe-fast-rcnn:
$ git clone https://github.com/rbgirshick/caffe-fast-rcnn.git 然后切换到对应的commit
$ cd py-faster-rcnn/lib
$ make
$ cd py-faster-rcnn/caffe-fast-rcnn
$ cp Makefile.config.example Makefile.config
# 修改 Makefile.config, 去掉注释
WITH_PYTHON_LAYER := 1
USE_CUDNN := 1
BLAS_INCLUDE := /usr/include/atlas
# 根据你的需求修改Makefile.config , 比如设置GPU 支持, cuDNN, CUDA 版本, Anaconda, OpenCV, 等等。
# 修改完Makefile.config后
$ make all -j32 # -j32 编译加速. 32 CPU核数目,根据你的电脑的CP核数目来修改,或者直接make all -j也可以
# 假设你已经安装好了PyCaffe相关依赖, 否则请重新去参考Caffe安装教程
$ make pycaffe -j32
.
├── caffe-fast-rcnn # caffe目录
│ ├── build -> .build_release
│ ├── caffe.cloc
│ ├── cmake
│ ├── CMakeLists.txt
│ ├── CONTRIBUTING.md
│ ├── CONTRIBUTORS.md
│ ├── data
│ ├── distribute
│ ├── docs
│ ├── examples
│ ├── include
│ ├── INSTALL.md
│ ├── LICENSE
│ ├── Makefile
│ ├── Makefile.config # 编译caffe配置文件
│ ├── Makefile.config.example
│ ├── matlab
│ ├── models
│ ├── python
│ ├── README.md
│ ├── scripts
│ ├── src
│ └── tools
├── data # 存放训练数据文件夹
│ ├── cache
│ ├── demo
│ ├── faster_rcnn_models
│ ├── imagenet_models
│ ├── pylintrc
│ ├── README.md
│ ├── scripts
│ ├── VOCdevkit # VOC2007数据集
│ ├── VOCdevkit2007 -> VOCdevkit
├── experiments
│ ├── cfgs
│ ├── logs
│ ├── README.md
│ └── scripts # 包含端对端训练脚本
├── lib
│ ├── datasets # 包含数据库读取工厂类
│ ├── fast_rcnn # 包含config.py
│ ├── Makefile
│ ├── nms
│ ├── pycocotools
│ ├── roi_data_layer
│ ├── rpn
│ ├── setup.py
│ ├── transform
│ └── utils
├── LICENSE
├── models # 大中小[VGG16,VGGCNNM1024,ZF]模型文件
│ ├── coco
│ ├── pascal_voc
│ └── README.md
├── output # 训练输出模型
├── README.md
└── tools # 包含训练py脚本和运行demo脚本
├── compress_net.py
├── demo.py
├── eval_recall.py
├── _init_paths.py
├── _init_paths.pyc
├── README.md
├── reval.py
├── rpn_generate.py
├── test_net.py
├── train_faster_rcnn_alt_opt.py
├── train_net.py
└── train_svms.py
问题:
faster rcnn 代码默认是使用的cudnn v4, 但是为了体验最新的v5, 或者使用GTX1080 ,我们编译faster rcnn的时候就会报错
In file included from ./include/caffe/util/cudnn.hpp:5:0,
from ./include/caffe/util/device_alternate.hpp:40,
from ./include/caffe/common.hpp:19,
from src/caffe/data_reader.cpp:6:
/usr/local/cuda/include/cudnn.h:799:27: note: declared here
cudnnStatus_t CUDNNWINAPI cudnnSetPooling2dDescriptor(
解决办法:
用最新caffe源码的以下文件替换掉faster rcnn 中caffe-fast-rcnn里面的对应文件
include/caffe/layers/cudnn_relu_layer.hpp, src/caffe/layers/cudnn_relu_layer.cpp, src/caffe/layers/cudnn_relu_layer.cu
include/caffe/layers/cudnn_sigmoid_layer.hpp, src/caffe/layers/cudnn_sigmoid_layer.cpp, src/caffe/layers/cudnn_sigmoid_layer.cu
include/caffe/layers/cudnn_tanh_layer.hpp, src/caffe/layers/cudnn_tanh_layer.cpp, src/caffe/layers/cudnn_tanh_layer.cu
include/caffe/util/cudnn.hpp
将 faster rcnn 中的 src/caffe/layers/cudnn_conv_layer.cu 文件中的所有
cudnnConvolutionBackwardData_v3 函数名替换为 cudnnConvolutionBackwardData
cudnnConvolutionBackwardFilter_v3函数名替换为 cudnnConvolutionBackwardFilter
修改完后,git status下,确保修改了指定的文件:
然后重新编译:
$ make all -j
$ make pycaffe -j
到此就可以使用py-faster-rcnn了。
$ cd py-faster-rcnn
$ ./data/scripts/fetch_faster_rcnn_models.sh
# 如果下载失败,可以通过这个种子来下载:
# http://academictorrents.com/download/cca56021739c8a75af3b58f536d4930266c25d5e.torrent
# 然后将faster_rcnn_models.tgz解压到data目录下
$ cd py-faster-rcnn
$ ./tools/demo.py
$ cd py-faster-rcnn/data
# 注意链接可能会失效,网上可以另找资源
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
$ wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
$ tar xvf VOCdevkit_08-Jun-2007.tar
$ tar xvf VOCtrainval_06-Nov-2007.tar
$ tar xvf VOCtest_06-Nov-2007.tar
$ ln -s VOCdevkit VOCdevkit2007 #create a softlink
$ cd py-faster-rcnn
$ ./data/scripts/fetch_imagenet_models.sh
$ ./data/scripts/fetch_faster_rcnn_models.sh
$ cd py-faster-rcnn
# ./experiments/scripts/faster_rcnn_end2end.sh [GPU_ID] [NET] [DATASET]
$# # Directly run this command might have an error "AssertionError: Selective search data not found at:". For the solution, please google it.
$ ./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascavcc
训练完成后,见py-faster-rcnn/output文件夹。
faster_rcnn_end2end.sh
整个处理的最上层,包括对输入参数的处理,涉及到GPU id, 网络结构(ZF-net, VGG, 或者其他),数据集(PASCAL VOC, COCO或者其他数据集),和一些其他的配置输入参数。
然后它会调用两个程序,一个是train_net.py,紧跟着的是test_net.py,train_net.py是用来训练模型的,而test_net.py是用来评估训练出来的模型的性能的。
faster_rcnn_end2end.yml
# 我们可以从faster_rcnn_end2end.sh看到,cfg来自faster_rcnn_end2end.yml,
# 这意味着这个文件存储着很多重要的配置,下面显示了一些原始的配置:
EXP_DIR: faster_rcnn_end2end
TRAIN:
HAS_RPN: True
IMS_PER_BATCH: 1
BBOX_NORMALIZE_TARGETS_PRECOMPUTED: True
RPN_POSITIVE_OVERLAP: 0.7
RPN_BATCHSIZE: 256
PROPOSAL_METHOD: gt
BG_THRESH_LO: 0.0
TEST:
HAS_RPN: True
但是,如果要添加自己的配置,例如在训练时进行模型快照的迭代次数,可以参考py-faster-rcnn / lib / fast_rcnn / config.py。此文件包含所有配置参数。不需要在此config.py中设置配置,但只需在faster_rcnn_end2end.yml中添加语句。程序可以自动解析参数。当然,如果没有声明.yml文件中的项目,则会采用存在的默认值。
train_net.py
这个py文件主要是读取数据并训练数据,它连接着py-faster-rcnn/lib/database/
里面的内容。