我们引入了YOLO9000,一个可以检测超过9000种类别的先进的实时目标检测系统。首先我们提出了多种yolo检测方法的提升方式,既新颖又参考了 之前的工作。改进后的模型,YOLOV2在标准检测任务例如PASCAL VO 和COCO 上都取得了领先。使用一个新颖的多尺度的训练方法,同一个YOLOV2模型可以在不同尺寸下行,提供了一种速度和准确率之间的简单的平衡。在67fps下,yolov2在VOC2007上取得了78.6的mAP,在40fps下,yolov2取得了78.6的mAP,在超越现有的最先进的方法例如使用了ResNet的Faster R-CNN和SSD的同时运行速度显著的快。最后我们提出了一个方法来共同训练目标检测和分类。使用这种方法我们同时在COCO目标检测数据集和ImageNet分类数据集上训练YOLO9000。我们的联合训练允许YOLO9000预测没有检测标签的对象类别的检测。我们在ImageNet检测任务上验证了我们的方法。在ImageNet检测验证集上yolo9000得到了19.7的mAP,尽管只有200个类中的44个类的检测数据。在不在coco中的156个类中,yolo9000得到了16.0的mAP。但是yolo可以检测超过200个类别,它可以预测超过9000个类别的检测。而且依然是实时运行的。
通用的目标检测应该是快速准确同时可以识别多样的目标。自从神经网络的引入,检测框架变得越来越快和准确。然而,大多数目标检测方法现在仍旧将目标约束为一个小的目标集。
当前的目标检测数据集相比于分类和标记等其他任务是受限的。最常见的检测数据集包含数千到数十万个图像和数十到数百个标签。分类数据集包含数以百万计的图像,其中包含数万或数十万个类别。
我们希望检测扩展到目标分类的程度。然而,为图片打检测标签比打分类标签或tag要贵的多。因此我们不可能在不久的将来看到与分类数据集相同规模的检测数据集。
我们提出了一个新的方法来利用我们已有的大量的分类数据同时用其来扩大目前目标检测系统的范围。我们的方法使用了目标分类的层次视图允许我们将不同的数据集结合在一起。
我们也提出了一个联合训练算法允许我们在目标检测和分类数据集上训练目标检测器。我们的方法充分利用有标签的检测图片来学习如何区精准的定位目标同时使用分类图像来提高器词汇量和鲁棒性。
使用这种方法,我们训练了YOLO9000,一个实时对象检测器,可以检测9000多种不同的对象类别。首先,我们改进了基础的YOLO检测系统,提出了YOLOv2,一种最先进的实时探测器。然后我们使用我们的数据集组合方法和联合训练算法,在ImageNet的9000多个类别以及来自COCO的检测数据上训练模型。
我们所有的代码和预训练模型都可在线获取,http://pjreddie.com/yolo9000/。
相对于最先进的检测系统,YOLO有很多缺点。YOLO与Fast R-CNN的误差分析表明,YOLO会产生大量的定位误差。此外,与基于区域提议的方法相比,YOLO的召回率相对较低。因此,我们主要关注在保持分类准确性的同时提高召回率和定位正确性。
计算机视觉通常趋向于更大、更深的网络。更好的性能通常取决于训练更大的网络或将多个模型集成在一起。然而,对于YOLOv2,我们想要一个更准确的探测器同时仍然很快。我们没有扩大网络,而是简化了网络,然后使表示更容易学习。我们将过去工作中的各种想法与我们自己的新想法结合起来,以提高YOLO的性能。表2是对结果的总结。
批量归一化批量归一化可以显著提高收敛性,同时消除对其他形式的正则化的需要。通过在YOLO的所有卷积层上添加批量归一化,mAP的改进幅度超过2%。批量归一化也有助于模型的规范化。通过批处理归一化,我们可以在不过度拟合的情况下从模型中去除dropout。
高分辨率分类器所有最先进的检测方法都使用在ImageNet上预训练的分类器。从AlexNet开始,大多数分类器对小于256 × 256的输入图像进行操作。原始的YOLO以224 × 224的分辨率训练分类器网络,并将检测分辨率提高到448。这意味着网络必须同时切换到学习目标检测并调整以适应新的输入分辨率。
对于YOLOv2,我们首先在ImageNet上以完整的448 × 448分辨率对分类网络进行10次微调。这使得网络有时间调整其过滤器,以便在更高分辨率的输入上更好地工作。然后我们继续对所得网络进行微调,以用于检测。这种高分辨率分类网络使我们的mAP增加了近4%。
带有锚框的卷积YOLO直接使用卷积特征提取器的全连接层来预测边界框的坐标。不直接预测坐标,Faster R-CNN使用手工挑选的先验预测边界框。仅使用卷积层的区域候选网络(RPN)在Faster R-CNN中预测锚框的偏移量和置信度。由于预测层是卷积的,RPN在特征映射的每个位置预测这些偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。
我们从YOLO中移除完全连接的层,并使用锚框来预测边界框。首先,我们消除一个池化层,使网络的卷积层的输出具有更高的分辨率。我们还缩小了网络以在416大小的输入图像上运行,而不是448×448。我们这样做是因为我们想在我们的特征映射中有奇数个位置,这样就有一个中心单元格。物体,尤其是大的物体,往往会占据图像的中心,所以最好在中心有一个位置来预测这些物体,而不是附近的四个位置。YOLO的卷积层将图像下采样了32倍,所以通过使用416大小的输入图像,我们得到了13 × 13的输出特征图。
当我们转而使用锚框时,我们也将类预测机制与空间位置解耦,转而预测每个锚框的类和对象。和YOLO一样,对象预测仍然预测了真值和候选框的IOU,类别的预测则预测在存在一个对象的情况下,该类别的条件概率。
通过使用锚框,我们的精度略有下降。YOLO每张图像只预测98个框,但使用锚框,我们的模型可以预测超过1000个框。没有锚框,我们的中间模型得到69.5 mAP,召回率为81%。使用锚框后,我们的模型得到69.2 mAP,召回率为88%。尽管mAP降低了,但召回率的增加意味着我们的模型还有更多的改进空间。
大小聚类将锚框在YOLO中使用时,我们遇到了两个问题。首先,锚框的尺寸是手工选定的。网络可以学习适当地调整盒子,但是如果我们为网络选择更好的先验,可以让网络更容易地学到如何预测。
我们在训练集的边界框上运行kmeans聚类来自动地找寻找的更优的先验框,而不是手动选择。如果我们使用欧几里得距离下的标准kmeans,会使得大的锚框比小的锚框的距离更大也就是说聚类的结果会和框的大小相关。但是,我们真正想要的是可以获得更好的IOU的先验,而这和锚框的大小是无关的。因此,我们自定义了Kmeans的距离度量如下:
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box,centroid)=1-IOU(box,centroid) d(box,centroid)=1−IOU(box,centroid)
然后,我们用不同的k值运行k-means,并绘制最接近质心的平均IOU,如图2所示。
我们最终选择k = 5,因为其在模型复杂性和高召回率之间取得了一个很好的平衡。使用聚类与手动挑选的锚框明显的不同。短而宽的盒子更少,而高而窄的盒子更多。
我们用聚类和手动选择锚框两种策略,对其平均IOU进行了比较。k=5的聚类策略的表现与手动选择9个锚框类似,平均IOU分别为61.0和60.9。如果k=9,那么可以得到更高的平均IOU。这表明使用kmeans来生成边界框可以使模型具有更好的表示,并且使得任务更容易学习。
直接位置预测在YOLO中使用锚框时,我们遇到了第二个问题:模型不稳定性,特别是在早期迭代期间。大多数不稳定性来自于对边界框 ( 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将使框向右移动一个锚框的宽度,tx = - 1将使其向左移动相同的宽度。这个公式是不受约束的,所以任何锚框都可以在图像中的任何一点结束,而不管锚框的位置是什么。在随机初始化的情况下,模型需要较长的稳定时间才能预测出合理的偏移量。我们采用了YOLO的方法,预测相对于网格单元位置的位置坐标,而不是预测偏移。这将真值限定在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,则预测对应于:
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_we^{t_w} bw=pwetw
b h = p h e t h b_h=p_he^{t_h} bh=pheth
P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t o ) Pr(object)*IOU(b,object)=\sigma(t_o) Pr(object)∗IOU(b,object)=σ(to)
由于我们约束了位置预测,因此参数更容易学习,使得网络更稳定。使用大小聚类和直接预测边界框的中心位置可以提高精度与使用锚框的版本相比,YOLO提高了近5%。
细粒度特征改进的YOLO在13 × 13的特征映射上预测检测。虽然这对于大型目标来说已经足够了,但是对于定位较小的目标,更细的粒度可能对其更有效。Faster R-CNN和SSD都在网络中的各层特征映射上运行它们的候选网络,来获得一系列分辨率。我们采用了一种不同的方法,简单地添加一个passthrough层,从26 × 26分辨率的早期层中提取特征。
passthrough层通过将相邻的特征叠加到不同的通道而不是空间位置来连接高分辨率特征和低分辨率特征,类似于ResNet中的身份映射。将26x26x512的特征图转变为一个13x13x2048的特征图,这就可以和初始的特征相连接。我们的检测器运行在这个扩展的特征映射之上,这样它就可以访问细粒度的特征。这将带来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 mAP,同时仍然可以以超过实时的速度运行。在表3和图4中可以看到YOLOV2和其他框架在VOC 2007上的对比。
进一步的实验我们在VOC 2012上训练了YOLOv2。表4显示了YOLOv2与其他先进检测系统的性能比较。YOLOv2在运行速度远快于竞争对手的情况下达到73.4 mAP。我们还在COCO上进行了训练,并在表5中与其他方法进行了比较。在VOC度量(IOU =0.5)下, YOLOv2获得44.0 mAP,与SSD和Faster R-CNN相当。
我们希望检测准确,但也希望快速。大多数检测应用,如机器人或自动驾驶汽车,都依赖于低延迟预测。为了使得性能最佳我们,我们一开始就设计的YOLOV2速度很快。
大多数检测框架都依赖于VGG-16作为基本特征提取器。VGG-16是一个功能强大,准确的分类网络,但它有些过于复杂。VGG-16的卷积层需要306.9亿次浮点运算才能通过一张224 × 224分辨率的图像。
YOLO框架使用基于Googlenet架构的自定义网络。这个网络比VGG-16快,只用了85.2亿次操作。然而,它的精度略低于VGG-16. 在单次裁剪和224 × 224分辨率条件下, YOLO的自定义模型在ImageNet上取得了88.0%的top-5准确率,而VGG-16为90.0%。
Darknet-19我们提出了一个新的分类模型作为YOLOv2的基础。我们的模型建立在之前的网络设计工作以及该领域的共同知识之上。类似于我们常用的VGG模型我们主要使用了3 × 3的卷积核,并在每个池化步骤后增加一倍的通道数量。参考这项工作,网络上的后续网络(NIN),我们使用全局平均池化来进行预测,以及1 × 1卷积来压缩3 × 3个卷积之间的特征表示。我们使用批量归一化来稳定训练,加速收敛,并正则化模型。
我们的最终模型,称为Darknet-19,有19个卷积层和5个maxpooling层。完整的描述见表6所示。Darknet-19只需要55.8亿次操作来处理图像,却达到了72.9%的顶级精度,在ImageNet上准确率为91.2%。
分类训练我们在标准的ImageNet 1000类分类数据集上训练网络,共160个epoch,使用随机梯度下降,初始学习率为0.1,学习率衰减策略采用多项式速率衰减,参数设置为幂4、权重衰减参数为0.0005和动量设置为0.9并使用Darknet神经网络框架。在训练过程中,我们使用标准的数据增强技巧,包括随机裁剪、旋转、色调、饱和度和曝光位移。
如上所述,在对224 × 224的图像进行初始训练后,我们将网络调整为更大的尺寸,448。对于这种微调,我们使用上述参数进行训练,但只有10个epoch,并且以 1 0 − 3 10^{−3} 10−3的学习率开始。在这个更高的分辨率下,我们的网络达到了76.5%的top-1精度和93.3%的top-5精度。
检测训练为了检测,我们修改了这个网络,删除了最后一个卷积层,增加了三个3 × 3的卷积层,每个卷积层有1024个滤波器,最后一个1 × 1的卷积层检测所需的输出数量。对于VOC,我们预测5个框,每个框有5个坐标,20个类别,所以需要125个过滤器。我们还从最后的3 × 3 × 512层添加了一个passthrough层到倒数第二个卷积层,以便我们的模型可以使用细粒度特征。
我们以 1 0 − 3 10^{−3} 10−3的起始学习率训练网络160次,在第60次和第90次时学习率除以10。我们使用0.0005的权重衰减和0.9的动量。使用与YOLO和SSD类似的数据增强方法,包括随机裁剪、颜色移动等。在COCO和VOC数据集上,采用相同的训练策略。
我们提出了一种分类和检测数据联合训练的机制。该方法使用有检测标签的图像来学习特定的检测信息,如边界框的坐标预测和是否有目标,以及如何对常见物体进行分类。它使用仅带有分类标签的图像来扩展它可以检测的类别的数量。
在训练过程中,我们混合了来自检测和分类数据集的图像。当我们的网络看到有检测标签的图像时,我们可以基于完整的YOLOv2损失函数进行反向传播。当它看到分类图像时,我们只在架构特定的分类部分进行损失的反向传播。
这种方法存在一些挑战。检测数据集只有常见的对象和一般的标签,比如“狗”或“船”。而分类数据集具有更广泛和更细节的标签。ImageNet上有一百多个品种的狗,包括“诺福克梗”、“约克郡梗”和“贝德林顿梗”。如果我们想在两个数据集上进行训练,我们需要一个连贯的方法来合并这些标签。
大多数分类方法在所有可能的类别中使用softmax层来计算最终的概率分布。使用softmax假定了类是互斥的。这就给组合数据集带来了问题,比如,你不希望使用这个模型组合ImageNet和COCO,因为“Norfolk terrier”和“dog”类不是互斥的。
相反,我们可以使用多标签模型来组合数据集,而不假设互斥。这种方法忽略了我们所知道的关于数据的所有结构,例如,所有的COCO类都是互斥的。
层次分类 ImageNet标签是从WordNet中提取的,WordNet是一个语言数据库,用于构建概念以及它们之间的关系。在WordNet中,“诺福克梗”和“Yorkshire terrier”都是“terrier”的下位词,“terrier”是“猎犬”的一种,而“猎犬”是“狗”的一种,“狗”是“犬科动物”的一种,等等。大多数分类方法都假设标签的结构是扁平的,但是对于组合数据集来说,层次正是我们所需要的。
WordNet的结构是一个有向图,而不是树,因为语言是复杂的。例如,“dog”既是“canine”的一种,也是“domestic animal”的一种,两者都是WordNet中的同义词集。我们没有使用完整的图结构,而是利用ImageNet中的概念构建层次树来简化问题。
为了构建这棵树,我们检查ImageNet中的视觉名词,并查看它们通过WordNet图到根节点的路径,在本例中是“物理对象”。许多语法集在图中只有一条路径,所以首先我们将所有这些路径添加到树中。然后我们迭代地检查我们剩下的概念,并添加尽可能少地使树增长的路径。如果一个概念有两条到根结点的路径其中一条会给树增加三条边而另一条只会增加一条边,我们会选择更短的路径。
最终的结果是WordTree,一个视觉概念的分层模型。为了使用WordTree进行分类,我们在每个节点上预测给定该同义词集的每个下义词的概率的条件概率。例如,在“terrier”节点,我们预测:
P r ( N o r f o l k t e r r i e r ∣ t e r r i e r ) P_r(Norfolk terrier|terrier) Pr(Norfolkterrier∣terrier)
P r ( Y o r k s h i r e t e r r i e r ∣ t e r r i e r ) P_r(Yorkshire terrier|terrier) Pr(Yorkshireterrier∣terrier)
P r ( B e d l i n g t o n t e r r i e r ∣ t e r r i e r ) P_r(Bedlington terrier|terrier) Pr(Bedlingtonterrier∣terrier)
…
如果我们想计算一个特定节点的绝对概率,我们只需沿着树的路径到达根节点,然后乘以条件概率。因此,如果我们想知道一张图片是否是诺福克梗,我们计算:
P r ( N o r f o l k t e r r i e r ) = P r ( N o r f o l k t e r r i e r ∣ t e r r i e r ) ∗ P r ( t e r r i e r ∣ h u n t i n g d o g ) . . . ∗ P r ( m a m m a l ∣ a n i m a l ) ∗ P r ( a n i m a l ∣ p h y s i c a l o b j e c t ) P_r(Norfolk terrier)=P_r(Norfolk terrier|terrier) *P_r(terrier|hunting dog) ... *P_r(mammal|animal) *P_r(animal|physical object) Pr(Norfolkterrier)=Pr(Norfolkterrier∣terrier)∗Pr(terrier∣huntingdog)...∗Pr(mammal∣animal)∗Pr(animal∣physicalobject)
为了便于分类,我们假设图像包含一个对象,即 P r ( p h y s i c a l o b j e c t ) = 1 P_r(physical object)= 1 Pr(physicalobject)=1。
为了验证这种方法,我们在使用1000类的ImageNet构建的WordTree上训练Darknet-19模型。为了构建WordTree1k我们加入所有中间节点,将标签空间从1000扩展到1369。在训练期间,我们将真实标签传播到树中,以便如果图像被标记为“诺福克梗”,它也被标记为“狗”和“哺乳动物”等。为了计算条件概率,我们的模型预测了一个包含1369个值的向量,我们计算了作为同一概念的下位词的所有同义词集合的softmax,参见图5。
使用与之前相同的训练参数,我们的分层Darknet-19达到了71.9%的top-1准确率和90.4%的top-5准确率。尽管增加了369个额外的概念,并让我们的网络预测树形结构,但我们的准确性只会略微下降。以这种方式执行分类也有一些好处。对于新的或未知的对象类别,性能会优雅地下降。例如,如果网络看到一张狗的照片,但不确定它是什么类型的狗,它仍然会以高置信度预测“狗”,但在下位词中的置信度较低。
这个方法也适用于检测。现在,我们不再假设每个图像都有一个对象,而是使用YOLOv2的目标预测器给出 P r ( p h y s i c a l o b j e c t ) P_r(physical object) Pr(physicalobject)的值.检测器预测边界框和概率树。我们向下遍历树,在每个分叉处取最高置信度的路径,直到到达某个阈值,然后我们预测该对象类。
利用WordTree实现数据集的组合我们可以使用WordTree以一种合理的方式将多个数据集组合在一起。我们只需将数据集中的类别映射到树中的同义词集。图6显示了一个使用WordTree来组合ImageNet和COCO标签的示例。WordNet非常多样化,因此我们可以将此技术用于大多数数据集。
联合分类与检测现在我们可以使用WordTree组合数据集,在分类和检测上训练我们的联合模型。我们想要训练一个超大规模的检测器,所以我们使用COCO检测数据集和完整的ImageNet的前9000个类创建了我们的组合数据集。我们还需要评估我们的方法,所以我们添加了ImageNet检测挑战中尚未包含的任何类。此数据集对应的WordTree有9418类。ImageNet是一个大得多的数据集,所以我们通过对COCO进行过采样来平衡数据集,这样ImageNet只大了4倍。
使用这个数据集我们训练YOLO9000。我们用基础的YOLOv2架构,但只有3个先验框,而不是5个,以限制输出大小。当网络看到检测图像时,损失将正常的反向传播。对于分类损失,我们只反向传播标签对应级别或更高级别的损失。例如,如果标签是“狗”,我们会将任何错误分配给树中更低的预测,“德语牧羊犬"和"金毛猎犬"因为我们没有这方面的信息。
当它看到分类图像时,我们只反向传播分类损失。要做到这一点,我们只需找到预测该类概率最高的边界框,然后计算其预测树上的损失。我们还假设预测框与真值标签重叠至少0.3个IOU,并基于此假设反向传播目标损失。
通过这种联合训练,YOLO9000学习使用COCO中的检测数据在图像中查找对象,并使用来自ImageNet的数据学习对各种各样的这些对象进行分类。
我们在ImageNet检测任务上评估了YOLO9000。ImageNet的检测任务与COCO共享44个对象类别,这意味着YOLO9000只看到了大多数测试图像的分类数据,而没有看到检测数据。YOLO9000在它从未见过任何标记检测数据的156个不相交对象类上获得19.7 mAP和16.0 mAP。这个mAP高于DPM取得的结果,但YOLO9000是在只有部分监督的不同数据集上训练的。它还可以实时检测9000个其他对象类别。
当我们分析YOLO9000在ImageNet上的表现时,我们看到它能很好地学习新的动物物种,但在学习服装和设备等类别时却遇到了困难。新的动物更容易学习,因为对象性预测很好地从COCO中的动物中泛化。相反,COCO没有任何类型的服装的边界框标签,只有人,所以YOLO9000努力建模“太阳镜”或“泳裤”等类别。
我们引入了YOLOv2和YOLO9000实时检测系统。其中YOLOv2是最先进的,比其他检测系统在各种检测数据集上都更快。此外,它可以在各种图像尺寸下运行,以提供速度和精度之间的平滑权衡。
YOLO9000是一个实时检测框架,通过对检测和分类的共同优化,可以检测9000多种目标类别。我们使用WordTree结合各种来源的数据和我们的联合优化技术在ImageNet和COCO上同时训练。YOLO9000是缩小检测和分类之间数据集大小差距的有力一步。
我们的许多技术推广到目标检测之外。我们的ImageNet的WordTree表示为图像分类提供了更丰富、更详细的输出空间。使用层次分类的数据集组合在分类和分割领域是有用的。像多尺度训练这样的训练技术可以在各种视觉任务中提供好处。
对于未来的工作,我们希望使用类似的技术进行弱监督图像分割。我们还计划使用更强大的匹配策略来改进检测结果,以便在训练期间为分类数据分配弱标签。计算机视觉拥有大量的标记数据。我们将继续寻找将不同来源和数据结构结合在一起的方法,以构建更强大的视觉世界模型。