物体检测模型-Faster RCNN原理

1,总览

Faster RCNN算法发表于NIPS 2015,该算法最大的创新点在于提出 了RPN(Region Proposal Network)网络,利用Anchor机制将区域生成 与卷积网络联系到一起,将检测速度一举提升到了17 FPS(Frames Per Second),并在VOC 2012测试集上实现了70.4%的检测结果。
算法的思路分两个阶段,第一个阶段生成很多确定的一系列框,这些框是不同大小比例的,在这里称Anchor,这些Anchor会通过已有 的label生成一些自己专属的label,主要两类label,一个是类别,分正样本(有物体),负样本(背景,没有物体);另一类是偏移,即离实际物体的框的偏移。这一阶段的主要任务就是预测这些Anchor的正负类别和与实际物体的偏移,做一个预检测分类,得到大概物体的位置,然后通过这些预测的偏移对Anchor进行修正,得到Proposal,也是一系列框,也可以说是一系列感兴趣的区域,里面都有物体,只是边框不太准,需要送入下一阶段进行细分类预测。第二个阶段是细分类,对上一阶段的每一个框进行预测类别和偏移,仅对框住的区域提取特征,进行预测,而不是整张图片。
算法的主要分四个部分,特征提取网络Backbone,RPN模块,RoI Pooling(Region of Interest)模块与RCNN模块。
1,特征提取网络Backbone:主要是提取图片中的特征,为后面的网络做预测。
2,RPN模块:主要是粗预测,生成一系列的RoI (Region of Interest),即一系列可能有物体的框
3,RoI Pooling模块:为上一阶段生成的框从特征图里提取相应部分的特征,并变换到统一的维度,因为后面的RCNN模块是全连接网络,需要固定的输入维度
4,RCNN模块为上一阶段送过来的框做细预测
下面对每一个模块分别进行介绍
物体检测模型-Faster RCNN原理

物体检测模型-Faster RCNN原理

2,原理介绍

2.1特征提取网络Backbone

特征提取网络一般由vgg16或者resnet101构成,这里其实算一个比较粗糙的点,只利用了单层特征,之后会讲一般优化思路,这里先说一下,这里以VGGNet为例,假设输入图像的维度为3×600×800,由于VGGNet 包含4个Pooling层(物体检测使用VGGNet时,通常不使用第5个Pooling 层),下采样率为16,因此输出的feature map的维度为512×37×50。对应着上图:
物体检测模型-Faster RCNN原理

2.2RPN模块

该模块一共分五个部分,Anchor生成、RPN卷积网络、计算RPN loss、生成Proposal、筛选Proposal得到RoI,下面分别介绍这几个部分是怎么工作的

2.2.1Anchor生成

Anchor介绍

首先介绍一下Anchor是什么,Anchor其实就是作者预先定义的一系列框,跟模型无关,只跟图片尺寸有关,尺寸大,相应的Anchor就多,反之。那怎么来的,以及有多少,位置在哪?下面来介绍,这种框的大小有三类,长宽比例有三类,一共则有九类框,如果feature map的维度为512×37×50,则一共有37×50×9=16650这么多框,即每个特征点对应九类框,这9种Anchors,具体Scale为{8,16,32},Ratio为{0.5,1,2},Ratio是指长宽比例,在特征图上,三类大小框的面积分别是8×8,16×16,32×32,然后针对长宽三种比例分别对8×8,16×16,32×32进行变形。具体实现代码在lib/model/rpn/generate_anchors.py。由于feature map是通过原图片经过16的下采样得到的,所以原图上的框的长宽都是特征图上的16倍,加入feature map上的坐标是(m,n),则原图上的坐标是(16m,16n),以该点为中心点,有九个框,面积分别是8×8×16×16、16×16×16×16、32×32×16×16。每个大小的框长宽比例有0.5、1、2。如下图
物体检测模型-Faster RCNN原理

