前几期我们一起学习了,R-CNN, SPP-Net, Fast RCNN等网络,链接如下:
目标检测算法Fast RCNN详解目标检测算法SPP-Net详解目标检测算法R-CNN详解

由于每期都是逐步改进,重复的不在赘述,所以建议先阅读前面的,这期我们继续改进,学习一下Faster RCNN都做了哪些改进?

我们知道Fast RCNN的主要贡献是将分类和回归整合到了网络中,虽然速度提升了不少,但是还是存在一个很大的问题,就是SS算法选择候选框,因为这个算法很难在GPU上运行,所以Faster RCNN就将选择候选框的方法也集成到了网络中。从R-CNN, Fast RCNNFaster RCNN,从框架上都做了哪些改变呢?如下表:

CNN可以识别什么语音_CNN可以识别什么语音

 

从上表中,可以看到在R-CNN时候三大步骤是独立的,候选框选择是SS算法,特征提取是深度网络,而分类和回归是单独的机器学习算法;Fast RCNN将分类回归也整合到了网络中;而今天要学的Faster RCNNSS算法选择候选,替换成了RPN(Region Proposal Network)深度网络。接下来我们先一起看一下Faster RCNN的整体框架。

1. Faster RCNN整体框架

我们先看看Faster RCNN的大致流程,主要流程跟前面的Fast RCNN都差不多,唯一不一样的就是候选框的选取,在Fast RCNN的时候是用SS算法进行选取,而在Faster RCNN这里用了RPN网络,如下图:

CNN可以识别什么语音_CNN可以识别什么语音_02


步骤如下:

  1. 将原始输入图像输入到卷积网络进行特征提取,得到特征图。
  2. 对获取到的特征图进行利用RPN网络进行提取候选框。
  3. 利用特征映射的方法将候选框的位置映射到特征图相应位置,并提取特征。
  4. 将提取的特征经过ROI Pooling层来固定特征数量。
  5. 将经过ROI Pooling的的特征输入到共享全连接层。
  6. 最后将共享全连接层的输出分别经过各自的全连接层利用softmax进行分类以及进行边框回  归。

核心改进在于利用的RPN网络代替SS算法提取了候选框。其他地方跟之前的Fast RCNN大致相同。接下来,我们一起重点看一下RPN网络长什么样子?

2. RPN网络详解

通过上面的学习,我们知道Faster RCNN的重要改进在于RPN层,我们来一起看一下这个RPN层是怎么实现网络提取的,如下图:

CNN可以识别什么语音_CNN可以识别什么语音_03

  1. 首先,我们经过卷积网络得到特征图之后,假设特征图的尺寸为W*H*D,先将特征图经过一个3*3*256的卷积层,将特征图的深度固定为256
  2. 接下来对W*H*256的特征图的每个像素都生成Kanchor boxes,映射到输入图像上,可以直接理解为,基于特征图生成了W*H*K个候选框。
    稍后会一起看下如何生成候选框。
  3. 然后,利用特征图上的每个像素的256个特征,对该像素产生到原图上的候选框进行分类和回归。
  4. 我们通过前面学的FCN知道全连接层就相当于是1x1的卷积操作。
    所以这里就直接用1x1的卷积层来直接对该像素产生的候选框进行分类,由于是提取候选框,所以该分类仅分两类:
    目标和背景,每个候选框有两个得分,故而得到的分类结果就是一个W*H*2K的分类得分图。
  5. 同样,边框回归也利用1x1的卷积层代替全连接层,对映射到原图上的候选框进行回归,每个回归结果由向量[x,y,w,h]组成,所以得到的回归图的尺寸为W*H*4K.

对于上面第二步说的特征图上的每个像素都产生Kanchor boxes,如下图:

CNN可以识别什么语音_CNN可以识别什么语音_04


假如K=9的话,特征图上的一个像素产生的Kanchor boxes对应到原图上就是上图的9个候选框。分三组比例尺寸(1:1,1:2,2:1),三组size(128,256,512),共9个候选框,这样总共产生W*H*K个候选框。

RPN网络的大致流程理解了,那么具体该怎么训练网络呢?

RPN网络训练

我们以具体尺寸为例,来看下这个网络该怎么训练,假如我们最后一层卷积层提取到的特征图尺寸为40*60*256,如下图:

CNN可以识别什么语音_CNN可以识别什么语音_05

  1. 最后一个卷积层输出的特征图再进行一次3*3的卷积操作得到新的特征图;
  2. 新特征图的平面上共有40x60=2400个点,每个点都可以对应到原始图片上得到9anchor,所以移动可以得到40x60x9大约20000个候选区域。
  3. 计算所有候选区域是否为目标的得分。
  4. 把所有超出图片的候选区域都限制在图片区域内,给置信度得分排序,选出得分最大的前12000个候选区域。
  5. 在选出的候选区域里面,候选区域之间往往会有大量的重叠,这里基于上一步的得分,采取非极大值抑制(NMS)。
    NMS之后再选出score得分最大的前2000个,接着对这2000个候选区域进行标定,比如候选与某个标定区域的IoU大于0.7的记为正样本,如果与任意一个标定框的IoU都小于0.3,那么该候选区域记为负样本,其余的不作为样本训练。
  6. 在训练RPN层分类回归任务时,随机抽取256个区域来训练,正负样本比例为1:1,如果正样本数量小于128,则用负样本填充。
  7. 在训练整个Faster RCNN的分类回归任务的时候,随机抽取64个与真实类别标注框IoU大于等于0.5的区域作为前景,256-64IoU大于0.1且小于0.5的区域作为背景来训练具体类别。

到这里,我们基本上介绍完了Faster RCNN的框架以及RPN网络的流程。但是明白了原理不代表知道具体怎么训练,下期我们深入一步,去学下这个网络的损失函数该怎么构建。