【深度学习】:Faster RCNN论文详解

Faster RCNN详解

Faster RCNN 是在Fast RCNN的基础上,进一步改进,解决select search 算法选择候选框速度太慢的问题。

Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
submit time: 2016
arxiv link

fast R-CNN和faster R-CNN之间的区别在于我们不使用特殊区域提议方法来创建region proposal。而是训练一个region proposal network(RPN)该网络将features map 作为输入并输出region proposals。然后将这些proposal输入Fast R-CNN中的RoI池化层。以下是fast RCNN与Faster RCNN的网络结构对比图。

structure

由于frcnn的网络结构主要是两个网络组成,损失函数分为四个部分。

  1. RPN分类损失:anchor是否为gt
  2. RPN位置回归损失:anchor位置微调
  3. ROI分类损失:ROI所属类别
  4. ROI位置回归损失:继续对ROI位置微调

四个损失相加就是最后的损失,反向传播,更新参数。

Faster RCNN 关键步骤:

  • Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  • Region Proposal NetworksRPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals
  • Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  • Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

Faster RCNN 网络是用于目标检测的一种比较流行的框架。它主要由以下四个部分组成:

  • 分别是conv layer 输入为原始图片,用于提取图片的feature map;
  • RPN网络,输入为features map,用于生成region proposal,该层为features map 上每个像素生成若干个anchors(9个),随后通过softmax 判断每个anchor是属于foreground(目标)或者background(背景),再利用bounding box regression修正anchors获得精确的proposal位置;
  • RoI pooling,该层输入为proposal位置信息和features map,通过proposal的位置信息在features map 上提取region features map候选区,然后通过pooling产生一个固定长度的特征,送入全连接层进行目标判别;
  • classification,利用proposal feature maps计算proposal的类别,同时再次进行一次bounding box regression,对proposal位置进行精修,随后将结果输出。

总结一套介绍网络框架的先后顺序的方法。

可以先大后小,按照先后顺序从前到后,按功能性介绍一件事情,每件事情的功能介绍的时候,说清楚输入,工作流程附带其具体功能,输出。

Faster RCNN 详细网络结构如图:

faster rcnn structure

将一副任意大小PxQ的图像,首先缩放至固定大小MxN,然后将MxN图像送入网络;而卷积层 Conv layers中包含了13个conv层+13个relu层+4个pooling层RPN网络首先经过3x3卷积,再分别生成foreground anchors与bounding box regression偏移量,然后计算出proposals;而Roi Pooling层则利用proposals以及feature maps,提取proposal feature送入后续全连接和softmax网络作classification。

conv layer

VGG

Conv layers部分共有13个conv层,13个relu层,4个pooling层。

  • 所有的conv层都是: kernel_size=3 , pad=1 ,stride=1,因此conv层不改变原图大小
  • 所有的pooling层都是: kernel_size=2 ,pad=0 , stride=2,pooling 层将原图缩小为原来的一半
  • 经过Conv layer后,一个MxN大小的矩阵将变为(M/16)x(N/16)

Region Proposal Networks(RPN)

Faster RCNN 层在fast RCNN 的基础上,对提取候选框进行优化。

RPN
RPN

RPN网络分为2条线,上面一条通过softmax分类anchors获得foreground和background(检测目标是foreground),下面一条用于计算anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合foreground anchors和bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

anchors

anchor为由一个中心点,周围生成了9个矩形,矩形长宽比由三个尺寸1:1,1:2;2:1三种,如下图,基本覆盖了各种尺寸和形状,引入检测中常用到的多尺度方法。

anchors

 

Faster RCNN遍历Conv layers计算获得的feature maps,为feature map上每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确,之后将会在RPN层,以及最后进行2次的bounding box regression修正检测框位置。

