文章目录
- 原文地址
- 论文阅读方法
- 初识(Abstract & Introduction & Conclusion)
- 相识(Body)
- 2. Related Work
- 3. Region Proposal Networks
- Translation-Invariant Anchors
- Loss Function for Learning Region Proposals
- Optimization
- Sharing Convolutional Features for Region Proposal and Object Detection
- Experimentation Details
- 4. Experiments
- 回顾(Review)
- 参考
- 代码
原文地址
http://papers.nips.cc/paper/5638-faster-r-cnn-towards-real-time-object-detection-with-region-proposal-networks.pdf
论文阅读方法
初识(Abstract & Introduction & Conclusion)
在Faster R-CNN推出时,主流的目标检测网络几乎都是基于Region Proposal Method和Region-based CNN(eg. R-CNN, SPPNet, Fast R-CNN等),Region Proposal Method通常是基于inexpensive features和economical inference方案(eg. Selective Search,一张图像需要2s;EdgeBoxes,一张图像0.2s),对于目前的目标检测网络来说,proposal的生成已经成为了计算瓶颈。
一个原因是这些Region Proposal Methods只能使用CPU,而后续的检测CNN可以使用GPU,因此自然地想到可以在GPU上重新实现,这或许很有效(也过于工程化),但是这忽略了与下游检测网络共享计算的机会。
本文提出了一种算法上的改进:使用Deep Net来计算proposal——“Region Proposal Networks (RPNs)”,它能与后续的目标检测网络共享卷积层权重,因此它的计算成本非常小(每张图10ms)。RPN主要思想是在卷积层输出的特征顶部再额外增加两层:①将每个Conv map位置编码为一个short特征向量(eg. 256-d);②在每个Conv map位置上生成objectness分数(分类前背景)以及k个bounding-box(不同尺度以及长宽比,k通常为9)。
在将RPN与Fast R-CNN统一之后,能够简化整个训练流程:在保持proposals不变的同时,在fine-tuning region proposal与fine-tuning目标检测之间交替训练。这可以很快达到收敛,并且所有task都可以共享卷积特征。
最后得到的Faster RCNN能够达到5-17fps(包括了所有步骤,btw. Fast RCNN生成一张图的proposals就需要2s),并在多个数据集上达到SOTA。
相识(Body)
2. Related Work
作者主要提到了两个方面,首先提了一下最近使用Deep Net来构建proposal的方法(OverFeat和MultiBox),其次提到共享卷积计算已经引起越来越多的关注,因为它使得网络变得高效、快速、准确(eg. OverFeat、SPPNet以及Fast R-CNN)。
3. Region Proposal Networks
RPN以任意尺寸的图像为输入,输出一组矩形object proposals,每个proposals均带有objectness分数(判断前/背景)。
为了生成region proposals,在backbone最后一个卷积层(共享)输出的Conv Feature Map滑动"小型网络",如上图所示,在一个n x n的窗口内,使用全连接层(其实就为卷积操作,卷积核大小为nxn)编码一个低维向量(VGG:512-d,ZF:256-d),这个向量被送入两个全连接分支:①box-regression层(reg);②box-classification层(cls)。
本文中n=3,需要注意的是每个区域对应于输入图像中的有效感受野是非常大的(ZF为171,VGG228)。RPN为全卷积网络,结构的具体实现为:1个
nxn卷积 + ReLU + 2个1x1卷积(cls + reg)
Translation-Invariant Anchors
对于每个滑动窗口,我们同时预测k个region proposals,因此有4k个coordinates(reg层得到)和2k个score(cls层得到)。生成的k个proposals是相对于k参考框的参数化结果,叫做Anchors。
Anchor均位于其对应的滑动窗口中心,并与Scale和长宽比(Aspect ratio)相关,使用3种Scale和3种Aspect ratios,每个位置产生k=9个Anchors。
作者认为这种Anchor本身以及基于Anchor生成proposal的方法都具有translation invariant(平移不变性,即.Anchor的生成与位置无关)。
Loss Function for Learning Region Proposals
对于RPN的训练,首先为每个anchor确定2分类标签(是否为前景)。
确定为正类(前景)有两种情况:①与ground-truth box有最高IOU的Anchors;②与ground-truth box的IoU大于0.7的Anchors
确定为负类的:与ground-truth box的IOU小于0.3的Anchors
一个ground-truth可能导致了多个anchors为正类,其他剩下的anchors在整个训练过程中都不作考虑
根据上面的定义,Loss Function定义为如下形式,类似于Fast R-CNN:
其中,i是mini-batch内的anchor的索引,pi 为anchor i的为正类的概率,pi* 为对应的ground-truth(正类为1,负类为0);ti 为代表预测bounding-box的向量(包含4个参数化坐标), ti* 为对应的ground-truth box(只有正类有),整个式子通过Ncls 和Nreg 以及λ进行归一化。关于公式两个部分的解释,可以参照Fast R-CNN的相关章节:https://blog.csdn.net/qq_36560894/article/details/108090046
公开代码中,Ncls为mini-batch大小,为256;Nreg为anchor数量,大概2400左右,因此λ设置为10
为了彻底搞清楚bounding-box回归任务,先补充一下背景知识:
如上图所示,A为直接生成的Anchor,G为Ground-Truth,G’为经过修正后的prediction Bounding-box,我们期望A修正后产生Bounding-Box尽可能贴近于Ground-Truth。所以可以做一个线性回归预测(ground-truth与bounding-box位置比较接近时才为线性变换),得到变换数组[dx(A), dy(A), dw(A), dh(A)],进行以下变换:
① 平移:
② 缩放:
每个矩形框都可以通过一个向量来表示[x,y,w,h],分别代表左上角的坐标(x,y),以及宽w、高h
对应到本文中,[dx(A), dy(A), dw(A), dh(A)]就由t表示,其中ti 和ti* 如下所示:
x, xa, x*分别代表预测bounding-box,Anchor,ground-truth(y,w,h也类似)
Optimization
RPN的训练方式类似于Fast R-CNN,为"image-centric"采样策略,但一个mini-batch只包含单张图像的Anchors(正类及负类),由于负类样本远大于正类(很多anchor为背景类),因此在计算mini-batch的loss时,随机采样256个Anchor(正负比例1:1,如果正类的anchor不够,再由负类样本填充)
(0, 0.01)高斯分布初始化权重,使用Image-Net预训练模型,SGD(lr=0.001 + 0.0001, momentum=0.9, weight decay=0.0005)
Sharing Convolutional Features for Region Proposal and Object Detection
接下来需要将RPN融入到Fast R-CNN中,并使得它们能共享卷积计算:这也就意味着在训练时,我们不能独立地训练两个网络(因为它们分别以会不同的方式改变卷积层权重)。需要注意的是,不能简单地把两个网络融合起来,使用反向传播来训练参数,因为Fast R-CNN的训练基于fixed object proposals,不能同时训练Fast RCNN又同时改变proposal的生成机制。
Fast R-CNN训练时,输入为proposals,输出类别与bounding-box修正向量,如果在训练时改变proposal的生成机制(这也意味proposal的分布是不确定的),这可能会导致整个网络无法收敛。
这里,作者提出了一个四步训练法,使得RPN能与Fast R-CNN共享权重:
- 使用上节的方法先训练一个RPN;(未共享卷积)
- 将1中得到的RPN用来生成proposals,用于训练Fast R-CNN;(未共享卷积)
- 使用2中的网络(卷积层)初始化一个RPN(新的网络),固定共享卷积层,只对RPN的特定部分进行fine-tuning;(共享卷积)
- 使用3中得到RPN生成proposals,固定卷积层,只对Fast R-CNN的特定部分进行fine-tuning(共享卷积)
Experimentation Details
a) 关于Anchors,使用了3种不同的scale(1282, 2562, 5122)和aspect ratio(1:2, 2:1, 1:1),需要注意的是,RPN只使用了nxn窗口内的feature map用于生成Anchor,这也就意味着在生成一些比较大的proposal时,RPN的感受野只包含了物体的中心区域,并未完全囊括物体区域,不过实验证明,RPN能够具有这样的能力。
上图为一些预测结果,可以看到本文提出的方法能够产生各种各样的bounding-box。
上表为在ZF网络的实验中,每种anchor生成的平均proposal,可以看到,RPN具有很强的调节能力(产生不同的proposal)。
b) 关于如何处理那些越过图像边界的Anchor,在训练时会直接忽略,不考虑它们对于loss的贡献;在测试时,使用训练好的RPN生成proposal,如果它们产生了越过边界的Anchor,会进行修正,将其剪切到边界位置。
c) RPN生成的proposals有很多是相互重叠的,基于cls层生成的类别分数使用NMS(非极大抑制,阈值设为0.7),这样会剩下只有大概2k个proposal,在NMS后,选取top-N个proposal用于后续的检测任务(Fast R-CNN在训练时使用2k个proposals)。
4. Experiments
关于实验部分,不过多赘述,只简单介绍一下结果,有兴趣可以参见原文对应段落
首先进行实验证明RPN相比于传统的Region Proposal Methods的优势,接下来进行消融实验,分别证明共享卷积层的优势以及RPN各个组成部分的有效性,实验结果如上表所示。
上面两张表展示了Faster RCNN在PASCAL VOC07和12数据集上的结果以及与Fast的比较,可以看到无论是mAP还是速度都提升了不少。
上表为具体的速度分析,可以看到Faster R-CNN使用VGG作为Backbone为5fps,ZF能达到17fps。
上图为Recall-to-IOU指标图,用于衡量Region Proposal Method的好坏。
对比当时的one-stage检测方法(当时SSD、YOLO这些大杀器还没出世)
回顾(Review)
Faster RCNN作为RCNN系列的最终章,发表于NeurIPS2015。将Fast RCNN中用于生成Proposal的Selective Search算法替换为RPN,其与后面的检测网络共享卷积计算,这即提高了精度也提升了速度。
整个RCNN系列就此告一段落,每一年的RCNN(R-CNN、Fast R-CNN、Faster R-CNN)都在之前的工作上融入了新的思想,不断地改进,不断地提升性能。虽然two-stage检测网络的训练过程不是end-to-end,但是它们的训练策略也在变得越来越简便。最终,Faster RCNN中的所有模块全部为神经网络(CNN),这也能看出深度学习在计算机视觉领域越来越起到主导作用。
参考
[1] https://zhuanlan.zhihu.com/p/31426458 一文读懂Faster RCNN 作者:白裳
代码
先贴上一份GitHub代码,有空再复现一下。
以上为个人的浅见,水平有限,如有不对,望大佬们指点。
未经本人同意,请勿转载,谢谢。