专栏链接:深度学习和论文精读
本文并非对论文直接进行翻译,增加了自己对于论文的理解,如有问题请及时指出~
前言
论文题目:《YOLO9000: Better, Faster, Stronger》
论文原文:https://arxiv.org/abs/1612.08242
论文来源:CVPR(CCF-A会议)
发表时间:2017
摘要
本文介绍了YOLO9000,一种最先进的实时对象检测系统,能够检测超过9000种对象类别。首先 提出了对YOLO检测方法的各种改进,这些改进既包括新颖之处,也借鉴了以往的工作 。改进后的模型,YOLOv2,在标准检测任务如PASCAL VOC和COCO上达到了最先进的水平。通过一种新颖的多尺度训练方法,同一个YOLOv2模型可以在不同大小下运行,提供了速度和准确性之间的简易权衡。在每秒67帧的情况下,YOLOv2在VOC 2007上获得了76.8的平均精度(mAP)。在每秒40帧的情况下,YOLOv2获得了78.6的mAP,超越了如Faster R-CNN with ResNet和SSD等最先进方法,同时运行速度明显更快。最后,提出了一种同时进行对象检测和分类训练的方法。通过这种方法,YOLO9000在COCO检测数据集和ImageNet分类数据集上同时进行训练。联合训练使YOLO9000能够预测那些没有标记检测数据的对象类别的检测结果。在ImageNet检测任务上的验证表明,尽管YOLO9000只有44种类别的检测数据,但它在ImageNet检测验证集上获得了19.7的mAP。在COCO中没有的156个类别上,YOLO9000获得了16.0的mAP。但是YOLO能检测的不仅仅是200个类别;它能预测超过9000种不同对象类别的检测结果。而且它仍然能实时运行。
1 介绍
用目的的对象检测应该是快速、准确的,并能识别各种各样的对象。自神经网络被引入以来,检测框架变得越来越快和准确。然而,大多数检测方法仍然限于一小部分对象。
当前的对象检测数据集与分类和标签等其他任务的数据集相比是有限的。最常见的检测数据集带有几十到几百个标签。分类数据集则带有数万到数十万个类别。
目标是使检测能够扩展到对象分类的水平。然而,为检测标记图片的成本远高于分类或标签(标签通常是用户免费提供的)。
本文提出了一种新方法,利用已有的大量分类数据,用它来扩展当前检测系统的范围。该方法使用对象分类的层次视图,允许结合不同的数据集。
本文还提出了一种联合训练算法,允许在检测和分类数据上训练对象检测器。该方法利用标记的检测图像学习精确定位对象,同时使用分类图像增加其词汇量和鲁棒性。
使用这种方法训练了YOLO9000,一种实时对象检测器,能够检测超过9000种不同的对象类别。首先改进了基础YOLO检测系统,产生了YOLOv2,一种最先进的实时检测器。然后使用数据集组合方法和联合训练算法,在ImageNet的9000多个类别以及COCO的检测数据上训练模型。
所有代码和预训练模型都可在线获得,网址为http://pjreddie.com/yolo9000/。
2 更好(Better)
相对于最先进的检测系统,YOLO存在多种缺点。与Fast R-CNN相比,对YOLO的错误分析显示YOLO会产生大量的定位错误。此外,与基于区域提议的方法相比,YOLO的召回率相对较低。因此,主要关注于提高召回率和定位精度,同时保持分类准确性。
计算机视觉通常趋向于更大、更深的网络。更好的性能常常依赖于训练更大的网络或将多个模型集成在一起。然而,对于YOLOv2,希望有一个更准确但仍然快速的检测器。不是扩大网络规模,而是简化网络,然后使表示更容易学习。汇集了过去工作中的多种想法及我们自己的新颖概念来提高YOLO的性能。结果见下表。
这里可以发现YOLOv2相交于YOLOv1新增了很多模块,最后的效果提升非常大。下面对每个模块将进行说明。
2.1 批量归一化(Batch Normalization)
BN在促进模型收敛方面带来了显著的改进,同时消除了对其他形式正则化的需求。通过在YOLO的所有卷积层上添加批量归一化,平均精度(mAP)上获得了超过2%的提升。批量归一化还有助于正则化模型。有了批量归一化,YOLOv1中的dropout层被移除。
BN层是一种广泛应用于深度学习中的技术,旨在加速深度网络的训练,同时提高模型的稳定性。它通过对每一层输入的批数据进行归一化处理,即调整数据的均值和方差,使得数据分布更加稳定。这种处理有几个关键好处:
- 加速收敛:通过减少内部协变量偏移(输入分布的变化),可以使用更高的学习率,从而加速模型的训练过程。
- 减少模型对初始化的敏感度:由于每层输入的数据都被归一化,模型对不同的参数初始化方式不那么敏感。
- 充当正则化:在一定程度上,批量归一化具有正则化效果,可以减轻模型的过拟合。这是因为在训练过程中,每个小批量数据的统计量会有所不同,为模型引入了一些噪声,相当于轻量级的数据增强。
在实际应用中,批量归一化层通常插入在卷积层(或全连接层)与激活函数之间。通过对中间层的激活值进行归一化,BN层帮助保持数据在整个网络中流动时的稳定性,使得深层网络的训练变得更加高效和可靠。
参考
BN层详解(含有公式推导过程)
BN层的学习(意义、效果、训练测试的区别、数学公式推导、反向传播公式解释证明)
2.2 高分辨率分类器(High Resolution Classifier)
所有最先进的检测方法都使用在ImageNet上预训练的分类器。从AlexNet开始,大多数分类器处理的输入图像大小小于256×256。YOLOv1在224×224的分辨率下训练分类网络,然后将分辨率增加到448进行检测。这意味着网络必须同时切换到学习对象检测并适应新的输入分辨率。
YOLOv2首先在ImageNet上以完整的448×448分辨率对分类网络进行10个epochs的微调。这让网络有时间调整其滤波器,以便更好地处理更高分辨率的输入。然后在检测任务上对结果网络进行微调。这种高分辨率的分类网络使YOLOv2的平均精度(mAP)几乎增加了4%。
2.3 使用锚框进行卷积(Convolutional With Anchor Boxes)
YOLO直接使用卷积特征提取器顶部的全连接层来预测边界框的坐标。与直接预测坐标不同,Faster R-CNN使用人为选定的先验框来预测边界框。Faster R-CNN中的区域提案网络(RPN)仅使用卷积层来预测锚框的偏移和置信度。由于预测层是卷积的,RPN在特征图的每个位置都预测这些偏移。预测偏移而不是坐标简化了问题,使网络更容易学习。
从YOLO中移除全连接层,并使用锚框来预测边界框。首先,去除一个池化层以使网络的卷积层输出分辨率更高。还将网络缩小,以处理416×416的输入图像而不是448×448。这样做是因为希望在特征图中有奇数个位置,这样就有一个中心单元格。
这里为什么要更改了输入图像大小? 主要是因为YOLO的卷积层将图像下采样32倍,如果输入为448×448,那么最终得到一个14×14(448/32)的输出特征图。见下图(图源路人贾’ω’),对于检测的物体而言,尤其是大的物体,它们往往占据图像的中心。这里就可能出现一个极端情况,就是目标检测框的中心点可能正好位于网络输入时候的划分线上(14x14),而YOLOv1中提到,负责物体预测的是物体中心点所在的单元网格(grid cell)。如果一个大物体的中心恰好落在这个特征图的分割线上,就会出现没有单个特定的网格单元(grid cell)明确负责预测这个物体的情况。
当转移到锚框(anchor)时,我们还将类预测机制与空间位置解耦,并为每个锚框预测类别和对象性。遵循YOLO,对象性预测仍然预测真实值和提出的框的IOU,而类预测预测在有对象的条件下该类的条件概率。使用锚框,我们的准确率略有下降。YOLOv1每张图像仅预测98个框,但使用锚框后,YOLOv2预测框超过一千个。没有锚框时,我们的中间模型获得69.5 mAP和81%的召回率。使用锚框后,我们的模型获得69.2 mAP和88%的召回率。尽管mAP有所下降,但召回率的增加意味着我们的模型有更大的改进空间。
2.4 维度聚类(Dimension Clusters)
当在YOLO中使用锚框(anchor)时,存在两个问题。第一个问题是锚框的尺寸是手动选择的。网络可以学习适当地调整这些框,但如果为了网络选择更好的先验作为起点,可以使网络更容易学习预测良好的检测结果。
为了不手动选择锚框,因此在训练集的边界框上运行k-means聚类,以自动找到好的先验框。由于是希望能够导致良好IoU得分的先验框,这与框的大小无关。因此,使用距离度量为:
d ( box , centroid ) = 1 − IOU ( box , centroid ) d(\text{box}, \text{centroid}) = 1 - \text{IOU}(\text{box}, \text{centroid}) d(box,centroid)=1−IOU(box,centroid)
针对不同的k值运行k-means,并绘制与最近中心点的平均交并比(IoU),见下图。
最终选择
k
=
5
k=5
k=5,作为模型复杂性和高召回率之间的良好权衡。聚类中心与手动挑选的锚框有显著不同。短宽框较少,而高瘦框较多。
下表中比较了聚类策略和手动挑选锚框的平均交并比(IoU)与最接近的先验(第一行是使用欧氏距离的结果)。仅使用5个先验框时,表现与手动选择的9个锚框相似,平均IOU为61.0,相比之下手动挑选的锚框是60.9。如果使用9个中心点,结果平均IOU更高。这表明使用k-means来生成边界框,会使得模型从一个更好的表示开始,并且使任务更容易学习。
这里举个例子,见下图(图源铁心核桃)。假如我们要检测图中的白色汽车,整个汽车的中心点大约在左后视镜所处的网格中。在YOLOv1中,这个网格会生成2个预测框,这2个框没有规定的形状或大小,他们通过“野蛮生长”去拟合真实框。而在YOLOv2中,根据预先设定的anchor,通过拟合后选择与真实框IoU最大的作为结果,在这里应是最外层的黄色框。
由于anchor选择5个,因此最终的预测结果形状也相较于YOLOv1有所改变,见下图(图源路人贾’ω’和铁心核桃)。
简单来说,在YOLOv1中,每个网格单元格(grid cell)预测了多个边界框(bounding boxes),但是每个网格单元格只预测了一组类别概率。这意味着在YOLOv1中,不管一个单元格预测了多少个边界框,所有这些框都共享相同的类别概率。而在YOLOv2中,每个边界框除了包含自己的位置和尺寸信息外,还包括自己的对象置信度分数(即框中含有对象的概率)和一套完整的类别概率。这种改变意味着YOLOv2可以对每个预测的边界框分别进行更精确的类别预测,因为每个框都有自己的类别概率分布。
2.5 直接位置预测(Direct location prediction)
在YOLO中使用锚框(anchor)时,会遇到了第二个问题:模型不稳定,特别是在早期迭代时。大部分不稳定性来自于预测框的 ( x , y ) (x,y) (x,y)位置。在区域提议网络中,网络预测值 t x t_x tx和 t y t_y ty,然后 ( x , y ) (x,y) (x,y)中心坐标按照以下方式计算:
x
=
(
t
x
∗
w
a
)
−
x
a
x = (t_x * w_a) - x_a
x=(tx∗wa)−xa
y
=
(
t
y
∗
h
a
)
−
y
a
y = (t_y * h_a) - y_a
y=(ty∗ha)−ya
例如,
t
x
=
1
t_x = 1
tx=1的预测会将框向右移动一个锚框的宽度,
t
x
=
−
1
t_x = -1
tx=−1的预测会将它向左移动同样的距离。公式是不受限制的,所以任何锚框都可能出现在图像的任何位置,无论是哪个位置预测了该框。这就导致仍然会出现“野蛮生长”的情况,从而到了模型前期的稳定。
因此这里改为预测相对于网格单元位置的位置坐标。限定了真实值在0到1之间。使用logistic激活函数来限制网络的预测在这个范围内。
网络在输出特征图的每个单元预测5个边界框。网络为每个边界框预测5个坐标
t
x
t_x
tx,
t
y
t_y
ty,
t
w
t_w
tw,
t
h
t_h
th和
t
o
t_o
to。如果单元格从图像左上角偏移
(
c
x
,
c
y
)
(c_x, c_y)
(cx,cy),并且边界框先验有宽度
p
w
p_w
pw和高度
p
h
p_h
ph,具体的符号说明可见下图(图源同济子豪兄),那么预测对应为:
b
x
=
σ
(
t
x
)
+
c
x
b_x = \sigma(t_x) + c_x
bx=σ(tx)+cx
b
y
=
σ
(
t
y
)
+
c
y
b_y = \sigma(t_y) + c_y
by=σ(ty)+cy
b
w
=
p
w
e
t
w
b_w = p_w e^{t_w}
bw=pwetw
b
h
=
p
h
e
t
h
b_h = p_h e^{t_h}
bh=pheth
P
r
(
object
)
∗
I
O
U
(
b
,
object
)
=
σ
(
t
o
)
{Pr}(\text{object}) * {IOU}(b, \text{object}) = \sigma(t_o)
Pr(object)∗IOU(b,object)=σ(to)
由于限制了位置预测,参数化更容易学习,使得网络更加稳定。使用维度聚类以及直接预测边界框中心位置的方法,使得YOLO比使用锚框的版本提高了近5%。
2.6 细粒度特征(Fine-Grained Features)
修改后的YOLO在13×13的特征图上预测检测结果。虽然这对于大型对象来说已经足够,但对于定位小型对象,可能会从更细粒度的特征中获益。Faster R-CNN和SSD都在网络的不同特征图上运行它们的提议网络,以获得不同的分辨率。这里仅仅添加了一个直通层,将来自早期层的26×26分辨率的特征引入。
直通层(Pass Throuth)通过将相邻特征堆叠到不同的通道而不是空间位置,将高分辨率特征与低分辨率特征连接起来,类似于ResNet中的恒等映射。这将26×26×512的特征图转换为13×13×2048的特征图,可以与原始特征连接起来。直通层操作见下图(图源铁心核桃)。
检测器在这个扩展的特征图上运行,因此它可以访问到细粒度的特征。这提供了1%的性能提升。
2.7 多尺度的训练(Multi-Scale Training)
YOLOv1使用448×448的输入分辨率。随着锚框的加入,将分辨率改变为了416×416。然而,由于YOLOv2仅使用卷积层和池化层,它可以即时调整大小。所以能希望YOLOv2能够稳健地运行在不同大小的图像上。在训练中,YOLOv2没有固定输入图像的大小,而是每过几次迭代就改变网络的大小。每10个batches,我们的网络会随机选择一个新的图像尺寸大小。由于模型按32的因子下采样,所以从32的倍数中选择:{320, 352, …, 608}。因此,最小选项是320×320,最大608×608。将网络调整到那个尺寸并继续训练。
这种机制强迫网络学会在不同的输入尺寸上做出良好的预测。这意味着同一个网络可以在不同的分辨率上预测检测结果。在较小尺寸下,网络运行得更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。多尺度输入的结果见下表。
根据上表和上图可以发现,YOLOv2的效果非常好。在低分辨率下,YOLOv2作为一个快速而相当准确的检测器运行。在288×288分辨率下,它的运行速度超过90 FPS,mAP几乎与Fast R-CNN一样好。在高分辨率下,VOC 2007上的mAP达到78.6,同时仍然能够以超过实时速度运行。
2.8 进一步的实验(Further Experiments)
进一步实验。在VOC 2012数据集上训练YOLOv2进行检测。显示了YOLOv2与其他最先进检测系统的性能比较。YOLOv2达到了73.4的mAP,同时运行速度远快于其他竞争方法。此外还在COCO数据集上进行训练,并与其他方法进行比较。在VOC指标(IoU = 0.5)上,YOLOv2获得了44.0的mAP,与SSD和Faster R-CNN相当。
2.9 损失函数(论文中没有此部分)
这里为方便理解YOLOv2相交于YOLOv1的改变,根据原文所描述的方法以推断出YOLOv2的损失函数。
参考
同济子豪兄 【精读AI论文】YOLO V2目标检测算法
just_sort 目标检测算法之YOLOv2损失函数详解
这里的
W
W
W和
H
H
H代表的是特征图的高宽,都为13,而
A
A
A指的是Anchor个数,YOLOv2中是5,各个
λ
\lambda
λ值是各个loss部分的权重系数。这里将损失函数分成3大部分来解释:
- 第一部分(第1行):
这部分是计算background的置信度误差。这里需要计算各个预测框和所有的真实框(ground truth)之间的IoU值,并且取最大值记作MaxIOU,如果该值小于一定的阈值,YOLOv2论文取了0.6,那么这个预测框就标记为background,需要计算 λ n o o b j \lambda_{noobj} λnoobj这么多倍的损失函数。如果有物体的话,那么 λ n o o b j = 0 \lambda_{noobj}=0 λnoobj=0,没有物体则为 λ n o o b j = 1 \lambda_{noobj}=1 λnoobj=1 - 第二部分(第2行):
这部分是计算Anchor boxes和预测框的坐标误差,但是只在前12800个iter计算,这一项应该是促进网络学习到Anchor的形状。 - 第三部分(第3-5行):
这部分计算的是和真实框匹配的预测框各部分的损失总和,包括坐标损失,置信度损失以及分类损失。
1)坐标损失:首先要计算其中心点落在哪个cell上,然后计算这个网格单元中的5个先验框和真实框的IoU值,选择IoU值最大的先验框和真实框匹配,对应的预测框用来预测这个真实框。
2)置信度损失:在计算obj置信度时,增加了 λ o b j \lambda_{obj} λobj 权重系数,当其为1时,损失是预测框和真实框的真实IOU值。而对于没有和真实框匹配的先验框,除去那些Max_IOU低于阈值的,其它就全部忽略。
3)分类损失:同YOLOv1。
3 更快(Faster)
检测不仅要准确,还要快速。大多数需要使用检测技术的应用场景,比如机器人或自动驾驶汽车,都依赖于低延迟的预测。
大多数检测框架依赖于VGG-16作为基础特征提取器。VGG-16是一个强大且准确的分类网络,但它过于复杂。
YOLO框架使用基于Googlenet架构的自定义网络。这个网络比VGG-16更快。然而,它的准确率略低于VGG-16。
3.1 Darknet-19
这里提出了一种新的分类模型,作为YOLOv2的基础。模型主要使用3×3的滤波器,并在每次池化后将通道数翻倍。遵循网络中网络(NIN)的工作,使用全局平均池化来做出预测,以及使用1×1的滤波器在3×3卷积之间压缩特征表示。使用批量归一化来稳定训练、加快收敛,并对模型进行规范化。最终模型,被称为Darknet-19,有19个卷积层和5个最大池化层。完整结构见下表。
3.2 分类的训练(Training for classification)
对于分类任务,在标准的ImageNet 1000类分类数据集上训练网络160个epochs,使用Darknet神经网络框架进行训练。
在初始的224×224图像训练之后,随后在更大尺寸的448上微调我们的网络。对于这种微调,只训练10个epochs,并从
1
0
−
3
10^{-3}
10−3的学习率开始。在这种更高的分辨率下,YOLOv2达到了76.5%的top-1准确率和93.3%的top-5准确率。
3.3 检测的训练(Training for detection)
对于检测任务,通过移除最后一个卷积层来修改这个网络,以便检测,并增加了三个3×3卷积层,每个有1024个过滤器,然后是一个最终的1×1卷积层,其输出数量满足检测需求。对于VOC,预测5个边界框,每个有5个坐标,每个框有20个类别,所以是125个过滤器。还从最终的3×3×512层添加了一个穿透层到倒数第二个卷积层,以便模型可以使用细粒度的特征。模型训练网络160个epochs,初始学习率为 1 0 − 3 10^{-3} 10−3,在第60和90个时代将其除以10。
4 更强(Stronger)
此外论文还提出了一种机制,用于同时在分类和检测数据上进行训练(YOLO9000)。使用标记为检测的图像来学习特定于检测的信息,如边界框坐标预测和对象性,以及如何分类常见对象。它使用只有类标签的图像来扩展它能检测的类别数量。
在训练过程中,混合了来自检测和分类数据集的图像。当网络看到一个为检测标记的图像时,可以基于完整的YOLOv2损失函数进行反向传播。当它看到一个分类图像时,我们只从架构的分类特定部分反向传播损失。
这种方法提出了一些挑战。检测数据集只有常见对象和一般标签。分类数据集有更广泛和更深入的标签范围。如果想同时在两个数据集上训练,我们需要一种连贯的方式来合并这些标签。
大多数分类方法使用softmax层来计算最终的概率分布,涵盖所有可能的类别。使用softmax假设类别是互斥的。这对于合并数据集提出了问题,例如,你不会想使用这种模型来合并ImageNet和COCO,因为类别“诺福克梗”和“狗”并不是互斥的。
这里可以改用一个多标签模型来合并数据集,这不假设互斥。这种方法忽略了我们确实知道的所有数据结构,例如所有的COCO类别是互斥的。
由于更重要的是前文的YOLOv2部分,这部分YOLO9000不是特别重要,因此不再过多介绍,大家可以移至【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)查看。
5 结论
本文介绍了YOLOv2和YOLO9000,实时检测系统。YOLOv2是最先进的,并且在各种检测数据集上比其他检测系统更快。此外,它可以在多种图像尺寸下运行,以提供速度和准确性之间的平滑权衡。
YOLO9000是一个实时框架,通过联合优化检测和分类,能检测超过9000种对象类别。我们使用WordTree将来自不同来源的数据结合起来,以及我们的联合优化技术同时在ImageNet和COCO上训练。YOLO9000是向缩小检测和分类之间数据集大小差距迈出的一大步。
本文的许多技术不仅限于对象检测之外。对ImageNet的WordTree表示提供了一个更丰富、更详细的图像分类输出空间。使用层次化分类的数据集组合在分类和分割领域将是有用的。像多尺度训练这样的训练技术可能在各种视觉任务中提供好处。
对于未来的工作,作者希望使用类似的技术进行弱监督图像分割。还计划通过使用更强大的匹配策略在训练期间为分类数据分配弱标签来改进当前的检测结果。计算机视觉拥有大量的标记数据。未来将继续寻找方法,将不同来源和结构的数据结合在一起,以构建对视觉世界的更强大的模型。
Code
目前大部分使用的YOLO是v3、v5以及以后版本,因此不包含模型代码。
相关面试问题
对于单个YOLO版本的相关面试题并不是特别多,大部分都是介绍v1-v5的演变,后续有专门的汇总部分。
参考
【YOLO系列】YOLOv2论文超详细解读(翻译 +学习笔记)
【精读AI论文】YOLO V2目标检测算法
目标检测那点儿事——更好更快的YOLO-V2
YOLOv2目标检测算法——通俗易懂的解析