RPN(Region Proposal Network)和 Anchor 理解

介绍

上一篇博客介绍了Fast RCNN中的ROI Pooling原理,网络只需一次特征提取过程,不同尺寸的候选框映射到feature map对应位置上,经过该结构后可变成相同大小的特征向量作为全连接层的输入。但是对于候选框的选取仍然保留了RCNN中的Selective Search策略,这显然限制了网络的速度,因此RPN(Region Proposal Network)被提出作为候选框的提取网络,在加速了检测过程的同时,RPN也可以很容易结合到Fast RCNN中,从而把物体检测整个流程融入到一个神经网络中成为一个整体,即Faster RCNN。

原理

Faster RCNN的整体流程如下图,其中RPN接收一个特征图作为输入,输出一系列目标物体出现可能性较高的候选框。在分析RPN原理之前,需要先介绍一下Anchor的概念。
RPN(Region Proposal Network)和 Anchor 理解_第1张图片

Anchor

RPN的目标是代替Selective Search实现候选框的提取,目标检测的实质是对候选框的回归,而网络不可能自动生成任意大小的候选框,因此Anchor的主要意义就在于根据feature map在原图片上划分出很多大小、宽高比不相同的矩形框,RPN会对这些框进行一个粗略的分类和回归,选取一些微调过的包含前景的正类别框以及包含背景的负类别框,送入之后的网络结构参与训练。

Anchor的产生过程:

  1. base_size=16 这个参数代表的是网络特征提取过程中图片缩小的倍数,和网络结构有关,ZFNet的缩小倍数为16,表明了最终feature map上一个像素可以映射到原图上16 x 16区域的大小。
  2. ratios=[0.5,1,2] 这个参数指的是要将16x16的区域,按照1:2,1:1,2:1三种比例进行变换,如下图所示:
    RPN(Region Proposal Network)和 Anchor 理解_第2张图片
  3. scales=2**np.arange(3, 6) 这个参数是要将输入区域的宽和高进行8,16,32三种倍数的放大,如16x16的区域变成(16x8)x(16x8)=128x128的区域,(16x16)x(16x16)=256x256的区域,(16x32)x(16x32)=512x512的区域,如下图所示:
    RPN(Region Proposal Network)和 Anchor 理解_第3张图片

通过以上三个参数,针对于feature map上的任意一个像素点,首先映射到原图片上一个 16 x 16 的区域,然后以这个区域的中心点作为变换中心,将其变为三种宽高比的区域,再分别对这三种区域的面积扩大8,16,32倍,最终一个像素点对应到了原图的9个不同的矩形框,这些框就叫做Anchor,如下图:
RPN(Region Proposal Network)和 Anchor 理解_第4张图片
注意: 将不完全在图像内部(初始化的anchor的4个坐标点超出图像边界)的anchor都过滤掉,一般过滤后只会有原来1/3左右的anchor。如果不将这部分anchor过滤,则会使训练过程难以收敛。

具体代码实现和分析可以阅读下面这两篇博客,介绍的很清楚:https://blog.csdn.net/sinat_33486980/article/details/81099093
https://blog.csdn.net/u014380165/article/details/80379812

RPN的实现

RPN(Region Proposal Network)和 Anchor 理解_第5张图片
如上图所示,对于卷积层提取出来的feature map,在ZFNet中为13x13x256,作者使用了一个3x3的滑动窗口进行处理,其实就是一个3x3x256x256的卷积核(padding=1,stride=1),每个窗口的中心点,即图中的蓝点,会根据上面介绍过的Anchor生成机制,对应到原图上k=9个不同的矩形框。而得到的13x13x256的输出,就负责这13x13x9个矩形框的分类得分以及回归,具体分为两路:
一路通过1x1x256x18的卷积核得到13x13x18的输出,也就是对于每个框预测其为前景和背景的得分(实际中只需要前景的得分即可,所以很多代码实现中直接得到13x13x9的输出);
另一路通过1x1x256x36的卷积核得到13x13x36的输出,也就是对于每个框的大小和位置进行初步的回归。