如上图,对于每一个点的k个anchor来说,从conv layer提取出得特征具有256维,对于每一个anchor,需要分foreground与background,因此共有2k个score,对于每一个anchor共有 (x1,y1,x2,y2) 四个坐标值。因此共有4k个coordinates。在训练阶段,程序将会从这些anchor中挑选出一些合适的anchor进行训练。
因此RPN最终就是在原图尺度上,对每一个像素设置9个尺度的候选anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!

那么Anchor一共有多少个?原图800x600,VGG下采样16倍,feature map每个点设置9个Anchor,所以:
ceil(800/16) \times ceil(600/16) \times 9 = 50 \times 38 \times 9 = 17100

其中ceil()表示向上取整,是因为VGG输出的feature map size= 50*38。

generateAnchor

softmax判定foreground与background

RPN网络中利用anchors和softmax初步提取出foreground anchors作为候选区域。

softmax
softmax


features map 首先做一个1*1的卷积,这个卷积的作用是生成一个 W*H*(9*2) 大小的矩阵。该矩阵用于存储上面提到的foreground与background信息(2*k score)。将该特征后接softmax分类获得foreground anchors,也就相当于初步提取了检测目标候选区域box(一般认为目标在foreground anchors中)。前后两个reshape 操作目的为便于程序实现。
clc layer输出预测区域共k个,每个有的2个参数,即预测为前景的概率和背景的概率,损失用softmax loss(cross entropy loss)。监督信息是Y=0,1,表示这个区域是否为groundtruth。确定groundtruth时,我们需要确定k个区域中的各个区域是不是有效的,是前景还是背景。
K个区域分配标签规则:

  • 与某个ground truth(GT)的IoU最大的区域的分配正标签
  • 与任意GT的IoU大于0.7的区域分配正标签
  • 与所有GT的IoU都小于0.3的区域分配负标签

bounding box regression原理

对于窗口一般使用四维向量 (x, y, w, h) 表示,分别表示窗口的中心点坐标和宽高。对于图 11,红色的框A代表原始的Foreground Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G’,即:

bbox
bbox

 

那么经过何种变换F才能从图10中的anchor A变为G’呢? 比较简单的思路就是先做平移,然后进行缩放,边框回归与RCNN中边框回归相同。bounding box 原理参考链接
RPN中所涉及的边框回归首先经过一个1*1的卷积层,输出一个 W * H * (9 * 4) 的矩阵,用于存储box的坐标信息(4k coordinate)
 

rpnbox

RPN值得注意的地方:

  • - RPN在原图的尺度上选择anchor的大小
  • - anchor的数目是feature map上每个像素选择9个长宽比不同的矩形
  • - soft Max层用于判断anchor是否为前景(含有目标)
  • - bounding box regression 预测的输出是anchor的偏移变换
  • - proposal层,结合前景的anchor(背景anchor被忽略)与anchor偏移变换,对anchor位置进行调整,计算出proposal的精确位置。
  • - bounding box 本质上是学习一个W权重矩阵,即那个1*1的网络的参数(输出为4K regreason,对应anchor的(x,y,w,h)四个偏移),利用W参数乘以 CNN pool5层输出的features map,通过最小二乘,得到anchor的偏移。
  • - 为什么bounding box regression不直接预测坐标呢? 因为坐标间的关系不是简单的一维关系,难以优化。当anchor 与 ground truth比较接近时,他们之间的位置关系(偏移)就可以用一维关系来近似。
  • - proposal层输出的proposal坐标是在原图的尺度上的proposal坐标。

proposal layer

RPN 最后一层为proposal layer,用于前景anchors,以及anchor对应的边框回归微调参数[d_x(A), d_y(A),d_w(A) , d_h(A)] 和 im\_info=[M, N, scale_factor](传入Faster RCNN前首先reshape到固定MxN,im_info则保存了此次缩放的所有信息)来计算产生的proposal位置,此时输出的proposal坐标为原图尺度上的proposal坐标

