Fast-RCNN项目地址:https://github.com/rbgirshick/fast-rcnn
Fast RCNN利用深度卷积网络建立了一个比以往方法都更高效的目标检测的方法,Fast RCNN利用一些创新点使得训练和测试的速度都得到了提升。Fast RCNN训练VGG16比RCNN快9倍,测试上快213倍,并且在PASCAL VOC 2012数据集上获得了最高的mAP。Fast RCNN相比SPPnet在VGG16上的训练快3倍,测试快10倍,且准确率更高。
深度卷积网络[14][16] 已经使得图像分类和目标检测的准确率有了很大的提升,目标检测相比于图像分类更加具有挑战性,需要更复杂的方法来实现高精度。所以目前的方法都是多级级联的效率较低的复杂网络[9,11,19,25]。
算法的复杂性源于检测需要对目标进行准确的定位,故有了两个挑战。其一,需要处理大量目标候选区域(proposal)。其二,这些候选区域仅仅是大体上的定位,需要精细化以提供更加精细的定位。解决这些问题可以使得更快,更准确,更简单。
本文介绍了目前最优的基于ConvNet的目标检测器[9,11],并且提出了一个单阶段的训练方法,同时学习分类目标候选框和精细化空域位置。
所得到的方法用来训练非常深的检测网络(例如VGG16) 比R-CNN快9倍,比SPPnet快3倍。在运行时,检测网络在PASCAL VOC 2012数据集上实现最高准确度,其中mAP为66%(R-CNN为62%),每张图像处理时间为0.3秒,不包括候选框的生成(所有的时间都是使用一个超频到875MHz的Nvidia K40 GPU测试的)。
R-CNN[9]获得了目前应用深度ConvNet来对目标框进行分类的目标检测的最好结果。但是RCNN具有一些显著的缺点:
1. 训练过程是多级流水线
R-CNN首先利用log loss作为损失函数来微调ConvNet,之后将卷积特征送入SVM进行分类器的学习。这些SVM就类似于目标检测器,代替了深度网络的softmax分类层,训练的第三级是利用回归的方法来确定b-box。
2. 训练过程占用内存和所需时间都很大
训练SVM和b-box回归的过程,所有的特征都是从每个目标框中抽取的并写入磁盘,对于很深的网络,例如VGG16,该过程在单个GPU上需要2.5天(VOC07 trainval上的5k个图像)。这些特征需要数百GB的存储空间。
3. 目标检测过程很慢
测试时,特征从每个图像中的每个候选区域中抽取,VGG16检测目标每幅图在GPU上需要花费47s。
R-CNN之所以速度较慢是因为它要对每个候选框都进行前向传播,没有共享的过程。SPPnets[11]利用共享计算的原理被提出来提升R-CNN的速度。SPPnet对整个输入图像计算卷积特征图,然后使用该共享特征图提取每个候选框的特征向量。通过最大池化将每个不同大小的候选框特征图转化为固定大小的输出。不同大小的输出通过池化后级联,和金字塔池化过程一样。SPPnet在测试时会加速10到100倍,由于更快的候选框特征提取使得训练时会加速3倍左右。
SPPnet也有很多缺点,和R-CNN一样,训练过程是多阶段流水线工作,包括特征提取,log loss微调损失函数,训练SVM和b-box的回归等等,也需要将特征写入硬盘。与R-CNN不同的是,在[11]中提出的微调算法不能更新在空间金字塔池化之前的卷积层,这种固定卷积层的方法限制了网络的精度。
本文提出了一种新的方法,修正R-CNN和SPPnet的缺点,同时提升了速度和精度,称为Fast R-CNN(因为其训练和测试的速度都很快),其优势如下:
1、比R-CNN和SPPnet都高的mAP
2、训练过程是使用多任务损失的单阶段训练
3、训练可以更新所有网络层
4、不需要磁盘空间缓存特征
Fast R-CNN是用Python和C++写的,网址https://github.com/rbgirshick/fast-rcnn
图1是Fast R-CNN的框架结构,输入一整张图像和一系列目标框。首先将一幅图像进行卷积操作和最大池化来获得卷积特征图,之后对每个候选框中的特征图进行RoI pooling来提取固定大小的特征向量,每个特征向量都输入全连接层其最终分支成两个同级输出层:一个产生k个输出类别加上一个背景类别的softmax概率估计,另一个针对k个类别中的每个类别输出四个数字(确定每个类别的框的位置和大小)
RoI pooling层利用最大池化来将所有的不同大小的输入转化为相同空域大小 H × W H\times W H×W的特征图(如 7 × 7 7\times7 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)高和宽。
RoI最大池化是将 h × w h\times w h×w的RoI窗划分为 H × W H\times W H×W的网格子窗,之后保留每个子窗中的最大值作为该网格的输出。RoI层只是SPP层的特殊情况,只有一个金字塔,也就是简化为了但尺度的池化。
在Fast R-CNN网络中,原始图片经过多层卷积与池化后,得到整图的feature map。而由selective search产生的大量proposal经过映射可以得到其在feature map上的映射区域(ROIs),这些ROIs即作为ROI Pooling层的输入。
ROI Pooling时,将输入的h * w大小的feature map分割成H * W大小的子窗口(每个子窗口的大小约为h/H,w/W,其中H、W为超参数,如设定为7 x 7),对每个子窗口进行max-pooling操作,得到固定输出大小的feature map。而后进行后续的全连接层操作。
此处用三个预训练的ImageNet网络进行实验,每个用五层max pooling,五至十三层卷积(4.1节有网络细节描述),当预训练网络初始化Fast RCNN时,经历三个变换。
首先,最后的最大池化层被RoI pooling所代替,其将H和W设置为一个与网络的第一个全连接层兼容的配置(例如VGG16中,H=W=7)。
其次,网络的最后一层全连接层和softmax层(从ImageNet中训练的1000分类的分类器)被替换为前面描述的两个同级层(全连接层和k+1类别softmax分类层,以及候选框的回归)。
最后,网络被修改为采用两种输入:图像的列表和这些图像的RoI列表。
用反向传播来训练网络中的所有权重是Fast R-CNN的重要性能。首先,来说说为什么SPPnet不能更新低于空间金字塔池化层的权值。
其根本原因是,每个训练样本是从不同的图像中的得到的,从SPP层反向传播是非常低效率的,这正是训练R-CNN和SPPnet的方法,低效率的部分是因为每个RoI可能具有非常大的感受野,通常跨越整个输入图像,由于正向传播必须处理整理感受野,训练输入很大。
本文提出了一个更高效的训练方法,引入了特征图共享机制。在Fast RCNN的训练过程中,SGD的小批量样本是分层抽样的,首先采样 N N N幅图像,之后从每个图像中采样 R / N R/N R/N 个RoI。从每个图像中采样的RoI在前向传播和反向传播的过程中的计算和存储都是共享的,这样就能够使得一个小批量的计算速度减小为原来的 1 / N 1/N 1/N。例如,使用 N = 2 , R = 128 N=2,R=128 N=2,R=128,本文的方法大约比从128个不同图像中采样一个RoI的方法(R-CNN或SPPnet等)快约64倍。
该方法的一个令人担心的点在于它可能导致训练收敛缓慢,因为来自相同图像的RoI是有相关性的。但实际上好像并不存在这个问题,当 N = 2 , R = 128 N=2,R=128 N=2,R=128我们使用比R-CNN更少的SGD迭代次数获得了更好的效果。
除了分层采样,Fast R-CNN使用了一个精细的训练过程,在微调阶段联合优化softmax分类器和候选框的回归,而不是在三个独立的阶段分别训练softmax分类器、SVM和回归器。
多任务损失:
Fast R-CNN网络有两个同级输出层,第一个在 K + 1 K+1 K+1个类别上对每个RoI输出离散的概率估计, p = ( p 0 , . . . , p K ) p=(p_0,...,p_K) p=(p0,...,pK),一般来说,p是从全连接层的 K + 1 K+1 K+1中输出中计算得到的。第二个层输出包围盒的回归偏移量, t k = ( t x k , t y k , t w k , t h k , ) t^k=(t_x^k, t_y^k, t_w^k, t_h^k,) tk=(txk,tyk,twk,thk,),k是每个目标类别。我们利用[9]中的参数化 t k t^k tk的方法,其中 t k t^k tk指定相对于候选框的尺度不变转换和对数空间高度/宽度偏移。
每个训练的RoI都用真值GT进行标记,包括类别u和目标框的真值v,我们对每个标记的RoI使用多任务损失 L L L以联合训练分类和检测框回归:
其中, L c l s ( p , u ) = − l o g p u L_{cls}(p,u)=-log p_u Lcls(p,u)=−logpu,表示真类u的log损失。
第二个目标损失 L l o c L_{loc} Lloc定义了类别 u u u真实边界框的回归元组值 v = ( v x , v y , v w , v h ) v=(v_x,v_y,v_w,v_h) v=(vx,vy,vw,vh)和预测的元组 t u = ( t x u , t y u , t w u , t h u ) t^u=(t_x^u, t_y^u, t_w^u, t_h^u) tu=(txu,tyu,twu,thu)上的损失。Iverson指示函数 [ u ≥ 1 ] [u\ge 1] [u≥1]表示当 u ≥ 1 u \ge 1 u≥1值为1,否则为0。按照惯例,背景类标记为 u = 0 u=0 u=0,背景的RoIs没有检测框真值的概念,因此 L l o c L_{loc} Lloc被忽略,对于b-box回归,损失如下:
使用L1 loss是因为其对异常值没有R-CNN和SPPnet中使用的L2 loss那么敏感。当回归目标无界时,将L2作为损失函数的的训练可能需要仔细的调整学习速率,以防止梯度爆炸。公式3)避免了该状况。
公式1)中的超参数控制着两个损失之间的平衡,我们将GT回归目标 v i v_i vi进行零均值和标准方差归一化,所有的实验中都使用 λ = 1 \lambda =1 λ=1。
注意到,[6]中使用相关损失来训练一个与类别无关的目标候选网络,提出两个网络的系统分别进行定位和分类,OverFeat [19], R-CNN
[9], and SPPnet [11] 也训练分类器和检测框定位器,但这些方法使用逐级训练,对于Fast RCNN不是最好的选择。
小批量采样:
在微调的过程中,每个SGD的小批量是由 N = 2 N=2 N=2个图像构成,是通过均匀的随机选择而来的。我们使用小批量大小为 R = 128 R=128 R=128,对每个图像采样64个RoIs,如[9]中,我们从候选框中选取25%的RoI,这些候选框与检测框真值的IoU至少为0.5,这些RoI只包括前景对象标记类别,也就是 u ≥ 1 u\ge1 u≥1。其余的RoI从目标候选框中采样,选择保留在区间[0.1,0.5)上最大的IoU。低于0.1的IoU的样本被当做难确定的负样本来重新训练(hard example mining,hard negative就是每次把那些顽固的棘手的错误,再送回去继续练,练到你的成绩不再提升为止,这一个过程就叫做’hard negative mining’.)[8]。训练过程中,图像以0.5的概率水平翻转,不使用其他数据增强方式。
通过RoI pooling层的反向传播:
为了简单起见,假设每个小批量只有一个图像,之后可以扩展到 N > 1 N>1 N>1的情况。
令 x i ∈ R x_i\in R xi∈R为第i个激活输入, y r j y_{rj} yrj为第r个RoI的第j层的输出,RoI pooling层的计算为 y r j = x i ∗ ( r , j ) y_{rj}=x_{i*(r,j)} yrj=xi∗(r,j),其中 i ∗ ( r , j ) = a r g m a x i ′ ∈ R ( r , j ) x i ′ i*(r,j)=argmax_{i' \in R_{(r,j)}}x_{i'} i∗(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 pooling层的反向传播函数是利用argmax switches的方法来计算关于每个输入变量 x i x_i xi损失函数的偏导数:
对每个小批量RoI(r)和每个池化输出单元 y r j y_{rj} yrj,如果通过最大池化来对 y r j y_{rj} yrj选择 i i i,那么偏导 ∂ L / ∂ y r j \partial L/ \partial y_{rj} ∂L/∂yrj是会累积的,反向传播过程中,偏导 ∂ L / ∂ y r j \partial L/ \partial y_{rj} ∂L/∂yrj已经从RoI池化层顶部的层的反向函数中计算得来了。
SGD超参数:
利用softmax分类和b-box回归的全连接层的初始化是0均值的高斯分布,标准差为0.01或0.001。偏置初始化为0,所有层中,每层权值的学习率为1,偏置的学习率为2,全局学习率为0.001。当对VOC2007或VOC2012训练时,我们运行SGD进行30k次小批量迭代,然后将学习率降低到0.0001,并且再进行10k次迭代。当使用更大的数据集时,运行SGD更多次,使用0.9的动量和0.0005的参数衰减(权值和偏置)。
我们将利用两种方法来实现目标检测中的尺度不变性:1)通过“brute force”学习,2)通过图像金字塔。
“brute force”方法中,训练和测试的每幅图像都被处理为预定义像素大小的图像,网络必须直接从训练数据学习尺度不变性目标检测。
相反的在多尺度方法中,通过图像金字塔向网络提供尺度不变性,测试时,图像金字塔被用来对每个目标框进行尺度规范化,多尺度的训练中,我们随机采样金字塔尺度,作为数据增强,由于GPU内存的限制,我们只对较小的网络进行多尺度训练。
一旦Fast R-CNN网络微调完成,检测的次数远远超过运行前向传播次数(假设目标框被提取计算好了)。网络将图像(或图像金字塔,编码为图像列表)和待计算概率的 R R R个候选框列表作为输入。测试时, R R R通常在2000左右,尽管我们考虑将其变大(45k左右)。当使用一个图像金字塔时,每个RoI都被缩放一定的尺度,使得缩放后的RoI接近 22 4 2 224^2 2242大小。
对每个测试的RoI r r r,前向传播输出类别的后验概率分布 p p p和一系列预测的b-box相对于 r r r的偏移(每个类别获得其精细的边界框预测)。并且利用概率估计 P r ( c l a s s = k ∣ r ) = p k Pr(class=k|r)=p_k Pr(class=k∣r)=pk来对第k类的r计算检测置信度,之后对每个类独立使用非极大值抑制来确定保留的框。
对于整幅图像的分类任务,全连接层花费的时间比卷积层花费的时间要少。相反,检测任务中要处理的RoIs的数量很多,全连接层花费的时间基本上是卷积过程的两倍(Fig.2)。可以将大型的全连接层和截断SVD结合起来来加速。
一层大小为 u × v u\times v u×v的权重参数 W W W可以进行SVD因式分解:
W ≈ U Σ t V T W\approx U\Sigma_tV^T W≈UΣtVT
在这种分解中, U U U是一个 u × t u\times t u×t的矩阵,包括 W W W的前 t t t个左奇异向量, Σ t \Sigma_t Σt是 t × t t\times t t×t对角矩阵,其包含 W W W的前 t t t个奇异值,并且 V V V是 v × t v\times t v×t的矩阵,包括 W W W的前 t t t个右奇异向量。截断SVD将参数数量从 u v uv uv 减少到 t × ( u + v ) t\times(u+v) t×(u+v) 个,如果 t t t远小于 m i n ( u , v ) min(u,v) min(u,v),则SVD可能起到重要的作用。 为了压缩网络,对应于 W W W的单个全连接层由两个全连接层替代,且在它们之间没有非线性。这些层中的第一层使用权重矩阵 Σ t V T \Sigma_tV^T ΣtVT(没有偏置),并且第二层使用 U U U(其中原始偏差与相关联)。当RoI的数量大时,这种简单的压缩方法给出良好的加速。
本文有三个主要的贡献点:
1)获得了在VOC 2007,2010,2012 上的最好mAP
2)比R-CNN和SPPnet获得了更快的训练和测试时间
3)VGG16网络的卷积层的微调提升了mAP
本文网络使用三个可线上获取的预训练ImageNet模型,第一个是来自R-CNN的CaffeNet(实质上是AlexNet)。我们将该Caffe模型称为S,即小模型,第二个网络是来自[3]的VGG-CNN-M-1024,其与S具有相同的深度,但是更宽,我们称为M,即中等模型。最后一个是来自[20]的非常深的VGG16模型,由于该模型最大,称为L。本节所有的实验都使用单尺度训练和测试(s=600)。
表2. VOC 2010测试检测平均精度(%)。 BabyLearning使用基于16的网络。 所有其他方法使用VGG16。训练集:12:VOC12 trainval,Prop.:专有数据集,12+seg:12具有分段注释,07++12:VOC07 trainval,VOC07测试和VOC12 trainval的联合。
表3. VOC 2012测试检测平均精度(%)。 BabyLearning和NUS_NIN_c2000使用基于16的网络。 所有其他方法使用VGG16。训练设置:见表2,Unk.:未知。
如上表(表2,表3)所示,在这些数据集上,我们比较Fast R-CNN(简称FRCN)和公共排行榜中comp4(外部数据)上的主流方法(http://host.robots.ox.ac.uk:8080/leaderboard )。对于NUS_NIN_c2000和BabyLearning方法,目前没有其架构的确切信息,它们是Network-in-Network的变体16。所有其他方法从相同的预训练VGG16网络初始化。
Fast R-CNN在VOC12上获得最高结果,mAP为65.7%(加上额外数据为68.4%)。它也比其他方法快两个数量级,这些方法都基于比较“慢”的R-CNN网络。在VOC10上,SegDeepM 6获得了比Fast R-CNN更高的mAP(67.2%对比66.1%)。SegDeepM使用VOC12 trainval训练集训练并添加了分割的标注,它被设计为通过使用马尔可夫随机场推理R-CNN检测和来自17的语义分割方法的分割来提高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的mAP。 所有方法从相同的预训练VGG16网络开始,并使用边界框回归。 VGG16 SPPnet结果由5的作者提供。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 RCNN,R-CNN和SPPnet之间的训练时间(小时),测试速率(每秒图像数)和VOC07上的mAP。对于VGG16,没有截断SVD的Fast R-CNN处理图像比R-CNN快146倍,有截断SVD的R-CNN快213倍。训练时间减少9倍,从84小时减少到9.5小时。与SPPnet相比,没有截断SVD的Fast RCNN训练VGG16网络比SPPnet快2.7倍(9.5小时对25.5小时),测试时间快7倍,有截断SVD的Fast RCNN比的SPPnet快10倍。 Fast R-CNN还不需要数百GB的磁盘存储,因为它不缓存特征。
截断的SVD可以将检测时间减少30%以上,同时在mAP中只有很小(0.3个百分点)的下降,并且无需在模型压缩后执行额外的微调。
图2. 截断SVD之前和之后VGG16的时间分布。在SVD之前,完全连接的层fc6和fc7需要45%的时间。
图2示出了如何使用来自VGG16的fc6层中的矩阵的顶部1024个奇异值和来自fc7层的矩阵的顶部256个奇异值减少运行时间,而在mAP中几乎没有损失。如果在压缩之后再次微调,则可以在mAP中具有更小的下降的情况下进一步加速。
对于不太深的网络SPPnet,仅仅在全连接层应用,用于获取更好的效果。假定该方法不适用于深度网络结构,为了验证微调卷积层对VGG16的重要性,我们使用Fast R-CNN微调,冻结十三个卷积层,以便只有全连接层学习,这种消融模拟单尺度SPPnet训练,将mAP从66.9%降低到61.4%(Table 5),这个实验验证了我们的假设:通过RoI池化层的训练对于非常深的网络是很重要的。
这是否意味着所有的卷积层都需要微调?答案是否定的。在小点的网络中(S和M)我们发现conv1(第一个卷积层)是通用且独立完成任务的。允许conv1学习或者不学习对mAP并没有很大的影响意义。对于VGG16,我们发现只需要更新conv3_1以及在其之上的层(13个卷积层之中的9个)。这种观察是实用的:1)从conv2_1的训练更新慢1.3倍(12.5小时对比9.5小时)和(2)从conv1_1更新GPU内存不够用。当从conv2_1学习时mAP仅为增加0.3个点(表5,最后一列)。 所有Fast R-CNN在本文中结果都使用VGG16微调层conv3_1及以上的层,所有实验用模型S和M微调层conv2及以上的层。
我们通过实验来了解FastR-CNN和R-CNN与SPPnet的区别,以及评估设计决策。按照最佳实践,我们在PASCAL VOC07数据集上进行实验。
多任务训练是很方便的,因为它避免了管理顺序训练任务的流水线。但它也有可能改善结果,因为任务通过共享的表示(ConvNet)18相互影响。多任务训练能提高Fast R-CNN中的目标检测精度吗?
为了测试这个问题,我们训练仅使用公式中的分类损失(即设置)的基准网络。这些基线是表6中每组的第一列。请注意,这些模型没有检测框回归。接下来(每组的第二列),是我们采用多任务损失(公式,)训练的网络,但是我们在测试时禁用检测框回归。这隔离了网络的分类准确性,并允许与基准网络的apple to apple的比较。
在所有三个网络中,我们观察到多任务训练相对于单独的分类训练提高了纯分类精度。改进范围从+0.8到+1.1 个mAP点,显示了多任务学习的一致的积极效果。
最后,我们采用基线模型(仅使用分类损失进行训练),加上检测回归层,并使用训练它们,同时保持所有其他网络参数冻结。每组中的第三列显示了这种逐级训练方案的结果:mAP相对于第一列改进,但逐级训练表现不如多任务训练(每组第四列)。
表6. 多任务训练(每组第四列)改进了分段训练(每组第三列)的mAP。
我们比较两个策略实现目标检测的尺度不变性:暴力学习(单一尺度)和图像金字塔(多尺度)。同时,我们定义一副图像的尺度s为其最短边的长度。
所有的单一尺度使用 s = 600 s=600 s=600像素,一些图像的 s s s 可能比600小,因为我们保持纵横比缩放图像,并限制其最长边为1000像素。选择这些值会使得VGG16在微调期间不会出现内存不足的现象,较小的模型占用内存较少,并且可以从较大的 s s s 中受益,然而,对每个模型优化 s s s 并非我们的主要目的。PASCAL 图像的像素是384*473,因此单尺度设置通常以1.6倍上采样图像,故RoI层的平均有效步长约为10像素。
在多尺度设置中,我们使用指定相同的五个尺度( s ∈ 480 ; 576 ; 688 ; 864 ; 1200 s\in {480; 576; 688; 864; 1200} s∈480;576;688;864;1200)来方便与SPPnet进行比较,但是我们以2000像素为上限,避免出现内存不足。
表7展示了使用单一尺度或五个尺度的模型 S 和 M 的结果,也许在[11]中最让人惊讶的结果是单尺度检测竟然几乎与多尺度检测的效果一样好,我们的发现能证明[11]中的结果:深度卷积网络擅长学习尺度不变性。多尺度的方法消耗大量的时间但仅仅带来了很少的mAP提升(表7)。在VGG16(模型L)的情况下,我们仅限于使用单一尺度来实施细节,达到了66.9%的mAP,比R-CNN的66.0%略高,尽管R-CNN在每个候选区域被缩放为规范大小,使用了“无限尺度”。
因为单一尺度处理提供了速度和精度之间的最佳折衷,特别是对于非常深的模型,本小节以外的所有实验都使用单尺度训练和测试,且尺度 s = 600 s=600 s=600。
一个好的目标检测器的效果是随着训练数据的增加而提升的,[24]中发现DPM[8]的mAP在只有几百到几千个训练样本的时候就饱和了,在这里我们增加了VOC2007 trainval训练集和VOC2012 trainval训练集,大约增加到三倍达到16.5k来评估Fast R-CNN的效果。扩大训练集在VOC07上的mAP达到了70%,且我们使用60k次迭代而非40k次。
我们对VOC10和2012进行类似的实验,我们用VOC07 trainval,test和VOC12 trainval构造了21.5k图像的数据集。当训练这个数据集时,我们使用100k次SGD迭代和每40k次迭代(而不是每30k次)降低学习率10倍。对于VOC10和2012,mAP分别从66.1%提高到68.8%和从65.7%提高到68.4%。
Fast R-CNN在微调期间使用softmax分类器学习,而非R-CNN中的SVM,为了阐明做出该选择的原因,我们在Fast R-CNN中实施了具有难负采样重新练的SVM,且参数与R-CNN中相同。
图8中展示了在这三个网络中,softmax的效果比SVM略好,对mAP的提升约为0.1~0.8个点之间,这种影响很小,但是它表明了与先前的多级训练方法相比,“一次性”的微调是足够的,且softmax不会像SVM一样在分类RoI时引入竞争。
(广义上)存在两种类型的检测器:使用候选区域的稀疏集合(如选择性搜索)和使用密集集合(如DPM)。分类稀疏候选是级联的一种类型,其中候选机制首先拒绝了很大数量的候选框,留下一小部分来进行评估。当应用DPM检测时,这种级联提高了检测精度,且我们发现级联候选分类器也提高了Fast R-CNN的精度。
利用选择性搜索模式,我们对每个图像都扫描1k到10k个候选框,每次重新训练和重新测试M模型,加入候选框纯粹扮演的计算的角色,则增加每个图像的候选框数量不会对mAP造成负面影响。
我们发现,mAP先上升后随着候选框数量的增加而有些下降(蓝色实线),该实验表明,用更多的候选区域可能并没有mAP提升的作用,甚至会有负面影响。
如果不实际运行该实验,那么很难预测出这样的结果,用于测量候选区域质量的最先进的技术是平均召回率(AR)。当对每个图像都实验相同数量的候选区域时,在R-CNN中使用多种不同的候选区域方法的AR与mAP有很大的相关性。图3展示了当每个图像的候选框数量不是固定的时候,AR(红色实线)与mAP并没有很好的相关性。AR的使用必须很小心,很多的候选区域获得的高的AR并不意味着mAP会增加。幸运的是,训练和测试模型M仅仅花费了不到2.5个小时,故Fast-RCNN能够高效的,直接评估目标检测的mAP,这就优于间接度量了。
我们同样研究了使用密集生成框(缩放、位置、宽高比等)的Fast R-CNN,大约每个图像中45k个框,这些密集的框集合足够丰富,当每个候选框使用与其最近的框来代替它后,mAP只降低1个百分点(图3中蓝色三角指示的点,约为57.7%)。
使用密集框的统计结果与选择性搜索的框有很大的不同,从2k个选择性搜索框开始,我们随机采样$1000 × {2; 4; 6; 8; 10; 32; 45} $个密集框来测试mAP,对于每个实验,我们重新训练和重新测试模型M,加上这些密集框之后,mAP比添加更多选择性搜索框时下降的更厉害,甚至到了53%。
同时我们还仅仅利用密集框(每幅图约45k个框)训练并测试了Fast R-CNN,此时的mAP是52.9%(蓝色的菱形)。最后,我们检查是否需要使用难分负样本来重新练SVM来处理密集矿的分布,SVM更糟:49.3%。
我们对MS COCO (使用VGG16)应用于MS COCO数据集以建立初步基线,我们对80k大小的训练集进行240k次的迭代,并使用评估服务器对“test-dev”集进行评估,PASCAL VOC mAP为35.9%,新的COCO标准下的AP为19.7%。
本文提出了Fast R-CNN,一种比R-CNN和SPPnet都简洁高效的网络结构。除了目前的最好的检测结果以外,我们还提供了新的见解和详细实验过程。稀疏的目标候选框似乎提高了检测的效果,这个观点在过去花费了很长的时间来探索,但是Fast R-CNN用实验证明了这一点。当然,肯定存在一些我们没有发现的方法能够使得密集框的表现和稀疏框的表现一样优秀,如果后面发现了这样的技术,那么可以帮助目标检测向前有很大的发展。