美文网首页
『Faster R-CNN: Towards Real-Time

『Faster R-CNN: Towards Real-Time

作者: ktulu7 | 来源:发表于2019-03-07 23:48 被阅读0次

    一 为什么读这篇

    大名鼎鼎的Faster R-CNN,二阶段法的代表,属于目标检测领域的必读之作。

    二 截止阅读时这篇论文的引用次数

    2019.2.9 6349次。在细分领域里能有这么多,可见影响之广泛。

    三 相关背景介绍

    15年6月首次挂在arXiv上,就比Fast RCNN晚一个多月,比YOLO v1早几天,比ResNet早半年。中了15年的NIPS。作者还是MSRA时那几个,一作任少卿当时还是MSRA的实习生,现在在Momenta,二作何恺明不用多说了,三作Ross Girshick(rbg)是R-CNN和Fast R-CNN的一作,YOLO v1的三作,四作孙剑也不用多说。拿了2015年的ImageNet和COCO的冠军。

    四 关键词

    Faster R-CNN

    RPN

    anchor

    五 论文的主要贡献

    1 比Fast R-CNN更快

    2 提出RPN,统一了候选区域生成和最终的检测为一体

    六 详细解读

    0 摘要

    虽然SPPnet和Fast R-CNN减少了检测网络的运行时间,不过候选区域的计算依旧是瓶颈。本文提出RPN(Region Proposal Network)网络,与检测网络共享整幅图像的卷积特征,从而实现几乎无成本的候选区域计算。RPN是全卷积网络,可以同时预测每个位置上的目标框和目标分数。RPN生成高质量的候选区域,用于Fast R-CNN的检测。通过共享卷积特征将RPN和Fast R-CNN合并为一个网络,这些卷积特征相当于通过"attention"机制,RPN部分告诉网络应该朝哪里看。用VGG16,能到5FPS,(测试时)每张图仅用300个候选区域就达到了VOC2007,2012和COCO的SOTA。

    1 介绍

    Selective Search是过去最流行的方法之一,它是基于低阶特征贪心地合并超像素,每张图在CPU上要运行2秒。EdgeBoxes提供了候选质量和速度的最佳权衡,每张图要0.2秒。而本文提出的RPN每张图10毫秒。

    本文观察到像Fast R-CNN这样基于区域的检测器使用的卷积特征图也可以用来生成候选区域。在这些卷积特征之上,通过增加一些卷积层来构建RPN,这些层可以在常规网格的每个位置处同时回归候选框和目标分数。因此RPN是一种全卷积网络(Fully Convolutional Network FCN),可以针对生成候选区域的任务进行端到端的训练。

    RPN旨在有效地预测具有各种尺度和纵横比的候选区域。相比之前方法,如图1a的图像金字塔,图1b的滤波器金字塔,本文引入一种全新的"anchor",作为多种尺度和纵横比的参考(图1c)。这种机制避免了大量的具有多个尺度或纵横比的图像(滤波器)。该模型在使用单尺度图像进行训练和测试时表现都很好,因此有利于提速。

    faster_rcnn-fig1.png

    2 相关工作

    候选目标

    广泛使用的候选目标方法包括基于组超像素(如Selective Search,CPMC,MCG)和基于滑动窗口的方法(如EdgeBoxes)。候选目标方法作为与检测器独立的外部模块提供(如Selective Search,R-CNN,Fast R-CNN)

    用于目标检测的深度网络

    OverFeat方法训练全连接层来预测框坐标,而这个任务是假设只有单个对象的定位,后面的全连接层转为卷积层用于检测多个类相关的目标。MultiBox方法并没有共享候选和检测网络之间的特征。

    共享卷积计算受到了越来越多的关注。

    3 Faster R-CNN

    Faster R-CNN主要由两个模块组成,第一个是产生候选区域的全卷积网络,第二个是使用候选区域的Fast R-CNN。用流行词"attention"来说就是RPN模块告诉Fast R-CNN模块应该看哪里。

    faster_rcnn-fig2.png

    3.1 Region Proposal Network

    RPN用任意大小的图像作为输入,输出是一组矩形候选目标,每一个矩形都有是否为目标的分数。

    为了生成候选区域,在最后一个共享卷积层输出的特征图上滑动一个小网络。该小网络将特征图的n × n空间窗口作为输入。每个滑动窗口映射为低维特征(ZF 256-d,VGG 512-d,后面跟着ReLU),之后将该特征输入两个并行的全连接层,一个为box回归层(reg),一个为box分类层(cls)。本文设置n=3。这个mini网络在一个位置上的示例如图3左所示。注意该mini网络以滑动窗口方式运行,因此所有空间位置共享全连接层。该架构很自然地用n x n卷积层实现,后面跟着两个并行的1 x 1卷积层(分别用于reg和cls)

    faster_rcnn-fig3.png
    3.1.1 Anchors

    在每个滑动窗口位置,同时预测多个候选区域,其中每个位置最大可能侯选数定义为k。因此回归层有4k个输出,用于编码k个box的坐标,分类层有2k个得分,用于估计每个候选是否为目标的概率(本文为了简化实现用了2分类的softmax层,其实也可以用逻辑回归生成k个得分作为预测)k个候选相对于k个参考框(本文称为anchors)参数化。anchor位于滑动窗口的中心,并且与尺度和纵横比相关联。默认在每个滑动位置设置3个尺度和3个纵横比,生成k=9个anchors。对于大小为W x H的卷积特征图,总共有W x H x k个anchors(2400多个)。

    平移不变的Anchors

    本文方法的一个重要属性就是平移不变性,anchors和计算相对于anchors的候选都有这个特点。如果平移一幅图像上的一个目标,候选也应当平移,在每个位置上预测候选的函数也应一样。这种平移不变性是由FCN的特点保证的。平移不变性也减小了模型的大小,当k=9个anchors时,有(4+2) x 9维的卷积输出层。

    作为回归参考的多尺度Anchors

    见图1。本文方法仅仅依赖单尺度图像和特征图,单独大小的滤波器(特征图上的滑动窗口)。正是由于这种基于anchors的多尺度设计,本文方法能简单的在单尺度图像上计算卷积特征。多尺度anchors的设计是共享特征的关键组件,而无需额外的成本去解决尺度问题。

    faster_rcnn-table8.png
    3.1.2 Loss Function

    为了训练RPNs,给每个anchor赋予一个二元标签(是否为目标)。当符合以下条件之一时,赋为正标签:

    a. 与真实box有最高IoU的anchor

    b. anchor与任意真实box的IoU>0.7

    注意一个真实box可以给多个anchors赋予正标签。如果anchor和所有真实box的IoU都小于0.3则赋为负标签。如果Anchor即非正也非负则对训练目标没有贡献。基于这些定义,一幅图像的损失函数定义如下:
    L \left( \left\{ p _ { i } \right\} , \left\{ t _ { i } \right\} \right) = \frac { 1 } { N _ { c l s } } \sum _ { i } L _ { c l s } \left( p _ { i } , p _ { i } ^ { * } \right) + \lambda \frac { 1 } { N _ { r e g } } \sum _ { i } p _ { i } ^ { * } L _ { r e g } \left( t _ { i } , t _ { i } ^ { * } \right)
    式中,i为mini-batch中一个anchor的索引,p _ { i }为anchor i是目标的预测概率。如果anchor是正的,真实标签p _ { i } ^ { * }为1,anchor是负的,则为0。t _ { i }是预测的边界框的4个参数化坐标的向量表示,t _ { i } ^ { * }是与正anchor关联的真实box。分类损失L _ { c l s }是两个类的对数损失(是否为目标)。对于回归损失,用L _ { r e g } \left( t _ { i } , t _ { i } ^ { * } \right) = R \left( t _ { i } - t _ { i } ^ { * } \right),其中R是Fast R-CNN定义的健壮损失函数(平滑L1)。p _ { i } ^ { * } L _ { r e g }意味着仅当用于正anchor时回归损失是激活的N _ { c l s } = 256(和mini-batch size一样),N _ { r e g } \sim 2,400(anchor位置的数量),设置\lambda = 10,以使分类和回归的权重大致相等。另外发现上式的规范化并不是必需的,也许可以简化掉。。

    faster_rcnn-table9.png

    对于边界框回归,采用R-CNN中的4个坐标的参数化:
    t _ { \mathrm { x } } = \left( x - x _ { \mathrm { a } } \right) / w _ { \mathrm { a } } , \quad t _ { \mathrm { y } } = \left( y - y _ { \mathrm { a } } \right) / h _ { \mathrm { a } }

    t _ { \mathrm { w } } = \log \left( w / w _ { \mathrm { a } } \right) , \quad t _ { \mathrm { h } } = \log \left( h / h _ { \mathrm { a } } \right)

    t _ { \mathrm { x } } ^ { * } = \left( x ^ { * } - x _ { \mathrm { a } } \right) / w _ { \mathrm { a } } , \quad t _ { \mathrm { y } } ^ { * } = \left( y ^ { * } - y _ { \mathrm { a } } \right) / h _ { \mathrm { a } }

    t _ { \mathrm { w } } ^ { * } = \log \left( w ^ { * } / w _ { \mathrm { a } } \right) , \quad t _ { \mathrm { h } } ^ { * } = \log \left( h ^ { * } / h _ { \mathrm { a } } \right)

    其中x , y , w , h是box中间的坐标及其宽高。变量x , x _ { \mathrm { a } } , x ^ { * }分别为预测box,anchor box,真实box。上面的式子可以理解为从anchor box到附近真实box的边界框回归。

    然而,本文的边界框回归方法与之前的SPPnet,Fast R-CNN又有所不同。之前方法的边界框回归是对任意大小的RoIs执行特征池化,并且回归权重由所有区域大小共享。本文定义中,用于回归的特征在特征图上有同样的空间大小(3 x 3)。为了考虑不同的大小,学习了一组k个边界框回归。每个回归负责一种尺度和一种纵横比,k个回归不共享权重。

    多亏了anchors的设计,即使特征具有固定的尺寸/比例,仍然可以预测各种尺寸的boxes。

    3.1.3 训练RPNs

    每个mini-batch从一幅图像上生成许多正负anchor样本。对所有的anchor进行优化也是可以的,不过这样会朝着负样本偏移,因为它们占主导地位。取而代之,本文从一张图像上随机采样256个anchors,来计算一个mini-batch的损失函数,其中正负anchors的比例为1:1。当一幅图像上的正样本少于128个时,才用负样本补齐。

    对所有新加的层用高斯分布做初始化,其余层用ImageNet预训练权重。基于Caffe实现。

    3.2 用于RPN和Fast R-CNN的共享特征

    有3种方式来训练共享特征的网络

    a. 交替训练

    先训练RPN,然后用候选训练Fast R-CNN。通过Fast R-CNN调优的网络再初始化RPN,然后迭代这个过程。

    b. 近似的联合训练

    如图2所示,在训练期间RPN和Fast R-CNN合并为一个网络。在每个迭代中,前向传播生成的候选区域被视为就好像固定的,预先计算好的候选,用于训练后面的Fast R-CNN。

    c. 非近似的联合训练

    RoI pooling

    4步交替训练

    本文采用4步训练算法来学习共享特征

    1 如3.1.3节描述,训练RPN。用ImageNet预训练权重,并做基于候选区域任务的微调。

    2 使用第一步RPN生成的候选训练Fast R-CNN。检测网络也用ImageNet预训练权重,此时两个网络还没共享卷积层

    3 用检测网络来初始化RPN训练,但是固定共享卷积层,仅微调RPN特有的层。此时两个网络共享卷积层

    4 保持共享卷积层固定,微调Fast R-CNN特有的层

    3.3 实现细节

    对于anchors,使用3种尺度,3种纵横比。

    faster_rcnn-table1.png

    与图像边界交叉的anchors需要仔细处理。在训练时,忽略了所有边界交叉的anchors。测试时对边界交叉anchor做图像边缘的裁剪就行了。

    用IoU阈值为0.7的NMS,这样每幅图大约还剩2000个候选区域。再用这2000个候选区域训练Fast R-CNN。

    4 实验

    4.1 PASCAL VOC

    VOC2007包含5千张训练集,5千张测试集,20类。

    faster_rcnn-table2.png faster_rcnn-table5.png
    RPN的剥除实验

    见表2下半部分。

    尽管anchor有多种尺度和纵横比,对于精确的检测也是不够的。

    VGG-16的性能
    faster_rcnn-table3.png faster_rcnn-table4.png
    对超参数的敏感性

    见表8,表9。

    Recall-to-IoU分析
    faster_rcnn-fig4.png

    如图所示,当候选数量从2000降到300时,RPN方法表现得很好。这也解释了为什么在使用少至300个候选时RPN仍然有很好的mAP。正如前面分析的,这要归功于RPN的cls。

    一阶段检测 vs. 二阶段候选 + 检测

    OverFeat是一阶段,类相关的方法。

    faster_rcnn-table10.png

    4.2 MS COCO

    VOC2007包含8万张训练集,4万张验证集,2万张测试集,80类。针对这个数据集也做了几点轻微的修改。用8卡GPU实现,RPN的batch size为8(每卡1个),Fast R-CNN的batch size为16(每卡2个)。因为batch size改大了,学习率也跟着调大。对于anchors,用3个纵横比4个尺度(加了64 x 64),主要目的是处理数据集中的小目标。

    faster_rcnn-table11.png

    将VGG-16用ResNet-101替换后,mAP从41.5%/21.2%提升到48.4%/27.2%(basenet的影响还是很明显的

    4.3 从MS COCO到PASCAL VOC

    COCO的类别是VOC的超集,所以预测VOC的训练数据可以加上COCO。从表12可以看出,数据集的影响还是很大的。

    faster_rcnn-table12.png

    5 总结

    提出RPN用于生成候选区域。通过与下游的检测网络共享卷积特征,生成候选区域这步几乎没有额外的代价。本文方法提供一个统一的,基于深度学习的目标检测系统,可以近实时的运行。因为学习到的RPN提升了候选区域的质量,因此也改进了整个目标检测的准确率。

    七 读后感

    这个论文是系列的,还是得看Fast R-CNN和R-CNN,它们分别递进的解决不同的问题。

    素质四连

    要解决什么问题

    生成候选区域和之后的检测网络是割裂的

    用了什么方法解决

    提出RPN,用一个网络统一生成候选区域和Fast R-CNN

    效果如何

    共享卷积特征,在提速的同时检测效果也有稍许提升

    还存在什么问题

    虽然已经是Faster了,相比一阶段还是不够快。

    八 补充

    基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN

    从编程实现角度学习Faster R-CNN(附极简实现)

    一文读懂Faster RCNN

    RoI pooling/Spp和max pooling很像,除了在重叠区域的pooling。(rbg在ICCV15的slides第16页)

    因为原始图像上物体大小不一样,所以需要将这些抠出来的Region想办法resize到相同的尺寸,这一步方法很多(pooling或插值都可以,一般采用pooling,因为反向传播时求导方便)

    Regoin Proposal的作用:

    如果没有,会产生过多的不包含任何有用的类别的region,因为这些region数量庞大,不能为softmax带来有用的性能提升(因为无论怎么预测,其类别都是背景,对于该识别的类别没有贡献)。这些无用的Region都要单独进入分类网络,十分耗费计算时间。

    整张图像上,所有的框,一开始就由anchor和网络结构确定了。所有后续的工作,RPN提取前景和背景,其实就是保留包含前景的框,丢掉包含背景的,包括后续的NMS,也是丢掉多余的,并非重新新建一个框。网络输出的两个bbox回归,都是输出坐标偏移量,也就是在初始锚点的基础上做的偏移修正和缩放并非输出一个原图上的绝对坐标

    每个特征图上的点都有9个anchor,对于下采样16倍,生成(H/16) x (W/16) x 9个anchor,对于一个512x62x37的feature map,大约有2w个anchor,这种做法很像暴力穷举,2w多个哪怕是蒙也能把ground truth蒙中

    SPP的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。在卷积层和全连接层之间加入了SPP层,此时网络的输入可以是任意尺度的,在SPP层中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。

    ROI pooling其实就是一个单层SPPNet

    rbg自己在slide里说了,当时用4步交替训练法并没有任何基础原则,只是仅仅为了在NIPS deadline前交稿。。。

    R-CNN的3个问题:

    1 测试时很慢:需要在每一个候选区域运行完整的CNN

    2 SVM和回归是后处理:在响应SVM和回归时CNN特征没有更新

    3 复杂的多阶段训练流程

    Fast R-CNN如何解决的:

    1 共享候选区域的卷积计算

    2 3 端到端的训练整个系统(multi-task loss)

    Fast R-CNN的问题:

    测试时速度并不包括候选区域提取

    Faster R-CNN如何解决的:

    让CNN也来做候选区域提取!

    相关文章

      网友评论

          本文标题:『Faster R-CNN: Towards Real-Time

          本文链接:https://www.haomeiwen.com/subject/tjnkpqtx.html