前几期我们一起学习了,
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的整体框架。
我们先看看Faster RCNN的大致流程,主要流程跟前面的Fast RCNN都差不多,唯一不一样的就是候选框的选取,在Fast RCNN的时候是用SS算法进行选取,而在Faster RCNN这里用了RPN网络,如下图:

步骤如下:
RPN网络进行提取候选框。ROI Pooling层来固定特征数量。ROI Pooling的的特征输入到共享全连接层。softmax进行分类以及进行边框回 归。核心改进在于利用的RPN网络代替SS算法提取了候选框。其他地方跟之前的Fast RCNN大致相同。接下来,我们一起重点看一下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网络的大致流程理解了,那么具体该怎么训练网络呢?
我们以具体尺寸为例,来看下这个网络该怎么训练,假如我们最后一层卷积层提取到的特征图尺寸为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网络的流程。但是明白了原理不代表知道具体怎么训练,下期我们深入一步,去学下这个网络的损失函数该怎么构建。