Faster RCNN网络理解

一、RPN:

    首先图片经过backbone抽取特征图

    然后,RPN网络首先对特征图做一下卷积,比如3*3*256,对于特征图上每个像素点就得到(1,256)的长向量,分两支分别判断:

        1.是不是物体(因为只是区域建议,只需要区分是前景还是背景)

        2.若是物体(即认为此号anchor是Positive anchor了),就用预设的每个特征图锚点对应的anchor box(本身这个锚框的尺寸无论是相对便宜还是绝对尺寸都是指对应到原图上的尺寸)去粗回归GT的位置(锚点是指特征图上的点,但是本质上锚点和原图本身就有一一映射关系)

    最后,这个粗回归的位置就是原图的目标位置框。

  训练RPN:

    RPN分类支路的标签:关键是如何确定正负anchor样本(正1,负0),把Ground Truth与预设anchor的IOU>0.7的anchor,以及最高IOU的anchor设为positive anchor,其他IOU<0.3的标记为负样本。通过这种标记,训练时自然就把分类支路的输出跟对应anchor绑定了。

              注意:显然正样本中可能一个Groud truth分配了多个正样本的anchor box。

 

  为解决训练RPN时,网络注意力向负样本的偏移,作者采取随机采样256个anchors,其中positive :negative = 1:1。后期在focal loss作者进一步解决此偏移问题。

 

二、Faster   RCNN:

  1.拿RPN对应到原图的目标框坐标,直接到上面抽取的特征图(共享特征图)去对应拿到目标区域的特征图

  2.拿这块特征图先ROI池化,得到固定大小的proposal feature map(ROI pooling目的:对不同尺寸原图得到的不同尺寸的Proposal在ROI池化后都可以得到相同大小的池化特征图。当然,如果不用ROI池化就要用裁剪或者直接做仿射变换,裁剪会导致特征缺失,仿射变换会导致特征变形

    (其实整个过程依然有多处位置信息丢失,首先,在保证原图卷积后是整数的情况下, Region proposal 对应区域的特征图就不一定是整数;其次ROI池化本身这个过程还会有浮点像素区域的舍弃,然后再池化还会有位置信息的丢失)

      实现手段:划分固定块的网格,池化----------方法出自SPPNet)

  3.用这个pooling后的feature map再去回归bbox位置(这个池化后特征图依然对应了之前RPN粗回归的部分锚点(有些池化丢失了)在原图上对应的目标框位置),对这些位置再次监督回归,修正位置及尺寸。

 

 

三、如何RPN的proposal结果特征图 得到后续步骤需要的固定尺寸大小的输入特征图?

  从 Region Proposal 对应的区域特征图 得到 下一阶段的精修回归所需要的固定输入特征图 的过程:有两种方法-------ROI Pooling 和ROI Align

    ROI Pooling 过程:(Faster RCNN中的做法)

      1.第一次量化过程(浮点像素区域的舍弃)

            对backbone卷积造成的Region proposal 对应区域的特征图的非整浮点数,直接取整

      2.第二次量化过程(浮点像素区域的舍弃)

           ROI池化本身这个过程还会有浮点像素区域的舍弃 

 

       ROI Align 过程:(Mask RCNN中的做法)

      1.第一次不量化:

        backbone卷积造成的Region proposal 对应区域的特征图的非整浮点数,不做操作进入下一阶段

      2.第二次也不量化

        上面得到的浮点像素区域,通过分区池化,对浮点数区域的池化块内的中心点(亚像素)进行双线性差值。

  

对于大目标的物体,两种做法相差不大;但是如果是小目标物体,ROI Align对于位置信息的保存更精确

  

 

RPN网络中AnchorTargetCreator分析:

将20000多个候选的anchor选出256个anchor进行二分类和所有的anchor进行回归位置 。为上面的预测值提供相应的真实值。选择方式如下:

  • 对于每一个ground truth bounding box (gt_bbox),选择和它重叠度(IoU)最高的一个anchor作为正样本
  • 对于剩下的anchor,从中选择和任意一个gt_bbox重叠度超过0.7的anchor,作为正样本,正样本的数目不超过128个。
  • 随机选择和gt_bbox重叠度小于0.3的anchor作为负样本(等于0的不算,明白的告诉你里什么也没有)。负样本和正样本的总数为256。

对于每个anchor, gt_label 要么为1(前景),要么为0(背景),所以这样实现二分类。在计算回归损失的时候,只计算正样本(前景)的损失,不计算负样本的位置损失。

 

单阶段和两阶段:

单阶段:在Overfeat中,对不同尺度的图像滑窗,得到区域特征,然后直接对这块特征进行目标分类和回归

两阶段:而Faster RCNN是

  1. (特征图)通过RPN先得到前景建议,物体区域
  2. 然后对这块特征图对应的多尺度的anchor的ROI去自适应池化到固定的size,再送去Fast RCNN检测头去分类和回归。

                所谓的区域建议就是认为这块(3*3*256,是基于这个3*3区域的)某个anchor预定位置未知(agnostic)类别物体(前景 or 背景)的可能比较大(认为是 positive anchor),对这块特征图(3*3区域的中心像素)关联的本Positive anchor,送去回归得到Region Proposal。

                比如对于w*H= 2400的Feature map来说,Faster RCNN做区域建议时,首先用滑窗法比如1*1*256的filters,就得到2400*256_d的tensor,然后通过后面分两路级联Fcn(这个fcn作用就是将),一路得到2k scores(对anchor box二分类)判断是前景 or 背景,如果是前景,即将此k对应的anchor作为初始预测区域anchor_proposal,然后另一路得到4K coordinates,就是利用这个anchor_proposal去粗回归的Groundtruth位置,得到RPN最终的Region Proposal。

后面就是fast rcnn再去回归一次精确位置。

 

Faster RCNN的anchor理解:

            Anchor点是在feature map上取的没错,但是anchor设置的时候有个base_size=16,  而这个16*16就是当前特征图上一点在原图上的感受野。

             因此虽然anchor的思路是在特征图上设置,但是由于最终的anchor尺度都乘上了当前像素的感受野——base_size=16,因此anchor是在feature map上设置的,但是尺度是基于原图像尺度的box.

              比如,原图上有一类目标大小约为200*200,假若featuremap上1像素对应图像上10*10,则只需要在特征图上放area = 20*20 = 400 pixels的anchor,此时把anchor再设置成ratios  = 1:1,1:2, 2:1,就得到20*20,14*28,28*14。再对应上锚点的坐标即得到anchor的位置坐标(x1,y1,x2,y2)。

 

posted @ 2020-05-13 10:50  Parallax  阅读(337)  评论(0编辑  收藏  举报