Faster RCNN 学习
Faster R-CNN这篇论文着重解决了这个系统中的三个问题:
1. 如何设计区域生成网络;RPN
2. 如何训练区域生成网络;
3. 如何让区域生成网络和Fast RCNN网络共享特征提取网络。
图1:Faster RCNN 结构
Faster RCNN:
1. Faster RCNN 由两部分组成:提取候选框和Fast R-CNN 检测器
2. 提取候选框:卷积特征提取 + RPN网络
RPN网络的训练样本是anchors
RPN网络输出为Proposals
Fast RNN检测器 的训练样本是Proposals
基于ZF网络的Faster RCNN (ZF + RPN + Faster R-CNN)
Layer1:conv_5 3*3 convilution
输出特征集 14 * 14 * 256
2)RPN
图2: RPN网络结构简化版
图3:RPN网络流程图
RPN 网络是替换Fast R-CNN 的 SS 部分,用来生成Region Proposal,对应到ZF最后一个卷积特征层14 * 14的特征集上每一个点产生9个anchors。
产生9个anchors过程主要有三步:
(1)首先采用固定大小,固定尺度比和固定横纵比产生9个base_anchors(属于预处理过程)。
(2)由ZF生成的特征(14 * 14)先经过一个3 * 3 * 256 维(256个卷积核)的卷积操作,再经过两个1 * 1(1 * 1 * 18 和 1 * 1 * 36)的卷积操作,一个输出为18维(9个 anchors,每一个有两个参数,共18维,18个输出值),一个输出36维(9个 anchors,每一个有四个参数,共36维,36个输出值)
(3)根据上面两个过程,将产生的9个anchors映射到原图上,得到9个anchors在原图上的位置。
Layer2:conv_rpn 3*3 convilution
Filter 3 * 3 * 256,输出为256维,padding = 1 Stride = 1
输出为 14 * 14 * 256
Layer3_1:conv_rpn_cls 1*1 convilution
RPN网络第1条线路:
Filter 为 1 * 1 * 18 padding = 0 Stride = 1
9个 anchors ,每一个有两个参数,一个是前景概率,一个是后景概率
输入14 * 14 * 256 输出 14 * 14 * 18
Layer3_2:conv_rpn_res 1*1 convilution
RPN网络第2条线路:
Filter 为 1 * 1 * 36 padding = 0 Stride = 1
9个 anchors ,每一个有四个参数,坐标(x,y) 宽高(w,h)
输入14 * 14 * 256 输出 14 * 14 * 36
由图2可知,Layer3_1在进入到下一层时需要进行Reshape一下,{dim:0 dim:2 dim:-1 dim: 0}。Reshape表示一种操作。
我们输入为{dim:1 dim:18 dim:14 dim:14} 经过Reshape 得到{dim:1 dim:2 dim:9 * 14 dim:14},即126 * 14 * 2(9是每一个特征点anchors的个数,一共有14 * 14个特征点,因此一共有14 * 14 个9,即14 * 14 * 9 = 1764 个anchors,2 表示每一个anchors是前景和不是前景的概率,利用softmax得到)。
为什么要进行Reshape?:
其实只是为了便于softmax分类,feature maps每一个点都有9个anchors,同时每个anchors又有可能是foreground和background,所有这些信息都保存WxHx(9x2)大小的矩阵,后面接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中),开始的存储形式为[1, 18, H, W]。而在softmax分类时需要进行fg/bg二分类,所以reshape layer会将其变为[1, 2, 9*H, W]大小,即单独“腾空”出来一个维度以便softmax分类,之后再reshape回复原状。
Layer4:softmax 将18维的特征集输入,得到概率
输入为Reshape 的结果即 126 * 14 * 2。进行完这一步还要Reshape回去变成{dim:1 dim:18 dim:14 dim:14} 即14 * 14 * 18
RPN网络第2条线路:Layer3_2 输出相当于feature maps每个点都有9个anchors,每个anchors又都有4个用于回归的[dx(A),dy(A),dw(A),dh(A)]变换量。利用bounding box regression的计算公式即可从foreground anchors(RPN网络第1条线路cls)回归出proposals。
Layer4:proposals
输入为Layer4 和 Layer3_2 和im_info,另外还有参数feat_stride=16,输出为精准的proposal,然后送入后续的RoI Pooling Layer。
im_info:对于一副任意大小PxQ图像,传入Faster R-CNN 前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息,所有这些数值都是为了将proposal映射回原图而设置的。例如经过4此池化,feature_stride=16则保存了该信息。*
具体实现步骤:
(1) 利用feat_stride和im_info将anchors映射回在原图的位置即坐标和参数。
(2) 将长宽低于阈值的除去(检测不到小的物体)
(3) 按照score(前景分数值) 从高到底排序
(4) 选取前top_N(例如6000)的proposal留下来,其他删除
(5) 对留下来的top_N的proposal进行NMS(非极大抑制)操作,操作阈值为0.7,剩下的就是我们想要的proposal(例如2000)
在训练的时候有以下几个原则
(a)对每一个标定的真值候选区域,与其重叠比例最大的anchor标记为前景样本(label = 1)
(b)对于a)剩下的,如何与某一个标定的真值候选区域的重叠比例大于0.7,也标记为前景样本,如果与任意一个标定的真值候选区域的重叠比例小于0.3则标定为背景样本(label = 0)
(c) (a)和(b)剩下的弃之不用
(d) 跨越图像边界的anchor弃之不用。
最终得到一定数量的proposals,例如当输入为600 * 1000 可得到2000个proposals。
由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的。
RPN网络结构就介绍到这里,总结起来就是:
生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
Layer5:ROI_pool_conv5
什么是ROI呢?
ROI是Region of Interest的简写,指的是在“特征图上的框”;
1)在Fast RCNN中, RoI是指Selective Search完成后得到的“候选框”在特征图上的映射,如下图所示;
2)在Faster RCNN中,候选框是经过RPN产生的,然后再把各个“候选框”映射到特征图上,得到RoIs。
先看一下Fast RCNN的结构:
图4 Fast RCNN 的网络结构
ROIs Pooling顾名思义,是Pooling层的一种,而且是针对RoIs的Pooling,他的特点是输入特征图尺寸不固定,但是输出特征图尺寸固定;
Layer5的输入为Layer4得到的ROI(例如Layer4输出300个proposals{index,x,y,w,h})和ZF最后一层卷积特征(Layer1:14 * 14 * 256),本层的池化参数为6 * 6 ,空间尺度为16分之一,意思是输出的特征集大小是6 * 6 维,因为Layer4得到的ROI尺寸是针对原图的,所有此时要映射到特征层上,ROI的坐标参数要除以16(经过几层池化计算得到),对每一个ROI都需要池化,最终得到300个ROI 。其具体步骤:
(1)将ROI的坐标参数映射到特征集上,设为H * W
(2) 要想得到6 * 6的特征图,采用特定的核进行最大池化,并用index表示输出的值由特征集中哪个位置的元素得到,对于每一个ROI可得到6 * 6 * 256 维的向量。
(3)共有300个ROI,因此,最终输出为300 * 6 * 6 * 256
Layer6:FC6
输入300 * 6 * 6 * 256 的特征图,输出4096个神经元
Layer7:Droput
以一定概率丢掉一些参数
Layer8:FC7
输出为4096个神经元。
Layer9:Droput
以一定概率丢掉一些参数
Layer10_1:cls_score
如果目标为10类(数字0到9)则输出为10,参数个数4096 * 10
Layer10_2:FC6
我需要10个框,则输出为40,参数个数4096 * 40
**Layer11 Softmax:cls_prob
cls_score 层概率值
参考文献 :
基于ZF网络的Faster RCNN网络结构详解(非常详细版)
Faster RCNN原理分析(二):Region Proposal Networks详解
ROI Pooling层解析
Faster R-CNN论文笔记——FR