详细内容来源于:https://blog.csdn.net/cdknight_happy/article/details/87925098
论文:https://arxiv.org/abs/1504.08083
caffe实现:https://github.com/rbgirshick/fast-rcnn
包括理解!
本文在R-CNN的基础上提出了Fast R-CNN,使用CNN实现了更快更准的目标检测。
相比于R-CNN,使用VGG16骨干网络,训练提速了9倍,测试提速了231倍,在PASCAL VOC 2012数据集上取得了更高的mAP;相比于SPP Net,使用VGG16骨干网络,训练提速了3倍,测试提速了10倍,并且更加准确。
最近,深度ConvNets显著地改进了图像分类和物体检测的准确率。与图像分类相比,目标检测是一项更具挑战性的任务,需要更复杂的方法来解决。由于这种复杂性,当前的算法多采用多级方法训练模型(例如R-CNN),这些模型是速度慢且不优雅。
目标检测的复杂源于需要对目标进行精确定位,有两个主要的挑战:
必须处理大量的候选位置(通常称为“proposal”),计算量大;
这些proposal只是目标的粗略定位,必须对其修正以提升检测精度。
解决上面两个问题往往会影响算法的整体处理速度、准确性和简洁性。
在本文中,我们简化了最先进的基于ConvNet的目标检测器的训练过程。使用单个卷积网络完成proposal的分类和目标位置修正,由此产生的方法以VGG16为骨干网络时,训练速度比R-CNN快9倍,比SPPnet快3倍。在测试时,单幅图像的目标检测过程需要0.3s(不包括提取proposal的时间)。同时在PASCAL VOC 2012上实现了最高的mAP,66%(R-CNN为62%)。
R-CNN通过使用深度ConvNet对proposal进行分类,实现了良好的目标检测。然而,R-CNN有明显的缺点:
训练过程太过繁琐:R-CNN首先使用proposal的log损失对ConvNet进行微调;然后,对ConvNet提取的特征训练SVM分类器,这些SVM分类器替代微调过程中的softmax分类器实现目标类别判定;最后,训练bounding-box回归器以对目标位置进行修正;
训练过程空间占用和耗时很大:训练SVM分类器和BB回归网络时,需要提取各图像全部proposal的特征并保存。对于非常深的网络,例如VGG16,特征提取过程耗时很长,磁盘空间占用也很大;
目标检测速度慢:在测试时,需要对测试图像的各proposal提取特征,使用GPU进行目标检测的速度依然为47s/幅。
R-CNN速度很慢,因为它不共享计算过程,而是对每个proposal都需要执行一次ConvNet前向运算。
SPP Net通过共享计算来加速R-CNN,SPPnet计算整个输入图像的卷积特征图,然后从总的特征图上提取各proposal对应的特征实现其类别判定,由于各proposal大小不同,对应的特征大小也不同,SPP中通过应用池化核大小可变的最大池化得到固定大小的输出特征(例如,6×6),连接多个尺度的输出特征,SPP可以实现多个尺度的快速目标检测。SPP的检测速度比R-CNN快10到100倍。由于proposal的特征提取速度加快,模型的训练时间也减少了3倍。
SPPnet也有明显的缺点,与R-CNN一样,其训练过程包含多个阶段,涉及到了提取特征、微调具有log损失的网络、训练SVM和拟合bounding-box回归器,特征也需要存储到硬盘上。但与R-CNN不同,SPP-Net中微调时无法更新空间金字塔池化层(SPP层)之前的卷积层,该缺陷(固定卷积层的参数)限制了最终的检测精度。
我们提出了一种新的训练算法,它可以解决R-CNN和SPPnet的缺点,同时提高它们的速度和准确性。我们称这种方法为Fast R-CNN,因为它训练和测试的速度相对较快。 Fast R-CNN方法有几个优点:
比R-CNN、SPPnet具有更高的mAP;
使用多任务损失进行单阶段训练;
训练过程可以更新网络的所有层;
不需要任何的硬盘空间进行特征缓存。
Fast R-CNN的架构如下:
Fast R-CNN的输入是整个图像和一组proposal(2000个),首先对输入图像应用卷积和最大池化操作产生卷积特征图,然后,对于每个proposal,通过ROI Pooling层从全图的特征图中提取和该proposal对应的固定长度的特征向量,提取的特征向量送入多个全连接层,最终分成两个输出层:一个产生proposal的类别信息(通过softmax函数得到的K+1个概率值),另一个输出大小为K∗4的实数值,表示该proposal对于各类别bounding box坐标的修正值。
RoI池化层使用最大池化将任何尺寸的感兴趣区域的特征转换为大小固定为H×W(如,7×7)的特征值。其中H和W是超参数,与任何特定的RoI无关。在本文中,RoI是卷积特征映射上的某个矩形窗口,每个RoI由四元组 ( r , c , h , w ) (r,c,h,w) (r,c,h,w)定义,指定其左上角位置 ( r , c ) (r,c) (r,c)和高度宽度 ( h , w ) (h,w) (h,w)。(注:FPN+Fast RCNN代码中实现是左上角、右下角坐标)
RoI 最大池化层通过将大小为 h × w h×w h×w的RoI窗口划分为大约 H × W H×W H×W个大小为 h / H × w / W h/H×w/W h/H×w/W的子窗口,然后将每个子窗口中的值应用最大池化得到输出值。和标准最大池化一样,ROI池化操作独立应用于特征图的每个通道。RoI层只是SPPnets中使用的SPP层的特例,因为这里只有一个尺度。
我们尝试了三个预训练的ImageNet 网络,每个网络都有五个最大池化层,但卷积层有五到十三个(有关网络详细信息,请参见第5.1节)。
使用预训练的分类网络初始化Fast R-CNN网络时,需要进行三项调整:
*最后一个最大池化层替换为RoI池化层,ROI池化层的参数H和W依据该层后接的第一个全连接层来配置(例如,对于VGG16,H = W = 7),目的就是保证ROI池化层的输出和后面的全连接层的输入的尺寸一致;
*网络的最后一个全连接层和softmax层(用于1000类ImageNet分类训练)被前面描述的两个输出层替换(K+1类的全连接层后接softmax;及各类的bounding-box回归器,全连接层实现);
*网络被修改为采用两个数据输入:图像和各图像的RoI集合。
*能够通过反向传播训练所有层的参数是Fast R-CNN的重要创新点。
首先,解释下为什么SPPnet无法更新空间金字塔池化层之前的网络层的权重。
根本原因是,R-CNN和SPPnet网络的训练时,每个训练样本(即,ROI)来自于不同的图像,通过SPP层反向传播时非常低效。这是因为每个RoI可能具有非常大的感受野,通常几乎覆盖了整个输入图像。由于前向传播必须处理整个感受野,因此训练输入很大(通常是整个图像),造成反向传播时的计算量很大。(理解:RCNN是每个batch从所有图像中取128个ROI,然后每个ROI都要过卷积层求特征,卷积特征参数不共享)
*Fast R-CNN在训练期间通过特征共享实现了更高效的训练。Fast R-CNN训练过程中,mini-batch的随机梯度下降(SGD)按层次采样,首先选择N个图像,然后从每个图像中采样R / N个RoI。重要的是,来自相同图像的各RoI在前向和反向传播中共享计算和存储(理解:一张图像只卷积一次,共享卷积计算),这样使得计算量减少了N倍。例如,当N = 2,R = 128时,该训练方案比从128个不同图像中各采样一个RoI(即,R-CNN和SPPnet的策略)大约快64倍。
对这种策略的一个担忧是它可能导致训练收敛速度慢,因为来自同一图像的RoI具有一定的相关性。但实验结果可以打消我们的疑虑,通过使用比R-CNN更少的SGD迭代,使用N = 2和R = 128的Fast R-CNN获得了良好的检测结果。
*Fast R-CNN还使用简化的训练和微调过程,同时优化softmax分类器和边界框回归器,而不是像R-CNN那样分别训练softmax分类器,SVM和回归器。具体的训练细节(损失函数,小批量抽样策略,通过RoI池化层的反向传播和SGD超参数)描述如下:
多任务损失
Fast R-CNN网络具有两个输出层,第一个输出每个RoI的K + 1个类别的离散概率分布 p = ( p 0 , … , p k ) p=(p_0,…,p_k) p=(p0,…,pk), p p p是通过对一个具有K+1个神经元的全连接层应用softmax函数得到。第二个输出为输入的proposal对于各类目标ground-truth box的位置及宽高偏移, t k = ( t x k , t y k , t w k , t h k ) t^k=(t^k_x,t^k_y,t^k_w,t^k_h) tk=(txk,tyk,twk,thk),k表示类别索引。我们使用R-CNN中给出 t k t^k tk的参数,其中 t k t^k tk为proposal相对于gt box的的尺度不变的平移和对数空间高度/宽度比值。
每个训练RoI都标有真实目标类别u和真实目标边界框回归目标v。我们在每个标记的RoI上使用多任务损失L来联合训练分类和回归边界框:
其中, L c l s = − l o g p u L_{cls}=-logp_u Lcls=−logpu是目标类u的交叉熵损失; L l o c L_{loc} Lloc表示对类别u,预测位置信息 t u = ( t x u , t y u , t w u , t h u ) t^u=(t^u_x,t^u_y,t^u_w,t^u_h) tu=(txu,tyu,twu,thu)相对于真实位置 v = ( v x , v y , v w , v h ) v=(v_x,v_y,v_w,v_h) v=(vx,vy,vw,vh)的偏差。函数 [ u ≥ 1 ] [u≥1] [u≥1]表示当u大于等于1时为1,否则为0。按照惯例,将背景类标记为u = 0。对于背景RoI而言,没有任何位置信息,因此不需要考虑定位损失 L l o c L_{loc} Lloc。对于bounding-box回归,我们使用:
损失函数中的超参数λ控制两个任务损失之间的平衡,本文所有实验中都设定λ= 1。我们将真实回归目标 v i v_i vi标准化为零均值和单位方差。
我们注意到[6]使用相关的损失来训练一个类不可知对象提议网络。与我们的方法不同,[6]主张采用双网络系统来区分定位和分类。OverFeat [19],R-CNN [9]和SPPnet [11]也训练分类器和边界框定位器,但是这些方法使用阶段式训练,我们的实验表明Fast R-CNN优于它们(如5.1节所示)。
mini batch采样:
在微调期间,每个SGD小批量由随机选取的N = 2个图像构成,我们使用尺寸为R = 128的mini batch,从每个图像中采样64个RoI。如[9]所示,这些proposal中25%的proposal与真实边界框之间的IoU至少为0.5,也就是这些RoI包含前景目标,即 u≥1。其余的RoI和真实目标框之间的IOU介于[0.1,0.5],这些是背景目标,标记为u = 0。下限阈值0.1似乎充当了难例挖掘的启发式参数。在训练期间,图像以0.5的概率水平翻转,没有使用其他的数据扩充手段。
ROI池化层的反向传播:
训练过程中需要跨过ROI池化层进行反向传播。这里简化假设每个小批量只有一个图像(N = 1),虽然真实训练时N>1,但这里的结论可以同样适用于N>1的情况,因为前向传递独立地处理每一幅图像。
令 x i ∈ R x_i∈R xi∈R为进入ROI池化层的第i个激活输入, y r j y_{rj} yrj为第r个RoI的的第j个输出。RoI池化层计算 y r j = x i ∗ ( r , j ) y_{rj}=x_{i*(r,j)} yrj=xi∗(r,j), x i ∗ ( r , j ) = a r g m a x i ′ ∈ R ( r , j ) x i ′ x_{i*(r,j)}=argmax_{i'∈R(r,j)}x_{i'} xi∗(r,j)=argmaxi′∈R(r,j)xi′。 R ( r , j ) R(r,j) R(r,j)是输出单元 y r j y_{rj} yrj对应的池化子窗口的位置集。单个 x i x_i xi可以分配给几个不同的输出 y r j y_{rj} yrj。
RoI池化层的反向函数通过argmax计算损失函数相对于每个输入变量 x i x_i xi的偏导数:
换言之,对于每个小批量RoI r 和每个池化输出单元 y r j y_{rj} yrj,如果对r进行最大池化选择的位置为i,那么就需要对 x i x_i xi累积偏导数 ∂ L / ∂ y r j ∂L/∂y_{rj} ∂L/∂yrj。在反向传播中,偏导数 ∂ L / ∂ y r j ∂L/∂y_{rj} ∂L/∂yrj是loss相对于ROI池化层输出的导数。
理解,不太明白?:ROI池化层前向过程就是对于各proposal所对应的特征块应用不同大小池化核的最大池化,得到了固定尺寸的输出值,对每一个子块而言,就是记录下最大值的位置信息。反向传播的时候,就对最大值位置的 x i x_i xi计算梯度,因为取最大值操作的导数为1,所以就是记录 ∂ L / ∂ y r j ∂L/∂y_{rj} ∂L/∂yrj,因为这个最大值位置可能被多个子块采用了,所以对 j j j进行累加,这个位置还有可能出现在了多个roi中,所以也需要对 r r r累加。
SGD超参数
用于softmax分类和边界框回归的全连接层分别使用零均值高斯分布初始化,标准差分别为0.01和0.001,偏差初始化为0(代码中有)。所有层中权重的学习率和全局学习率一致,偏差的学习率为全局学习率的两倍,全局学习率为0.001。在训练VOC07或VOC12 trainval时,我们使用SGD进行30k次mini batch迭代,然后将学习率降低到0.0001,并进行另外10k次迭代。当我们在更大的数据集上训练时,我们运行SGD以进行更多迭代,如稍后所述。
SGD的动量值为0.9,权重衰减系数为0.0005(权重衰减同时考虑了权重值和偏差值)。
我们探索了实现尺度不变目标检测的两种方法:(1)通过固定尺寸和(2)通过图像金字塔。这些策略遵循[11]中的两种方法。在固定尺寸方法中,在训练和测试期间以预定义的固定尺度处理每个图像。网络必须直接从训练数据中学习检测各种尺度的目标。
相反,多尺度方法通过图像金字塔为网络提供近似的尺度不变性。在测试时,图像金字塔用于近似地规范化每个proposal。通过多尺度训练,我们在每次采样图像时随机设置金字塔尺度,如[11]所示,作为数据增强的一种形式。由于GPU内存限制,我们仅尝试针对较小网络的进行多尺度训练。
一旦完成了Fast R-CNN网络的微调,检测就是进行网络的前向运算过程(预先计算出proposal)。网络以图像(或图像金字塔,编码为图像列表)和R个proposal作为输入。测试时,R通常在2000左右,但我们会考虑R更大的情况(≈45k)。当使用图像金字塔时,每个RoI被按照下面的原则设置比例,使得缩放的RoI接近224 * 224个像素。
对于每个测试RoI r,前向过程输出类别后验概率分布p和一组相对于 r 的预测边界框偏移(每个类获得其自己的边界框预测)。我们使用估计概率 P r ( c l a s s = k ∣ r ) = p k Pr(class=k|r)=p_k Pr(class=k∣r)=pk表示proposal r包含类别为k的目标的概率。最后为每个类别应用NMS消除重叠框。
使用Truncated SVD进行加速全连接层的计算
对于图像分类,与conv层相比,计算全连接层所花费的时间很少。相反,对于检测任务,因为要处理的RoI的数量很大,会有近一半的前向运算时间用在了全连接层的计算上(参见图2)。可以通过使用截断SVD加速大的全连接层的计算过程。
没理解?
三个主要结果支持本文的贡献:
*在VOC07,2010和2012上的最高mAP;
*与R-CNN,SPPnet相比,训练和测试速度更快;
*基于VGG16中的卷积层微调提高了mAP。
我们的实验使用了三种在线提供的预训练的ImageNet模型。第一个是来自R-CNN[9]的CaffeNet(基本上是AlexNet [14]),我们使用S代码“small”,表示这个小网络。第二个是VGG_CNN_M_1024,它和S具有相同的网络层数,但各层的神经元数量更多,我们将这个模型称之为中等大小的模型,表示为M。最后一个网络是VGG16,由于这个模型很大,我们称之为大模型L。在这部分的实验中,所有的实验都是使用单尺度训练和测试(s=600),具体请参考5.2节。
在这些数据集上,我们将Fast R-CNN(简称FRCN)与公共排行榜的comp4(外部数据)上的顶级方法进行比较(表2,表3)。对于NUS NIN c2000和BabyLearning方法,目前没有相关的出版物,我们无法找到有关所用ConvNet架构的确切信息; 它们是NIN网络的变体[17]。所有其他方法都是使用相同的预先训练的VGG16网络初始化的。
Fast R-CNN在VOC12上取得了最高成绩,mAP为65.7%(使用外部数据时取得了68.4%的mAP)。它也比其他方法快两个数量级,其他方法都基于“慢”的R-CNN流水线。在VOC10上,SegDeepM [25]实现了比Fast R-CNN更高的mAP(67.2%对66.1%)。SegDeepM使用VOC12trainval和语义分割数据集进行训练; 它旨在通过使用马尔可夫随机场来推理R-CNN检测和来自O2P [1]语义分割方法的分割来提高R-CNN精度。可以使用Fast R-CNN替换SegDeepM中的R-CNN,这可以产生更好的结果。当使用扩大的07 ++ 12训练集(见表2标题)时,Fast R-CNN的mAP增加到68.8%,超过了SegDeepM。
在VOC07上,我们将Fast R-CNN与R-CNN、SPPnet进行比较。所有方法都使用相同的预训练VGG16模型进行初始化,并使用边界框回归。VGG16 SPPnet结果由[11]的作者计算。SPPnet在训练和测试期间使用了五个尺度。Fast R-CNN相对于SPPnet的改进说明即使Fast R-CNN使用单一尺度的训练和测试,对卷积层进行微调也会使mAP有很大的改进(从63.1%到66.9%)。R-CNN的mAP达到66.0%。一个小细节是,SPPnet在没有使用PASCAL中标记为“困难”的样本的情况下进行的训练,删除这些示例可将Fast R-CNN mAP提高到68.1%。所有其他实验都使用了标记为“困难”的样本。
快速的训练和测试是我们的第二个主要成果。表4比较了Fast R-CNN,R-CNN和SPPnet之间的训练时间(小时),测试速率(每个图像处理的秒数)和VOC 07上的mAP。对于VGG16,不使用截断SVD的Fast R-CNN处理图像R-CNN快146倍,使用截断SVD时比R-CNN快213倍。训练时间减少9倍,从84小时减少到9.5小时。与SPPnet相比,Fast R-CNN训练VGG16速度提高2.7倍(9.5对25.5小时),没有截断SVD时测试速度快7倍,使用截断SVD时快10倍。Fast R-CNN还消除了数百GB的磁盘存储空间,因为它不需要缓存特征。
截断SVD:截断SVD可以将检测时间减少30%以上,mAP只有很小的(0.3百分点)下降,并且在模型压缩后无需进行额外的微调。图2示出了如何使用来自VGG16的fc6层中的25088×4096矩阵的前1024个奇异值,以及来自4096×4096 fc7层的前256个奇异值减少运行时间但mAP损失很小。如果在压缩后再次进行微调,则可以进行进一步的加速,mAP只有小幅下降。
对于在SPPnet参考文献[11]中考虑的深度较低的网络,仅对全连接的层进行微调就足以获得良好的精度。我们假设这个结果不适用于非常深的网络。为了验证微调卷积层对于VGG16很重要,我们使用Fast R-CNN进行微调,但冻结了13个卷积层,以便只改变全连接层。如表5所示,只微调全连接层时准确度为61.4%,但添加对conv3_1和fc6之间的卷积层进行微调之后,准确率可以上升到66.9%,该实验验证了我们的假设:跨过RoI池化层对其前面的卷积层进行训练对于非常深的网络非常重要。
所有卷积层进行微调?答:不是。在较小的网络(S和M)中,我们发现conv1是通用的并且与任务无关(众所周知的事实[14]),是否允许conv1改变对mAP没有任何意义的影响。对于VGG16,我们发现只需更新conv3_1及更高层(13个卷积层中的9个)。这种做法是务实的:(1)与从conv3_1开始更新相比,从conv2_1开始更新耗时增加了1.3×(12.5对9.5小时);(2)从conv1开始更新造成了GPU显存不足。从conv2_1开始更新时,mAP的差异仅为+0.3分(表5,最后一栏)。本文所有Fast R-CNN的结果使用VGG16微调conv3_1及以上的层获得; 模型S和M的所有实验都使用微调conv2及其以上的层获得。
我们进行了实验,以了解Fast R-CNN与R-CNN、SPPnet的比较,以及评估设计决策。遵循最佳实践,我们在PASCAL VOC07数据集上进行了这些实验。
多任务训练很方便,因为它避免了人工管理顺序训练的任务。它也有可能改善结果,因为任务通过共享表示(ConvNet)相互影响[2]。多任务训练是否可以提高Fast R-CNN中的目标检测精度?
为了测试这个问题,我们训练了仅使用分类损失 L c l s L_{cls} Lcls的基准网络(即设置公式1中的 λ = 0 λ=0 λ=0)。在表6中的每组的第一列中显示基准模型S,M和L的检测结果。请注意,这些模型没有进行边界框回归。接下来(每组第二列),我们采用经过多任务损失训练的网络(公式1,λ= 1),但我们在测试时禁用了边界框回归。这样做仅比较了网络的分类准确性,并允许与基准网络进行比较。在所有三个网络中,我们观察到相对于单独的分类训练,多任务训练提高了分类准确性。改进范围从+0.8到+1.1 mAP点,显示了多任务学习的一致的正向效果。
最后,我们采用基准模型(仅使用分类损失进行训练),在边界框回归层上进行处理,并使用 L l o c L_{loc} Lloc训练它们,同时保持所有其他网络工作参数冻结。每组中的第三列显示了这种分阶段训练方案的结果:mAP比第一列有所提升,但是阶段式训练的效果比多任务联合训练(每组第四列)要差。
我们比较了实现尺度不变目标检测的两种策略:蛮力学习(单一尺度)和图像金字塔(多尺度)。在任何一种情况下,我们都将图像的比例s定义为其最短边的长度。
所有单尺度实验都使用s = 600像素; 对于某些图像,s可能小于600,因为我们将最长的图像边限制在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]中最令人惊讶的结果是单尺度检测几乎与多尺度检测一样好。我们的实验也支持了相同的结论:深度ConvNets擅长直接学习尺度不变性。多尺度方法以较大的计算时间成本获得了mAP的小幅增加(表7)。在VGG16(模型L)的情况下,我们只能使用单个尺度。然而,它实现了66.9%的mAP,略高于R-CNN报告的66.0%[10],但R-CNN近似使用了“无限”尺度,因为每个proposal都被warp成固定尺寸。
由于单尺度处理在速度和精度之间提供了最佳权衡,特别是对于非常深的模型,本小节之外的所有实验都使用s = 600像素的单尺度训练和测试。
当提供更多训练数据时,目标检测器的性能应该得到改善。朱等人[24]发现DPM [8] mAP仅在几百到几千训练之后饱和。在这里,我们使用VOC12 trainval set增加VOC07 trainval set,大约将图像数量增加三倍至16.5k,以评估Fast R-CNN。扩大训练集使VOC07测试的mAP从66.9%提高到70.0%(表1)。在对此数据集进行训练时,我们使用60k小批量迭代而不是40k。
我们对VOC10和2012进行了类似的实验,为此我们从VOC07 trainval,test和VOC12 trainval的联合构建了21.5k图像的数据集。在对该数据集进行训练时,我们使用100k SGD迭代并将学习率降低0.1×每40k次迭代(而不是每30k)。对于VOC10和2012,mAP分别从66.1%提高到68.8%,从65.7%提高到68.4%。结论是使用更多的训练数据有助于检测精度的提升。
Fast R-CNN使用在微调期间学习的softmax分类器,而不是使用R-CNN和Sppnet使用的One VS Rest的线性SVM分类器。为了评估这一选择的影响,我们在Fast R-CNN中采用难例挖掘实现了事后SVM分类器的训练。我们使用与R-CNN相同的训练算法和超参数。
表8显示,对于3个网络,softmax略微优于SVM,增加了+0.1至+0.8 mAP点。这种效果很小,但它表明与先前的多阶段训练方法相比,“一次性”微调就足够了。我们注意到softmax与OVR SVM的不同,在对RoI进行评分时引入了类间竞争。
存在(广泛地)两种类型的对象检测器:使用稀疏对象proposal集(例如,选择性搜索[21])和使用密集proposal集(例如,DPM [8])的对象检测器。对稀疏提议进行分类是一种级联[22],其中提议机制首先拒绝大量候选proposal,只对少量的proposal进入分类器评估。当把这种级联处理机制应用于DPM检测时,可以提升DPM的提高了检测精度[21]。我们发现这种级联处理也提高了Fast R-CNN的精度。
使用选择性搜索的质量模式,我们从每张图像中获取1k到10k个提议,每次重新训练并重新测试模型M。如果proposal只是纯粹的输入,那么增加每个图像的proposal数量不应该损害mAP。
我们发现随着proposal数量的增加,mAP上升然后略有下降(图3,蓝色实线)。这个实验表明,使用更多proposal对深度分类器并没有帮助,甚至有点伤害准确性。
如果没有实际运行实验,这个结果很难预测。测量目标proposal质量的最新技术是平均召回(AR)[12]。当设置每个图像固定数量的proposal时,AR与使用R-CNN的若干提议方法的mAP很好地相关。图3示出了AR(实线红线)与mAP不完全相关,因为每个图像的proposal数量是变化的。AR必须小心使用,更高的AR由于具有更多proposal,并不意味着mAP会增加。幸运的是,使用M型网络进行训练和测试的时间不到2.5小时。因此,Fast R-CNN能够有效、直接地评估对象proposal的mAP,这比代理度量更好。
当使用密集生成的box(包括比例、位置和纵横比)结合Fast R-CNN时,约为45k proposals/图像。这些密集的proposal足够丰富,当每个选择性搜索框被其最近的(在IoU)密集框中替换时,mAP仅下降1个点(到57.7%,图3,蓝色三角形)。
密集框的统计信息与选择搜索框的统计信息不同。从2k选择性搜索框开始,我们额外添加1000×{2,4,6,8,10,32,45}密集框的随机样本时测试mAP。对于每个实验,我们重新训练并重新测试模型M。当添加这些密集框时,mAP比添加更多选择性搜索框时下降的更强烈,最终达到53.0%。
我们还使用密集框(45k /图像)训练和测试Fast R-CNN。此设置产生的mAP为52.9%(蓝色菱形)。最后,我们检查是否需要使用具有难例挖掘的SVM来应对密集框分布,结果比SVM更糟糕:49.3%(蓝色圆圈)。
我们将快速R-CNN(基于VGG16)应用于MS COCO数据集[18]以建立初步基线。我们对240k迭代的80k图像训练集进行了训练,并使用评估服务器在“test-dev”集上进行评估。PASCAL式mAP为35.9%; 新的COCO式AP,平均超过IoU门槛,为19.7%。
本文提出了Fast R-CNN,一种简介、快速的R-CNN和SPPnet更新。除了报告最领先的检测结果,我们还提供了详细的实验,希望能够提供新的见解。特别值得注意的是,稀疏对象提议似乎可以提高检测器质量。这个问题在过去进行探测时在时间上成本太高,但是对于Fast R-CNN来说是实用的。当然,可能还有一些尚未发现的技术,它们允许基于密集提议可取得和稀疏提议同样好的效果。如果开发出这样的方法,可以帮助进一步加速物体检测的发展。