Faster-RCNN详解

Faster-RCNN源码分析可以点击这里

1. 向前传播过程

1.1 CNN提取特征

就是将图片输入到预训练好的CNN网络中获取特征图feature map。

以含有四层maxpool的vgg网络为例,输入图片大小为(w,h,3),则输出特征图的大小为(w/16, h/16, 512)

1.2 RPN网络

Faster-RCNN一个重要的变化就是抛弃了前代RCNN使用SS(Selective Search)方法生成检测框,而是使用RPN网络。

1.2.1 生成anchor base

anchor base就是由两个参数scale=[8,16,32]和ratio=[0.5,1,2]两个参数生成的生成的,scale指anchor的长,ratio指anchor的长宽比,有这两个参数进行组合就能得到9个anchor base,anchor base用四个坐标(x,y,w,h)保存(分别表示中心点的坐标和长宽)。如下图所示

faster rcnn论文复现 faster rcnn详解_faster rcnn论文复现

1.2.2 获得所有anchor box

然后让anchor base在特征图feature map(w/16, h/16, 512)的每一个像素点上移动,由此就能得到faster rcnn论文复现 faster rcnn详解_神经网络_02个anchor。就是下图画圈部分的操作。

(注意anchor的坐标是相对与原图上的坐标,而不是特征图上的,所以在特征图上移动时需要将坐标映射会原图,在这里直接x,y坐标乘以16即可,因为特征图相对于原图缩小了16倍)

faster rcnn论文复现 faster rcnn详解_卷积_03

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AoKXbQ79-1595253678225)(https://s1.ax1x.com/2020/07/20/U4p2bd.png)]

1.2.3 边框回归获得ROIs
  1. 先使用Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))对特征图进行处理,得到图中的中间层(intermediate layer)
  2. 使用Conv2d(512, 9*2, kernel_size=(1, 1), stride=(1, 1), padding=(1, 1))对中间层进行处理得到anchor box的分类参数(用于判断anchor box中的是否含有检测目标,即前景和背景)
  3. 使用Conv2d(512, 9*4, kernel_size=(1, 1), stride=(1, 1), padding=(1, 1))对中间层进行处理得到anchor box的位置修正参数,然后将参数带入坐标回归公式就能得到ROIs的坐标。

坐标回归公式如下( faster rcnn论文复现 faster rcnn详解_python_04为该卷积网络输出的参数, faster rcnn论文复现 faster rcnn详解_python_05为anchor的坐标,faster rcnn论文复现 faster rcnn详解_python_06为回归后的预测坐标 ):

faster rcnn论文复现 faster rcnn详解_faster rcnn论文复现_07

1.2.4 筛选去掉一部分ROIs

上一步对anchor box使用边框回归获得了所有的ROIs,但是数量太多了,直接进行后续计算会增大计算量,所需需要筛选去掉一些。

  1. 将上述边框回归过程中得到的分类参数(用于判断前景和后景)输入到softmax,在其中选择得分大于给定得分阈值的那部分ROIs。
  2. 在上述基础上再进行nms(非最大抑制),进一步筛选掉一部分ROIs。
  3. 最后再剩余的ROIs随机抽取R个(训练时抽取2000个,测试时抽取300个)

通过以上步骤就完成了ROIs的筛选。

1.3 ROIPooling

ROIPooling起始就是简化版的金字塔池化(SSPNet),这里参考了这篇文章

  1. 假设下图就是我们的特征图

faster rcnn论文复现 faster rcnn详解_卷积_08

  1. 然后我们需要将ROIs(是原图上的坐标)映射到特征图上,如下图所示:

faster rcnn论文复现 faster rcnn详解_神经网络_09

  1. 由于不同的ROI的大小和形状都不相同,但是我们却希望得到相同的输出怎么办呢? 这就是ROIPooling的核心部分,假设我们想得到一个2*2的输出,那么我们就能将上述ROI对应的特征图划分为如下图所示的2*2的矩阵,然后再每个小矩阵上分别使用maxpool即可。

划分~

faster rcnn论文复现 faster rcnn详解_faster rcnn论文复现_10

分别使用maxpool

faster rcnn论文复现 faster rcnn详解_卷积_11

1.4 获得最后的预测结果

  1. 将上述ROIPooling后得到所有ROIs相同大小的输出特征输入到全连接层中,假设最后获得一个4096的一个输出向量。
  2. 将上述4096向量输入到用于边框回归的全连接网络,再使用上述的边框回归计算公式得到最终的边框。
  3. 将上述4096向量输入到种类回归(共n_class +1 种,n_class种物体,还有一种表示背景)的全连接网络,得到各个边框的物体种类和相应的置信概率。

2. 反向传播过程

2.1 RPN网络的训练

RPN网络需要训练的部分就是位置修正参数和种类参数(前景和背景)的卷积网络。

对于位置修正参数,我们只需要根据人工标定的bounding box,然后结合生成的anchor box就能获得推得位置修正参数的ground truth(其实就是由anchor box和和位置修正参数推到ROI的逆过程),然后计算Smooth L1 Loss(探测边框回归)

对于种类参数,计算Softmax Loss(探测分类概率)

得到上述的两个损失值,然后根据下列的损失函数就能得到最终的损失函数:

faster rcnn论文复现 faster rcnn详解_卷积_12

2.2 最后预测网络的训练

和RPN网络的训练十分类似,就是一个位置修正参数和种类参数(n_class+1种)的全连接网络的回归。

对于位置修正参数,根据人工标注的bounding box结合输入的ROIs就能得到位置修正参数,然后计算Smooth L1 Loss(探测边框回归)

对于种类参数,计算Softmax Loss(探测分类概率)

同上计算最后的损失值