Anchor的真值生成

由于RPN模块需要对Anchor做回归(偏移)和分类预测,则我们需要得到这些Anchor的实际类别(物体、背景)以及与实际物体的偏移量。

类别真值的生成

由于RPN网络只负责保证召回率,不需要具体类别,而没必要细分每一个区域属于哪一个类别,因此只需 要前景与背景两个类别,前景即有物体,背景则没有物体。
RPN通过计算Anchor与实际label之间的IoU来定义前景和背景,IoU的计算公式如下
物体检测模型-Faster RCNN原理

即Anchor A与label M的交集除以并集,这里的交并集都是面积,如下图
物体检测模型-Faster RCNN原理

当IoU大于一定值时,该Anchor的真值为前景,如上面Anchor A与Anchor C,低于一定值时,该 Anchor的真值为背景,如Anchor B。具体规则是
·对于任何一个Anchor,与所有标签的最大IoU小于0.3,则视为负样本。
·对于任何一个标签,与其有最大IoU的Anchor视为正样本。
·对于任何一个Anchor,与所有标签的最大IoU大于0.7,则视为正样本。

偏移真值的生成

以上图的Anchor A与标签M为例,假设 Anchor A的中心坐标为xa与ya,宽高分别为wa与ha,标签M的中心坐标 为x与y,宽高分别为w与h,则对应的偏移真值计算公式如下
物体检测模型-Faster RCNN原理

位置偏移tx与ty利用宽与高进行了归一 化,而宽高偏移tw与th进行了对数处理,这样的好处是进一步限制了偏移,便于预测。
有了上述的真值,为了求取损失,RPN通过卷积网络分别得到了类 别与偏移量的预测值。具体来讲,RPN需要预测每一个Anchor属于前景 与背景的概率,同时也需要预测真实物体相对于Anchor的偏移量,记为 tx、ty、tw和th。具体的网络下一节细讲。通过 tx、ty、tw和th即可推算出预测的x*、y*、w和h

如果没有Anchor,做物体检测需要直接预测每个框的坐标,由于框 的坐标变化幅度大,使网络很难收敛与准确预测,而Anchor相当于提供 了一个先验的阶梯,使得模型去预测Anchor的偏移量,即可更好地接近 真实物体。 实际上,Anchor是我们想要预测属性的先验参考值,并不局限于矩形框。如果需要,我们也可以增加其他类型的先验,如多边形框、角度和速度等。

2.2.2RPN卷积网络

该网络的任务就是预测每一个Anchor 的类别和偏移,类别分两个类别,所以输出的分类预测值是18×37×50,偏移预测的是 tx、ty、tw和th,所以输出的是36×37×50,网络的主要架构是
物体检测模型-Faster RCNN原理

在图二对应的是下图,feature map是上一层特征提取网络生成的,ROIPooling是下一层网络的
物体检测模型-Faster RCNN原理

具体实现见lib/model/rpn/rpn.py

2.2.3计算RPN loss

由于Anchor的总数量接近于2万,并且大部分Anchor的标签都是背景,如果都计算损失的话则正、负样本失去了均衡,不利于网络的收敛。在此,RPN默认选择256个Anchors进行损失的计算,其中最多不超 过128个的正样本。如果数量超过了限定值,则进行随机选取。当然, 这里的256与128都可以根据实际情况进行调整,而不是固定死的。
RPN的损失函 数包含分类与回归两部分,具体公式
物体检测模型-Faster RCNN原理

Lcls(Pi,Pi*)代表了256个筛选出的Anchors的分类损失,Pi为每一个 Anchor的类别真值,Pi为每一个Anchor的预测类别。由于RPN的作用是 选择出Proposal,并不要求细分出是哪一类前景,因此在这一阶段是二分类,使用的是交叉熵损失。
Lreg(ti,ti
)是回归损失,回归损失使用了smoothL1函数
物体检测模型-Faster RCNN原理

