论文链接:https://arxiv.org/abs/1506.01497
代码链接:https://github.com/rbgirshick/py-faster-rcnn
因为R-CNN到Fast R-CNN再到Faster R-CNN是一个递进的改进过程,所以对前两个不清楚的还是要先去读一读这两篇文章,我在下面提出自己的读书笔记(私以为还是写的很全面的,对很多其他博客里面没有提到的坑都有涉及)。
一文详解R-CNN:https://blog.youkuaiyun.com/h__ang/article/details/89071664
一文详解Fast R-CNN:https://blog.youkuaiyun.com/h__ang/article/details/89092367
有一篇Faster R-CNN的文章写的着实不错,重点推荐:https://zhuanlan.zhihu.com/p/31426458
对于看完还想看看论文中细节的同学,可以继续阅读本篇博客
1. Abstract
目前的高性能的检测网络都依赖region proposal算法来假设目标位置,像SSPnet和Fast R-CNN取得的进展已经减少了检测网络的运行时间,但同时也暴露出来了一个问题——在提出候选框的这一部分存在计算瓶颈。在本篇论文中,我们介绍了一个RPN网络,它可以和检测网络一起共享整张图片的特征,因此可以几乎零成本的提取候选框。RPN网络是一个可以在每个位置同时预测目标边界和目标分数的全卷积网络,与Fast R-CNN结合起来做检测,我们更进一步的通过共享它们的卷积特征而将它们合并成一个单个网络——使用了最近比较流行的具有“注意力”机制的神经网络术语,RPN组件告诉统一的网络在哪里寻找。对于非常深的VGG-16模型,我们的检测系统在GPU上的帧率为5fps(5帧每秒,包含所有步骤),并且仅在每张图片上只提取了300个候选框的情况下,在PASCAL VOC 2007,2012,和MS COCO数据集上都取得了最先经的目标检测精度,在ILSVRC和COCO 2015竞赛中,Faster R-CNN和RPN是多个比赛中获得第一名的基础。
2. Introduction
候选框的提取通常依赖于廉价的特征和经济的推断方案。作为最受欢迎的算法之一,SS(Selective Search)算法运行传统分割算法提取很多初始候选框,贪心的按照规则合并候选框,最终留下固定数量的候选框,一般这个具体的数量选择2000个。与高效的检测网络相比,SS算法慢了一个数量级,在CPU上处理实现需要2s。EdgeBoxes在提取候选框的质量和速度之间做了一个最好的权衡,每张图片需要0.2s。尽管如此,提取候选框花费的时间仍然和检测网络的运行时间差不多。
有人可能会注意到基于区域的CNNs是利用了GPUs,直接与在CPU上实现的提取候选框的算法相比是不合理的,因此一个显而易见的方法就是通过GPU重新实现来加速候选框的提取。这可能是一个高效的解决方案,但是重新实现忽略了下游的检测网络,失去了共享计算的重要机会。
在本篇论文中,我们展示了一种算法上的改变——使用深度卷积网络来计算候选框的位置,这是一个高效且优雅的解决方法,使得在给定的检测网络的计算下提取候选框几乎零成本。为此,我们提出了新的区域提议网络(RPNs),它可以同最先进的检测网络共享卷积层,通过在测试阶段的计算共享,提取候选框的边际成本会很小(每张图片10ms)。
我们观察到被基于区域的检测器(如Fast R-CNN)使用的卷积特征图也可以被用来产生区域提议。在这些卷积特征之上,我们通过添加一些额外的卷积层在一个规则的网格上的每个位置同时回归区域边界和目标分数。因此RPN是一种全卷积网络,可以被端到端的训练来做产生候选框的任务。
RPNs被设计用来高效地预测具有很宽尺度和长宽比的候选框。与原来的方法(如Figure 1中a所示的图像金字塔,b中所示的卷积核金字塔)不同,我们介绍了一种新颖的“anchor” 框用来作为多种尺度和长宽比的参考,我们的方案可以看作回归参考的金字塔(Figure 1中c所示),避免了枚举多种尺度和长宽比的图像和卷积核,这个模型在使用单尺度图像做输入时训练和测试的表现都很好,并且速度很快。
为了将RPNs和Fast R-CNN目标检测网络结合,我们提出了一种训练方案,它在微调区域回归任务和微调目标检测之间做交替,同时又固定了候选框。这个方案可以快速收敛,并且产生了两个任务之间共享卷积特征的统一网络。
3. Faster R-CNN
Faster R-CNN由两个模块组成,第一个模块是一个用来产生候选框的深度全卷积网络,第二个模块是使用之前提出的候选框做检测的Fast R-CNN检测器。整个系统是一个单独的、统一的目标检测网络(Figure 2)。使用最近比较流行的神经网络术语——“注意力“机制,RPN模块可以告诉Fast R-CNN模块在哪里寻找。在3.1节我们会介绍提出候选框的网络设计和属性;在3.2节我们开发了用于训练的特征共享的算法。
3.1 Region Proposal Networks
RPN网络的输入为任意大小的图片,输出为一组矩形的候选框,每个框都有类别得分(属于背景类还是目标类)。我们用一个全卷积网络对这个过程建模,由于我们的目标是和Fast R-CNN目标检测网络共享计算,所以两个网络共享了一组卷积层。在我们的实验中,我们调查了具有5个共享卷积层的ZF模型和13个共享卷积层的VGG-16。
为了产生候选框,我们使用一个小网络在最后一个共享卷积层输出的特征图上滑动,这里的小网络将输入卷积特征图的一个 n x n 的空间窗口作为输入,每一个滑动窗口都映射一个低维度特征(ZF—256-d, VGG—512-d,后面紧跟ReLU)。这个特征被喂入两个子全连接层——一个边框回归层,另一个边框分类层。在这篇论文中n=3,要注意的是输入图片的有效感受野已经很大了(ZF和VGG分别是171和228个像素点)。在Figure 3左图中显示了这个小网络的一个位置,请注意,因为小网络以滑动窗口方式运行,所有空间位置共享全连接层。这种架构通过一个n×n卷积层,后面跟两个子1×1卷积层(分别用于reg和cls)自然地实现。
3.1.1 Anchors
在每个滑动窗口位置,我们同时预测多个候选框,这里在每个位置候选框的最大数量用k表示。所以回归层有4k个输出编码k个候选框,分类层有2k个输出得分用来估计每个候选框是不是背景类的概率。k个候选框被参数化,我们将其称作anchors。一个anchor本质上是滑动窗口的中心,并和尺度与长宽比有关系(Figure 3,左图)。默认情况下我们使用3个尺度和3个长宽比,在每个位置产生9个anchors。对于一个尺寸为 W x H 的卷积特征图,总共有 WHk 个anchors 。
平移不变的anchors
我们的方法一个重要的属性就是平移不变性,不管是anchors还是和anchors有关的的计算候选框信息的函数。如果一张图片上的目标发生了平移,区域应该平移,这时候相同的函数在任意位置都可以预测候选框。这个平移不变的特性是由我们方法本身的特性保证的,作为对比,MultiBox方法使用k-means来产生800个anchors,它不具备平移不变性,所以当目标发生平移时MultiBox方法不能保证得到相同的候选框。
平移不变特性同时减少了模型的大小,MultiBox有一个(4 + 1) x 800维度的全连接输出层,而我们的方法在k=9 anchors时有一个(4 + 2) x 9维度的卷积输出层。因此,我们的输出层有2.8×1042.8 \times 10^{4}2.8×104(3x3x512x512 + 512x(18+36))个参数,比MultiBox的6.1 x 10**6 个参数少了两个数量级,这使得我们的方法在像 PASCAL VOC这样的小数据集上过拟合的风险更小。
多尺度的anchors作为回归参考
anchors的设计展现了一种新颖的方案来解决多尺度和长宽比的问题。正如在Figure 1中所示,目前对于多尺度预测有两种比较流行的方法,第一种方法就是建立在图像/特征金字塔(以DPM和基于CNN方法为例),图像在多个尺度上进行缩放,并且针对每个尺度(图1(a))计算特征映射(HOG或深卷积特征),这种方法通常是有用的,但是非常耗时。第二种方法是在特征映射上使用多尺度(和/或长宽比)的滑动窗口。例如,在DPM中,使用不同的卷积核大小(例如5×7和7×5)分别对不同长宽比的模型进行训练。如果用这种方法来解决多尺度问题,可以把它看作是一个“卷积核金字塔”(图1(b))。第二种方法通常与第一种方法联合采用。
作为对比,我们的基于anchors的方法是anchors金字塔,它在成本上更加高效,我们的方法参照多尺度和长宽比的anchor 框进行分类和回归。它只依赖单一尺度的图像和特征映射,并使用单一尺寸的滤波器(特征映射上的滑动窗口)。我们通过实验来展示这个方案解决多尺度和尺寸的效果,如table 8所示:
3.1.2 损失函数
为了训练RPNs,我们给每个anchor分配一个二值类标签(即是目标类还是背景类),我们分配正标签给两种anchor:
- 一种是和ground-truth有最高的IoU的边框;
- 另一种是和ground-truth的IoU超过0.7的边框;
应该注意的是,单个ground-truth可能给多个anchors分配正标签,通常第二种情况对于采样正样本是足够的,但是我们仍然采用第一种情况,这是为了防止在极少数的情况下我们没有发现正样本。如果一个边框和ground-truth的IoU都小于0.3,那么我们就认为其是负样本;而IoU在0.3和0.7之间的anchors不参与RPN训练。
有了上面的定义,我们最小化多任务损失函数(形式和Fast R-CNN的类似),我们的损失函数被定义为:
上面的英文部分描述了(1)式中各个符号的含义,R是 smooth L1 损失函数,其定义为:
为了做边框回归,我们将坐标参数化:
其中x、y、w、h分别为边框的中心点的x坐标、y坐标、边框的宽和高;变量x、xa、x*分别为预测框、anchor框、ground-truth框的参数。因此这可以看作是从anchor box到近ground-truth box的回归。
然而,我们的方法以不同于之前基于RoI方法的方式实现bounding-box回归(即Fast R-CNN中的边框回归),在之前的回归中,做边框回归时的输入为RoI池化层之后的特征图,所有的RoIs回归权重共享。在我们的公式中,被用于回归的特征为特征图上 3x3 的空间区域,为说明不同的尺寸,学习了k个回归器,每个回归器都代表一种尺度和长宽比,而且这k个回归器之间不共享权重,因此,由于我们anchors的设计,即使特征是固定尺寸的(即只用了3x3一种大小的卷积核),任然可以预测不同尺寸的边框。
我总结一下上面的那段话,在Fast R-CNN中由于不同边框对应的特征向量不同,因此所有边框的权重共享也可以实现回归,但是在我们的方法中,细心的同学应该发现,同一个点对应的k个anchors的特征向量其实是相同的,这就意味着在做回归时我们要想将它们区分开,k个anchors之间就不可以共享权重,所以回归部分用了 36个 1x1x通道数的卷积核,同时对于不同点对应的同一尺度同一长宽比的anchors却是权重共享的。
3.1.3 Training RPNs
具体细节:
- 采用反向传播和SGD进行端到端的训练;
- 每个minibatch都包含从单张图片得到的许多正样本和负样本,为了使得正负样本均衡,我们一般随机采样256个anchors来计算一个minibatch的损失函数,正负样本的比例达到1:1,如果一张图片中的正样本数少于128,那就用负样本来填充;
- 初始化每层权重为均值0方差0.01的高斯分布,网络都是在Imagenet上预训练的基础上进行微调;
- 前60k个minibatch的学习率为0.01,后20k个minibatch的学习率为0.0001;
- 动量为0.9,权重衰减率为0.0005;
3.2 Sharing Features for RPN and Fast R-CNN
到目前为止,我们已经描述了如何训练生成区域提议的RPN网络,对于检测网络我们使用Fast R-CNN,接下来我们会描述学习由RPN和Fast R-CNN组成的一个具有共享卷积层的统一网络(如Figure 2所示)。
如果RPN和Fast R-CNN单独进行训练,它们将会以不同的方式修正卷积层。因此我们需要开发出一种共享卷积层的新技术,而不是学习两个单独的网络,我们讨论三种训练权重共享网络的方法:
- (i) 交替训练. 在这种解决方案中,我们首先训练RPN,然后使用RPN得到的候选框训练Fast R-CNN,被Fast R-CNN微调过后的网络接着用于初始化RPN,这个过程继续迭代。这个方法也是我们论文中所有实验所使用的方法;
- (ii) 近似的联合训练. 在这种方案中,RPN和Fast R-CNN网络如同Figure 2所示在训练期间合并成一个网络,在每个SGD迭代期间,前向传播产生区域候选框,这些候选框在训练Fast R-CNN期间被当作固定的、预计算的候选框。反向传播和往常相同,不过这个时候共享卷积层的反向传播信号来自RPN和Fast R-CNN损失的结合。这个方案很容易实现,但是这个方案忽视了对边界框坐标的梯度,而它也是作为网络的响应的,所以这个方案是近似的。在我们的实验中,我们发现用这个方案进行训练的结果接近(i),同时训练时间减少了25%-50%;
- (iii) 非近似的联合训练. 正如上面讨论的,在Fast R-CNN中的RoI层的输入包括卷积特征图和由RPN产生的区域候选框,所以理论上有效的反响传播器应该涉及到对边界框做坐标的梯度,在上述近似联合训练中,这些梯度被忽略。在一个非近似的联合训练解决方案中,我们需要一个关于边界框坐标可微分的RoI池化层。这是一个重要的问题,可以通过[15]中提出的“RoI扭曲”层给出解决方案,这超出了本文的范围。
4-step 交替训练
- 在已经预训练好的model上,训练RPN网络,收集proposals;
- 利用第一步收集到的proposals训练Fast R-CNN网络,这个检测网络也是在预训练的model上初始化的,要注意的是,第一步和第二步的网络并没有共享卷积层;
- 在第二步得到的检测网络初始化第二次RPN网络的训练,但是我们固定了共享卷积层,只对RPN独有的那些层微调,现在两个网络就有了共享卷积层;
- 保持共享卷积层不变,对Fast R-CNN独有的那些层进行微调,由此两个网络共享了卷积层组成了一个统一的网络;
可以多进行这样的1-4次迭代,但是我们发现没有很大的提升。
3.3 实现细节
在Proposal Layer forward按照以下顺序依次处理:
- 生成anchors,利用[dx(A),dy(A),dw(A),dh(A)]对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致);
- 按照输入的foreground softmax scores由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的foreground anchors;
- 限定超出图像边界的foreground anchors为图像边界(防止后续roi pooling时proposal超出图像边界);
- 剔除非常小(width<threshold or height<threshold)的foreground anchors;
- 进行nonmaximum suppression;
- 再次按照nms后的foreground softmax scores由大到小排序fg anchors,提取前post_nms_topN(e.g. 300)结果作为proposal输出;
实验结果
table 2展示了当使用不同的区域提议方法训练和测试Fast R-CNN的性能:
参考文章
https://zhuanlan.zhihu.com/p/31426458
https://blog.youkuaiyun.com/quincuntial/article/details/79132243