【目标检测(一)】RCNN详解——深度学习目标检测的开山之作
【目标检测(二)】SPP Net——让卷积计算共享
【目标检测(三)】Fast RCNN——让RCNN模型能端到端训练
【目标检测(四)】Faster RCNN——RPN网络替代selective search
【目标检测(五)】YOLOv1——开启one-stage目标检测的篇章
【目标检测(六)】YOLOv2——引入anchor, Better, Faster, Stronger
【目标检测(七)】YOLOv3——准确率的全面提升
【目标检测(八)】一文吃透目标检测回归框损失函数——IoU、GIoU、DIoU、CIoU原理及Python代码
【目标检测(九)】FPN详解——通过特征金字塔网络进行多尺度特征融合
【目标检测(十)】RetinaNet详解——Focal Loss将one-stage算法推向巅峰
【目标检测(十一)】CenterNet——Anchor Free, NMS Free
【目标检测(十二)】FCOS——用实例分割的思想做Anchor Free的目标检测
1. Motivation: 用RPN网络替代selective search
Ross Girshick大神团队在2015年同年又推出了Faster RCNN目标检测算法,是Fast RCNN算法后的又一力作。前面几篇文章分别介绍了RCNN、SPP Net和Fast RCNN,这个发展历程也是逐渐端到端化的过程:从RCNN的selective search + CNN网络 + SVM分类器 + Bounding Box回归器,到SPP Net使卷积计算只需要计算一次,再到后面的Fast RCNN的selective search + CNN网络(含全连接层预测分类和回归),训练时间和推理时间都大大缩短。整个端到端的发展过程可以用下图来表示:
上一篇介绍Fast RCNN的文章也提到,网络前向推理时间只需要0.32s,但是selective search就需要2s,当前性能瓶颈的主要矛盾在于selective search算法过于耗时。为了解决这个问题,Faster RCNN提出了RPN,Region Proposal Network(区域建议网络)来替代原来的selective search算法,其他部分与Fast RCNN相同,即Faster RCNN = RPN + Fast RCNN。理解Faster RCNN的关键就是理解RPN机制是如何运作的。
2. Fast RCNN原理
2.1 Pipeline
Faster RCNN = RPN + Fast RCNN,主要分为以下几个步骤:
- 将图像输入到CNN网络得到特征图。
- 使用RPN网络结构生成候选框,然后将这些RPN生成的候选框投影到第一步得到相应的特征矩阵。
- 将每个特征矩阵通过ROI Pooling层缩放到固定
7*7
固定大小的特征图,最后将特征图flatten后经过一系列全连接层得到分类和回归的结果。
2.2 RPN网络结构
2.2.1 RPN的输入输出
下图为RPN网络结构图,首先搞清楚RPN的输入和输出分别是什么。
- RPN网络的输入是backbone输出的特征矩阵,如果backbone是ZFNet或AlexNet,那么RPN前面共有5层,如果backbone是VGG16的话就是13层。如果使用的是AlexNet,那么RPN的输入就是
13*13*256
的feature map。 - RPN网络的输出是2k个score预测和4k个bbox的偏差值预测值(k为预测候选框的数量),每个候选框分别预测两个分数(区分是前景还是背景)和4个bbox的偏差值(偏差值定义与RCNN和Fast RCNN相同)。
2.2.2 RPN网络细节
RPN输入backbone提取到的特征图后(假设输入维度为13*13*256
),依次经过一个3*3
的卷积核(3*3*256
)和1*1
的卷积核(1*1*256
),即可得到下图中256-d的特征矩阵。然后会将特征矩阵并联输入到两个分支中,第一个分支cls layer用2k个1*1*256
个卷积核进行卷积,输出2k个数,表示某个区域有或没有物体的分数,第二个分支reg layer用4k个1*1*256
个卷积核进行卷积,最后输出4k个数,表示x, y, w, h的偏移量。
自然而然会想到两个问题:既然是偏移量,是相对谁的偏移量呢?这个k指的又是什么?2.2.3
章节将详细解释。
2.2.3 Anchor机制
上面的k指的是Anchor Box的数量,每个位置(每个滑动窗口)在原图上都对应着k=3*3=9
个anchors,分别包括了3个尺度和3个长宽比ratio的组合:
- scale: [128, 256, 512]
- ratio: 1:1, 1:2, 2:1 RPN网络在输入feature map之后进行
3*3
的卷积,特征图的位置和原图像像素之间是有对应关系的,这里anchor box参考框的中心就是卷积核的中心点,所以在conv5层上每卷积一次就会自动对应着9个anchor box,这样一来我们拟合的边界框偏移量其实就是相对anchor box的偏移量。
问题1:
产生的anchor太多,影响效率怎么办?对于一张1000*60*3
的图片,大约可以产生600*40*9
(20000+)个anchor,忽略跨越图像边界的anchor之后,大概还剩下6000个anchor。对于RPN生成的候选框之间存在着大量的重叠,基于候选框的cls得分使用NMS算法抑制, 这样每张图片只剩下2000个候选框,与selective search生成候选框的数量基本能保持一致。作者验证,这样缩减候选候选框的数量不会降低模型的准确率。总结一下这段话,作者通过以下四个方式对生成的anchor进行压缩:
- 过滤掉anchor对应原图区域超越图像边界的。
- 过滤掉与GT Box的IOU在[0.3, 0.7]的anchor。
- 经过分类器和回归器之后,对生成的Region Proposal进行NMS抑制。
- NMS之后,使用softmax分类的结果(score)选取Top-N的Region Proposal。
问题2:
对于ZFNet来说感受野是171,VGG16感受野是228,而anchor box的最大尺度能达到512,为什么感受野171的特征图电能对512大小的框进行学习和修正呢?作者认为虽然感受野比最大尺度的anchor box要小,可能只是物体的一部分信息,但是物体的部分信息已经足够目标检测网络进行学习了,就像人们只看到一个人的上半身而没有下半身,人们也会知道这是一个人。
2.2.4 RPN损失函数
这里RPN的损失函数与Fast RCNN是一样的,如下图所示:
pi表示第i个anchor预测为真实标签的概率,pi当为正样本时为1负样本时为0,ti表示预测第i个anchor的边界框的回归参数,ti表示第i个anchor的边界框对应GT Box的边界框回归参数,Ncls表示一个mini-batch中所有样本数量(256),Nreg表示anchor位置的个数(不是anchor的个数)约2400。这里λ是这两个Loss的平衡系数,原论文中取λ=10
。可以观察到Ncls为256,而λ*1/Ncls约为1/240,基本趋于相等,所以在torch的官方实现中直接将回归Loss的系数也设置为1/Ncls,与分类器保持一致。
这里Lcls是多分类cross entropy loss(softmax + negative log likelyhood),很多技术博客把这里说成是二分类交叉熵损失的计算,其实这是不正确的,因为如果是二分类交叉熵损失的计算,cls layer只能输出k个scores而不是2k个scores。Lreg只计算候选框确实为目标情况的loss,与Fast RCNN一模一样,依旧使用smooth L1 Loss。
这里对bbox的回归采用offset regression,作者拟合的是预测框与anchor的偏移量同真实框与anchor的偏移量,使二者尽可能相等(想让P=G
,等价于P-a=G-a
)。下图offset公式中中,x和y为预测框的坐标,w和h为预测框的宽和高,xa和ya表示anchor对应原图位置bbox的坐标,wa和ha表示anchor对应原图位置bbox的宽和高,x和y表示anchor对应真实GT Box的坐标,w和h表示anchor对应真实GT Box的宽和高。这里可能有一个疑问:为什么不直接对预测框和GT做回归呢?我们考虑这样两个情况,一个是300*300
大小的大目标,预测框和GT Box相差了30个pixel,另一个是只有15*15
大小的小目标,预测框和GT Box之间相差了2个pixel,如果直接对预测框和GT进行回归,则loss就会极度偏向于大目标,导致小目标几乎没有学习效果,最后造成小目标检测效果极差。这就是offset regression的动机。
2.2.5 正负样本划分
- 每张图片取256个anchor作为一个mini-batch,尽量做到正负样本比1:1,如果正样本少于128,不够的就用负样本来进行填充。
- 正样本判定条件,论文中给出两个条件,满足一个就认为是正样本。
- anchor对应位置和GT Box的IOU大于0.7.
- 和GT Box有最大IOU的那个anchor。
- 负样本判定条件:与任何GT Box的IOU都小于0.3。
2.2.6 RPN训练过程
现在我们都采用RPN Loss + Fast RCNN loss联合训练的方法来对整个网络做端到端训练了,当时2015年受限于各种原因(可能是网络还没有现在这么好训练,同年谷歌才提出了BN),论文中Faster RCNN是分段fine-tune的:
- 利用ImageNet预训练模型初始化backbone网络层参数。
- 固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet与训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数。
- 固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。
- 同样保持固定前置卷积网络层参数,去微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层参数,构成一个统一的网络。
3. Faster RCNN的效果和缺点
如下图所示,相比Fast RCNN,Faster RCNN也是涨点+提速。mAP@0.5准确率从39.3%提升到42.7%,同时原来Fast RCNN推理一张图片需要2.32s,而Faster RCNN只需要0.198s,速度上也带来了巨大提升。时至今日,Faster RCNN在工业界依然有非常广泛的应用,当前实践上两阶段目标检测依然比单阶段和anchor free的算法要准一些,但是Faster RCNN推理实时性比较差,一般都不到10fps,只能用于对检测速度要求不高的场景。
Reference:
今天的文章【目标检测(四)】Faster RCNN——RPN网络替代selective search分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20922.html