目录
- 摘要
- 1.引言
- 2.更好(Better)
- 3.更快(Faster)
- 4.更健壮(Stronger)
- 使用 WordTree 组合数据集
- 联合分类和检测
- 评估 YOLO9000
- 5.结论
Author: Joseph Redmon; Ali Farhadi
Published in: 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)
Date of Conference: 21-26 July 2017
Date Added to IEEE Xplore: 09 November 2017
ISBN Information:
Electronic ISBN:978-1-5386-0457-1
Print on Demand(PoD) ISBN:978-1-5386-0458-8
Print ISSN: 1063-6919
DOI: 10.1109/CVPR.2017.690
Publisher: IEEE
Conference Location: Honolulu, HI, USA
摘要
我们介绍了YOLO9000,这是一个最先进的实时目标检测系统,能够检测超过9000个目标类别。首先,我们提出了对YOLO检测方法的各种改进,这些改进既包括创新性的,也包括借鉴以往工作的。改进后的模型YOLOv2在标准检测任务(如PASCAL VOC和COCO)上达到了最先进的水平。通过一种新颖的多尺度训练方法,同一个YOLOv2模型可以在不同尺寸下运行,从而在速度和准确性之间提供了一个便捷的权衡。在67帧/秒(FPS)时,YOLOv2在VOC 2007上达到了76.8%的平均精度均值(mAP)。在40帧/秒时,YOLOv2达到了78.6%的平均精度均值,超越了像带有ResNet的Faster R-CNN和SSD这样的最先进的方法,同时仍然运行得更快。最后,我们提出了一种同时进行目标检测和分类训练的方法。使用这种方法,我们在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000。我们的联合训练使得YOLO9000能够为目标类别进行预测,即使这些类别没有标记的检测数据。我们在ImageNet检测任务上验证了我们的方法。尽管只有44个类别有检测数据,YOLO9000在ImageNet检测验证集上达到了19.7 的平均精度均值。在COCO中不存在的156个类别上,YOLO9000达到了16.0 的平均精度均值。YOLO9000能够实时预测超过9000个不同目标类别的检测。
1.引言
通用目标检测应当具备快速、准确且能够识别各种不同物体的能力。自神经网络问世以来,检测框架的速度和准确性不断提升。然而,大多数检测方法仍然局限于识别一小部分物体。与分类和标记等其他任务的数据集相比,当前的目标检测数据集规模较小。常见的检测数据集包含数千到数十万张图像,以及数十到数百个标签。而分类数据集则拥有数百万张图像,涵盖数万到数十万类别。
我们希望目标检测能够达到物体分类的水平。然而,为检测目的标记图像的成本远远高于为分类或标记目的标记图像的成本(标记通常是由用户免费提供的)。因此,在不久的将来,我们不太可能看到与分类数据集规模相当的检测数据集。
我们提出了一种新方法,利用我们已经拥有的大量分类数据,并将其用于扩展当前检测系统的范围。我们的方法采用一种分层的目标分类视图,使我们能够将不同的数据集组合在一起。
我们还提出了一种联合训练算法,使我们能够在检测和分类数据上训练目标检测器。我们的方法利用标记了检测信息的图像来学习精确地定位物体,同时利用分类图像来增加其词汇量和鲁棒性。
通过这种方法,我们训练了YOLO9000,这是一个能够实时检测超过9000种不同目标类别的检测器。首先,我们改进了基础的YOLO检测系统,开发出了YOLOv2,这是一个最先进的实时检测器。然后,我们使用我们的数据集组合方法和联合训练算法,在来自ImageNet的超过9000个类别以及COCO的检测数据上训练了一个模型。
我们的所有代码和预训练模型都可以在以下网址在线获取:YOLO: Real-Time Object Detection。
注解:
(1)YOLOv2的网络结构可以从其配置文件中找到(yolov2.cfg),使用了Darknet-19作为主干,这里使用了Darknet-19前面18层(因为最后一层是输出层),并且都使用了BN,Leaky ReLU
# Darknet-19
Conv_1 : 3x3x32, s=1, p=1, BN, Leaky ReLU
MaxPool : 2x2, s=2
Conv_2 : 3x3x64, s=1, p=1, BN, Leaky ReLU
MaxPool : 2x2, s=2
Conv_3 : 3x3x128, s=1, p=1, BN, Leaky ReLU
Conv_4 : 1x1x64, s=1, p=1, BN, Leaky ReLU
Conv_5 : 3x3x128, s=1, p=1, BN, Leaky ReLU
MaxPool : 2x2, s=2
Conv_6 : 3x3x256, s=1, p=1, BN, Leaky ReLU
Conv_7 : 1x1x128, s=1, p=1, BN, Leaky ReLU
Conv_8 : 3x3x256, s=1, p=1, BN, Leaky ReLU
MaxPool : 2x2, s=2
Conv_9 : 3x3x512, s=1, p=1, BN, Leaky ReLU
Conv_10 : 1x1x256,s=1, p=1, BN, Leaky ReLU
Conv_11 : 3x3x512, s=1, p=1, BN, Leaky ReLU
Conv_12 : 1x1x256, s=1, p=1, BN, Leaky ReLU
Conv_13 : 3x3x512, s=1, p=1, BN, Leaky ReLU
MaxPool : 2x2, s=2
Conv_14 : 3x3x1024, s=1, p=1, BN, Leaky ReLU
Conv_15 : 1x1x512, s=1, p=1, BN, Leaky ReLU
Conv_16 : 3x3x1024, s=1, p=1, BN, Leaky ReLU
Conv_17 : 1x1x512, s=1, p=1, BN, Leaky ReLU
Conv_18 : 3x3x1024, s=1, p=1, BN, Leaky ReLU
# 额外添加的结构
Conv_19 : 3x3x1024, s=1, p=1, BN, Leaky ReLU
Conv_20 : 3x3x1024, s=1, p=1, BN, Leaky ReLU
route : layers = -9
Conv_21 : 1x1x64, s=1, p=1, BN, Leaky ReLU
reorg : s=2
route: layers=-1, -4
Conv_22 : 3x3x1024, s=1, p=1, BN, Leaky ReLU
Conv_23 : 1x1x425, s=1, p=1, Linear
(2)route: layers = -9表示提取第前9个层(Conv_13)的输出特征矩阵,作为Conv_21的输入层;reorg : s=2,表示将特征图的尺寸减半,特征通道扩展,reorg层又称之为pass through层【目标检测】YOLOv2 网络结构(darknet-19 作为 backbone);route : layers = -1, -4,表示将Conv_20和reorg(Conv_21)的输出按照维度进行拼接,再输入到Conv_22之中。
网络中特征的传输结构
Conv_18 --> Conv_19 --> Conv_20
route (layers = -9) : Conv_13 --> Conv_21
reorg (s=2) : reorg(Conv_21)
route (layers = -1, -4) : reorg(Conv_21) && Conv_20 --> Conv_22
(3)网络中特征图尺寸的变化
Darknet-19作为主干
Input | Layer | Output |
---|---|---|
InputImage(416x416x3) | Conv_1(3x3x32) | feature_1(416x416x32) |
feature_1(416x416x32) | MaxPool(2x2-s-2) | feature_2(208x208x32) |
feature_2(208x208x32) | Conv_2(3×3×64) | feature_3(208×208×64) |
feature_3(208×208×64) | MaxPool(2x2-s-2) | feature_4(104×104×64) |
feature_4(104×104×64) | Conv_3(3×3×128) | feature_5(104×104×128) |
feature_5(104×104×128) | Conv_4(1×1×64) | feature_6(104×104×64) |
feature_6(104×104×64) | Conv_5(3×3×128) | feature_7(104×104×128) |
feature_7(104×104×128) | MaxPool(2×2-s-2) | feature_8(52×52×128) |
feature_8(52×52×128) | Conv_6(3×3×256) | feature_9(52×52×256) |
feature_9(52×52×256) | Conv_7(1×1×128) | feature_10(52×52×128) |
feature_10(52×52×128) | Conv_8(3×3×256) | feature_11(52×52×256) |
feature_11(52×52×256) | MaxPool(2×2-s-2) | feature_12(26×26×256) |
feature_12(26×26×256) | Conv_9(3×3×512) | feature_13(26×26×512) |
feature_13(26×26×512) | Conv_10(1×1×256) | feature_14(26×26×256) |
feature_14(26×26×256) | Conv_11(3×3×512) | feature_15(26×26×512) |
feature_15(26×26×512) | Conv_12(1×1×256) | feature_16(26×26×256) |
feature_16(26×26×256) | Conv_13(3×3×512) | feature_17(26×26×512) |
feature_17(26×26×512) | MaxPool(2×2-s-2) | feature_18(13×13×512) |
feature_18(13×13×512) | Conv_14(3×3×1024) | feature_19(13×13×1024) |
feature_19(13×13×1024) | Conv_15(1×1×512) | feature_20(13×13×512) |
feature_20(13×13×512) | Conv_16(3×3×1024) | feature_21(13×13×1024) |
feature_21(13×13×1024) | Conv_17(1×1×512) | feature_22(13×13×512) |
feature_22(13×13×512) | Conv_18(3×3×1024) | feature_23(13×13×1024) |
YOLOv2添加的模块,最终输出的特征为13x13x425
Input | Layer | Output |
---|---|---|
feature_23(13×13×1024) | Conv_19(3×3×1024) | feature_24(13×13×1024) |
feature_24(13×13×1024) | Conv_20(3×3×1024) | feature_25(13×13×1024) |
feature_17(26×26×512) | Conv_21(1×1×64) | feature_26(26×26×64) |
feature_26(26×26×64) | regorg(stride=2) | feature_27(13×13×256) |
feature_25(13×13×1024) + feature_27(13×13×256) | feature_28(13x13x256) | |
feature_28(13x13x256) | Conv_22(3x3x1024) | feature_29(13x13x1024) |
feature_29(13x13x1024) | Conv_23(1x1x425) | feature_30(13x13x425) |
(4)在yolov2.cfg中,最后还定义了检测头的输出解码方式和训练策略
[region]
# 预定义的锚框长宽(相对于输入图像的归一化参数),两个数字为一组
# 一共5组: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828
bias_match=1 # 是否在锚框匹配时考虑卷积层的偏置项(1=启用)
classes=80 # 类别数量(COCO数据集为80个类别)
coords=4 # 锚框的参数数量,一定为4,因为是(x, y, w, h)
num=5 # 锚框的数量,与anchors对应
softmax=1 # 是否使用softmax(1=使用)
jitter=.3 # 随机抖动比例(图像尺寸会在 70% 到 130% 范围内随机变化)
rescore=1 # 是否用真实框与预测框的IoU值重新计算置信度标签(1=使用)
object_scale=5 # 正样本(含目标)的置信度损失权重
noobject_scale=1 # 负样本(含目标)的置信度损失权重
class_scale=1 # 类别预测损失权重
coord_scale=1 # 坐标回归损失权重
absolute=1 # 是否使用 绝对坐标编码(1=启用)
thresh = .6 # 判断正样本的IoU阈值(如果IoU < 0.6,则视为负样本)
random=1 # 是否在训练时随机调整输入图像尺寸(1=启用)
假如输入图像为416x416x3,会被划分成为13x13个网格,单个网格的尺寸为32x32,每个网格的锚框长宽为
第一个 anchor:(0.57273 * 32, 0.677385 * 32) = (18.32736, 21.67632)
第二个 anchor:(1.87446 * 32, 2.06253 * 32) = (59.98272, 66.00096)
第三个 anchor:(3.33843 * 32, 5.47434 * 32) = (106.82976, 175.17888)
第四个 anchor:(7.88282 * 32, 3.52778 * 32) = (252.25024, 112.88896)
第五个 anchor:(9.77052 * 32, 9.16828 * 32) = (312.65664, 293.38496)
锚框在训练过程中不会变化,目标框会基于锚框进行检测
2.更好(Better)
YOLO 相对于最先进的检测系统存在多种不足。与 Fast R-CNN 相比的错误分析表明,YOLO 犯了大量定位错误。此外,YOLO 的召回率相对于基于区域提议的方法较低。因此,我们主要专注于提高召回率和定位精度,同时保持分类准确性。
计算机视觉领域通常倾向于使用更大、更深的网络。更好的性能往往依赖于训练更大的网络或将多个模型组合在一起。然而,对于 YOLOv2,我们希望得到一个更准确且仍然快速的检测器。我们没有扩大网络规模,而是简化了网络,并使表示更容易学习。我们将过去工作中的一些想法与我们自己的新概念结合起来,以提高 YOLO 的性能。结果总结见表 2。
批量归一化:批量归一化显著提高了收敛速度,同时消除了对其他正则化形式的需求。通过在 YOLO 的所有卷积层上添加批量归一化,我们获得了超过 2% 的平均精度均值(mAP)提升。批量归一化还有助于正则化模型。有了批量归一化,我们可以从模型中移除 Dropout,而不会出现过拟合。
高分辨率分类器:所有最先进的检测方法都使用在 ImageNet 上预训练的分类器。从 AlexNet 开始,大多数分类器的输入图像尺寸小于 256×256。原始的 YOLO 在 224×224 的分辨率上训练分类网络,并在检测时将分辨率提高到 448。这意味着网络必须同时切换到学习目标检测并适应新的输入分辨率。
对于 YOLOv2,我们首先在完整的 448×448 分辨率下对分类网络进行 10 个周期的微调。这使得网络有时间调整其滤波器,以更好地处理高分辨率输入。然后,我们在检测任务上对得到的网络进行微调。这个高分辨率分类网络使我们的 mAP 提升了近 4%。
卷积与锚框:YOLO 使用全连接层直接预测边界框的坐标。与之不同的是,Faster R-CNN 使用手工挑选的先验框来预测边界框。Faster R-CNN 中的区域提议网络(RPN)仅使用卷积层预测锚框的偏移量和置信度。由于预测层是卷积的,RPN 在特征图的每个位置上预测这些偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。
我们从 YOLO 中移除了全连接层,并使用锚框来预测边界框。首先,我们移除了一个池化层,以提高网络卷积层的输出分辨率。我们还将网络的输入图像尺寸从 448×448 缩小到 416,因为我们希望特征图中有奇数个位置,这样在中心位置上就有一个单一的中心单元。物体,尤其是大物体,往往占据图像的中心位置,因此在中心位置有一个单一的单元来预测这些物体比有四个相邻的单元要好。YOLO 的卷积层将图像下采样了 32 倍,因此使用 416×416 的输入图像,我们得到一个 13×13 的输出特征图。
当我们转向使用锚框时,我们也解耦了类别预测机制与空间位置的关系,并且为每个锚框预测类别和目标性。按照 YOLO 的方式,目标性预测仍然预测真实边界框和提议框的交并比(IOU),类别预测则预测在存在目标的情况下该类别的条件概率。
使用锚框后,我们的准确度略有下降。YOLO 每张图像仅预测 98 个边界框,但使用锚框后,我们的模型预测了超过一千个边界框。在没有使用锚框的情况下,我们的中间模型达到了 69.5% 的 mAP 和 81% 的召回率;使用锚框后,模型的 mAP 为 69.2%,召回率为 88%。尽管 mAP 下降了,但召回率的提高意味着我们的模型有更多的改进空间。
维度聚类:在将锚框与 YOLO 结合使用时,我们遇到了两个问题。第一个问题是框的尺寸是手工挑选的。网络可以学习适当地调整框,但如果我们在一开始就为网络选择更好的先验,我们可以使网络更容易学习预测良好的检测结果。
我们没有手工选择先验,而是对训练集的边界框运行 k-means 聚类,以自动找到良好的先验。如果使用标准的 k-means 和欧几里得距离,较大的框会产生比小框更多的误差。然而,我们真正想要的是能够产生良好 IOU 分数的先验,这与框的大小无关。因此,我们使用以下距离度量公式:
我们针对不同的
k
k
k 值运行了 k-means 聚类,并绘制了与最近质心的平均交并比(IOU),见图 2。我们选择
k
=
5
k = 5
k=5 作为模型复杂度和高召回率之间的一个良好折衷。聚类得到的质心与手工挑选的锚框有显著不同。短而宽的框更少,而高而细的框更多。
我们在表 1 中比较了我们的聚类策略与手工挑选的锚框的平均 IOU。在仅有 5 个先验的情况下,质心的表现与 9 个锚框相当,平均 IOU 为 61.0,而手工挑选的锚框为 60.9。如果我们使用 9 个质心,我们会看到更高的平均 IOU。这表明使用 k-means 生成边界框的先验,可以让模型从一个更好的表示开始,并使学习任务变得更加容易。
直接位置预测。在将锚框与 YOLO 结合使用时,我们遇到了第二个问题:模型不稳定,尤其是在早期迭代中。大部分的不稳定性来自于对框的
(
x
,
y
)
(x, y)
(x,y) 位置的预测。在区域提议网络(Region Proposal Network)中,网络预测值
t
x
t_x
tx 和
t
y
t_y
ty,而框的中心坐标
(
x
,
y
)
(x, y)
(x,y) 是通过以下公式计算得出的:
例如,如果预测
t
x
=
1
t_x = 1
tx=1,则边界框会向右移动一个锚框的宽度;如果预测
t
x
=
−
1
t_x = -1
tx=−1,则会向左移动相同的距离。这种公式没有约束,因此任何锚框都可以移动到图像中的任何位置,而不管是哪个位置预测了这个框。由于随机初始化,模型需要很长时间才能稳定地预测出合理的偏移量。
因此,我们没有预测偏移量,而是采用了 YOLO 的方法,预测相对于网格单元位置的坐标。这使得真实值(ground truth)被限制在 0 和 1 之间。我们使用逻辑激活函数来约束网络的预测值落在这个范围内。
网络在输出特征图的每个单元格中预测 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,那么这些预测值对应于:
由于我们对位置预测进行了约束,参数化变得更加容易学习,从而使网络更加稳定。使用维度聚类并直接预测边界框中心位置的方法,比使用锚框的版本使 YOLO 的性能提高了近 5%。
细粒度特征:这个改进后的 YOLO 在一个 13×13 的特征图上进行检测预测。虽然这对于大物体来说已经足够了,但对于定位小物体可能需要更细粒度的特征。Faster R-CNN 和 SSD 都在不同分辨率的特征图上运行它们的提议网络,以获得一系列分辨率。我们采用了一种不同的方法,简单地添加了一个传递层,将早期层的 26×26 分辨率的特征引入。
传递层通过将相邻特征堆叠到不同的通道而不是空间位置来连接高分辨率特征和低分辨率特征,类似于 ResNet 中的恒等映射。这将 26×26×512 的特征图转换为 13×13×2048 的特征图,可以与原始特征连接。我们的检测器在扩展后的特征图上运行,以便能够访问细粒度特征。这带来了适度的 1% 性能提升。
多尺度训练:原始的 YOLO 使用了 448×448 的输入分辨率。随着锚框的加入,我们将分辨率改为了 416×416。然而,由于我们的模型仅使用卷积层和池化层,因此可以即时调整大小。我们希望 YOLOv2 能够在不同尺寸的图像上稳健运行,因此我们将这一点训练到模型中。
我们没有固定输入图像的大小,而是每隔几次迭代就改变网络的大小。每 10 个批次,我们的网络随机选择新的图像尺寸。由于我们的模型按 32 的因子下采样,我们从以下 32 的倍数中选择:{320, 352, …, 608}。因此,最小的选项是 320×320,最大的是 608×608。我们将网络调整到该尺寸并继续训练。
这种训练机制迫使网络学会在各种输入尺寸上进行良好的预测。这意味着同一个网络可以在不同分辨率下进行检测预测。网络在较小尺寸下运行得更快,因此 YOLOv2 在速度和准确性之间提供了一个便捷的权衡。
在低分辨率下,YOLOv2 作为一个廉价且相当准确的检测器运行。在 288×288 的分辨率下,它的运行速度超过 90 帧/秒,平均精度均值(mAP)几乎与 Fast R-CNN 相当。这使得它非常适合小 GPU、高帧率视频或多个视频流。
在高分辨率下,YOLOv2 是一个最先进的检测器,在 VOC 2007 上达到了 78.6% 的平均精度均值,同时仍然保持实时速度以上。有关 YOLOv2 与其他框架在 VOC 2007 上的比较,请参见表 3。图 4
进一步实验。我们在 VOC 2012 上训练 YOLOv2 进行目标检测。表 4 显示了 YOLOv2 与其他最先进的目标检测系统的比较性能。YOLOv2 实现了 73.4% 的平均精度均值(mAP),同时运行速度远远超过其他方法。我们还在 COCO 数据集上进行了训练,见表 5。在 VOC 指标(IOU = 0.5)下,YOLOv2 达到了 44.0% 的 mAP,与 SSD 和 Faster R-CNN 相当。
注解:
(1)使用批量归一化(BatchNormalization)的好处很多,在进行网络参数更新时,前一层的输出也会变化,导致后续层也需要适应新的数据分布,这降低了训练的效率。通过将输入数据进行归一化,强制稳定在均值为0,方差为1的标准正态分布附近,这样输入数据更稳定,反向传播梯度更平滑,同时也降低了网络对初始化权重的敏感性。因此,BN层的应用也利于使用更加深层次的网络进行训练
(2)高分辨率分类器,使用输入尺寸更高的数据集,这样网络就能够学习到更多的特征。对比之前的网络,如AlexNet使用的是224x224分辨率,YOLOv2使用的分辨率为448x448
(3)使用锚框,通过预测偏移量来获取预测框,而不是直接预测框,提升了召回率
(4)使用k-means聚类进行锚框的选择,能够获得很好的效果,这里选择的是5个
(5)直接位置预测,使用锚框时,并不会直接预测偏移量,而是预测相对网格位置的单元坐标,是坐标值而不是偏移量,再加上激活函数,最终获得目标框,使用这种方式,提升了5%的效果
(6)细粒度特征,之前为了让网络学到更多的特征,使用的分辨率是448x448和416x416,这里还将26x26尺寸的特征加入进来,学习到了细粒度的特征,提升的效果为1%
(7)多分辨率训练,每10个批次修改一次分辨率,最小的选项是 320×320,最大的是 608×608,这样YOLOv2就支持不同分辨率的推理。随后,评估了分辨率和推理速度的tradeoff,效果不错
3.更快(Faster)
我们希望检测既准确又快速。大多数检测应用,如机器人技术或自动驾驶汽车,都依赖于低延迟的预测。为了最大化性能,我们从一开始就设计 YOLOv2 使其快速运行。
大多数检测框架依赖于 VGG-16 作为基础特征提取器。VGG-16 是一个强大且准确的分类网络,但它过于复杂。VGG-16 的卷积层在 224×224 分辨率下对单张图像进行一次前向传播需要执行 306.9 亿次浮点运算。
YOLO 框架使用基于 Googlenet 架构的自定义网络。这个网络比 VGG-16 快,仅使用 85.2 亿次运算进行一次前向传播。然而,其准确性略逊于 VGG-16。在 224×224 分辨率下,对于单裁剪图像的 top-5 准确率,YOLO 的自定义模型在 ImageNet 上达到了 88.0%,而 VGG-16 为 90.0%。
Darknet-19:我们提出了一个新的分类模型,用作 YOLOv2 的基础。我们的模型基于以往的网络设计工作以及该领域的常识。与 VGG 模型类似,我们主要使用 3×3 的滤波器,并在每次池化步骤后将通道数翻倍。遵循网络中的网络(Network in Network, NIN)的工作,我们使用全局平均池化进行预测,以及在 3×3 卷积之间使用 1×1 滤波器来压缩特征表示。我们使用批量归一化来稳定训练,加速收敛,并正则化模型。
我们的最终模型,称为 Darknet-19,包含 19 个卷积层和 5 个最大池化层。具体描述见表 6。Darknet-19 处理一张图像仅需 55.8 亿次运算,但在 ImageNet 上达到了 72.9% 的 top-1 准确率和 91.2% 的 top-5 准确率。
分类训练:我们使用随机梯度下降法,在标准的 ImageNet 1000 类分类数据集上训练网络 160 个周期,初始学习率为 0.1,采用 4 次幂的多项式衰减率,权重衰减为 0.0005,动量为 0.9,使用 Darknet 神经网络框架。在训练过程中,我们使用了标准的数据增强技巧,包括随机裁剪、旋转以及色调、饱和度和曝光度的偏移。
如上所述,在 224×224 分辨率的图像上进行初始训练后,我们在更大的尺寸 448 上对网络进行微调。对于这种微调,我们使用上述参数,但仅训练 10 个周期,初始学习率为 10^-3。在这个更高的分辨率下,我们的网络达到了 76.5% 的 top-1 准确率和 93.3% 的 top-5 准确率。
检测训练:我们通过移除最后一个卷积层,并添加三个具有 1024 个滤波器的 3×3 卷积层,以及一个具有检测所需输出数量的最终 1×1 卷积层,来修改这个网络用于检测。对于 VOC,我们预测每个边界框有 5 个坐标和 20 个类别,因此需要 125 个滤波器。我们还从最终的 3×3×512 层添加了一个传递层到倒数第二个卷积层,以便我们的模型可以使用细粒度特征。
我们训练网络 160 个周期,初始学习率为 10^-3,在 60 和 90 个周期时将其除以 10。我们使用 0.0005 的权重衰减和 0.9 的动量。我们使用与 YOLO 和 SSD 类似的数据增强方法,包括随机裁剪、颜色偏移等。我们在 COCO 和 VOC 上使用相同的训练策略。
注解:
(1)分类训练,YOLOv2的训练过程是,在低分辨率(ImageNet,224x224)上进行预训练,随后使用高分辨率(448x448)进行微调10个周期,最后在检测数据集上(448x448)进行调整网络。经过高分辨率微调,可以处理高分辨率的细节,从而更好的适应检测数据集。
(2)假设检测任务需要识别 小鸟(小目标):
YOLOv1:
从 224×224 直接切换到 448×448 分辨率训练时,网络需同时学习放大的小鸟细节和检测任务,导致初期预测框位置混乱,收敛缓慢。
YOLOv2:
在 448×448 分类微调阶段,网络已学会放大后的小鸟羽毛纹理等细节,检测训练时只需专注于定位和分类,收敛更快且精度更高
4.更健壮(Stronger)
我们提出了一种同时在分类和检测数据上进行训练的机制。我们的方法使用标记了检测信息的图像来学习检测特定的信息,如边界框坐标预测和目标性,以及如何对常见物体进行分类。它使用只有类别标签的图像来扩展其能够检测的类别数量。
在训练过程中,我们将来自检测和分类数据集的图像混合在一起。当我们的网络看到一个标记了检测信息的图像时,我们可以基于完整的 YOLOv2 损失函数进行反向传播。当它看到一个分类图像时,我们只从架构的分类特定部分反向传播损失。
这种方法带来了一些挑战。检测数据集通常只包含常见物体和一般性标签,如“狗”或“船”。而分类数据集则拥有更广泛和深入的标签范围。例如,ImageNet 包含了超过一百种狗的品种,包括“诺福克梗(terrier)”、“约克夏梗(terrier)”和“贝德灵顿梗(terrier)”。如果我们想要同时在这两个数据集上进行训练,我们需要一种合理的方式来合并这些标签。
大多数分类方法使用 softmax 层来计算所有可能类别的最终概率分布。使用 softmax 层假设类别是互斥的。这给合并数据集带来了问题,例如,你不会想使用这个模型将 ImageNet 和 COCO 合并起来,因为“诺福克梗(terrier)”和“狗”这两个类别并不是互斥的。
我们也可以使用多标签模型来合并数据集,这种模型不假设类别互斥。然而,这种方法忽略了我们已知的数据结构,例如,COCO 中的所有类别都是互斥的。
分层分类:ImageNet 的标签来源于 WordNet,这是一个语言数据库,它对概念及其相互关系进行了结构化[12]。在 WordNet 中,“诺福克梗”和“约克夏梗”都是“梗”的下义词,而“梗”是一种“猎犬”,“猎犬”是一种“狗”,“狗”是一种“犬科动物”,等等。大多数分类方法假设标签具有扁平结构,然而在合并数据集时,结构正是我们所需要的。
WordNet 被构建成一个有向图,而不是树,因为语言是复杂的。例如,“狗”既是一种“犬科动物”,也是一种“家畜”,而这两者都是 WordNet 中的同义词集合。为了简化问题,我们通过从 ImageNet 中的概念构建一个分层树,而不是使用完整的图结构。
为了构建这棵树,我们检查 ImageNet 中的视觉名词,并查看它们通过 WordNet 图到达根节点(在这种情况下是“物理对象”)的路径。许多同义词集合在图中只有一条路径,因此我们首先将这些路径添加到我们的树中。然后,我们迭代地检查剩余的概念,并添加那些尽可能少地扩展树的路径。因此,如果一个概念有两条通往根节点的路径,其中一条路径会向我们的树中添加三条边,而另一条路径只添加一条边,那么我们选择较短的路径。
最终结果是 WordTree,一个视觉概念的分层模型。使用 WordTree 进行分类时,我们在每个节点上预测条件概率,即在给定同义词集合的情况下,该同义词集合的每个下义词的概率。例如,在“梗”节点上,我们预测:
如果我们想要计算某个特定节点的绝对概率,我们只需沿着树的路径到达根节点,并将条件概率相乘。因此,如果我们想知道一张图片是否是诺福克梗(Norfolk terrier),我们计算如下:
为了分类的目的,我们假设图像中包含一个物体:
Pr
(
physical object
)
=
1
\text{Pr}(\text{physical object}) = 1
Pr(physical object)=1。
为了验证这种方法,我们在使用 1000 类 ImageNet 构建的 WordTree 上训练 Darknet-19 模型。为了构建 WordTree1k,我们将所有中间节点加入其中,这使得标签空间从 1000 扩展到 1369。在训练过程中,我们将真实标签向上传播到树的顶部,因此如果一张图像被标记为“诺福克梗”,它也会被标记为“狗”和“哺乳动物”等。为了计算条件概率,我们的模型预测一个包含 1369 个值的向量,并且我们在所有属于同一概念的下义词的同义词集合上计算 softmax,见图 5。
使用与之前相同的训练参数,我们的分层 Darknet-19 实现了 71.9% 的 top-1 准确率和 90.4% 的 top-5 准确率。尽管我们添加了 369 个额外的概念,并让我们的网络预测一个树状结构,我们的准确率仅略有下降。以这种方式进行分类也有一些好处。在新的或未知的物体类别上,性能会优雅地下降。例如,如果网络看到一张狗的图片,但不确定是什么种类的狗,它仍然会以高置信度预测“狗”,但会在下义词之间分散较低的置信度。
这种公式也适用于检测。现在,我们不再假设每张图像都有一个物体,而是使用 YOLOv2 的目标性预测器来给出 Pr ( physical object ) \text{Pr}(\text{physical object}) Pr(physical object) 的值。检测器预测一个边界框和一个概率树。我们沿着树向下遍历,在每个分支处选择置信度最高的路径,直到我们达到某个阈值,然后我们预测那个物体类别。
注解:
(1)对于wordtree的理解是,父类和子类的关系,类似于树结构,例如 物体 → 动物 → 犬科 → 狗 → 哈士奇,根节点是物体(object),上一层是动物,逐层向上,最后是哈士奇。置信度的计算方式为
P
(
物体
)
∗
P
(
动物
)
∗
P
(
犬科
)
∗
P
(
狗
)
∗
P
(
哈士奇
)
P(物体) * P(动物) * P(犬科) * P(狗) * P(哈士奇)
P(物体)∗P(动物)∗P(犬科)∗P(狗)∗P(哈士奇)
使用 WordTree 组合数据集
我们可以使用 WordTree 以合理的方式将多个数据集组合在一起。我们只需将数据集中的类别映射到树中的同义词集合。图 6 展示了使用 WordTree 将 ImageNet 和 COCO 的标签组合在一起的示例。WordNet 非常多样化,因此我们可以使用这种技术与大多数数据集结合。
联合分类和检测
现在我们已经可以使用 WordTree 组合数据集,我们可以训练我们的联合模型进行分类和检测。我们希望训练一个非常大规模的检测器,因此我们使用 COCO 检测数据集和完整的 ImageNet 发布中的前 9000 个类别来创建我们的组合数据集。我们还需要评估我们的方法,因此我们加入了 ImageNet 检测挑战中尚未包含的任何类别。这个数据集对应的 WordTree 有 9418 个类别。ImageNet 是一个更大的数据集,因此我们通过过采样 COCO 来平衡数据集,使得 ImageNet 只比 COCO 大 4 倍。
使用这个数据集,我们训练了 YOLO9000。我们使用基础的 YOLOv2 架构,但只使用 3 个先验框而不是 5 个,以限制输出大小。当我们的网络看到一个检测图像时,我们正常地反向传播损失。对于分类损失,我们只在标签对应的级别或更高级别反向传播损失。例如,如果标签是“狗”,我们不会将错误分配给树中更深层次的预测,如“德国牧羊犬”与“金毛猎犬”,因为我们没有这些信息。
当它看到一个分类图像时,我们只反向传播分类损失。为此,我们只需找到预测该类别最高概率的边界框,并仅计算其预测树的损失。我们还假设预测的边界框与真实标签的重叠至少有 0.3 的交并比(IOU),并基于此假设反向传播目标性损失。
通过这种联合训练,YOLO9000 学会了使用 COCO 中的检测数据在图像中找到物体,并使用 ImageNet 中的数据对这些物体进行广泛的分类。
评估 YOLO9000
我们在 ImageNet 检测任务上评估了 YOLO9000。ImageNet 检测任务与 COCO 只共享 44 个目标类别,这意味着 YOLO9000 对大多数测试类别的检测数据一无所知。YOLO9000 的整体平均精度均值(mAP)为 19.7%,在它从未见过任何标记检测数据的 156 个独立目标类别上,mAP 为 16.0%。这个 mAP 高于 DPM 的结果,但 YOLO9000 是在不同的数据集上训练的,并且只有部分监督[4]。它还在同时实时检测其他 9000 个类别。
YOLO9000 在学习新的动物种类方面表现良好,但在学习服装和设备等类别时却遇到了困难。新的动物种类更容易学习,因为目标性预测可以从 COCO 中的动物很好地泛化。相反,COCO 没有任何类型的服装的边界框标签,只有人的标签,因此 YOLO9000 在建模“太阳镜”或“泳裤”等类别时会遇到困难。
注解:
(1)YOLO9000的训练集来自ImageNet和COCO,一共9418个类别,但是只是用了3个先验框,YOLOv2使用了5个
5.结论
我们介绍了 YOLOv2 和 YOLO9000,这两个实时目标检测系统。YOLOv2 在多种检测数据集上达到了最先进的水平,并且比其他检测系统更快。此外,它可以在多种图像尺寸下运行,以在速度和准确性之间提供平滑的权衡。
YOLO9000 是一个实时框架,通过联合优化检测和分类,能够检测超过 9000 个目标类别。我们使用 WordTree 来组合来自不同来源的数据,并利用我们的联合优化技术同时在 ImageNet 和 COCO 上进行训练。YOLO9000 是朝着缩小检测和分类之间数据集规模差距迈出的重要一步。
我们的许多技术可以推广到目标检测之外的领域。我们对 ImageNet 的 WordTree 表示提供了一个更丰富、更详细的图像分类输出空间。使用分层分类进行数据集组合在分类和分割领域将是有用的。像多尺度训练这样的训练技术可能会在各种视觉任务中带来益处。
对于未来的工作,我们希望使用类似的技术进行弱监督图像分割。我们还计划在训练期间使用更强大的匹配策略,将弱标签分配给分类数据,以改进我们的检测结果。计算机视觉拥有大量标记数据。我们将继续寻找方法,将不同来源和结构的数据结合起来,以构建更强大的视觉世界模型。
致谢:我们感谢 Junyuan Xie 在构建 WordTree 方面提供的有益讨论。这项工作得到了 ONR N00014-13-1-0720、NSF IIS-1338054、NSF-1652052、NRI-1637479、Allen 杰出研究者奖以及 Allen 人工智能研究所的支持。