(目标检测篇)系列文章目录
第一章:R-CNN网络详解
第二章:Fast R-CNN网络详解
第三章:Faster R-CNN网络详解
第四章:YOLO v1网络详解
第五章:YOLO v2网络详解
第六章:YOLO v3网络详解
文章目录
- 系列文章目录
- 技术干货集锦
- 前言
- 一、摘要
- 二、正文分析
- 1.引入库
- 2.读入数据
- 总结
技术干货集锦
Fast R-CNN算法流程可分为3个步骤:
- 一张图像生成1k~2k个候选区域(使用Selective Search方法)
- 将图像输入网络得到相应的特征图,将SS算法生成的候选框,投影到特征图上获得相应的特征矩阵
- 将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着将特征图展平通过一些列全连接层得到预测结果
不同点:
一次性计算整张图现特征。R-CNN依次将候选框区域输入卷积神经网络得到特征。
Fast-RNN将整张图像送入网络,紧接着从特征图像上提取相应的候选区域。这些候选区域的特征不需要再进行重复的计算。(不限制输入图像的尺寸)
训练数据的采样(正样本,负样本)
Fast R-CNN框架
Region Proposal(Selective Search) |
Feature extraction Classification Bounding-box regression (CNN) |
前言
引言 最近,深度卷积神经网络(Deep ConvNets)在图像分类和目标检测的准确性方面取得了显著的进展。与图像分类相比,目标检测是一项更具挑战性的任务,需要更复杂的方法来解决。由于这种复杂性,当前的方法(例如[9,11,19,25])在多阶段的流程中训练模型,这种方法速度慢且不够优雅。复杂性的原因在于检测需要准确地定位物体,这带来了两个主要的挑战。首先,需要处理大量的候选物体位置(通常称为“提案”)。其次,这些候选物体位置仅提供粗略的定位,需要进行精细调整才能实现精确的定位。解决这些问题的方法往往会在速度、准确性或简单性方面做出妥协。在本文中,我们简化了基于最先进的卷积神经网络的目标检测器的训练过程。我们提出了一种单阶段的训练算法,可以同时学习对目标提案进行分类和调整其空间位置。所得到的方法可以比R-CNN [9]快9倍、比SPPnet [11]快3倍来训练一个非常深的检测网络(VGG16 [20])。在运行时,检测网络在0.3秒内处理图像(不包括目标提案的时间),同时在PASCAL VOC 2012 [7]上实现了66%的mAP(相比R-CNN的62%)的高准确性
一、摘要
本文提出了一种快速区域卷积网络方法(Fast R-CNN)用于目标检测。Fast R-CNN在以前的工作基础上,利用深度卷积网络有效地对目标提案进行分类。与以前的工作相比,Fast R-CNN引入了几个创新来提高训练和测试速度,同时也提高了检测准确性。Fast R-CNN训练使用了非常深的VGG16网络,比R-CNN快9倍,测试时间快213倍,并在PASCAL VOC 2012上达到更高的平均精度(mAP)。与SPPnet相比,Fast R-CNN训练VGG16网络快3倍,测试快10倍,并且更准确。Fast R-CNN使用Python和C++(使用Caffe实现),并在开源MIT许可下提供。
二、正文分析
1.1 R-CNN和SPPnet 基于区域的卷积网络(Region-based Convolutional Network,R-CNN)方法[9]通过使用深度卷积网络对目标提案进行分类来实现出色的目标检测准确性。然而,R-CNN存在一些明显的缺点:
- 训练是一个多阶段的流程。R-CNN首先使用对数损失函数对目标提案上的卷积网络进行微调。然后,它使用SVM对卷积网络特征进行拟合。这些SVM充当目标检测器,取代了通过微调学习的softmax分类器。在第三个训练阶段,学习边界框回归器。
- 训练成本高,占用空间和时间。对于SVM和边界框回归器的训练,需要从每个图像中的每个目标提案中提取特征,并将其写入磁盘。对于像VGG16这样非常深的网络,处理VOC07 trainval数据集的5k张图像需要2.5个GPU天。这些特征需要数百GB的存储空间。
- 目标检测速度慢。在测试时,需要从每个测试图像中的每个目标提案中提取特征。使用VGG16进行检测需要每张图像47秒(在GPU上)。R-CNN的速度慢是因为它对每个目标提案都执行一次卷积网络的前向传播,没有共享计算。 空间金字塔池化网络(Spatial Pyramid Pooling Networks,SPPnet)[11]被提出来加速R-CNN,通过共享计算。SPPnet方法计算整个输入图像的卷积特征图,然后使用从共享特征图中提取的特征向量对每个目标提案进行分类。对于一个提案,通过将提案内部的特征图部分进行最大池化,得到一个固定大小的输出(例如6×6)。多个输出大小被池化,然后像空间金字塔池化[15]一样连接起来。SPPnet在测试时将R-CNN的速度加快了10到100倍。由于更快的提案特征提取,训练时间也减少了3倍。
SPPnet也有明显的缺点。与R-CNN类似,训练是一个多阶段的流程,涉及提取特征、使用对数损失函数对网络进行微调、训练SVM,最后拟合边界框回归器。特征也被写入磁盘。但与R-CNN不同的是,[11]中提出的微调算法无法更新空间金字塔池化层之前的卷积层。这个限制(固定的卷积层)限制了非常深的网络的准确性。
1.2.贡献 我们提出了一种新的训练算法,解决了R-CNN和SPPnet的缺点,并在速度和准确性上有所改进。我们将这种方法称为Fast R-CNN,因为相对于训练和测试来说速度较快。Fast R-CNN方法具有以下几个优点:
- 比R-CNN和SPPnet具有更高的检测质量(mAP)。
- 训练是单阶段的,使用多任务损失函数。
- 训练可以更新所有的网络层。
- 不需要对特征进行磁盘存储。 Fast R-CNN使用Python和C++(Caffe [13])编写,并在开源MIT许可下提供,网址为https://github.com/rbgirshick/fast-rcnn。
(图1. Fast R-CNN架构。输入图像和多个感兴趣区域(RoIs)被输入到一个全卷积网络中。每个RoI被池化为一个固定大小的特征图,然后通过全连接层(FCs)映射为特征向量。网络每个RoI有两个输出向量:softmax概率和每个类别的边界框回归偏移量。该架构使用多任务损失进行端到端的训练。)
2.Fast R-CNN的架构和训练
图1展示了Fast R-CNN的架构。Fast R-CNN网络接受整个图像和一组目标提案作为输入。网络首先通过几个卷积(conv)和最大池化层对整个图像进行处理,生成一个卷积特征图。然后,对于每个目标提案,一个感兴趣区域(RoI)池化层从特征图中提取一个固定长度的特征向量。每个特征向量被输入到一系列全连接(fc)层中,最终分为两个平行的输出层:一个生成K个目标类别的softmax概率估计,还有一个输出每个目标类别的四个实数值。每组4个值编码了K个类别的精炼边界框位置。
2.1. RoI池化层
RoI池化层使用最大池化将任何有效感兴趣区域内的特征转换为具有固定空间范围H×W(例如7×7)的小特征图,其中H和W是与任何特定RoI无关的层超参数。在本文中,RoI是对卷积特征图的矩形窗口。每个RoI由一个四元组(r;c;h;w)定义,指定其左上角(r;c)和其高度和宽度(h;w)
RoI最大池化的工作原理是将h × w的RoI窗口分割成一个大小约为h=H × w=W的H × W的子窗口网格,然后对每个子窗口中的值进行最大池化,得到相应的输出网格单元。池化是独立应用于每个特征图通道的,就像标准的最大池化一样。RoI层是SPPnet中使用的空间金字塔池化层的特例[11],其中只有一个金字塔级别。我们使用[11]中给出的池化子窗口计算方法。
2.2.从预训练网络进行初始化
我们使用了三个预训练的ImageNet网络进行实验,每个网络都有五个最大池化层和五到十三个卷积层(有关网络细节,请参见第4.1节)。当一个预训练网络初始化Fast R-CNN网络时,它经历了三个转换。首先,最后一个最大池化层被一个RoI池化层替换,该层的配置通过将H和W设置为与网络的第一个全连接层兼容(例如,对于VGG16,H=W=7)。其次,网络的最后一个全连接层和softmax层(用于1000类的ImageNet分类)被之前描述的两个平行层替换(一个全连接层和K+1个类别的softmax以及类别特定的边界框回归器)。第三,网络被修改为接受两个数据输入:一个图像列表和这些图像中的RoI列表。
2.3.用于检测的微调 使用反向传播训练所有网络权重是Fast R-CNN的一个重要能力。首先,让我们阐明为什么SPPnet无法更新空间金字塔池化层以下的权重。根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播非常低效,而这正是R-CNN和SPPnet网络的训练方式。低效性源于每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于前向传递必须处理整个感受野,训练输入数据很大(通常是整个图像)。
我们提出了一种更高效的训练方法,利用训练过程中的特征共享。在Fast RCNN训练中,采用随机梯度下降(SGD)逐层采样小批量,首先从N个图像中采样,然后从每个图像中采样R = N个RoIs。关键是,同一图像中的RoIs在前向和后向传递中共享计算和内存。将N设定较小可以减少小批量计算。例如,当使用N = 2和R = 128时,所提出的训练方案大约比从128个不同图像中采样一个RoI(即R-CNN和SPPnet策略)快64倍。
对于这种策略的一个担忧是,由于来自同一图像的RoIs之间存在相关性,可能会导致训练收敛缓慢。然而,这个担忧似乎并不是一个实际问题,我们使用比R-CNN更少的SGD迭代次数,在N=2和R=128的情况下取得了良好的结果。除了分层采样,Fast R-CNN还使用了一种简化的训练过程,其中包括一个微调阶段,同时优化softmax分类器和边界框回归器,而不是在三个独立的阶段中训练softmax分类器、SVM和回归器[9,11]。下面将描述这个过程的各个组成部分(损失函数、小批量采样策略、通过RoI池化层的反向传播和SGD超参数)。
多任务损失。
Fast R-CNN网络有两个相邻的输出层。
第一个输出一个离散的概率分布(对于每个RoI),p = (p0, ..., pK),其中K+1表示类别的数量。通常情况下,p是通过对全连接层的K+1个输出进行softmax计算得到的。
第二个相邻层输出每个对象类别(由k索引)的边界框回归偏移量,tk = tkx; tky; tkw; tkh。我们使用[9]中给出的tk的参数化形式,其中tk指定了与对象提议相对的尺度不变平移和对数空间的高度/宽度变化。每个训练RoI都标有一个真实类别u和一个真实边界框回归目标v。我们使用多任务损失L对每个带标签的RoI进行联合分类和边界框回归的训练:L(p,u,tu,v) = Lcls(p,u) + λ[u ≥ 1]Lloc(tu,v),其中Lcls(p,u) = -log pu是真实类别u的对数损失。第二个任务损失Lloc是在类别u的真实边界框回归目标元组v = (vx, vy, vw, vh)和预测元组tu = (tux, tuy, tuw, tuh)上定义的。对于背景RoI,没有真实边界框的概念,因此忽略Lloc。对于边界框回归,我们使用损失函数Lloc(tu,v) = ΣsmoothL1(tui - vi),其中smoothL1(x) = (0.5x^2 if |x| < 1, |x| - 0.5 otherwise)是一个鲁棒的L1损失函数,相对于R-CNN和SPPnet中使用的L2损失函数对异常值不敏感。当回归目标没有界限时,使用L2损失训练可能需要仔细调整学习率以防止梯度爆炸。方程式3消除了这种敏感性。方程式1中的超参数λ控制两个任务损失之间的平衡。我们将真实边界框回归目标vi标准化为均值为零,方差为一。所有实验中使用λ=1。我们注意到[6]使用了相关的损失函数来训练一个与类别无关的对象提议网络。与我们的方法不同,[6]主张使用两个网络系统分别进行定位和分类。OverFeat [19]、R-CNN [9]和SPPnet [11]也训练分类器和边界框定位器,但这些方法使用了阶段性训练,我们证明了这对于Fast R-CNN是次优的(第5.1节)。
小批量采样。
在微调过程中,每个SGD小批量是从N=2个图像中随机选择的(常见做法是对数据集的排列进行迭代)。我们使用大小为R=128的小批量,从每个图像中采样64个RoI。与[9]中一样,我们从与至少0.5的ground truth边界框具有交叠的对象提议中采样25%的RoI。这些RoI组成了标记有前景对象类别(即u≥1)的示例。剩下的RoI从与ground truth的最大IoU在区间[0.1,0.5)中的对象提议中采样,遵循[11]的方法。这些是背景示例,标记为u=0。0.1的较低阈值似乎是一种艰难示例挖掘的启发式方法[8]。在训练过程中,图像以0.5的概率进行水平翻转。没有使用其他数据增强技术。通过RoI池化层进行反向传播。反向传播通过RoI池化层传递导数。为了清晰起见,我们假设每个小批量只有一个图像(N=1),尽管扩展到N>1是直接的,因为正向传播将所有图像独立处理。设xi∈R为进入RoI池化层的第i个激活输入,yrj为第j个输出的层的r个RoI。RoI池化层计算yrj=xi∗(r;j),其中i∗(r;j)=argmaxi02R(r;j)xi0.R(r;j)是输出单元yrj进行最大池化的子窗口中输入的索引集合。一个xi可以分配给多个不同的输出yrj。RoI池化层的反向函数通过跟随argmax开关计算了损失函数相对于每个输入变量xi的偏导数:@L @xi =X r r Xj [i =i∗(r;j)]@L @y @@yrj :(4)简而言之,对于每个小批量RoI r和每个池化输出单元yrj,如果i是通过最大池化选择为yrj的argmax,则累积偏导数@L=@yrj。在反向传播中,偏导数@L=@yrj已经被RoI池化层上面的层的反向函数计算出来。SGD超参数。用于softmax分类和边界框回归的全连接层从零均值高斯分布中初始化,标准差分别为0.01和0.001。偏置初始化为0。所有层的权重采用每层学习率为1,偏置为2,全局学习率为0.001。当在VOC07或VOC12 trainval上训练时,我们运行30k个小批次迭代的SGD,然后将学习率降低为0.0001,并继续训练10k个迭代。当在更大的数据集上训练时,我们运行更多的迭代,具体描述如后。使用0.9的动量和0.0005的参数衰减(对于权重和偏置)。
2.4. 尺度不变性
我们探索了两种实现尺度不变目标检测的方法:
(1)通过“蛮力”学习和
(2)使用图像金字塔。
这些策略遵循[11]中的两种方法。在蛮力方法中,每个图像在训练和测试过程中都以预定义的像素大小进行处理。网络必须直接从训练数据中学习尺度不变的目标检测。相反,多尺度方法通过图像金字塔向网络提供近似尺度不变性。在测试时,图像金字塔用于近似尺度标准化每个目标提议。在多尺度训练过程中,我们每次采样一个金字塔尺度,作为数据增强的一种形式,遵循[11]。由于GPU内存限制,我们只对较小的网络进行多尺度训练的实验。
3. 快速R-CNN检测
一旦Fine-tune了快速R-CNN网络,检测就只需要运行前向传递(假设目标提议已经预先计算)。网络接收一个图像(或作为图像列表编码的图像金字塔)和一组R个目标提议来进行评分。在测试时,R通常约为2000,尽管我们也会考虑更大的情况(约45k)。当使用图像金字塔时,将每个RoI分配给最接近2242像素面积的尺度,然后对其进行缩放[11]。对于每个测试RoI r,前向传递输出一个类别后验概率分布p和一组相对于r的预测边界框偏移量(每个K类别都有自己的改进边界框预测)。我们使用估计的概率Pr(class = k | r) = ∆pk为每个对象类别k分配检测置信度。然后,我们对每个类别独立进行非最大值抑制,使用R-CNN[9]中的算法和设置。
3.1. 用截断SVD加速检测
对于整个图像分类任务,与卷积层相比,计算全连接层所需的时间较少。相反,对于检测任务,需要处理的RoI数量较多,几乎有一半的前向传递时间用于计算全连接层(见图2)。通过使用截断SVD [5,23]来压缩大型全连接层可以轻松加速计算。在这种技术中,由u×v权重矩阵W参数化的一层被近似分解为W ≈ UΣtV T(5),其中使用SVD。在这个分解中,U是一个u×t矩阵,由W的前t个左奇异向量组成,Σt是一个t×t的对角矩阵,包含W的前t个奇异值,而V是一个v×t矩阵,由W的前t个右奇异向量组成。截断SVD将参数数量从uv减少到t(u + v),如果t远小于min(u;v),这将是显著的。为了压缩一个网络,与W对应的单个全连接层被两个全连接层替代,它们之间没有非线性。这其中的第一个层使用权重矩阵ΣtV T(没有偏置),第二个层使用U(与W关联的原始偏置)。当RoI的数量较多时,这种简单的压缩方法可以获得良好的加速效果。
4. 主要结果
本文的贡献得到了三个主要结果的支持:
- 在VOC07、2010和2012数据集上达到了最先进的mAP。
- 与R-CNN和SPPnet相比,训练和测试速度更快。
- 在VGG16的卷积层进行微调可以提高mAP。
4.1. 实验设置
我们的实验使用了三个预训练的ImageNet模型,这些模型可以在线获取。第一个模型是来自R-CNN的CaffeNet(本质上是AlexNet [14])。我们将这个CaffeNet简称为模型S,表示“小”。第二个网络是来自[3]的VGG CNN M 1024,它与模型S具有相同的深度,但更宽。我们将这个网络称为模型M,表示“中”。最后一个网络是来自[20]的非常深的VGG16模型。由于这个模型最大,我们称之为模型L。在本节中,所有实验都使用单尺度的训练和测试(s = 600;详见第5.2节)。
4.2. VOC 2010和2012的结果
在这些数据集上,我们将Fast R-CNN(简称FRCN)与公共排行榜上comp4(外部数据)轨道上的顶级方法进行比较(表2,表3)。对于NUS NIN c2000和BabyLearning方法,目前还没有相关的出版物,并且我们找不到有关使用的ConvNet架构的确切信息;它们是Network-in-Network设计的变体[17]。所有其他方法都是从相同的预训练VGG16网络初始化的。Fast R-CNN在VOC12上取得了最高的结果,mAP为65.7%(在额外数据的情况下为68.4%)。它还比其他方法快两个数量级,而其他方法都是基于“慢”R-CNN流程的。在VOC10上,SegDeepM [25]的mAP高于Fast R-CNN(67.2%对66.1%)。SegDeepM是在VOC12 train val和分割注释上进行训练的;它通过使用马尔可夫随机场对R-CNN检测和O2P [1]语义分割方法的分割进行推理,旨在提高R-CNN的准确性。Fast R-CNN可以替换R-CNN并用于SegDeepM,这可能会带来更好的结果。当使用扩大的07++12训练集时(见表2标题),Fast R-CNN的mAP增加到68.8%,超过了SegDeepM。
4.3. VOC 2007的结果 在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中没有使用标记为“difficult”的示例进行训练。移除这些示例将提高Fast R-CNN的mAP至68.1%。所有其他实验都使用了“difficult”示例。
4.4. 训练和测试时间 快速训练和测试时间是我们的第二个主要结果。表4比较了Fast R-CNN、R-CNN和SPPnet在VOC07上的训练时间(小时)、测试速率(每张图像的秒数)和mAP。对于VGG16,Fast R-CNN的处理速度比没有截断的SVD的R-CNN快146倍,并且比有截断的SVD的R-CNN快213倍。训练时间减少了9倍,从84小时减少到9.5小时。与SPPnet相比,Fast R-CNN训练VGG16的速度快2.7倍(9.5小时对25.5小时),测试速度快7倍(没有截断的SVD)或10倍(有截断的SVD)。Fast R-CNN还消除了数百GB的磁盘存储空间,因为它不缓存特征。
截断奇异值分解(Truncated SVD)可以将检测时间缩短30%以上,仅仅导致mAP下降0.3个百分点,并且无需在模型压缩后进行额外的微调。图2说明了在VGG16的fc6层中使用25088×4096矩阵的前1024个奇异值以及在4096×4096的fc7层中使用前256个奇异值可以减少运行时间,而mAP损失很小。如果在压缩后再次进行微调,还可以进一步提高速度,同时减少mAP的损失。
4.5. 哪些层应该进行微调? 在SPPnet论文[11]中考虑的较浅网络中,仅微调全连接层似乎已足够获得良好的准确性。我们假设这个结果在非常深的网络中不成立。为了验证对于VGG16,微调卷积层的重要性,我们使用Fast R-CNN进行微调,但是冻结了13个卷积层,只让全连接层进行学习。这种去除实验模拟了单尺度的SPPnet训练,并将mAP从66.9%降低到61.4%(表5)。这个实验证实了我们的假设:通过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 1层开始学习会超出GPU内存。从conv2 1层开始学习与从conv3 1层开始学习的mAP差异仅为+0.3点(表5,最后一列)。
本文中使用VGG16的Fast R-CNN结果都是微调conv3 1层及以上的层;所有使用S和M模型的实验都是微调conv2层及以上的层。
(表1. VOC 2007测试检测平均精度(%)。所有方法都使用VGG16。训练集关键词:07:VOC07 trainval,07 n diff:没有“difficult”示例的07,07+12:07和VOC12 trainval的并集。ySPPnet结果由[11]的作者准备。)
(表2. VOC 2010测试检测平均精度(%)。BabyLearning使用基于[17]的网络。所有其他方法都使用VGG16。训练集关键词:12:VOC12 trainval,Prop.:专有数据集,12+seg:带有分割注释的12,07++12:VOC07 trainval,VOC07 test和VOC12 trainval的并集。)
(表3. VOC 2012测试检测平均精度(%)。BabyLearning和NUS NIN c2000使用基于[17]的网络。所有其他方法都使用VGG16。训练集关键词:参见表2,Unk.:未知)
(表4. Fast R-CNN、R-CNN和SPPnet中相同模型的运行时间比较。Fast R-CNN使用单尺度模式。SPPnet使用在[11]中指定的五个尺度。yTiming由[11]的作者提供。时间是在Nvidia K40 GPU上测量的。)
(图2. VGG16在截断奇异值分解(truncated SVD)之前和之后的时间。在截断奇异值分解之前,全连接层fc6和fc7占用了总时间的45%。)
(表5. 限制对VGG16的哪些层进行微调的影响。微调≥fc6模拟了SPPnet训练算法[11],但只使用单一尺度。使用五个尺度的SPPnet L结果在速度上有显著的(7倍)损耗)
5.设计评估
我们进行了一系列实验,以了解Fast R-CNN与R-CNN和SPPnet相比的性能,并评估设计决策。按照最佳实践,我们在PASCAL VOC07数据集上进行了这些实验。
5.1 多任务训练是否有帮助?
多任务训练非常方便,因为它避免了管理一系列按顺序训练的任务。但它也有可能提高结果,因为这些任务通过共享表示(ConvNet)相互影响[2]。在Fast R-CNN中,多任务训练是否能提高目标检测的准确性?为了测试这个问题,我们训练了仅使用分类损失Lcls(即将λ设为0)的基准网络。在表6的每个组的第一列中,打印了这些基准模型的结果。注意,这些模型没有边界框回归器。 接下来(每个组的第二列),我们采用了使用多任务损失(Eq.1,λ=1)训练的网络,但在测试时禁用了边界框回归。这样可以独立评估网络的分类准确性,并与基准网络进行直接比较。我们观察到,在所有三个网络中,相对于仅进行分类训练,多任务训练可以提高纯分类准确性。改进的范围从+0.8到+1.1 mAP点不等,显示出多任务学习的一致正面效果。 最后,我们取基准模型(仅使用分类损失进行训练),加上边界框回归层,并在保持所有其他网络参数冻结的情况下,使用Lloc进行训练。每个组的第三列显示了这种阶段式训练方案的结果:mAP相对于第一列有所提高,但阶段式训练表现不如多任务训练(每个组的第四列)。
(表6. 多任务训练(每个组的第四列)相对于分阶段训练(每个组的第三列)提高了mAP。)
5.2 尺度不变性:野蛮学习还是优雅学习?
我们比较了两种实现尺度不变的目标检测策略:野蛮学习(单一尺度)和图像金字塔(多尺度)。无论哪种情况,我们将图像的尺度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]中最令人惊讶的结果是,单一尺度的检测准确率几乎与多尺度的检测准确率相当。我们的发现证实了他们的结果:深度ConvNet能够直接学习尺度不变性。多尺度方法只能在计算时间上付出巨大的代价,仅能稍微提高一点mAP(表7)。对于VGG16(L模型),由于实现细节的限制,我们只能使用单一尺度。然而,它实现了66.9%的mAP,略高于R-CNN [10]报告的66.0%,尽管R-CNN使用了“无限”尺度,即每个候选框都被扭曲为规范大小。由于单一尺度处理在速度和准确性之间提供了最好的折衷方案,尤其是对于非常深的模型,除了这个小节之外的所有实验都使用单一尺度的训练和测试,s = 600像素。
(表7. 多尺度与单一尺度的比较。SPPnet ZF(与模型S类似)的结果来自[11]。较大的网络在单一尺度下提供了最佳的速度/准确性权衡。(由于GPU内存限制,L模型无法在我们的实现中使用多尺度。)
5.3 我们需要更多的训练数据吗?
一个好的目标检测器在提供更多训练数据时应该有所改善。Zhu等人[24]发现,DPM [8]的mAP在仅有几百到一千个训练样本后就饱和了。在这里,我们将VOC07 trainval数据集与VOC12 trainval数据集合并,将图像数量大约增加到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迭代,并在每40k个迭代时将学习率降低0.1倍(而不是每30k个迭代)。对于VOC10和2012,mAP分别从66.1%提高到68.8%和从65.7%提高到68.4%。
5.4 SVM是否胜过softmax?
Fast R-CNN在微调期间使用softmax分类器,而不是像R-CNN和SPPnet中那样事后训练一对多的线性SVM。为了了解这个选择的影响,我们在Fast R-CNN中实现了事后使用硬负例挖掘进行SVM训练。我们使用与R-CNN相同的训练算法和超参数。
(表8. 使用softmax和SVM的Fast R-CNN对比(VOC07 mAP))
5.5 更多的候选区域总是更好吗?
目标检测器大致可以分为两种类型:使用稀疏一组候选区域的检测器(例如,selective search [21])和使用密集一组候选区域的检测器(例如,DPM [8])。对于稀疏候选区域的分类是一种级联方法 [22],其中候选机制首先拒绝大量候选区域,只留下少量供分类器评估。这种级联方法可以提高DPM检测的准确性 [21]。我们发现,候选区域分类器级联方法也可以提高Fast R-CNN的准确性。我们通过使用selective search的质量模式,每次从每张图像的1k到10k个候选区域范围内进行训练和测试模型M。如果候选区域仅起计算作用,增加每张图像的候选区域数量不应该对mAP产生负面影响。我们发现,随着候选区域数量的增加,mAP先上升,然后略微下降(图3,实线蓝色线)。这个实验表明,用更多的候选区域淹没深度分类器并不会提高准确性,甚至会略微降低准确性。
(图3. 不同的候选方案在VOC07测试集上的mAP和AR。)
这个结果在没有实际运行实验的情况下很难预测。衡量候选区域质量的最先进方法是平均召回率(AR)[12]。对于使用固定数量的候选区域的几种R-CNN候选方法,AR与mAP有很好的相关性。图3显示,随着每张图像的候选区域数量的变化,AR(实线红色线)与mAP的相关性不强。必须谨慎使用AR;候选区域数量增加导致的较高AR并不意味着mAP会增加。幸运的是,使用模型M进行训练和测试的时间不到2.5个小时。因此,Fast R-CNN可以高效地直接评估候选区域的mAP,这比使用代理指标更可取。我们还研究了在每个图像上以密集方式生成的候选框(包括尺度、位置和长宽比),大约每个图像有45k个候选框。这个密集的集合足够丰富,即使将每个selective search框替换为最接近(在IoU方面)的密集框,mAP仅下降1个百分点(至57.7%,图3,蓝色三角形)。密集框的统计特征与selective search框不同。从2k个selective search框开始,我们测试添加1000×f2、4、6、8、10、32、45g个密集框时的mAP。对于每个实验,我们重新训练和重新测试模型M。当添加这些密集框时,mAP下降得比添加更多的selective search框更明显,最终达到53.0%。我们还使用仅密集框(每个图像45k个)进行Fast R-CNN的训练和测试。这种设置得到的mAP为52.9%(蓝色菱形)。最后,我们检查是否需要使用带有困难负例挖掘的SVM来处理密集框分布。结果显示,SVM的表现甚至更差,为49.3%(蓝色圆圈)。
5.6. 初步的MS COCO结果
我们使用Fast R-CNN(使用VGG16)在MS COCO数据集[18]上建立了一个初步的基准。我们在80k个图像的训练集上进行了240k次迭代的训练,并在“test-dev”数据集上使用评估服务器进行了评估。PASCAL风格的mAP为35.9%;新的COCO风格AP,也考虑了IoU阈值的平均值,为19.7%。
总结
- 结论 本文提出了Fast R-CNN,这是对R-CNN和SPPnet的一种简洁快速的更新。除了报告最先进的检测结果外,我们还进行了详细的实验,希望能提供新的见解。特别值得注意的是,稀疏的目标提议似乎可以提高检测器的质量。过去,探索这个问题的成本(时间上的)太高,但通过Fast R-CNN变得可行。当然,可能存在尚未发现的技术,使得密集框的性能可以与稀疏提议一样好。如果开发出这样的方法,可能有助于进一步加速目标检测。