Fast RCNN论文学习
Fast RCNN建立在以前使用深度卷积网络有效分类目标proposals的工作的基础上。使用了几个创新点来改善训练和测试的速度,同时还能增加检测的精确度。Fast RCNN训练VGG16网络的速度是RCNN速度的9倍,测试时的速度是其的213倍。与SPPnet对比,Fast RCNN训练VGG16网络的速度是其速度的3倍,测试时的速度是其的10倍,而且还更加准确了。Fast RCNN使用Python和C++(使用caffe)实现的,并且能够再开源MIT License 中获得代码,网址为:https: //github.com/rbgirshick/fast-rcnn
1. Introduction
最近,深度卷积网络在图像分类和目标检测精确度上得到了显著的改进。对比与图像分类,目标检测是一个更具挑战性的任务,需要更复杂的方法去解决。由于其的复杂性,目前的方法在多阶段管道上训练模型,但是很慢,也很不优雅。
复杂性的增长是因为检测需要准确的目标位置,这就导致了面临着两个主要的挑战:
- 首先,多数的候选目标位置(在论文中称为“proposals”)必须被处理
- 其次,这些候选集只提供了粗糙的位置,需要被提取去获得精确的位置
这些问题的解决办法经常会牺牲速度、精确度和简单性
在这篇论文中,我们简化了最新的基于神经网络的目标检测器的训练过程,我们提出了一个单级的训练算法,共同学习去对目标proposal分类和提取它们的空间位置
这个解决方法可以去训练一个深度检测网络(VGG16),将比RCNN方法快9倍,比SPPnet方法快3倍。在运行时,检测网络在0.3秒中处理图像(包括目标位置proposal的时间),同时得到在PASCAL VOC 2012中最高的精确度,mAP为66%(RCNN的mAP为62%)
1.1. R-CNN and SPPnet
R-CNN(Region-based Convolutional Network)方法通过使用深度卷积网络去对目标位置proposals分类而获得了优秀的目标检测精确度,但是其也有着很明显的缺点:
- 训练是一个多阶段的管道。R-CNN一开始在目标proposals上使用对数损失函数去微调一个卷积网络。然后是SVM去适应卷积网络特征。这些SVMs将作为目标检测器,替代通过微调学习得到的softmax分类器。在第三个训练阶段,bounding-box回归器被学习,如下图所示:
- 训练在空间和时间上的花费昂贵。对于SVM和bounding-box回归器的训练,将从每张图片的每个目标proposal中抽取出来特征,并将其写入硬盘中。对于非常深的网络,如VGG16,对于VOC07训练验证数据集中5k大小的图像,这个过程每天将会占用2.5GPU。因此这些特征需要几百千兆字节的存储空间
- 目标检测很慢。在测试中,特征在每个测试图像中从其每个目标proposal中抽取出来。使用VGG16检测,每张图片将会花费47s(在一个GPU上)
R-CNN很慢时因为其为每个目标proposal实现了一个卷积网络的前向传播,没有共享计算过程(即每个目标proposal都要输入卷积网络训练一遍)。SPPnets(Spatial pyramid pooling networks)被提出去加速R-CNN,通过共享计算过程。即该SPPnet方法使用整个输入图像去计算一个卷积特征映射,然后使用一个从共享的特征映射中提取出来的特征向量去对每一个目标proposal分类。对于每个proposal,通过最大池化该proposal中特征映射部分成固定大小的输出(如6*6)去抽取特征。多种输出大小被池化得到,然后串联起来,如下图所示:
在测试中,SPPnet将R-CNN加速了100倍。因为更快的proposal特征抽取,训练时间减少了三倍
但是SPPnet也有着很明显的缺陷。像R-CNN,其训练也是一个多阶段的管道,包含了抽取特征、使用对数损失函数微调网络、训练SVMs以及最后适应bounding-box回归器。特征也会被写入硬盘。但是不像R-CNN的地方是,提出的微调算式不能更新在空间金字塔池化层之前的卷积层。因此,该限制(即卷积层是固定的)显示了该深度卷积网络的精确度
1.2. Contributions
我们提出了一个新的训练算法去解决R-CNN和SPPnet中的问题,同时提高它们的速度和精确度。我们将该方法称为Fast R-CNN,因为训练和测试相对较快。该Fast R-CNN有着下面的几个优点:
- 比R-CNN和SPPnet有着更高的检测质量(mAP)
- 在单阶段中训练,使用了多任务损失函数
- 训练可以更新网络的所有层
- 特征存储不需要硬盘存储空间
Fast R-CNN使用Python和C++(caffe)进行编写,开源代码可见https://github.com/rbgirshick/ fast-rcnn.
2. Fast R-CNN architecture and training
图1阐述了Fast R-CNN的结构:
该网络使用整个图片和一组目标proposals作为输入。该网络一开始使用几个卷积层和最大池化层去处理整个图片,然后生成一个卷积特征映射。然后对于每个目标proposal,一个region of interest(RoI)池化层将会从得到的特征映射中抽取固定长度的特征向量。每个特征向量(从每个目标proposal中得到的)被输入一个全连接层(fc)层序列,最后分支成两个同级输出层:
- 一个是对k个目标类加上一个背景类生成softmax概率估计(用于分类)
- 另一个是对于k个目标类的4个位置值输出(用于回归,得到目标位置)
2.1. The RoI pooling layer
RoI池化层使用最大池化去将任意有效的region of interest中的特征转换成一个有着一个有着固定空间范围H*W(如7*7)的特征映射,这里H和W都是层的超参数,独立于任何特定的RoI。在该论文中,任何RoI都是一个输入卷积特征映射的矩形窗口。每个RoI被元组定义(r,c,h,w),指定它左上角的点(r,c)以及其高和宽(h,w)
RoI池化层将RoI窗口分割成有着大小为h/H * w/W 的H*W个子窗口网格,然后最大池化每个子窗口中的值,然后得到相应的输出网格单元。池化被独立应用到每个特征映射通道中,就像是标准最大池化一样。RoI其实就是使用在SPPnet中的空间金字塔池化层的特殊例子,不同在于这里只有一个金字塔层(如7*7)。
2.2. Initializing from pre-trained networks
我们使用三个预训练ImageNet网络进行训练,每个网络在第五个到十三个卷基层中有着五个最大池化层(4.1会讲到网络的细节)。当使用一个一个预训练网络来初始化一个Fast R-CNN网络时,它将会经历三个转变:
- 首先,最后一个最大池化层将会被RoI池化层替换,配置使用H*W设置来兼容网络的第一个全连接层(如对于VGG16网络设置为7*7)
- 其次,网络的最后一个全连接层和softmax (为了ImageNet分类的1000个类训练的) 将被上面提到的两个同级层替换(即一个全连接层接着一个有着k+1个类别的softmax 和 一个全连接层接着一个指定类别的bounding-box回归器)
- 最后,网络被修改为有两个输入:一个是图像列表和一个这些图像对应的RoI列表
2.3. Fine-tuning for detection
使用后向传播训练所有的网络权重是Fast R-CNN的一个重要的能力。首先,它阐明(elucidate)了为什么SPPnet不能够更新空间金字塔池化层前的卷积层
主要原因是通过SPPnet的后向传播在训练来自不同图片的样本(如RoI)时是十分低效的,这就是R-CNN和SPPnet怎么被训练的。其低效源于(stem from)每一个RoI可能有着很大的接受域,经常跨越整个输入图像。因为前向传播必须处理整个接受域,这样将会导致训练输入很大(经常是整个图像)
我们提出了一个更加高效的训练方法,即在训练时利用特征共享。在Fast R-CNN训练中,随机梯度下降(SGD的mini-batches按层次被取样,首先通过取样N个图像,然后从每个图像中取样R/N 个RoIs。重要的是来自同一个图像的RoIs在前向和后向传播中共享计算和内存。设置N为一个比较小的值来减少mini-batches的计算。比如,使用N=2,R=128,该推荐训练方案将直接比从128个不同图片中各取样一个RoI的方法(即R-CNN和SPPnet中使用的方法)快64倍。这样都是得到了128个RoI。
该策略需要注意的一点是它可能会导致比较慢的训练收敛,因为来自相同图片的RoIs是相关的。但是该点并没有成为一个实际问题,在我们设置为N=2,R=128时,使用比R-CNN更少的SGD迭代得到了一个很好的结果
除了上面说的层次取样,Fast R-CNN还使用一个带有可以共同优化softmax分类器和bounding-box回归器的一个微调阶段的简化训练过程(即同时进行),而不是在三个分开的阶段训练一个softmax分类器、SVMs和回归器。该过程的内容(损失函数、mini-batch采样策略、通过RoI池化层的后向传播以及随机梯度下降超参数)都会在下面提到
首先是多任务损失函数(Multi-task loss)。Fast R-CNN有着两个同级的输出层。第一个输出是一个离散的(discrete)概率分布(对于每个RoI得到一个概率结果),即p = (p0, ..., pK),有着K+1个类。像往常一样,p是一个全连接层的K+1个输出被softmax计算后的结果。第二个输出是bounding-box回归偏置,tk = (tkx, tky, tkw, tkh),对于k表示K个目标类中的一个(即一个RoI对应于每K个类都会有一个位置结果)。我们使用[9]中给出的tk参数化,其中tk指定了一个尺度不变的平移和相对于目标proposal的对数空间的高度/宽度偏移。
每一个训练RoI都会被真实类u和真实的bounding-box回归目标位置v标注。我们在每一个标注的RoI上使用一个多任务损失函数L去共同训练分类和bounding-box回归:
第一个为对数损失函数,用于分类。第二个任务损失Lloc定义为对类u的真实bounding-box回归目标位置元组预测的损失函数,真实位置为v = (vx, vy, vw, vh), 预测得到的类为u的元组为tu = (tux, tuy, tuw, tuh)。[u>=1]表示当u>=1时该值为1,否则为0,即如果是背景类(按惯例设置为u=0)的话就不计算损失Lloc。对于bounding-box回归,使用的损失函数为:
使用的是鲁棒的L1损失函数,比在R-CNN和SPPnet使用的L2损失函数对异常值的敏感度要小。当回归目标是无限值,使用L2损失函数需要仔细调整学习率,以防止梯度爆炸。上面的式子3就会消除这种敏感度
在式子1中的超参数λ用于控制两个任务损失函数的平衡。我们归一化真正回归目标vi的值为均值为0,方差为1。所有实验都设置λ=1
注意到[6]使用了相关损失函数去训练不可知类的目标proposal网络。与我们的方法不同,[6]提倡采用双网络系统,对定位和分类分开。OverFeat [19], R-CNN [9], and SPPnet [11]也训练了分类器和bounding-box定位,但是这些方法都基于阶段训练,都次优于该Fast R-CNN方法(可见5.1)
mini-batch采样。在微调的时候,每个SGD mini-batches都是由是由N = 2张图像构成的,一致随机选择(通常的做法是,我们实际上遍历数据集的排列)。使用的mini-batches 的大小是R=128,即从每个图像从采样64个RoIs,构成128个mini-batches。如[9],我们从目标proposal中提取25%的RoIs,这些RoIs与真实bounding-box框的交并比(IoU)至少是0.5。这些RoIs将使用该目标proposal的类别进行标注,即u>=1。剩下的RoI也是从目标proposals中采样得到的,只是与真实框的最大的交并比在区间[0.1, 0.5)中,如[11]。因此将会作为背景样本,被标注为u=0。最后把比阈值0.1还低的作为hard example mining的标准[8]。在训练中,图片按概率0.5随机水平翻转,除此之外就没有使用其他的数据增强了。
通过RoI池化层进行反向传播。反向传播路径通过RoI池化层派生而来。简单来说,我们假设每个mini-batch只有一个图片(即N=1),尽管扩展到N > 1很简单,因为前向传播能够独立处理所有图像。
让xi ∈ R作为RoI池化层的第i个激活输入,yrj则是该层来自第r个RoI的第j个输出。RoI池化层计算:
R(r, j)是在子窗口中的输出索引集,输出单元yrj从这里最大池化而来。因此一个xi可能被赋值给不同的输出yrj(讲那么复杂其实就是最大池化的原理)
RoI池化层的后向传播函数通过遵循argmax转换来计算关于每个输入变量xi的损失函数的偏导数(partial derivative):
总之,对于每个mini-batch RoI r 和每个池化输出单元yrj,如果i是通过最大池化为yrj收集的argmax,偏导数∂L/∂yrj是可累加的。在反向传播中偏导数∂L/∂yrj已经是被RoI池化层上面的层(即全连接层)的后向传播函数计算好的了。
SGD超参数。用于softmax分类和bounding-box回归前面的全连接层将使用均值为0,标准差分别为0.01和0.001的高斯分布来初始化。偏置值bias初始化为0。所有层中,对权重使用一个层学习率为1,对偏置bias的层学习率则为2,全局学习率为0.001。当在VOC07和VOC12训练验证集中训练时,在前30k个mini-batch迭代中运行SGD,然后降低学习率为0.0001再去训练另外10k个迭代。当我们在一个更大的数据集中训练时,将使用更多的迭代次数。动量momentum设置为0.9,参数衰减为0.0005(在权重和偏置中)
2.4. Scale invariance尺度不变性
我们探索了两种方式获得尺度不变的目标检测:
- 通过“暴力(brute force)”学习
- 通过使用图像金字塔
这些策略遵循[11](SPPnet)中的两种方法。在暴力方法中,每张图像在训练和测试时都被处理在一个预定义像素大小。该网络必须直接从训练数据中学习尺度不变目标检测
相反,在多尺度方法中通过图像金字塔提供了一种大概的尺度不变方法给网络。在测试中,图像金字塔用于对每个目标proposal进行大概的尺度归一化。在多规模训练时,我们每次一张图片被采样时都随机采样一个金字塔尺度。我们的实验只在较小的网络中使用多尺度训练,因为内存的限制
3. Fast R-CNN detection
一旦一个Fast R-CNN网络被微调,检测相当于运行正向传播(假设目标proposals是预先计算好的)。网络将一张图像作为输入(或者是一个图像金字塔,就是编码为一列图像)和一列R目标proposals去打分(这里的目标proposals的得到方法和R-CNN是一样的,都是使用选择性搜索去得到2k左右的proposals)。在测试中,R大概有2000个,虽然我们会考虑使用更大的值(如45K)。当使用一个图像金字塔时(就是使用多个图像时),每个RoI的尺度将会设置接近于224*224像素
对于每个测试RoI r,前向传播输出一个类后验概率分布p(posterior probability distribution)和一个关于r的预测bounding-box偏置集(对于K个类中的每个类都会得到一个精确的bounding-box预测)。我们将会使用估计概率Pr(class = k | r) = pk(即该RoI为该类的概率)对每个目标类别赋一个检测置信度给r。然后会使用来自R-CNN的算术和设置来单独对每个类实现非极大值抑制
3.1. Truncated SVD for faster detection为了更快的检测而使用截断SVD(Singular Value Description,奇异值分解)
对于整个图像分类,相较于卷积层,在全连接层花费的计算时间是比较少的。相反,在检测中,处理的RoIs 的数量是很大的,因此将近一半的前向传播时间将会划分在计算全连接层中,如图2所示:
使用truncated SVD压缩大的全连接层能够加速网络
⚠️
truncated SVD用于降低全连接层的运算量,提升模型的速度。而在Fast R-CNN的目标检测任务中,大多数的运算时间发生在FC 的运算中,是因为针对每张输入图片,只进行一次卷积操作,而要对生成的Region Proposal,大致两千个,进行全连接操作进行分类与Bounding Box 的回归,因此若对FC层进行压缩则可以大幅减少运算时间。
因此层的权重矩阵W使用SVD近似分解为(is approximately factorized as):
在该分解中,U是一个u*t大小的矩阵,包含W的第一个t左奇异向量。∑t是一个t*t的对角矩阵,包含W的前t个奇异值。V是一个v*t大小的矩阵,包含W的第一个t右奇异向量。truncated SVD将权重数量从u*t减少到t*(u+v),如果t远小于min(u, v),减少效果将十分明显,从而减少了运算时间。
为了压缩网络,一个与W相关的全连接层将会被两个全连接层替代,其之间没有非线性函数。第一层将会使用权重矩阵为ΣtVT(不带bias),另一层将使用U作为权重矩阵(并且带着之前的W的bias)。这种简单的压缩方法在RoIs数量很大的时候起到了很好的加速作用。
4. Main results
三个主要的结果支持着该论文的贡献:
- 在VOC07、2010和2012都获得了最佳的mAP
- 相对于R-CNN和SPPnet,训练和测试速度更快
- 能够微调VGG16网络的卷积层,因此提高了mAP
4.1. Experimental setup
实验使用了三个网上能够得到的预训练ImageNet模型(https://github.com/BVLC/caffe/wiki/Model- Zoo)。第一个是来自于R-CNN[9]的CaffeNet(基于AlexNet[14])。我们将该CaffeNet成为模型S,意为“small”。第二个网络是来自[3]的VGG_CNN_M_1024,其与S有着相同的深度,只是更宽一点,我们称其为模型M,意为“medium”。最后一个网络是来自[20]的非常深的VGG16网络。因为这个网络是最大的,所以我们称之为模型L。在这个部分,所有实验都将使用单尺度(SPPnet的金字塔就是多尺度的)进行训练和测试(s=600;可在5.2部分查看详细内容)
4.2. VOC 2010 and 2012 results
4.3. VOC 2007 results
Fast R-CNN比SPPnet效果好说明了即使Fast R-CNN只使用了单一尺度训练和测试,微调卷积层的实现使得mAP有了很大的改进(从63.1%到66.9%)
4.4. Training and testing time
更快的训练和测试时间是我们获得的第二个主要成果。下面的表4对比了Fast R-CNN、R-CNN和SPPnet的训练时间(小时),测试率(每张图片几秒)和在VOC07上的mAP
对于VGG16网络,在没有使用截断SVD的情况下,Fast R-CNN处理图片的速度是R-CNN的146倍,有截断的话则是213倍。训练时间则是减少了9倍,从84小时减少到9.5小时。与SPPnet对比,Fast R-CNN训练VGG16网络是它的2.7倍(9.5 VS 25.5小时),以及在没有截断SVD的情况下测试是其7倍,有截断的情况下是10倍。Fast R-CNN还消除了成百的千兆字节大小的磁盘存储,因为它不缓存特性。
截断SVD
截断SVD能够减少超过30%的检测时间,而仅仅只降低了0.3%的mAP,并且在模型压缩后并不需要额外的微调。下图阐述了怎样使用来自在VGG16网络的fc6全连接层的25088*4096大小矩阵的前1024个奇异值和fc7全连接网络4096*4096大小矩阵的前256个奇异值去减少运行时间,且仅造成了mAP的一点点损失。如果在压缩后再次进行微调,能够在造成mAP较小的下降情况下进一步加速网络。
4.5. Which layers to fine-tune?
对于SPPnet论文[11]中考虑的深度较低的网络,只全连接层进行微调就能获得较好的精度。我们假设这一结果不适用于非常深的网络。为了验证微调卷积层对VGG16是十分重要的,我们使用Fast R-CNN进行微调,但是冻结了13个卷积层,这样只有全连接层被学习。该ablation模拟单尺度SPPnet训练,mAP由66.9%降至61.4%(如表5所示)。本实验验证了我们的假设:对于非常深的网,通过RoI池化层进行训练是非常重要的。
这是否意味着所有conv层都应该进行微调?简而言之,没有。在较小的网络(S和M)中,我们发现conv1是通用的,并且与任务无关(这是一个众所周知的事实,可见[14])。不管是否允许对conv1学习,对mAP都没有任何有意义的影响。对于VGG16,我们发现只需要从conv3_1往后(即13个conv层中的第9个开始)更新层。这一观察结果是实用的:
(1)与从conv3_1开始学习相比,从conv2_1开始更新将使训练速度降低1.3倍(12.5 vs. 9.5小时)
(2)从conv1_1更新会超出GPU内存。
而从conv2_1往后学习时mAP的差异仅为增加了0.3个点(表5,最后一列)。在本文中所有Fast R-CNN的结果都是使用VGG16网络微调conv3_1层及往后的层;所有使用模型S和M的实验则微调conv2层及往后的层。
5. Design evaluation
我们进行了实验,以对比Fast R-CNN与R-CNN和SPPnet的速度,并评估设计决策。根据最佳实践结果,我们是在PASCAL VOC07数据集上执行了这些实验。
5.1. Does multi-task training help?——yes
多任务训练很方便,因为它避免了管理一系列连续训练的任务。但它也有可能改进结果,因为任务通过共享representation(ConvNet)[2]相互影响。多任务训练能否提高Fast R-CNN的目标检测精度呢?
为了测试这个问题,我们训练了一个仅使用了在上面提及的等式(1)中的分类损失函数Lcls的基础网络(即设置等式中的λ=0)。这些基础网络在表6中作为每个组的第一列与模型S、M和L一起打印。注意,这些模型都没有没有bounding-box回归器。下一个(即每组第二列),我们将网络带着多任务损失函数一起训练(即等价于等式(1)中设置λ= 1),但我们会在测试时禁用bounding-box回归器。这隔离了网络分类的精度,并允许与基础网络进行一对一的比较。
在所有三个网络中,我们观察到多任务训练相对于单独的分类训练提高了纯分类精度。mAP的改进范围从+0.8到+1.1,表明多任务学习具有一致的积极效果。
最后,我们在基础模型(即仅使用分类损失函数进行训练) 添加bounding-box回归器,并使用Lloc损失函数对它们进行训练,同时保持所有其他网络参数不变。每组的第三列显示了该阶段训练方案的结果:mAP比第一列有所改进,但是与多任务训练(即每组第4列)相比效果又较差。
5.2. Scale invariance: to brute force or finesse?——暴力
对比两种获得尺度不变目标检测的方法:暴力学习(即单一尺度)和图像金字塔(多尺度)。在每个例子中豆浆图像的尺度s设置为其长度最小的边的大小
所有单尺度的实验使用s=600像素;有时s可能会小于600,因为对于某些图像,我们将图像最长的边长设置为1000像素(就是图像边长不能长过1000像素),并保持图像的长宽比。选择该值以使VGG16网络在微调时适合GPU内存大小。因为较小的网络没有内存边界,就能够从更大的尺度s值中获利;可是为每个模型优化s并不是我们的主要目的。我们注意到PASCAL图像的大小大概是384*473像素,因此,单尺度设置通常将图像上采样至1.6倍。因此在RoI池化层的平均有效步长为10像素。
在多尺度设置中,我们使用与[11]中相同的五种尺度的设置(s ∈ {480, 576, 688, 864, 1200})去实现与SPPnet网络的对比。可是我们也会将最长的图像变长设置为2000像素,以免超出GPU内存。
表7显示了训练和测试时使用单尺度或多尺度的模型S和M的结果:
比较让人意外的就是在[11]中单尺度和多尺度的检测效果差不多。我们的发现证明了他们的结果:深卷积神经网络善于直接学习尺度不变性。多尺度方法仅在mAP实现了比较小的增长,但是花费了较大的计算时间。在VGG16网络中(即模型L),通过实现细节我们只能使用单尺度方法。但是其mAP能够达到66.9%,这比R-CNN[10]中的66.0%结果高一点,即使R-CNN中使用了“无限”尺度,每个proposal都被扭曲成一个规范大小
由于单尺度处理提供了速度和精度之间的最佳权衡,特别是对于非常深的模型,因此本小节之外的所有实验都使用s = 600像素的单尺度训练和测试。
5.3. Do we need more training data?-yes
一个好的目标检测器应该在提供更多的训练数据时得到改进。Zhu等人[24]发现,DPM [8] mAP在经过几十万个训练样本后就饱和了。在这里,我们用VOC12 trainval集来扩充VOC07 trainval集,大约将图像数量增加三倍,达到16.5k,来评估Fast R-CNN。扩大训练集将VOC07测试mAP从66.9%提高到70.0%(表1所示)。
我们对VOC10和2012进行了类似的实验,构建了VOC07 trainval、test和VOC12 trainval组合的21.5k大小的图像数据集。在该数据集上进行训练时,我们使用100k次SGD迭代,每40k次迭代后(而不是每次30k)学习率降低0.1×。对于VOC10和2012数据,mAP分别从66.1%提高到68.8%和从65.7%提高到68.4%。
5.4. Do SVMs outperform softmax?
在Fast R-CNN中在微调时使用了softmax分类器而不是训练 one-VS-rest 线性SVMs post-hoc(二分类),像在R-CNN和SPPnet中做的一样。为了了解这个选择的影响,我们在Fast R-CNN中实现了带着hard negative mining的post-hoc SVM训练。我们使用了和在R-CNN中相同的训练算法和超参数。
表8显示了对这三个网络来说,softmax的效果比SVM稍微好一些,mAP高了0.1到0.8不等。这个影响是很小的,但是它说明了与原来的多阶段训练方法相对比,‘one-shot’微调方法已经足够使用了。我们注意到softmax不像post-hoc SVM,因为softmax在为RoI打分时还说明了类之间的竞争性。
5.5. Are more proposals always better?——no
(广泛地)有两种类型的对象检测器:一种使用稀疏的对象proposals集(例如,选择性搜索[21]),另一种使用密集的对象proposals集(例如,DPM[8])。稀疏proposals分类是级联[22]的一种类型,在这种类型中,建议机制首先拒绝大量候选项,留给分类器一小组待评估的候选项。当应用于DPM检测[21]时,该级联提高了检测精度。我们发现有证据表明,该proposals分类器级联也提高了Fast R-CNN的准确性。
使用选择性搜索的quality模式,我们将每张图片从1k个proposals扫描到10k个proposals,每次重新训练和重新测试模型M。如果proposals服务纯粹是计算性的,那么增加每张图片的proposals数量应该不会损害mAP。
我们发现当proposals数量增加时,mAP先升高,然后轻微降低(如上面表3,蓝色实线)。该实验显示了使用更多的proposals覆盖深度分类器是没有用的,甚至还会对准确度有轻微损害。
如果没有实际运行该实验的话,该结果很难预测。用于测量目标proposal质量的最优方法是平均召回率(AR)[12]。当每张图片都使用固定数量的proposals时,AR与使用R-CNN的几种proposals方法上的mAP有很好的相关性。表3显示了在每张图片中的proposals数量是多变的时,AR(红色实线)与mAP没有很好的相关性。AR要小心使用;因为过多的proposals,即使得到较高的AR也不能说明mAP将会增加。幸运的是,使用模型M进行训练和测试花费不到2.5小时。因此Fast R-CNN是高效的,所以目标proposals的mAP的直接评估是优于proxy metrics的
我们也调查了当在Fast R-CNN中使用密集方法以每张图片45k个框的比例去生成框的情况(不同尺寸、位置和宽高比)。该密集集是足够多的,当每个选择性搜索框被其最近的(IoU测量)密集框所替代时,mAP仅降低了1个点(即降低到57.7%,表3中的蓝色三角形)
密集框的数据和选择性搜索框的数据不同。从2k个选择性搜索框开始,并添加1000 × {2, 4, 6, 8, 10, 32, 45}个密集框随机样本来测试mAP。对于每个实验,我们都重新训练和重新测试模型M。当这些密集框被添加后,mAP下降得比添加更多的选择性搜索框还要强烈,最后达到53.0%。
我们还仅使用密集框(每张图片45k个proposal)去训练和测试Fast R-CNN。该设置得到结果为52.9%(蓝色菱形)。最后,我们查看是否带着hard negative mining 的SVM需要和密集框分布合作,发现结果更坏了,达到了49.3%(蓝色圆形)
所以就是说明使用选择行搜索的稀疏proposal就足够了
5.6. Preliminary MS COCO results
我们将Fast R-CNN(VGG16网络)应用到MS COCO数据集中去建立一个初步的基线。我们在80k大小的图片训练集中训练,迭代240k次,并使用评估服务器在‘test-dev’集中对得到的训练网络进行评估。PASCAL风格的数据集的mAP为35.9%;这个新的COCO风格的AP——IoU阈值的平均值为19.7%
6. Conclusion
本文提出了一种Fast R-CNN,对R-CNN和SPPnet进行了干净、快速的更新。除了报告最新的检测结果,我们还提供了详细的实验,希望能提供新的见解。特别值得注意的是,稀疏目标proposals似乎可以提高检测器的质量。这个问题在过去花费太多(时间)去探索,但在Fast R-CNN中变得实用。当然,可能存在一些尚未发现的技术,允许密集的框性能和稀疏的proposals一样好。如果开发出这样的方法,将有助于进一步加速目标检测。
总结:(参考https://www.jianshu.com/p/9db81f1bb439)
R-CNN网络的主要问题有:
- 使用selective search产生proposal,操作耗时,且不利于网络的整体训练和测试
- 产生的proposal需要经过warp操作再送入后续网络,导致图像的变形和扭曲
- 每一个proposal均需要单独进行特征提取,重复计算量大
Fast R-CNN中ROI Pooling的加入,相对于R-CNN网络来说,至少有两个改善:
- 由于ROI Pooling可接受任意尺寸的输入,warp操作不再需要,这有效避免了物体的形变扭曲,保证了特征信息的真实性
- 不需要对每个proposal都提取特征,而是将整张图片输入网络中,采用映射方式从整张图片的feature map上获取ROI feature区域
除了上述两个改进外,其实还有一点。R-CNN中在获取到最终的CNN特征后先采用SVM进行类别判断,再进行bounding-box的回归得到位置信息。整个过程是个串行的流程。这极大地影响了网络的检测速度。Fast R-CNN中则将Classification和regression的任务合二为一,变成一个multi-task的模型,实现了特征的共享与速度的进一步提升。
但是Fast R-CNN只是解决了R-CNN中的后两点问题,而仍然沿用了R-CNN中selective search生成proposal的方法。这一方法产生的proposal即使经过NMS(非极大值抑制)也会达到2k~3k个。一方面生成过程耗时耗力,另一方面给存储也带来压力。
改进的办法就是Faster R-CNN的提出。