Faster RCNN 源码解读(1) -- 文件结构分析

版权声明:本文为williamyi原创,未经许可禁止转载或直接挪作他用! https://blog.csdn.net/williamyi96/article/details/77932416

基本介绍

Faster RCNN 在目标检测及其相关领域得到了广泛的运用。其原型RCNN是将CNN引入到目标检测的开山之作,此外基于region proposal是一种十分值得学习的思想。因此将在后续的系列章节中,基于源码,对Faster RCNN进行深入的剖析。

代码结构

从github上的源码看上去就是这个样子:

这里写图片描述

接下来将对各个文件夹的功能进行详细的分析:

caffe-fast-rcnn

Faster RCNN总体代码继承自Fast RCNN, 因此caffe-fast-rcnn中包含的是caffe的框架文件

Data

This directory holds (after you download them):

  • Caffe models pre-trained on ImageNet
  • Faster R-CNN models
  • Symlinks to datasets

参见https://github.com/rbgirshick/py-faster-rcnn/tree/master/data

Experiments

  • logs
  • scripts/faster_rcnn_alt_opt.sh
  • cfgs/faster_rcnn_alt_opt.yml

存放配置文件以及运行的log文件,另外这个目录下有scripts可以用end2end或者alt_opt两种方式训练。

Lib

用来存放一些python接口文件,如其下的datasets主要负责数据库读取,config负责cnn一些训练的配置选项。

lib/rpn

这就是RPN的核心代码部分,有生成proposals和anchor的方法

generate_anchors.py
生成多尺度和多比例的锚点。这里由generate_anthors函数主要完成,可以看到,使用了 3 个尺度( 128, 256,
and 512)以及 3 个比例(1:1,1:2,2:1)。一个锚点由w, h, x_ctr, y_ctr固定,也就是宽、高、x center和y center固定。

proposal_layer.py
这个函数是用来将RPN的输出转变为object
proposals的。作者新增了ProposalLayer类,这个类中,重新了set_up和forward函数,其中forward实现了:生成锚点box、对于每个锚点提供box的参数细节、将预测框切成图像、删除宽、高小于阈值的框、将所有的(proposal, score) 对排序、获取 pre_nms_topN proposals、获取NMS 、获取 after_nms_topN proposals。(注:NMS,nonmaximum suppression,非极大值抑制)

anchor_target_layer.py
生成每个锚点的训练目标和标签,将其分类为1
(object), 0 (not object) , -1 (ignore).当label>0,也就是有object时,将会进行box的回归。其中,forward函数功能:在每一个cell中,生成9个锚点,提供这9个锚点的细节信息,过滤掉超过图像的锚点,测量同GT的overlap。

proposal_target_layer.py
对于每一个object proposal 生成训练的目标和标签,分类标签从0-k,对于标签>0的box进行回归。(注意,同anchor_target_layer.py不同,两者一个是生成anchor,一个是生成proposal)

generate.py
使用一个rpn生成object proposals。

lib/nms文件夹

做非极大抑制的部分,有gpu和cpu两种实现方式
py_cpu_nms.py
核心函数

lib/datasets文件夹

在这里修改读写数据的接口主要是datasets目录下
(1)factory.py
(2)imdb.py
(3)pascal_voc.py
(4)voc_eval.py

lib/fast_rcnn文件夹

主要存放的是python的训练和测试脚本,以及训练的配置文件config.py
(1)config.py
(2)nms_wrapper.py
(3)test.py
(4)train.py

lib/roi_data_layer文件夹

主要是一些ROI处理操作
(1)layer.py
(2)minibatch.py
(3)roidb.py

lib/utils文件夹

(1)blob.py
(2)timer.py

lib/transform文件夹

Models

里面存放了三个模型文件,小型网络的ZF,大型网络VGG16,中型网络VGG_CNN_M_1024。推荐使用VGG16,如果使用端到端的approximate joint training方法,开启CuDNN,只需要3G的显存即可。
(1)fast_rcnn_test.pt
(2)rpn_test.pt
(3)stage1_rpn_train.pt
(4)stage1_fast_rcnn_train.pt
(5)stage2_rpn_train.pt
(6)stage2_fast_rcnn_train.pt

Tools

里面存放的是训练和测试的Python文件。

_init_paths.py

用来初始化路径的,也就是之后的路径会join(path,*)

compress_net.py

用来压缩参数的,使用了SVD来进行压缩,这里可以发现,作者对于fc6层和fc7层进行了压缩,也就是两个全连接层。

demo.py

通常,我们会直接调用这个函数,如果要测试自己的模型和数据,这里需要修改。这里调用了fast_rcnn中的test、config、nums_wrapper函数。vis_detections用来做检测,parse_args用来进行参数设置,以及damo和主函数。

eval_recall.py

评估函数

reval.py

re-evaluate,这里调用了fast_rcnn以及dataset中的函数。其中,from_mats函数和from_dets函数分别loadmat文件和pkl文件。

rpn_genetate.py

这个函数调用了rpn中的genetate函数,之后我们会对rpn层做具体的介绍。这里,主要是一个封装调用的过程,我们在这里调用配置的参数、设置rpn的test参数,以及输入输出等操作。

test_net.py

测试fast rcnn网络。主要就是一些参数配置。

train_faster_rcnn_alt_opt.py

训练faster rcnn网络使用交替的训练,这里就是根据faster rcnn文章中的具体实现。可以在主函数中看到,其包括的步骤为:
RPN 1,使用imagenet model进行初始化参数,生成proposal,这里存储在mp_kwargs
fast rcnn 1,使用 imagenet model 进行初始化参数,使用刚刚生成的proposal进行fast rcnn的训练
RPN 2使用 fast rcnn 中的参数进行初始化(这里要注意哦),并生成proposal
fast rcnn 2,使用RPN 2 中的 model进行初始化参数,

train_net.py

使用fast rcnn,训练自己数据集的网络模型。

train_svms.py

使用最原始的RCNN网络训练post-hoc SVMs。

Outputs

这里存放的是训练完成后的输出目录,默认会在faster_rcnn_end2end文件夹下。

后面将对上述中的重点内容进行细致分析。

protobuf文件定义的结构参数

layer_name表示的是层名,bottom表示层输入数据,top表示层输出数据,kernel_size表示卷积核大小,pad表示边沿补充,stride表示滑动步长。同时,caffe中的数据是通过blob来存储的,blob是一个四维数组,维度从高到低为(num, channels, height, width)。 floating_point 表示浮点运算次数。

参考资料

使用Faster-Rcnn进行目标检测(实践篇)

Faster RCNN文件夹说明

Faster RCNN Test 浮点运算次数

展开阅读全文

没有更多推荐了,返回首页