前几期我们一起学习了,
R-CNN
,SPP-Net
,Fast RCNN
等网络,链接如下:
目标检测算法Fast RCNN详解目标检测算法SPP-Net详解目标检测算法R-CNN详解
由于每期都是逐步改进,重复的不在赘述,所以建议先阅读前面的,这期我们继续改进,学习一下Faster RCNN
都做了哪些改进?
我们知道Fast RCNN
的主要贡献是将分类和回归整合到了网络中,虽然速度提升了不少,但是还是存在一个很大的问题,就是SS
算法选择候选框,因为这个算法很难在GPU
上运行,所以Faster RCNN
就将选择候选框的方法也集成到了网络中。从R-CNN
, Fast RCNN
到Faster RCNN
,从框架上都做了哪些改变呢?如下表:
从上表中,可以看到在R-CNN
时候三大步骤是独立的,候选框选择是SS
算法,特征提取是深度网络,而分类和回归是单独的机器学习算法;Fast RCNN
将分类回归也整合到了网络中;而今天要学的Faster RCNN
将SS
算法选择候选,替换成了RPN
(Region Proposal Network
)深度网络。接下来我们先一起看一下Faster RCNN
的整体框架。
1. Faster RCNN整体框架
我们先看看Faster RCNN
的大致流程,主要流程跟前面的Fast RCNN
都差不多,唯一不一样的就是候选框的选取,在Fast RCNN
的时候是用SS
算法进行选取,而在Faster RCNN
这里用了RPN
网络,如下图:
步骤如下:
- 将原始输入图像输入到卷积网络进行特征提取,得到特征图。
- 对获取到的特征图进行利用
RPN
网络进行提取候选框。 - 利用特征映射的方法将候选框的位置映射到特征图相应位置,并提取特征。
- 将提取的特征经过
ROI Pooling
层来固定特征数量。 - 将经过
ROI Pooling
的的特征输入到共享全连接层。 - 最后将共享全连接层的输出分别经过各自的全连接层利用
softmax
进行分类以及进行边框回 归。
核心改进在于利用的RPN
网络代替SS
算法提取了候选框。其他地方跟之前的Fast RCNN
大致相同。接下来,我们一起重点看一下RPN
网络长什么样子?
2. RPN网络详解
通过上面的学习,我们知道Faster RCNN
的重要改进在于RPN
层,我们来一起看一下这个RPN
层是怎么实现网络提取的,如下图:
- 首先,我们经过卷积网络得到特征图之后,假设特征图的尺寸为
W*H*D
,先将特征图经过一个3*3*256
的卷积层,将特征图的深度固定为256
。 - 接下来对
W*H*256
的特征图的每个像素都生成K
个anchor boxes
,映射到输入图像上,可以直接理解为,基于特征图生成了W*H*K
个候选框。
稍后会一起看下如何生成候选框。 - 然后,利用特征图上的每个像素的
256
个特征,对该像素产生到原图上的候选框进行分类和回归。 - 我们通过前面学的
FCN
知道全连接层就相当于是1x1
的卷积操作。
所以这里就直接用1x1
的卷积层来直接对该像素产生的候选框进行分类,由于是提取候选框,所以该分类仅分两类:
目标和背景,每个候选框有两个得分,故而得到的分类结果就是一个W*H*2K
的分类得分图。 - 同样,边框回归也利用
1x1
的卷积层代替全连接层,对映射到原图上的候选框进行回归,每个回归结果由向量[x,y,w,h]
组成,所以得到的回归图的尺寸为W*H*4K
.
对于上面第二步说的特征图上的每个像素都产生K
个anchor boxes
,如下图:
假如K=9
的话,特征图上的一个像素产生的K
个anchor boxes
对应到原图上就是上图的9
个候选框。分三组比例尺寸(1:1,1:2,2:1)
,三组size
(128,256,512
),共9
个候选框,这样总共产生W*H*K
个候选框。
对RPN
网络的大致流程理解了,那么具体该怎么训练网络呢?
RPN网络训练
我们以具体尺寸为例,来看下这个网络该怎么训练,假如我们最后一层卷积层提取到的特征图尺寸为40*60*256
,如下图:
- 最后一个卷积层输出的特征图再进行一次
3*3
的卷积操作得到新的特征图; - 新特征图的平面上共有
40x60=2400
个点,每个点都可以对应到原始图片上得到9
个anchor
,所以移动可以得到40x60x9
大约20000
个候选区域。 - 计算所有候选区域是否为目标的得分。
- 把所有超出图片的候选区域都限制在图片区域内,给置信度得分排序,选出得分最大的前
12000
个候选区域。 - 在选出的候选区域里面,候选区域之间往往会有大量的重叠,这里基于上一步的得分,采取非极大值抑制(
NMS
)。NMS
之后再选出score
得分最大的前2000
个,接着对这2000
个候选区域进行标定,比如候选与某个标定区域的IoU
大于0.7
的记为正样本,如果与任意一个标定框的IoU
都小于0.3
,那么该候选区域记为负样本,其余的不作为样本训练。 - 在训练
RPN
层分类回归任务时,随机抽取256
个区域来训练,正负样本比例为1:1
,如果正样本数量小于128
,则用负样本填充。 - 在训练整个
Faster RCNN
的分类回归任务的时候,随机抽取64
个与真实类别标注框IoU
大于等于0.5
的区域作为前景,256-64
个IoU
大于0.1
且小于0.5
的区域作为背景来训练具体类别。
到这里,我们基本上介绍完了Faster RCNN
的框架以及RPN
网络的流程。但是明白了原理不代表知道具体怎么训练,下期我们深入一步,去学下这个网络的损失函数该怎么构建。