RPN中的部分细节:
在上述过程中,经过滑动窗口会产生13x13x9=1521个矩形框,首先会将不完全在图像内部(初始化的4个坐标点超出图像边界)的anchor都过滤掉,一般过滤后只会有原来1/3左右的anchor。如果不将这部分anchor过滤,则会使训练过程难以收敛。
训练过程中,计算每一个Anchor中是否包含物体以及与物体框的IOU,把IOU>0.7的(或者不到0.7但与GT已经是最大IOU了)作为正样本,IOU<0.3的作为负样本,其他的舍弃。如果使用的网络产生的feature map尺寸较大,需要使用NMS对剩下的框再次筛选。
得到的结果中负样本会大于真样本的数量,一般分别采样,各选取128个作为下一层ROI Pooling的输入。

RPN与Fast RCNN特征共享:
RPN可以单独训练,但要想把它加入到Fast RCNN的检测网络中,就需要设计一种特征共享的训练策略,如果只是反向传播联合优化,很有可能造成网络无法收敛。
交替训练法:
step 1. 训练 RPN 网络,采用 ImageNet 预训练的模型进行初始化,并进行微调
step 2. 利用 step1 的RPN生成 proposal,由 Fast RCNN 训练一个单独的检测网络,该网络同样由ImageNet预训练模型进行初始化。 此时,两个网络还未共享卷积层
step 3. 用检测网络初始化 RPN 训练,固定共享的卷积层,只微调 RPN 独有的层,现在两个网络实现了卷积层共享
step 4. 保持共享的卷积层固定,微调 Fast RCNN 的全连接层。这样,两个网络共享相同的卷积层,构成一个统一的网络

RCNN系列的对比

流程对比:
RPN(Region Proposal Network)和 Anchor 理解_第6张图片
从整体流程来看,RCNN只是使用CNN作为特征提取器,分类和回归任务独立处理;Fast RCNN中使用多任务损失函数把分类和回归整合在了CNN的过程中,借助ROI Pooling一张图片只需一次特征提取过程,可近似的看作一个End-to-end的网络;而Faster RCNN把网络的前置任务,候选框的提取过程也加入CNN过程,真正实现了目标检测全过程的一体化。

详细对比:
RPN(Region Proposal Network)和 Anchor 理解_第7张图片

One-stage vs. Two-stage

RCNN系列和之后的R-FCN等网络都属于Two-stage的目标检测方法,而以yolo和ssd等为代表的目标检测属于One-stage,下图是yolo和Faster RCNN框架的对比:
RPN(Region Proposal Network)和 Anchor 理解_第8张图片
One-stage一步搞定分类和bbox问题。
Two-stage分为两步:1.根据区域是前景,还是背景,生成bbox(RPN)。2.对bbox进行分类和细调。

二者简单的对比:
1、One-stage算法从网络结构上看只是一个多分类的RPN,相当于Faster RCNN的第一阶段,所以速度相比后者更快。其预测结果是从feature map中Anchor对应的特征中预测得到的,而Two-stage会对上述结果再进行ROI Pooling之后进一步精细化,因此更为精准。比如,一个Anchor有可能只覆盖了一个目标的50%,但却作为完全的正样本,因此其预测肯定是有误差的。
2、One-stage算法对小目标检测效果较差,如果所有的Anchor都没有覆盖到这个目标,那么这个目标就会漏检。如果一个比较大的Anchor覆盖了这个目标,那么较大的感受野会弱化目标的真实特征,得分也不会高。Two-stage算法中的ROI Pooling会对目标做resize, 小目标的特征被放大,其特征轮廓也更为清晰,因此检测也更为准确。
3、One-stage算法中类别极不平衡,因为一张图片中包含物体的框可能只有几个,所以大多数Anchor都是属于背景类,这不利于网络的训练。Two-stage中经过RPN的筛选,会过滤掉很多背景Anchor,削弱了类别不平衡的影响。(为了解决这个问题使用了Focal Loss损失函数,之后的yolo改进版本也通过减少Anchor的数量降低类别不平衡的影响)

参考博客:
https://blog.csdn.net/qq_17448289/article/details/52871461
https://www.jianshu.com/p/4891042ef7ef

你可能感兴趣的:(记录,RPN,Anchor)