我们介绍了YOLO9000,一个最先进的,实时的目标检测系统,可以检测超过9000个目标类别。首先,我们提出了对YOLO检测方法的各种改进,包括新颖的和来自以前的工作。改进后的模型YOLOv2是最先进的标准检测任务,如高标准VOC和COCO。使用一种新颖的、多尺度的训练方法,相同的YOLOv2模型可以在不同的大小下运行,在速度和准确性之间提供了一个简单的权衡。在67FPS的速度下,YOLOv2在VOC2007上获得76.8mAP。在40FPS的速度下,YOLOv2获得78.6mAP,性能优于最先进的方法,如使用ResNet和SSD的Faster RCNN,同时运行速度仍然要快得多。最后,我们提出了一种联合训练目标检测和分类的方法 ,利用该方法,我们在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000。我们的联合训练允许YOLO9000预测没有标记检测数据的对象类的检测。我们在ImageNet检测任务上验证了我们的方法。YOLO9000在ImageNet检测验证集上获得19.7mAP,尽管只有200个类中的44个的检测数据。在非COCO的156个类别中,YOLO9000得到16.0mAP。但是YOLO可以检测到200多个类;它预测了对9000多个不同对象类别的检测。而且它仍然可以实时运行。
通用物体检测应快速、准确,并能够识别各种各样的物体。随着神经网络的引入,检测框架变得越来越快速和准确。然而,大多数检测方法仍然局限于一小部分对象。
目前的目标检测数据集相比,其他任务的数据集是有限的。最常见的检测数据集包含数千到数十万张图像,其中包含数十到数百个标签。[3][10][2]。分类数据集有数百万张图像和数万或数十万个类别的[20][2]。
我们希望检测能够扩展到对象分类的级别。然而,用于检测的标签图像要比用于分类或标签的标签昂贵得多(标签通常是用户免费提供的)。因此,在不久的将来,我们不太可能看到与分类数据集相同规模的检测数据集。
我们提出了一种新的方法来利用我们现有的大量分类数据,并使用它来扩大当前检测系统的范围。我们的方法使用了对象分类的分层视图,它允许我们将不同的数据集组合在一起。我们还提出了一种联合训练算法,允许我们在检测和分类数据上训练目标检测器。我们的方法利用带标记的检测图像来学习精确定位对象,同时使用分类图像来增加其词汇量和鲁棒性。使用这种方法,我们训练了YOLO9000,这是一个实时的对象检测器,可以检测超过9000种不同的对象类别。首先,我们改进了基础YOLO检测系统,以生产YOLOv2,一个最先进的,实时检测器。然后,我们使用我们的数据集组合方法和联合训练算法,对来自ImageNet的9000多个类以及来自COCO的检测数据进行训练模型。
我们所有的代码和预先训练过的模型都可以在网上找到http://pjreddie.com/yolo9000/.
与最先进的检测系统相比,YOLO存在各种缺点。YOLO与FastR-CNN相比的误差分析表明,YOLO产生了大量的定位错误。此外,与基于区域提案的方法相比,YOLO的召回率相对较低。因此,我们主要关注在提高分类精度的同时提高召回率和定位。
计算机视觉一般倾向于更大、更深层次的网络[6][18][17]。更好的性能通常取决于训练更大的网络或将多个模型集成在一起。然而,对于YOLOv2,我们想要一个更准确的探测器,而且仍然很快。我们没有扩大网络,而是简化了网络,然后使表示更容易学习。我们从过去的工作的各种想法与我们自己的新概念,以提高YOLO的表现。对结果的总结见表2。
对于YOLOv2,我们首先在ImageNet上以10个epoch的全448×448分辨率微调分类网络。这给了网络时间来调整其滤波器,使其在更高分辨率的输入时更好地工作。然后,我们会根据检测结果对生成的网络进行微调。这种高分辨率的分类网络使我们增加了近4%的mAP。
Convolutional With Anchor Boxes. YOLO直接使用卷积特征提取器上的全连接层来预测边界框的坐标。而不是直接预测坐标,R-CNN使用手工挑选的先验[15]预测边界框。仅使用卷积层,在Faster R-CNN中的区域建议网络(RPN)预测锚盒的偏移量和置信度。由于预测层是卷积的,所以RPN可以预测一个特征图中的每个位置的这些偏移量。预测偏移量而不是坐标,简化了问题,并使网络更容易学习。
我们从YOLO中删除完全连接的层,并使用锚盒来预测边界框。首先,我们消除了一个池化层,以使网络的卷积层的输出具有更高的分辨率。我们还缩小了网络,以操作416个输入图像大小,而不是448个×448。我们这样做是因为我们想要在特征图中有奇数个位置,这样就有一个中心单元格。物体,特别是大型物体,往往会占据图像的中心,所以在中心有一个位置来预测这些物体,而不是附近的四个位置。YOLO的卷积层对图像降采样32倍,因此通过使用416的输入图像,我们得到了一个13×13的输出特征图。
当我们移动到锚盒时,我们还将类预测机制与空间位置解耦,而不是预测每个锚盒的类和目标。在YOLO之后,客观预测仍然预测地面真实的IOU和提出的框,类预测预测在有对象的情况下该类的条件概率。使用锚盒,我们的精度略有下降。YOLO只预测每张图像98个盒子,但使用锚盒,我们的模型预测了超过1000个。在没有锚盒的情况下,我们的中间模型得到69.5mAP,召回率为81%。使用锚盒,我们的模型得到69.2mAP,召回率为88%。尽管mAP减少了,但召回率的增加意味着我们的模型有更大的改进空间。
Dimension Clusters.当使用YOLO使用锚盒时,我们遇到了两个问题。首先,盒子的尺寸是手工挑选的。网络可以学会适当地调整盒子,但如果我们为网络选择更好的先验,我们可以使网络更容易学会预测良好的检测。 我们在训练集的边界框上运行k-means聚类,以自动找到好的先验。如果我们使用具有欧几里得距离的标准k-means,那么大的框比小的框产生更多的误差。然而,我们真正想要的是能够导致良好的IOU的先验,这与盒子的大小无关。因此,对于我们的距离度量,我们使用:
我们对k的不同值运行k-means,并绘制具有最近质心的平均IOU,见图2。我们选择k=5作为模型复杂度和高召回率之间的一个很好的权衡。聚类的质心与手工挑选的锚定盒有显著的不同。短而宽的框少了,高而薄的框多了。
我们比较了平均IOU与聚类策略中最接近的先验和表1中手工挑选的锚定盒。在只有5个之前,质心的表现与9个锚盒相似,平均IOU为61.0,而不是60.9。如果我们使用9个质心,我们会看到一个更高的平均IOU。这表明使用k-means生成我们的边界框以更好的表示启动模型,并使任务更容易学习。
Direct location prediction. 当使用YOLO使用锚盒时,我们会遇到第二个问题:模型不稳定性,特别是在早期迭代中。大多数的不稳定性来自于预测盒子的(x,y)位置。在区域建议网络中,网络预测值tx和ty,(x,y)中心坐标计算为:
例如,tx=1的预测将使盒子向右移动锚盒的宽度,而tx=−1的预测也将使其向左移动相同的数量。
这个公式是不受约束的,因此任何锚盒都可以在图像中的任何点结束,而不管预测盒的哪个位置。通过随机初始化,该模型需要很长时间来稳定,以预测合理的偏移量。我们不是预测偏移量,而是遵循YOLO的方法,并预测相对于网格单元格位置的位置坐标。这就将地面真相限制在0到1之间。我们使用逻辑激活来限制网络的预测落在这个范围内。
该网络在输出特征图中预测了每个单元格上的5个边界框。该网络预测了每个边界框、tx、ty、tw、th和to的5个坐标。如果单元格从图像的左上角被(cx,cy)偏移,并且前面的边界框的宽度和高度为pw、ph,则预测对应于:
由于我们约束了位置预测,参数化更容易学习,使网络更加稳定。使用维度集群并直接预测边界框中心位置比YOLO的版本提高了近5%。
Fine-Grained Features. 这个修改后的YOLO预测了在13×13特征图上的检测。虽然这对于大型对象是足够的,但它可能受益于更细粒度的特性来定位更小的对象。Faster R-CNN和SSD都在网络中的各种特征图上运行他们的建议网络,以获得一定范围的分辨率。我们采用了一种不同的方法,简单地添加一个直通层,提供26×26分辨率的功能。
通过层通过将相邻特征叠加到不同的通道中,而不是在空间位置上,将高分辨率特征与低分辨率特征连接起来,类似于ResNet中的标识映射。这将26×26×512特征图变成了一个13×13×2048特征图,可以与原始特征连接。我们的检测器运行在这个扩展的特性图之上,这样它就可以访问细粒度的特性。这使得性能略微提高了1%。
Multi-Scale Training. 原始的YOLO使用的输入分辨率为448×448。随着锚定盒的加入,我们将分辨率更改为416×416。然而,由于我们的模型只使用卷积层和池化层,因此可以动态地调整大小。我们希望YOLOv2能够在不同大小的图像上运行得健壮,所以我们将其训练到模型中。我们不是固定输入图像的大小,而不是每隔几次迭代就改变一次网络。我们的网络每10批随机选择一个新的图像尺寸。由于我们的模型的样本下降了32倍,我们从以下32的倍数中提取:{320,352,...,608}。因此,最小的选项是320×320,最大的选项是608×608。我们将网络的大小调整到这个维度,并继续进行训练。
这种机制迫使网络学习如何对各种输入维度进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测。该网络在较小的尺寸下运行得更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。
在低分辨率下,YOLOv2作为一种廉价、相当精确的检测器。在288×288,它运行在超过90FPS与mAP几乎与Fast R-CNN一样好。这使得它非常适合更小的gpu,高帧率的视频,或多个视频流。
在高分辨率下,YOLOv2是一个最先进的探测器,在VOC2007上有78.6mAP,同时仍然运行在高于实时速度之上。YOLOv2与VOC2007上的其他框架的比较见表3。附图24
进一步的实验。我们对YOLOv2进行了关于VOC2012的检测的训练。表4显示了YOLOv2与其他最先进的检测系统的性能比较。YOLOv2实现了73.4 mAP,同时运行速度比竞争方法快得多。我们还对COCO进行了训练,并与表5中的其他方法进行了比较。在VOC度量(IOU=.5)上,YOLOv2得到44.0mAP,可与SSD和Faster R-CNN相比较。
我们希望检测是准确的,但我们也希望它要快。大多数检测应用程序,如机器人技术或自动驾驶汽车,都依赖于低延迟的预测。为了使性能最大化,我们将YOLOv2设计为从头开始就能快速运行。
大多数检测框架依赖于VGG-16作为基本特征提取器[17]。VGG-16是一个强大的、准确的分类网络,但它是不必要的复杂。VGG-16的卷积层需要306.9亿次浮点操作,才能以224×224分辨率通过单次图像。
YOLO框架使用了一个基于Googlenet架构[19]的自定义网络。该网络比VGG-16快,仅使用85.2亿次转发传递操作。然而,它的准确性比VGG-16略差。对于单个作物,在224×224,YOLO的定制模型获得了88.0%的ImageNet,而VGG-16的准确率为90.0%。
Darknet-19. 我们提出了一个新的分类模型作为YOLOv2的基础。我们的模型建立在之前的网络设计工作以及该领域的常识的基础上。与VGG模型类似,我们主要使用3个×3过滤器,并在每个池化步骤[17]后将通道数加倍。在网络(NIN)的工作之后,我们使用全局平均池来进行预测,以及1×1滤波器来压缩3×3卷积[9]之间的特征表示。我们使用批处理归一化来稳定训练,加速收敛速度,并规范模型[7]。
我们最终的模型,称为Darknet-19,有19个卷积层和5个最大池化层。完整的描述见表6。暗网-19只需要55.8亿次操作来处理一幅图像,但在ImageNet上达到了72.9%的前1精度和91.2%的前5精度。
Training for classifification. 我们训练网络的标准ImageNet1000类分类数据集160个epoch使用随机梯度下降开始学习率0.1,多项式率衰减为4,权重衰减0.0005和动量0.9使用Darknet神经网络框架[13]。在训练过程中,我们使用标准的数据增强技巧,包括随机作物、旋转、色调、饱和度和曝光转移。
如上所述,在我们对224×224的图像进行初始训练后,我们将我们的网络调整为更大的尺寸,448。对于这种微调,我们使用上述参数进行训练,但只训练了10个epoch,并从10**−3的学习速率开始。在这个更高的分辨率下,我们的网络达到了76.5%的top-1精度和top-5精度的93.3%。
Training for detection. 我们修改了这个检测网络,删除最后一个卷积层,而是添加三个3×3卷积层,每个层有1024个滤波器,然后是最后一个1×1卷积层,包含我们需要检测的输出数量。对于VOC,我们预测有5个先验框,每个盒子有5个坐标,每个框有20个类,所以有125个过滤器。我们还添加了一个直通层,从最后的3×3×512层到第二个到最后一个卷积层,以便我们的模型可以使用细粒度特征。
我们训练网络160个epoch,开始学习速率为10**−3,在60和90个epoch除以10。
我们使用的权重衰减为0.0005,动量为0.9。我们使用类似于YOLO和SSD的数据增强,使用随机裁剪,颜色变化等。我们对COCO和VOC采用相同的培训策略。
我们提出了一种联合训练分类化和检测数据的机制。我们的方法使用标记为检测的图像来学习检测特定的信息,如边界盒坐标预测和目标性,以及如何分类常见的对象。它使用只带有类标签的图像来扩展它可以检测到的类别的数量。
在训练过程中,我们混合了来自检测和分类数据集的图像。当我们的网络看到一个标记为检测的图像时,我们可以基于完整的YOLOv2损失函数反向传播。当它看到一个分类图像时,我们只反向传播架构中分类特定部分的损失。
这种方法提出了一些挑战。检测数据集只有常见的对象和一般的标签,如“狗”或“船”。分类数据集有更广泛和更深层次的标签范围。ImageNet有100多个品种的狗,包括“诺福克梗”、“约克郡犬”和“贝灵顿梗”。如果我们想在两个数据集上进行训练,我们需要一种连贯的方法来合并这些标签。
大多数分类方法在所有可能的类别中使用softmax层来计算最终的概率分布。使用softmax假定这些类是互斥的。这给合并数据集带来了问题,例如,您不希望使用这个模型合并IMmageNet和COCO,因为“诺福克梗”和“狗”这类并不是相互排斥的。
我们可以使用一个多标签模型来组合不假设互斥的数据集。这种方法忽略了我们所知道的关于数据的所有结构,例如,所有的COCO类都是相互排斥的。
Hierarchical classifification. ImageNet标签是从WordNet中提取的,这是一个构建概念及其如何关联[12]的语言数据库。在WordNet中,“诺福克梗”和“约克郡梗”都是“梗犬”的下义词,“梗犬”是“猎犬”,是“狗”,是“犬”,等等。大多数分类方法都假设标签是一个扁平的结构,但是对于组合数据集,结构正是我们所需要的。
WordNet的结构是有向图,而不是树,因为语言是复杂的。例如,“狗”既是一种“犬类”,也是一种“家畜”,它们都是WordNet中的同步集。我们没有使用完整的图结构,而是通过从ImageNet中的概念构建一个层次树来简化问题
为了构建这棵树,我们检查了ImageNet中的视觉名词,并查看了它们通过WordNet图到根节点的路径,在本例中是“物理对象”。许多同步集只有一条通过图的路径,所以我们首先将所有这些路径添加到树中。然后,我们迭代地检查我们剩下的概念,并添加尽可能少的增长树的路径。因此,如果一个概念有两条到根的路径,其中一条路径会给我们的树添加三条边,而另一条只会添加一条边,我们就选择较短的路径。
最终的结果是WordTree,一个视觉概念的层次模型。为了使用WordTree进行分类,我们预测每个节点上的该同步集的每个下缀义词的概率的条件概率。例如,在“小猎犬”的节点上,我们预测到:
如果我们想计算一个特定节点的绝对概率,我们只需沿着穿过树的路径走到根节点,然后乘以条件概率。如果我们想知道诺福克梗的图片,我们计算:
出于分类的目的,我们假设图像中包含一个对象:P r(physical object) = 1.
为了验证这种方法,我们在使用1000类ImageNet构建的文字树上训练darknet-19模型。为了构建WordTree1k,我们添加了所有的中间节点,从而将标签空间从1000扩展到1369。在训练过程中,我们传播地面真相标记树,这样如果一个图像被标记为“诺福克梗”,它也被标记为“狗”和“哺乳动物”,等等。为了计算条件概率,我们的模型预测了一个包含1369个值的向量,并且我们计算了所有具有相同概念的下位词的系统集的softmax,见图5。
使用与之前相同的训练参数,我们的层次darknet-19达到了71.9%的top-1准确率和90.4%的top-5准确率。尽管添加了369个额外的概念,并让我们的网络预测了一个树状结构,但我们的准确性只是略有下降。以这种方式执行分类也有一些好处。在新对象类别或未知对象类别上的性能会正常下降。例如,如果网络看到一只狗的图片,但不确定它是什么类型的狗,它仍然会以很高的信心预测“狗”,但在下位词之间分散的信心较低。
这个公式也适用于检测。现在,我们不是假设每个图像都有一个对象,而是使用YOLOv2的目标预测器来给我们Pr(physical object)的值。该探测器预测了一个边界框和概率树。我们向下遍历树,在每次分裂时采用最高置信路径,直到我们达到某个阈值,我们预测对象类。
Dataset combination with WordTree. 我们可以使用WordTree以一种合理的方式组合多个数据集。我们只需简单地将数据集中的类别映射到树中的同步集。图6显示了一个使用WordTree来组合来自ImageNet和COCO的标签的示例。WordNet是非常多样化的,所以我们可以在大多数数据集上使用这种技术。
Joint classifification and detection. 现在我们可以使用WordTree组合数据集,我们可以训练我们的联合模型进行分类和检测。我们想要训练一个非常大规模的检测器,因此我们使用COCO检测数据集和完整ImageNet发布的前9000个类来创建我们的组合数据集。我们还需要评估我们的方法,这样我们就可以添加尚未包含的ImageNet检测挑战中的任何类。该数据集对应的WordTree有9418个类。ImageNet是一个更大的数据集,所以我们通过过采样COCO来平衡数据集,这样ImageNet只大4:1倍。
使用这个数据集,我们训练YOLO9000。我们使用基本的YOLOv2架构,但只有3个先验而不是5个来限制输出大小。当我们的网络看到一个检测图像时,我们就会正常地反向传播损失。对于分类损失,我们只在标签的相应级别或以上反向传播损失。例如,如果标签是“狗”,我们确实会对树的预测,“德国牧羊犬”和“金毛猎犬”,因为我们没有这些信息。
当它看到一个分类图像时,我们只反向传播分类损失。为了做到这一点,我们只需找到预测该类的最高概率的边界框,并只计算其预测树上的损失。我们还假设预测的框与地面真实标签重叠至少是0.3IOU,并且我们基于这个假设反向传播目标损失。
通过这种联合训练,YOLO9000学习使用COCO中的检测数据在图像中寻找对象,并学习使用从ImageNet中获得的数据对这些对象进行分类。
我们在ImageNet检测任务上评估了YOLO9000。ImageNet的检测任务与COCO共享44个对象类别,这意味着YOLO9000只看到了大多数测试图像的分类数据,而不是检测数据。YOLO9000总共获得19.7mAP,对不相交的156个对象类有16.0mAP,它从未看到过任何标记的检测数据。这个mAP高于DPM所获得的结果,但是YOLO9000是在不同的数据集上进行训练的,只有部分监督[4]。它还同时检测9000个其他对象类别,都是实时的。
当我们分析YOLOeNet9000在ImageNet上的表现时,我们看到它很好地学习了新物种的动物,但在服装和设备等学习类别方面存在困难。新的动物更容易学习,因为客观性预测很好地概括了COCO中的动物。相反,COCO对任何类型的服装都没有边框标签,只针对个人,所以YOLO9000正在努力打造像“太阳镜”或“泳裤”这样的模特类别。
我们介绍了YOLOv2和YOLO9000,实时检测系统。YOLOv2是最先进的,并且比其他跨各种检测数据集的检测系统更快。此外,它可以在各种图像大小下运行,以提供速度和精度之间的平滑权衡。
YOLO9000是一个实时框架,通过联合优化检测和分类来检测9000多个对象类别。我们使用WordTree来结合来自不同来源的数据,以及我们的联合优化技术,同时在ImageNet和COCO上进行训练。YOLO9000是缩小检测和分类之间的数据集大小差距的有力一步。
我们的许多技术都可以推广到目标检测之外。我们的ImageNet的文字树表示为图像分类提供了一个更丰富、更详细的输出空间。使用分层分类的数据集组合将在分类和分割领域中是有用的。像多尺度训练这样的训练技术可以在各种视觉任务中提供好处。
在未来的工作中,我们希望使用类似的技术来进行弱监督的图像分割。我们还计划在训练期间使用更强大的匹配策略的方法来改进分类数据的检测结果。计算机视觉有幸拥有大量的标签数据。我们将继续寻找方法,将不同的数据来源和结构结合在一起,以形成更强的视觉世界模型。