faster rcnn 中Propsals 的详细生成过程

图1 Faster rcnn rpn阶段训练过程结构图

图2 Faster rcnn rpn阶段测试过程结构图

 

下面依据上图简述我理解的faster rcnn中propsal具体的生成流程

从图1可以看到

  1. 最后一层卷积层(ZF中为conv5,VGG16为conv5_3)中数据经过一次3*3,padding为1的卷积生成rpn_conv1层,此层通道数为256(VGG16为512),即一个256维的向量
  2. 该向量分别经过两次3*3,padding为1的卷积生成rpn_cls_score和rpn_bbox_pred。通道数即向量维数分别2k和4k(k为预计生成的anchor数目,即9)
  3. 接下来是最重要的一步,rpn_cls_score进入rpn-data层计算标签和box。该层为一个python层,对应的python文件为rpn/AnchorTargetLayer.py

      rpn-data层(bottom为层输入,top为层输出)

 

            这一层的算法可以简述为

            for each (H, W) location i

                           generate 9 anchor boxes centered on cell i

                          apply predicted bbox deltas at cell i to each of the 9 anchors

             filter out-of-image anchors

             measure GT overlap

           即对于高为H宽为W的特征图上的每一个定位点 i 生成以i为中心的9个anchors,再将预测边框deltas和anchors进行匹配。

首先计算shift_x和shift_y,将0到W和H的数分别乘上feat_stride,即16。feat_stride指的是合适的滑动步长,且发现这个数的大小和输入图片到特征图的缩小倍数相同(VGG16中最后一层卷积特征图为输入图片的1/16),或许有其特殊意义。这样对于输入为224*224的图片,此时W和H为15,可以得到shift_x和shift_y为[  0  16  32  48  64  80  96 112 128 144 160 176 192 208 224]。接下来两步是这两个数组相互组合,生成在224*224大小的方格内生成225个间隔为16的点。此点即cell i,记为shifts

左上角左边和右下角坐标相同的框应为点

再就是调用generate_anchors生成9个anchor,再将其坐标加上shifts,可以在全图上得到9*225=2025个anchors

 

再挑出出界的anchors,计算inside anchors和GT的overlap,挑选出符合条件的的anchors(IOU>0.7),lable记为1,否则为0.可以得到bbox。再根据bbox和gt的计算target.依据公式正是论文中提出来的

这些tartget可以用来回归bbox,程序还计算了bbox_inside_weights和bbox_out_weights

bbox_inside_weights:label等于1的行,它的值等于cfg.TRAIN.RPN_BBOX_INSIDE_WEIGHTS(1.0);其他等于0;相当于损失函数中的pi*

当cfg.TRAIN.RPN_POSITIVE_WEIGHT小于0(默认-1.0)

bbox_outside_weights:fg,bg=np.ones((1, 4)) * 1.0 / sum(fg+bg),其他为0;

  1. 将rpn-data的输出结果和rpn_cls_score_reshape([1,2,*,15])以及rpn_bbox_pre 结合可以计算loss,
  2. 依据loss 可以反向传播调整卷积参数,使之最小化来优化结果。

以上是训练的过程,通过反复训练可以得到有效的参数

而图2测试时又有不同

 

Test rpn 阶段结构

  1. 依据训练得到的参数,我们可以直接将单张输入图片进行卷积后得到的rpn_cls_score_reshape进行softmax得到分类结果(0,1)。并可以得到rpn_bbox_pred。
  2. 依据以上得到的结果进行propsal.其算法如下:

 

即对于(W,H)中的每一个cell,生成anchor,将anchors和bbox deltas进行匹配,筛除不合条件的anchors,将剩余的anchors按分类分数排序,进行NMS,再排序得到propsals.

而前面训练时的bbox deltas指的是GTbox ,而这里测试时则就是指上一步得到的rpn_bbox_pred了。这也是test和train的不同,train以GT为标准来选择anchors,通过梯度下降反向传播来修正rpn_bbox_pred的相关参数。而test 使用train训练好的参数生成rpn_bbox_pred作为标准,去筛选合适的anchors。作为prosals

 

弄清楚了这个过程。我们可以回答很多细节上的问题

  1. 尺寸比较小的特征图上生成的anchor是如何对应尺寸较大的输入图片上,并和基于输入图片标记的GT匹配的?

这是因为我们在生成anchors 的时候使用了scales参数,寻找滑动点的时候使用了feat_stride 参数,这些参数使得最终的中心点和其生成的anchors坐标是以原图上坐标来表示的。所以我们可以在15*15大小的特征图上看到

[84,100,52,200]这样的anchor坐标。

  1. 既然anchors是以特征图上的点来虚拟出原图坐标的宽来进行计算的,那特征图又起到什么作用呢,或者说特征图中的这些anchors中信息是怎么利用的呢

按照目前的理解就是卷积神经网络去做目标识别任务的时候,一方面进行分类任务,通过固定好的卷积参数对图片进行层层卷积,最后得到一个结果将这个结果和已知的类别数据进行比对就知道是什么种类了。而另一个任务则是定位,anchor的中文意思即定位锚,它作用就是和gtbox或者bbox deltas匹配上,从而可以定准位置。在faster rcnn中有两个网络两次分类和定位。第一次是我们上面详述的rpn。Rpn的作用是目标推荐,它的分类只是依据overlap的多少来确定这个里面有没有可能包含目标。并通过定位来大致找准位置。之后还要经过所谓fast rcnn 步骤进行真正的分类和定位,注意这里用的就是propsal的数据了也就是说我们前面的工作相当于在原图中抠出的小图进行了分类和重新定位,每一个被推荐的小图就是一个原本的anchor,其信息不就被利用了

猜你喜欢

转载自blog.csdn.net/qq_26974871/article/details/81605685