目标检测之Faster RCNN-2

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、RPN

RPN(Region Proposal Network)区域简易网络结构图

在这里插入图片描述
1.由VGG16生成的feature maps(m×n),首先进行一次3×3的卷积,将原来的特征图进一步卷积提取特征;
2.提取特征后的特征图,新的特征图每个点产生9个anchor(锚),分两个分支处理。第一个分支先进行1×1× 18(2×3×3) 的卷积,进行分类;第二个分支通过1×1× 36(4×9) 的卷积,找到每个anchors用于回归的变换量,以便后面proposal进行修正。

数据18
18是2×(3×3),一个点生成3钟宽高比例(一般为0.5,1,2,具体需要根据检测物体的宽高比变化)与3钟基础尺寸的特征图,即生成3*3种锚。2则是代表每种特征图都需要判断出是前景还是背景两种,即是检测的目标还是图像里的背景两种,最终共计18种。

数据36
36是9×4.9代表9锚,每个锚产生一个候选框框,每个候选框框都有四个坐标(候选框框的左上角与右下角坐标),或者需要四个值(左上角坐标,宽和高)才能够定位到目标。
在这里插入图片描述

那么总共会成m×n×9个anchors。其实RPN最终就是在原图尺度上,设置了密密麻麻的候选anchor。进而去判断anchor到底是前景还是背景,意思就是判断这个anchor到底有没有覆盖目标,以及为属于前景的anchor进行第一次坐标修正。proposal层则负责综合foreground anchors和偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。
Proposal Layer工作流程:
1) 首先通过RPN生成约m×n×9个anchor通过RPN
2) 对每个anchor进行第一次边框修正,得到修订边框后的proposal。
3) 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
4) 忽略掉长或者宽太小的proposal。
5) 将所有proposal按照前景分数从高到低排序,选取前6000个proposal。
6) 使用阈值为0.7的NMS算法排除掉重叠的proposal。
7) 针对上一步剩下的proposal,选取前300个proposal进行分类和第二次边框修正。


二、ROI层


RoI Pooling层则负责收集proposal,并计算出proposal feature maps,送入后续网络。从图2中可以看到Rol pooling层有2个输入:

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

ROI下一层是进行卷积,然后分类和回归。通常一个卷积的输入,应该是一个固定的值,而不是包含了许多不同的尺寸的输入特征图。那么ROI pooling需要将由RPN输出的不同的proposal boxes值进行固定下来。
通常有两种方法:

  1. 从图像中crop一部分传入网络
  2. 将图像warp成需要的大小后传入网络

在这里插入图片描述
ROI出现的原因:

  • 该网络结构上RPN层产生大量的region proposals,处理速度较慢
  • 若分大小特征图单独处理,整个网络架构就不是end-to-end的模式

ROI Pooling层的操作:
将feature map中的ROI缩放到预定义的大小,如7*7的尺寸;缩放的处理流程包括:将ROI均分为等大的子区域,其数量与网络层的输出大小相同;计算每个子区域中的最大值或平均值;将每个子区域中的计算结果作为该层输出中的一个元素。
ROI pooling具体操作如下:
(1)根据输入image,将ROI映射到feature map对应位置;
(2)将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
(3)对每个sections进行max pooling操作;

ROI Pooling层的输出:

经过该层后获得N3维的矩阵,其中N表示ROI数目,纵坐标的第一列表示输出特征图batch中的索引,最后两位表示pooling后的输出大小。
由该层的实际处理过程可知,ROI Pooling的输出维度实际上不依赖于特征图和其上产生ROI的大小,仅由ROI等分后的子区域的数目决定。整个处理过程可以通过一个例子近似展示。下图表示一个88的feature map,黑色框表示其中的一个ROI,ROI Pooling后的大小为22,也就是黑色框中水平和垂直线分割后的区域数目。
若Pooling中执行的是最大化操作,则ROI Pooling后的输出如下。此处之所以说该例子是ROI Pooling的一个近似操作,是因为ROI大小为75,Pooling的输出大小为2*2,上图中没有对ROI区域进行等分。

ROI pooling example
考虑一个88大小的feature map,一个ROI,以及输出大小为22.
(1)输入的固定大小的feature map
在这里插入图片描述
(2)region proposal 投影之后位置(左上角,右下角坐标):(0,3),(7,8)。
在这里插入图片描述
(3)将其划分为(22)个sections(因为输出大小为22),我们可以得到:
在这里插入图片描述
(4)对每个section做max pooling,可以得到:
在这里插入图片描述


三、分类和回归

分类和回归结构图

在这里插入图片描述
通过ROI pooling层后的输出大小维度一致,然后通过一次卷积。分为两个部分进行分类和回归的分支网络。

  • 通过全连接和softmax对proposals进行分类,这实际上已经是识别的范畴了
  • 再次对proposals进行bounding box regression,获取更高精度的rect box

损失函数

在RoI Pooling Layer之后,就是Faster R-CNN的分类器和RoI边框修正训练。分类器主要是分这个提取的RoI具体是什么类别(人,车,马等),一共C+1类(包含一类背景)。RoI边框修正和RPN中的anchor边框修正原理一样,同样也是SmoothL1 Loss,值得注意的是,RoI边框修正也是对于非背景的RoI进行修正,对于类别标签为背景的RoI,则不进行RoI边框修正的参数训练。对于分类器和RoI边框修正的训练,可以损失函数描述如下:
在这里插入图片描述
其中smooth L1 loss能从两个方面限制梯度:

  • 当预测框与 ground truth 差别过大时,梯度值不至于过大;
  • 当预测框与 ground truth 差别很小时,梯度值足够小。

参考:
https://blog.csdn.net/u011436429/article/details/80279536