smoothL1函数结合了1阶与2阶损失函数, 原因在于,当预测偏移量与真值差距较大时,使用2阶函数时导数太大,模型容易发散而不容易收敛,因此在大于1时采用了导数较小的1阶 损失函数
损失函数的代码见ib/model/rpn/rpn.py。

2.2.4生成Proposal

完成了损失的计算,RPN的另一个功能就是区域生成,即生成较好 的Proposal,以供下一个阶段进行细分类与回归。Proposal也是一系列框,不过该框与Anchors不同的是,Proposal不是固定的,它由Anchors调整而来,Proposal的主要过程如下图
物体检测模型-Faster RCNN原理

首先生成大小固定的全部Anchors(在Anchors生成那部分介绍了),然后将RPN卷积网络中预测得到的回归偏移作用到Anchor上使Anchor更加贴近于真值,并修剪超出图像尺寸的Proposal,得到最初的建议区域。在这之后,按照分类网络输出的得分对Anchor排序,保留前12000 个得分高的Anchors。由于一个物体可能会有多个Anchors重叠对应,因 此再应用非极大值抑制(NMS)将重叠的框去掉,最后在剩余的 Proposal中再次根据RPN的预测得分选择前2000个,作为最终的 Proposal,输出到下一个阶段,筛选Proposal得到RoI。如果是测试代码,则用相同的方式筛选出300个直接送入RoI Pooling。
NMS与Proposal的筛选过程源代码文件见 lib/model/rpn/proposal_layer.py。

2.2.5筛选Proposal得到RoI

该部分仅在训练时有,在训练时,上一步生成的Proposal数量为2000个,其中仍然有很多 背景框,真正包含物体的仍占少数,因此完全可以针对Proposal进行再 一步筛选,过程与RPN中筛选Anchor的过程类似,利用标签与Proposal 构建IoU矩阵,通过与标签的重合程度选出256个正负样本。这一步有3 个作用:
1,筛选出了更贴近真实物体的RoI,使送入到后续网络的物体正、负 样本更均衡,避免了负样本过多,正样本过少的情况。
2,减少了送入后续全连接网络的数量,有效减少了计算量。
3,筛选Proposal得到RoI的过程中,由于使用了标签来筛选,因此也为每一个RoI赋予了类别的标签,同时可以在此求得RoI变换到对应标签的偏移量,这样就求得了RCNN部分的真值。
具体实现时,首先计算Proposal与所有的物体标签的IoU矩阵,然后 根据IoU矩阵的值来筛选出符合条件的正负样本。筛选标准如下:
1,对于任何一个Proposal,其与所有标签的最大IoU如果大于等于 0.5,则视为正样本。
2,对于任何一个Proposal,其与所有标签的最大IoU如果大于等于0且 小于0.5,则视为负样本。
经过上述标准的筛选,选出的正、负样本数量不一,在此设定正、 负样本的总数为256个,其中正样本的数量为p个。为了控制正、负样本 的比例基本满足1:3,在此正样本数量p不超过64,如果超过了64则从正 样本中随机选取64个。剩余的数量256-p为负样本的数量,如果超过了256-p则从负样本中随机选取256-p个。 经过上述操作后,选出了最终的256个RoI,并且每一个RoI都赋予 了正样本或者负样本的标签。在此也可以进一步求得每一个RoI的真值,即属于哪一个类别及对应真值物体的偏移量。
具体实现见代码lib/model/rpn/proposal_target_layer_cascade.py

2.3RoI Pooling(Region of Interest)模块