Proposal Layer forward(caffe layer的前传函数)按照以下顺序依次处理:

  • 生成anchors:利用 [d_x(A), d_y(A),d_w(A) , d_h(A)] 对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)
  • - 按照输入的foreground softmax scores由大到小排序anchors提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors。
  • 限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界)
  • 剔除非常小(width<threshold or height<threshold)的foreground anchors
  • 进行nonmaximum suppression
  • 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal = [x1, y1, x2, y2]输出。
  • 输出的proposal=[x1, y1, x2, y2],由于在第三步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的
  • RPN网络结构主要步骤如下:
  • 生成anchors -> softmax分类器提取前景 anchors -> bbox reg回归前景 anchors -> Proposal Layer生成proposals

RoI pooling layer

RoI Pooling layer负责收集proposal,并计算出proposal feature maps,送入后续网络。Rol pooling层有2个输入:

  1. - 原始的feature maps
  2. - RPN输出的proposal boxes(大小各不相同)

RoI Pooling layer forward过程:

  • - 由于proposal是对应 M \times N 尺度的,所以首先使用spatial_scale参数将其映射回 (M/16) \times (N/16) 大小的feature map尺度;
  • - 再将每个proposal对应的feature map区域水平分为 pooled_w×pooled_hpooled_w×pooled_h的网格;
  • - 对网格的每一份都进行max pooling处理。

经过上述处理后,即使大小不同的proposal输出结果都是 pooled_w×pooled_hpooled_w×pooled_h 固定大小,实现了固定长度输出。

Classification

 

Classification部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
 

classfication

从PoI Pooling获取到7x7=49大小的proposal feature maps后,送入后续网络,可以看到做了如下2件事:

  • - 通过全连接和softmax对proposals进行分类
  • - 再次对proposals进行bounding box regression,获取更高精度的rect box
     

 Faster R-CNN训练

Faster R-CNN的训练,是在已经训练好的model(如VGG_CNN_M_1024,VGG,ZF)的基础上继续进行训练。实际中训练过程分为6个步骤:

  • 在已经训练好的model上,训练RPN网络
  • 利用步骤1中训练好的RPN网络
  • 第一次训练Fast RCNN网络
  • 第二训练RPN网络
  • 再次利用步骤4中训练好的RPN网络
  • 第二次训练Fast RCNN网络

可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:”A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。
 

train

RPN训练

与检测网络类似的是,依然使用Conv Layers提取feature maps。整个网络使用的Loss如下:

L(p_i, t_i) = \frac{1}{N_{cls}}\sum _i {L_{cls}(p_i, p_i^*)} + \lambda \frac {1} {N_{reg}} \sum _i {p_i^*L_{reg}(t_i, t_i^*)}

上述公式中 i 表示anchors index, p_i 表示foreground softmax probability,p_i^* 代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是foreground,p_i^* = 1;反之IoU<0.3时,认为是该anchor是background,p_i^* = 0;至于那些0.3<IoU<0.7的anchor则不参与训练);t代表predict bounding box,t^* 代表对应foreground anchor对应的GT box。可以看到,整个Loss分为2部分:

- cls loss,即rpn_cls_loss层计算的softmax loss,用于分类anchors为forground与background的网络训练
- reg loss,即rpn_loss_bbox层计算的soomth L1 loss,用于bounding box regression网络训练。注意在该loss中乘了 p_i^* ,相当于只关心foreground anchors的回归(其实在回归中也完全没必要去关心background)。

Smooth L1 loss 相比于L2 loss对离群点更加不敏感,更加鲁棒。当预测值与目标相差很大时,L2 loss的梯度是x-t,容易产生梯度爆炸,而L1的梯度为常数,使用L1 loss 可以防止梯度爆炸。

关于softMax loss 和 边框回归loss与fast RCNN 相同。链接

参考资料:

https://perper.site/%2F2019%2F02%2F14%2FFaster-RCNN%E8%AF%A6%E8%A7%A3%2F

 

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值