YOLO9000:更好,更快,更强
约瑟夫·雷德曼等
摘 要
我们介绍最先进的实时检测系统YOLO9000能检测超过9000个物体类别。首先,我们对YOLO检测方法提出了多种改进方法,包括新颖的和从之前工作中的。这个改进的模型YOLOv2在标准检测任务像PASCAL VOC和COCO上是最先进的。使用一种新颖的多尺度的训练方法,像YOLOv2这样的模型能运行在多种尺寸上,在速度和准确性上提供了一个简单的折中。YOLOv2在VOC 2007上取得了76.8 mAP和67 FPS。在40 FPS时,YOLOv2取得了78.6 mAP,优于目前最先进的方法,像使用ResNet的Faster R-CNN和SSD,同时运行的更快。最后,我们提出了一种在目标检测和分类联合训练的方法。我们使用这种方法让YOLO9000同时在COCO检测数据集和ImageNet分类数据集上进行训练。我们的联合训练使得YOLO9000能在没有检测数据标签的物体类别上进行检测预测。我们在ImageNet检测任务上验证了我们的方法。尽管在200个类别中只有44个是检测数据,YOLO9000在ImageNet检测验证集上取得了19.7 mAP。在156类不在COCO中,YOLO9000取得了16.0 mAP。但是YOLO可以检测超过2000个类别。它能进行超过9000个不同物体类别的检测预测。并且能保持实时运行。
1 引言
通用目标检测应该快速,准确,并且能识别各种各样的物体。自从引进了神经网络,检测框架变得越来越快速和准确。但是,大多数检测方法仍然局限于一小部分对象。与用于分类和标记等其它任务的数据集相比,当前的目标检测数据集是有限的。最常见的数据集包含数千到数十万个带有几十到几百个标签的图像。 分类数据集有数以百万计的图像,包含有几十万个类别。我们希望检测的规模到达物体分类的水平。但是,对图像的检测标注相比于分类或标签标注(标签通常是用户免费提供的)要贵的多。因此我们不大可能在最近的未来看到检测数据集到达分类数据集的规模。
我们提出一种新的方法用来利用已有的大量的分类数据,并将其用于扩展现有的检测系统范围。我们的方法使用物体对象的分层视图,它将允许我们将不同的数据集组合在一起。
我们同时提出了联合训练算法,允许我们在目标检测训练时结合检测和分类数据。我们的方法利用标记的检测图像来学习精确定位物体,同时使用分类图像来增加词汇量和鲁棒性。
我们使用这种方法训练一个实时的目标检测系统YOLO9000,它能检测超过9000种不同的物体类别。首先我们改进了基于YOLO的检测系统,产生了最先进的实时的检测器YOLOv2。然后我们使用数据库结合方法和联合训练算法对ImageNet中的9000多个类别和COCO中训练检测数据进行训练。
2 更好
相比于最先进的检测系统,YOLO有许多缺点。YOLO的错误分析与Fast R-CNN相比显示YOLO产生许多定位错误。此外,与基于区域建议的方法相比,YOLO的有相对低的召回率。因此我们在维持分类准确率的同时,把焦点主要放在提高召回率和定位上。
计算机视觉通常倾向与更大,更深的神经网络。更好的性能通常取决于训练更大的网络,或将更多的模型组合起来。但是,我们的YOLOv2想要有一个精确的检测器的同时仍然能很快。我们没有扩展我们的网络,而是简化了网络,然后使表示更容易学习。我们将过去工作中的各种想法与我们自己新颖的概念结合起来,以提高YOLO的性能。结果总结见表2。
表2 从YOLO到YOLOv2的过程。大多数表中列出的设计决策都会导致mAP的显著提高。两个例外的情况是切换到带锚框的全卷积网络和使用新的网络。在使用新的网络时,切换到带锚框的方法,在没有改变mAP的情况下,增加了33%的召回率。
批归一化。批归一化可以显著提高收敛性,同时消除对其它形式正则化的需求。通过在YOLO的所有卷积层中添加批归一化,我们在mAP上得到超过2%的提升。批归一化同时帮助了模型正则化。通过批归一话,我们可以在模型没有过拟合的情况下删除随机丢失。
高分辨率分类。所有最先进的检测方法都是使分类器在ImageNet上进行预训练。从AlexNet开始,大多数分类器都输入图像都小于256×256。最初的YOLO在224×224的输入上训练分类网络,然后把分辨率增加到448来做检测。这意味着网络不得不同时切换学习目标检测和适应新的输入分辨率。
对于YOLOv2,我们首先在ImageNet上以448×448的分辨率微调分类网络10个周期。这使得网络有时间去调整它的滤波器能在高分辨率输入上工作的更好。我们然后微调了检测结果网络。这个高分辨率分类网络给我们增加了大概4%的mAP。
带有锚框的卷积。YOLO预测边界框的坐标直接使用全连接层从卷积层的顶部提取特征。Faster R-CNN不是直接预测坐标,而是使用手工挑选的先验知识来预测边界框。在Faster R-CNN中的区域建议网络(RPN)只使用卷积层来预测锚框的偏移量和置信度。因为预测层是卷积层,所以区域建议网络可以在特征图的任何位置预测这些偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。
我们从YOLO中移除了全连接层,然后使用锚框来预测边界框。首先我们取消了池化层,使得网络的卷积层能输出更高的分辨率。我们还对网络进行了缩小,使其能过处理416的输入图像,而不是448×448。我们这样做是因为我们希望我们的特征图中有基数个位置,使得只要一个中心单元格。物体,特别是大物体,往往占据图像的中心,所以最好在中心有一个位置来预测这些物体,而不是在四个位置附近预测。YOLO的卷积层对图像下采样32倍,所以当输入图像是416时,我们得到一个13×13的输出特征图。
当我们移动到锚框时,我们还将类别预测机制与空间预测机制解耦,而是预测每个锚框的类别和物体概率。在YOLO之后,物体概率的预测仍然基于真实和建议框的交并集进行预测,并且类别预测是在给的的类别是一个物体的的条件下的概率。
使用锚框时,我们在精确度上有一点下降。YOLO每张图像只能预测98个边框,但是使用锚框,我们的模型能预测超过1000个边框。要是没有锚框我们的中等模型可以得到69.5 mAP和81%的召回率。虽然mAP减少了,召回率的提升意味着我们的模型有更大的改进空间。
图2 在VOC和COCO上的边框维度聚类。我们在不同维度的边框上运行K均值聚类,在我们的模型上取得一个好的提前预设。左图显示我们在多种选择K值上取得的平均交并集。我们发现当K=5时,在召回率和模型复杂度之间取得很好的平衡。右图显示在VOC和COCO上的相对质心。这两组预设都更倾向于更窄和更高的边框,而COCO在尺寸上比VOC变化更大。
维度聚类。我们在YOLO中使用锚框时遇到了连个问题。第一个问题是边框的维度是手工提取的。网络能学习调整大概的边框,但是如果我们在开始提前提取更好的边框,我们能让网络学习预测好的检测更容易。
我们使用K均值聚类在训练集边界框上自动寻找好的预设来替代手工提前选择。如果我们使用欧式距离的标准K均值,较大的边框比较小的边框更容易产生误差。但是,我们真正想要的好的交并比得分的预设,与边界框的大小无关。因此,我们使用距离度量如下:
我们对K的不同值运行K均值聚类,并用最近的质心绘制平均交并比,如图2。我们使用K=5作为模型复杂度和高召回率的一个平衡。聚类的质心与手工选择的锚框有明显的不同。它们很少有短而宽的边框,而是更多的长而细的边框。
表1 在VOC 2007上边框最近预设的平均交并比。使用不同的方法,在VOC 2007上的物体平均交并比与它们最近的、未修改的先验值。聚类的方法给出了比使用手工方法更好的结果。
在表1中,我们将平均交并比与我们聚类策略的最近预设和手工设计的锚框对比。只有5个预设时时的质心的平均交并比61.0,表现类似与9个锚框的平均交并比60.9。如果我们使用9个质心,我们可以看到一个更高的平均交并比。这表明使用K均值生成的边界框的模型,可以从更好的表示开始,并是任务更容易学习。
直接位置预测。当YOLO使用锚框进行预测时,我们遇到了第二个问题:模型不稳定,特别是在迭代早期。大多数不稳定都来自预测边框(x,y)位置。在区域建议网络中,网络预测tx和ty以及(x,y)中心坐标的计算如下:
例如,tx=1的预测将使边框向右移动一个锚框的宽度,tx=-1的预测将使边框向左移动相同的量。这个公式是不受约束的,所以任何锚框都可以在图像的任何点结束,而不管该锚框的预测位置是什么。在随机初始化的情况下,模型需要很长时间才能稳定到合理的偏移量。
与预测偏移量不同,我们采用YOLO的方法来预测相对于网格单元的位置坐标。这使得真实值被限制在0和1之间。我们使用逻辑激活来限制网络的预测在这个范围内。
网络在每个输出特征图中预测5个边界框。对每个边界框,网络预测5个坐标tx,ty,tw,th和to。如果单元格的偏移量是从图像的左上角开始为(cx,cy),并且边界框的预设有宽度pw和高度ph,那么这些预测值如下:
因为我们约束了预测位置参数使得学习更容易,让网络更稳定。使用维度聚类和直接预测边界框中心位置可以使YOLO比使用锚框版本提高近5%。
表3 在PASCAL VOC 2007上的检测框架。YOLOv2比先前的检测方法更快并且更准确。它也能在运行不同的分辨率并容易的在速度和准确率上取得平衡。每个YOLOv2条目都是具有相同权重的相同的训练模型,只是以不同的大小进行评估。所有的时间信息都是在GeForce GTX Titan X上取得。
细粒度特征。这个改进的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}。我们将网络调整到这个维度,并继续训练。
这种机制迫使网络在各种输入维度上进行良好的预测。这意味着相同的网络可以在不同的分辨率上进行检测预测。这个网络在小尺寸上运行的更快,所以YOLOv2在速度和准确率上提供了简单的折中。
在低分辨下,YOLOv2是一种廉价、相当精确的检测器。在288×288时,它运行超过90FPS,并且mAP几乎和Fast R-CNN一样好。这使得它非常适合于更小的GPU、高帧速率或多视频流。
YOLOv2在高分辨率下是最先进的检测器,在VOC 2007上有78.9 mAP,并且仍能在实时速度以上运行。从表3中可以看到YOLOv2和其它框架在VOC 2007上的比较。如图4。
图4 在VOC 2007上的准确率和速度
3 更快
我们想让检测变得更精确,同时也想让它变得更快。大多数检测的应用场景,例如机器人或自动驾驶汽车,依赖与低延时预测。为了最大化性能,我们在前面的工作上设计了更快的YOLOv2。
大多数检测框架都是依赖于基于VGG-16的特征提取器。VGG-16是一个强大、准确的分类网络,但是它有不必要的复杂。VGG-16的卷积层对单张224×224分辨率的图像单次通过需要306.9亿次浮点运算。
表6 Darknet-19
YOLO框架使用的定制网络是基于GoogNet架构。这个网络比VGG-16更快,向前传播只需要85.2亿次运算。但是,它的精确度比VGG-16稍差一些。
对于单个物体,224×224的前5名准确率,YOLO的定制模型在ImageNet上获得88.0%的准确率,相比于VGG-16获得了90.0%的准确率。
Darknet-19。我们提出一个新的分类模型被用于YOLOv2的基础模型。我们的网络建立在网络设计的前期工作和该领域的常识基础上。与VGG模型类似,我们主要使用3×3的滤波器,并且每步池化步骤之后将通道数量增加一倍。在网络中的网络(NIN)的基础上,我们使用全局平均池化来进行预测,同时使用1×1的滤波器在3×3的卷积的特征表示之间压缩。我们使用批归一化来稳定模型训练,加速收敛,并使模型正则化。
我们的最终模型叫做Darknet-19,它有19个卷积层和5个最大池化层。全部的描述请看表6。Darknet-19每张图像只需要55.8亿次操作就能在ImageNet上获取72.9% top-1的准确率和91.2% top-5的准确率。
分类器训练。我们在标准的ImageNet 1000类分类数据集上使用Darknet神经网络框架来训练网络。训练了160个周期,使用初始学习率为0.1的随机梯度下降法,多项式衰减系数为4,衰减权重为0.0005,动量为0.9。在训练期间我们使用一些标准的数据增强技巧,包括随机裁剪、旋转和色调,饱和度和曝光度的偏移。
如上所述,在对224×224的图像进行初始的训练之后,我们将网络微调到更大的尺寸448。在微调时,我们也是用上面的参数进行训练,但是只训练10个周期,并且开始的学习率为10-3。在高分辨率下,我们的网络获取了76.5% top-1准确率和93.3% top-5准确率。
检测器训练。我们通过移除最后一个卷积层来修改该网络以进行检测,添加三个3×3的卷积层,每个卷积层有1024个滤波器,最后一个1×1的卷积层具有我们检测所需的输出数量。对VOC我们预测5个边界框,每个框5个坐标,每个框20个类别,所以一共125个滤波器。我们还从最后的3×3×512层到第二层直连到最后的卷积层,这样我们就可以使用细粒度特征。
我们训练网络用了160个周期,开始学习率为10-3,在60和90个周期除以10。我们使用的权重衰减为0.0005并且动量为0.9。我们使用与YOLO和SSD类似的数据增强,例如随机裁剪、颜色变换等。我们使用相同的训练策略在COCO和VOC上。
4 更强
我们提出了一种联合训练分类和检测数据的机制。我们的方法使用标记图像来学习检测特定的信息,如边界框的坐标预测和物体性,以及如何对常见物体分类。它使用只有类别标签的图像来扩展它可以检测到的类别数量。在训练期间,我们把检测和分类数据集进行了混合。当我们的网络看到标记为检测的图像时,我们可以基于完整的YOLOv2损失函数进行反向传播。当它看到分类的图像使,我们只在特定的分类结构部分部分进行反向传播。
这种方法带来了一些挑战。检测数据集只有一些常见的物体和一般的标签,例如“狗”和“船”。分类数据集有更广泛和深度的标签范围。ImageNet有一百多个品种的狗,包括“诺福克梗”、“约克郡梗”和“贝灵顿梗”。如果我们想要在两个数据集一起训练,我们需要一个连贯的方法来合并这些标签。
大多分类方法在所有可能的标签中使用一个softmas层来计算最终非概率分布。使用softmax假定类别是相互排斥的。这对联合数据集提出了一个问题,例如你并不像使用这个模型来联合ImageNet和COCO,因为“诺福克梗”和“狗”的标签并不相互排斥。
我们可以使用多标签模型来联合数据集,这样就没有假设它们是相互排斥的。这种方法忽略了我们所知的数据结构,例如,所有COCO类别都是相互排斥的。
分级分类。ImageNet标签来自WordNet,WordNet是一个语言数据库,用来构建概念和它们之间的关系。在WordNet中,“Norfolk terrier”和“Yorkshire terrier”都是“terrier”的下位词,“terrier”是“hunching dog”的一种类型,“dog”是“canine”的一种类型,等等。大多数分类方法都假设标签的结果是扁平的,但对于组合数据集,结构正是我们需要的。
WordNet是一个有向图结构,而不是一个树结构,因为语言是复杂的。例如,“dog”标签既是 “canine” 类型也是f “domestic animal”类型,它们都是WordNet中的语法集。没有用完全图结构,我们通过从ImageNet的概念中建立一个分层树来简化问题。
为了构建这个树,我们检测了ImageNet中的可视名词,并且查看它们通过WordNet图到根结点的路径,在本例中是“物理对象”。许多语义集在图中只有一条路径,所以我们把这些所以的路径都添加到我们的树中。然后我们迭代的检测遗留的概念,并添加使树增长尽可能少的路径。如果有一个概念有两条路径,一条路径将向树中添加三条边,而另一条只添加一条边,那么我们选择较短的路径。
最终的结果是一个词树,一种可视概念的分层模型。使用词树来执行分类,我们在每个结点上预测给定语义集的每个下位词的条件概率。例如,对于“terrier”结点,我们预测:
如果我们想要计算一个特定结点的绝对概率,我们只要沿着树到根结点的路径,乘以条件概率。所以,如果我们想要知道一张图片是否是Norfolk terrier,我们们只需要计算:
Pr(Norfolk terrier) = Pr(Norfolk terrier|terrier)
*Pr(terrier|hunting dog)
*...
*Pr(mammal|animal)
*Pr(animal|physical object)
为了分类目的,我们假设图像包含一个对象:Pr(physical object) = 1。
为了验证这种方法我们使用1000类ImageNet建立的WordNet在Darknet-19模型上进行训练。为了构建WordTree 1k,我们添加了所有的中间节点,这些节点将标签空间从1000扩展到1369。在训练过程中,我们在树上传播真实值标签,这样如果一个图像被标记为“Norfolk terrier”,它也会被标记为“狗”和“哺乳动物”,等等。为了计算条件概率,我们的模型预测一个1369维向量,并且我们计算了语义集所有相同概念的下位词的softmax,如图5所示。
图5 ImageNet与WordTree的预测。大多数ImageNet模型使用一个巨大的softmax来预测一个概率分布。使用WordTree,我们可以在同下位词上执行多个softmax操作。
使用与之前一样的训练参数,我们的分层Darknet-19取得了71.9% top-1的准确率和90.4% top-5的准确率。 尽管增加了369个额外的概念,并让我们的网络预测一个树状结构,我们的准确只是略有下降。以这种方式执行分类也有一些好处。对新的或未知的对象类别,性能会大幅下降。例如,如果网络看到一只狗的图片,但不确定它是什么类型的狗,它仍会以高的置信度预测为“狗”,但在下位词之间传播的置信度较低。
这种方法也适用于检测。现在,我们不再假设每个图像都有一个对象,而是使用YOLOv2的物体检测器来给出我们的Pr(physical object)的值。这个检测器预测一个边界框和一个概率数。我们沿着树向下遍历,在每个分支处取最高的置信度路径,直到到达某个阈值,然后预测对象类别。
数据集与WordTree的组合。我们可以使用WordTree以一种合理的方式把多个数据集组合到一起。我们简单的把数据集中的目录映射到语义集树上。图6展示了一个使用WordTree把标签组合到ImageNet和COCO上例子。WordNet非常多样性,因此我们可以将这种技术用于大多数数据集。
联合分类和检测。现在我们可以使用WordTree来组合数据集,我们能在分类和检测模型上联合训练。我们想训练一个超大规模的检测器,因此我们使用COCO检测数据集和ImageNet完整版中的前9000个类创建组合数据集。我们也需要评估我们的模型,所以我们添加了ImageNet检测数据集挑战中还没有包含的其它类别。这个数据集对应的WordTree有9418个类别。ImageNet是一个巨大的数据集,因此我们通过对COCO进行采样来平衡数据集,从而使ImageNet只比原来大4:1。
我们使用这个数据集训练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个其它物体类别的同时,还是实时的。
当我们在ImageNet上分析YOLO9000的性能时,发现它能很好学习新种类的动物,但在学习服装和设备类别时却很困难。新的动物更容易学习,因为物体预测能动物能从COCO中归纳。相反,COCO中没有任何衣服类型的边界框标签,只有人边界框标签。所以YOLO9000对像“墨镜”或“泳裤”这样的模型类别很困难。
5 结论
我们介绍了YOLOv2和YOLO9000,实时的检测系统。YOLOv2在大量的检测数据集上都是最先进的。此外,它能在各种尺寸的图像上运行,来平滑速度和准确率的平衡。
YOLO9000是一个实时的框架,通过联合优化检测和分类能检测超过9000个物体类。我们使用WordTree从各种源数据中组合,联合优化技术来同时在ImageNet和COCO上进行训练。YOLO9000是缩小检测和分类数据集大小之间差距的有力一步。
我们的许多技术都能在目标检测之外推广。我们在ImageNet的WordTree表示为图像分类提供了丰富,更详细的输出空间。使用分级分类的数据集组合能有效的应用在分类和分割领域。像多尺度训练这样的训练技术能对不同的视觉任务带来好处。
在未来的工作中,我们希望使用类似的技术来进行弱监督图像分类。我们还计划在训练期间使用更强大的匹配策略来给分类数据分陪弱标签,以提供检测结果。计算机视觉拥有大量的标记数据。我们将继续寻找各种方法,将不同的数据源和数据结构组合在一起,以建立更强大的视觉世界模型。
参考资料
1.xxx.itp.ac.cn/pdf/1612.08242