上一层生成的256个RoI之后,现在模型的主要任务就是对这256个RoI进行精细的预测,但这是下一层RCNN模块的任务,RCNN模块主要是由全连接网络构成,需要固定的输入特征维度,而这256个RoI都是大小比例不一的,以满足后续全连接网络的要求,于是RoI Pooling就产生了。
在此我们举一个例子来讲解这几种算法的思想,假设当前某个RoI大小 为332×332,使用VGGNet的全连接层,其所需的特征向量维度为 512×7×7,由于目前的特征图通道数为512,Pooling的过程就是如何获 得7×7大小区域的特征。主要过程如下
物体检测模型-Faster RCNN原理

1,首先需要将该区域映射到全图的特征图上,由于下采样率为16,因此该区域在特征 图上的坐标直接除以16并取整,而对应的大小为332/16=20.75。在此, RoI Pooling的做法是直接将浮点数量化为整数,取整为20×20,也就得 到了该RoI的特征,即上图中第3步的边框
2,下一步还要将该20×20区域处理为7×7的特征,然而20/7≈2.857,再 次出现浮点数,RoI Pooling的做法是再次量化取整,将2.857取整为2, 然后以2为步长从左上角开始选取出7×7的区域,这样每个小方格在特征 图上都对应2×2的大小,如上图中第4步所示
3,最后,取每个小方格内的最大特征值,作为这个小方格的输出,最 终实现了7×7的输出,也完成了池化的过程,如上图中第5步所示。
从实现过程中可以看到,RoI本来对应于20.75×20.75的特征图区 域,最后只取了14×14的区域,因此RoI Pooling算法虽然简单,但量化 取整带来的偏差势必会影响网络,尤其是回归物体位置的准确率。

2.4RCNN模块

该模块的主要网络构架如下,由于每一个RoI从特征图里面得到的维度都是512×7×7,而有256个RoI,所以输入RCNN的维度是256×512×7×7,而作者使用的是PASCAL VOC数据集,里面一个20个物体类别,加上背景就为21个,所以分类网络的输出是21×256,回归网络预测是是四个偏移量,所以输出为21×4×256=84×256.
物体检测模型-Faster RCNN原理

值得注意的是,虽然是256个RoI放到了一起计算,但相互之间是独立的,并没有使用到共享特征,因此造成了重复计算,这也是Faster RCNN的一个缺点。
RCNN全连接部分的代码见 lib/model/faster_rcnn/faster_rcnn.py。

3,Faster RCNN可以改进的地方

1,卷积提取网络:无论是VGGNet还是ResNet,其特征图仅仅是单层 的,分辨率通常也较小,这些都不利于小物体及多尺度的物体检测,因 此多层融合的特征图、增大特征图的分辨率等都是可以优化的方向
2,NMS:在RPN产生Proposal时为了避免重叠的框,使用了NMS,并 以分类得分为筛选标准。但NMS本身的过滤对于遮挡物体不是特别友 好,本身属于两个物体的Proposal有可能因为NMS而过滤为1个,造成漏检,因此改进优化NMS是可以带来检测性能提升的
3,RoI Pooling:Faster RCNN的原始RoI Pooling两次取整带来了精度 的损失,因此后续Mask RCNN针对此Pooling进行了改进,提升了定位 的精度。
4,RCNN模块的全连接:原始Faster RCNN最后使用全连接网络,这部分全连接网 络占据了网络的大部分参数,并且RoI Pooling后每一个RoI都要经过一 遍全连接网络,没有共享计算,而如今全卷积网络是一个发展趋势,如何取代这部分全连接网络,实现更轻量的网络是需要研究的方向。
5,正负样本:在RPN及RCNN部分,都是通过超参数来限制正、负样 本的数量,以保证正、负样本的均衡。而对于不同任务与数据,这种 正、负样本均衡方法是否都是最有效的,也是一个研究的方向。
6, 两阶网络:Faster RCNN的RPN与RCNN两个阶段分工明确,带来 了精度的提升,但速度相对较慢,实际实现上还没有达到实时。因此, 网络阶数也是一个值得探讨的问题,如单阶是否可以使网络的速度更 快,更多阶的网络是否可以进一步提升网络的精度等。