(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

YOLO9000: Better, Faster, Stronger论文阅读笔记2016

Abstract

我们提出了YOLO9000,一个SOTA,实时目标检测系统,可以检测超过9000类目标。首先,我们对YOLO提出了多种改进方法,新的旧的都有。改进的模型YOLO v2在标准的PASCAL VOC和COCO上达到了SOTA。使用一种新的,多尺度训练方法,**同一个YOLO v2方法可以在不同尺寸上运行,在速度和准确率之间取得了一定的平衡。**YOLO v2在VOC2007取得了67FPS情况下76.8%mAP和40FPS情况下78.6%mAP,超过了SOTA方法,比如使用ResNet的Faster R-CNN和SSD,并且比它们更快。

最后我们提出了一种方法,来同时训练目标检测和分类。使用这种方法,我们同时在COCO数据集和ImageNet数据集上训练YOLO9000。**我们的这种联合训练使得YOLO9000可以对没有在检测数据中标记过的目标类别进行预测(即检测数据集上不存在的目标)。**我们在ImageNet上验证了我们的方法,尽管我们只有200类中的44类的检测数据,**我们在ImageNet的检测验证集上取得了19.7%mAP。对于COCO中不存在的那156类,我们取得了16.0%mAP。**但是YOLO可以预测不止200类目标,可以预测超过9000类目标,并且实时运行。

1. Introduction

**目标检测的通常要求是快速、准确、能够识别很多类别的目标。**随着神经网络的提出,检测模型变得越来越快速和准确。然而,大部分的检测模型仍受限于一小部分目标集,只能够检测一小部分类别的目标。

目前,相比于分类数据集,检测数据集十分有限。最常见的检测数据集包含几十到数百类别目标的成千上万张图像。而分类数据集包含成千上万类别,上百万的图像。

我们希望检测可以达到分类的这种数量级别。然而,检测的标注图像比分类要耗时得多,因此我们近期不太可能看到检测数据集可以有着分类数据集一样的数量级别。(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

我们提出的新模型可以利用我们现有的大数量分类数据,然后使用它扩展先有检测系统的范围。我们方法对目标分类使用了一种hierarchical视角,使得我们可以讲不通的数据集组合。

我们同样提出了一种联合训练算法,可以在检测和分类数据上训练目标检测模型。我们的方法使用分类图像来提升模型的vocabulary和鲁棒性,使用标注的检测数据来提升定位准确性。

我们使用这个方法训练了YOLO9000,一个实时的、可以检测超过9000类目标的目标检测方法。首先我们基于YOLO,进行提升,得到YOLO v2,一个实时、SOTA目标检测方法。然后使用我们的数据集组合方法和联合训练算法来在ImageNet上超过9000类数据和COCO数据集上对模型进行训练。

2. Better

相对于SOTA检测系统,YOLO有着一系列的缺点。YOLO相比于Faster R-CNN的错误分析中指出,YOLO有更多的定位错误。且,YOLO相对于基于区域的检测方法,有相对低的召回率。因此,我们主要关注如何在保持分类准确率的同时,提升召回率和定位准确。

计算机视觉向着更大、更深的网络发展。有着更好表现的网络通常更深或组合了多个模型一起。**然而,对于YOLO v2,我们希望更准确,同时仍然很快。**因此,没有在网络尺度上增加,我们简化了网络,并使得representation更容易学习。我们使用了一些past work中的idea和我们的新想法来提升YOLO的表现,表2中总结了结果。(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

Batch Normalization.

BN在网络收敛中有着很大的提升,同时还使得不再需要其他形式的正则化。在YOLO的所有卷积层上添加BN层之后,我们取得了超过2%的mAP提升。BN同样有助于正则化模型,使用了BN之后我们移除了dropout,没有过拟合。

High Resolution Classifier.

所有SOTA的检测方法都使用在ImageNet上预训练的分类器。从AlexNet开始,大多数分类器都是在小于256 * 256的图像上进行操作。原来的YOLO使用224 * 224训练分类网络,检测是提升到448。这意味着网络不得不同时学习目标检测和适应新的输入分辨率。

对于YOLO v2,==我们首先在ImageNet上对448 * 448图像训练10个epoahs,来微调分类网络。这给网络时间来适应更高的分辨率输入。然后再使用检测数据训练网络。==这种高分辨率的分类网络提升了大概4% mAP。

Convolutional With Anchor Boxes.

YOLO直接使用CNN特征提取之后的FC层来预测bbox的坐标,而Faster R-CNN首先使用人工的先验框,然后再仅使用卷积层(RPN网络)来预测相对于anchor的偏移和置信度。因为RPN是卷积的,它与特征图共享计算,预测offsets而不是坐标简化了任务,使得网络更容易去学习。

我们移除了YOLO中的FC层,使用anchor来预测bbox。首先我们移除一个池化层来使得卷积网络的输出分辨率更高;**将网络从448输入图像变为416,因为我们希望在特征图中得到奇数的长宽,这样可以有一个中心cell。**目标,尤其是大目标,更倾向于占据图像的*,因此对于正*有一个cell非常重要。YOLO的卷积层下采样了32倍,所以416的输入,特征图为13 * 13。

我们还要将类别预测与空间分离。预测的objectness仍是box与ground truth的IOU,分类的预测则是存在目标的情况下每一类的条件概率。

使用anchor之后,我们在准确率上有一点下降。YOLO每张图只预测98boxes,而改造后预测超过1000个。不使用anchor,我们69.5% mAP,81%召回率;使用之后我们69.2% mAP,88%召回率。尽管mAP下降,我们提升了召回率。

Dimension Clusters.

当YOLO使用anchor时,我们遇到两个困难。一个是box的维度时人工选择的,虽然网络可以学习去适应,但是如果我们为网络选择更好的先验框,网络可以取得更好的效果。

**因此我们在训练集的bbox上使用k-means聚类来自动找到好的先验框。**如果我们使用标准的的欧几里得距离的k-means,大的box会比小的box产生更多的错误。然而,我们真正想要的是与groundtruth有更大IOU的先验框,与尺寸无关,因此我们使用下面的距离尺度:(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

我们使用不同的k值进行k-means,画出了centroids的平均IoU,见图2。==我们选择k=5,它在模型复杂度和高召回率之间达到了较好的平衡。==聚类的中心与手工选择的anchor很不一样,有更多的细长的box。(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

表1中,我们比较了我们聚类方法的聚类中心的平均IoU和人工方法的平均IoU。**我们使用5个先验框就可以达到人工9个先验框的表现。如果我们使用9个聚类中心,我们的效果更佳。**这表明使用k-means生成bbox使得网络更好训练,任务更容易学习。(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

Direct location prediction.

YOLO使用anchor的时候,我们遇到的第二个问题是模型的不稳定性,尤其是在早期的迭代时。大多数不稳定性都来自于预测box的(x,y)坐标。在区域建议网络中,网络预测值tx和ty,通过下面的式子来计算中心坐标:

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

举例说明,预测tx=1则会使得box的x向右平移一个宽度,tx=-1则会向左偏移一个宽度。

上面的公式是不受限制的,所以每个anchor的边界可以在图像中的任一点,而不管这个box是由哪个位置提出的。随机初始化模型会使得网络花费很长的时间来稳定预测可靠的offsets。

因此,我们直接遵循YOLO的方法,直接预测bbox相对于grid cell的位置坐标,而不是offsets。这使得ground truth落在0到1之间,我们使用一个逻辑**函数来将网络的预测限制在这个范围。

网络在每个特征图的每个cell预测5个bbox,对每个bbox有5维坐标,tx、ty、tw、th、to。如果这个cell的坐标相对于图像左上角有(cx,cy)的偏移,先验框的初始宽度高度为pw、ph,那么这个bbox的预测结果为:

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

因为我们限制了定位预测,参数更容易学习,网络更加可靠。使用维度聚类和直接预测bbox中心坐标,提升了大概5%的mAP。

Fine-Grained Features.

修正的YOLO在13 * 13的特征图上进行预测。尽管这对大的目标已经足够了,但是对于定位小的目标可能需要更细致的特征。Faster R-CNN和SSD都在多个特征图上进行proposal,来得到更多的分辨率。我们使用不同的方法,直接增加一个passthrough层,将26 * 26分辨率的前面的层的特征加入

这个passthrough层将高分辨率和低分辨率的特征连接的方式是在channel维度上进行堆叠,而不是空间维度上,与ResNet中的identity mapping类似。这将26 * 26 * 512的特征图变成了13 * 13 * 2048特征图,然后与之前的特征图相连。这种方法使得网络获得1%的表现提升。

Multi-Scale Training.

原来的YOLO输入为448,使用anchor之后改为了416。然而,因为我们的网络只使用了卷积层和池化层,所以可以任意尺寸输入。我们希望YOLO v2可以对不同尺寸图像鲁棒,因此我们进行多尺度训练。

**我们每隔几个迭代更换输入尺寸。每10个batches,网络随机选择一个新的图像尺寸。**因为我们的网络下采样了32倍,我们选择的尺度应为32的倍数,比如{320、352、…、608}。因此最小选择为320 * 320,最大选择为608 * 608。

这种方法使得网络杜宇多种输入尺寸表现好,可以预测多种分辨率的图像,小尺度网络运行的更快。

在低分辨率时,YOLOv2相当于一个快速,较准确的检测器。228的输入,可以取得与Faster R-CNN相当的mAP,同时取得90FPS。这对于更小GPU,高帧率视频、多视频流非常适用。

在高分辨率时,YOLOv2是一个SOTA的检测器,在VOC2007取得78.6% mAP,仍能保持实时。表3展示了不同框架在VOC2007上的对比。

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

Further Experiments.

我们在VOC2012上训练YOLOv2,表4展示了对比结果。YOLOv2取得了73.4%的mAP,并且比其他对手更快。我们同样在COCO上进行了训练,对比结果如表5所示。

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

3. Faster

我们希望检测准确的同时也要快。大多数检测的应用,比如自动驾驶,依赖于预测的速度。

大多数检测框架依赖于VGG-16作为backbone。VGG-16很powerful,准确,但是有些复杂了。VGG-16的卷积层对于一个224 * 224图像的预测,需要30.69billion次浮点运算。

YOLO使用了我们基于GoogLeNet定制的网络,比VGG-16快,仅需要8.52billion运算。然而它不如VGG-16准确。

Darknet-19.

我们提出了一种新的分类模型作为YOLOv2的backbone。与VGG相似,**我们大多数使用了3 * 3卷积核,在每次pooling操作后对通道数翻倍。遵循NIN网络中的结构,我们使用了全局平均池化来进行预测,同时使用1 * 1的卷积来压缩3 * 3卷积之间的特征维度。**我们使用了BN来使得训练更可靠,加速收敛,对网络正则化。

我们最后的模型叫做Darknet19,有19层卷积层和5个最大池化层,表6描述了详细的结构。这个模型每张图只需要5.58billion次操作,且仍能取得很高的准确率。

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

Training for classification.

我们在标准ImageNet1000类数据集使用SGD训练了160epochs,开始学习率为0.1,参数为4的多项式学习率迭代,0.0005的权值衰减,0.9的动量。训练中,使用标准的数据增强,包括随机裁剪、旋转、色调、饱和度、和曝光shifts。

初始224训练之后,我们使用448来进行微调,使用上面的参数训练了10epochs,然后学习率降为0.001。

Training for detection.

对于检测,我们移除了最后一个卷积层,**增加了3个3 * 3的卷积层,1024通道;每个卷积层之后增加了1 * 1的卷积层来获得最后需要输出的维度。对于VOC,我们每个位置预测5个box,每个box5个坐标,一共20类,所以最后是125通道(5 * 20 + 5 * 5,每个box的20类+5坐标)。**我们同样从最后一个3 * 3 * 512层到倒数第二个卷积层增加了一个直通层,从而可以使用更细的features。

我们使用0.001学习率训练了160epochs,之后在60和90epochs对学习率除以10。使用了0.0005的权值衰减和0.9的动量。使用了与YOLO和SSD相似的数据增强,包括随机裁剪、颜色shifting等。在COCO和VOC上使用了相同的训练策略。

4. Stronger

我们提出了一种方法可以联合训练分类和检测数据。我们的方法使用用于检测的标记图像来学习检测特有的信息,比如bbox坐标预测和objectness。使用只有class label的分类数据来扩充网络可以检测的类别数量。

训练期间,我们将分类和检测的数据集图像进行混合。当网络训练的是检测图像,那么按照整个YOLOv2的loss函数进行反向传播;如果是分类图像,只使用网络分类部分loss进行反向传播。

这个方法面临几个挑战。检测数据集只有一些common目标和标签,比如狗。但是分类数据集有更多更深层的标签,比如ImageNet中包含了超过一百个品种的狗。如果直接使用两个数据集训练,我们需要一种方法来融合标签。

分类的大多数方法是使用softmax层来计算所有类别的概率分布。使用softmax前提是假定这些类出现时互斥的。这对于组合数据集产生了问题,因为对于ImageNet和COCO数据集中,约克夏犬和狗这两类不应该是互斥的。

我们可以使用多标签模型来组合数据集。

Hierarchical classification.

ImageNet上的标签来自WordNet,一个语言数据集。在WordNet中,这些标签是分层次的,比如Norfolk terrier” and “Yorkshire terrier” 都是terrier的下位词,terrier又是狗的一种…对于我们组合数据集来说,需要考虑到这种层次结构。

WordNet使用一个图来表示结构,比如“dog”既是一种“canine”,又是一种“domestic animal”,我们将问题简化为,将ImageNet中的标签建立一个分层的树。

我们首先将ImageNet中的标签,找到其对应在WordNet中到root的path,首先我们将只有一个path的词加入树,然后我们迭代地检查我们剩余的标签,来建立一个尽可能小的树。即,对于标签,如果有两条路径到根节点,我们选择较短的。

最后我们得到WordTree,一个分层的模型。为了使用WordTree上进行分类,我们在每一个结点预测它的每个下义词的条件概率,比如在terrier结点,我们预测:

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

如果我们想要计算某个节点的绝对概率,我们直接找到它到根节点的路径,然后把所有条件概率相乘即可。所以如果我们想要知道图像中是否包含Norfolk terrier,我们计算:

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

对于分类,我们假设图像包含目标,即Pr(physical object)=1。

为了验证这个方法,我们使用ImageNet的1000类构建WordTree,训练Darknet-19模型。为了构建WordTree1k,我们添加了所有的中间节点,最后label空间从1000扩充到1369。训练期间,我们将ground truth的label送入树,目的是如果标签是“Norfolk terrier”,它同样被标记为狗、哺乳动物等。为了计算条件概率,我们的模型预测一个1369维度的向量,然后计算同一概念下,所有下义词的softmax,见图5。

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

使用之前相同的训练参数进行训练,我们的分层Darknet-19达到了71.9% 的top-1准确率和90.4%的top-5准确率。尽管增加了369个额外的类,并且进行树状结构的训练,我们的准确率只下降了一点。这样训练同样带来了许多优点,在遇到新的不知道的类的时候,网络表现也不错,比如网络输入一张网络不知道的狗的图像,它虽然无法输出狗的种类,但是可以判断出是狗。

这种方式同样对检测有用。现在,我们不假设每张图都有目标,而是使用YOLOv2来预测objectness,给出Pr(physical object)。检测器预测bbox和概率树。我们向下遍历树,找到大于某个阈值的最高置信度的路径,输出这个目标类别。

Dataset combination with WordTree.

**我们可以使用WordTree将多个数据集组合在一起。我们直接将数据集中的类别映射到树中的同义词。**图6展示了一个例子,将ImageNet和COCO数据集中的标签进行组合。我们可以使用这种技术组合大部分数据集。(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

Joint classification and detection.

组合完数据集之后,我们就可以训练我们的联合模型。我们希望训练一个很大尺度的检测器,所以创建了组合数据集,包含了COCO和ImageNet中最多的9000类目标。我们同样需要评估模型,所以我们从ImageNet检测挑战中找了一些之前没有的类别进行测试。相关的WordTree有9418类,由于ImageNet非常大,所以我们将COCO的数据进行过采样,使得两者的比例为4:1。

我们使用上面的数据集训练了YOLO9000。**我们使用基础的YOLOv2结构,但是每个位置只有3个先验框。**面对检测图像时,正常进行回传loss,对于分类loss,只回传相对应的树中结点以及之上的loss。

当面对分类图像时,只回传分类loss。为此,我们只需要找到预测这个类别的box中最高可能性的box,然后计算loss即可。我们假设这个box与ground truth重叠至少0.3,按照这个假设回传这个的objectness loss。

使用这种联合训练,YOLO9000使用COCO的数据学会定位目标,使用ImageNet数据学会分类目标。

我们在ImageNet检测任务上评估YOLO9000,这个检测任务只与COCO共享44类目标,这意味着剩余的大部分类,YOLO9000只见过分类图像,没见过检测数据。YOLO9000取得了总体19.7% mAP,在没见过的156个类中取得了16.0的mAP。

**我们分析YOLO9000的表现时,我们发现它学到了一些新的动物类,但是学习clothing和设备时比较挣扎。**新的动物比较容易学习是因为从COCO中学到的对动物objectness的预测比较容易概括。相反,COCO没有任何对衣物的标注bbox,只有人的,所以YOLO9000对太阳镜,泳裤等类别表现很差,

(YOLOv2)YOLO9000: Better, Faster, Stronger论文阅读笔记

5. Conclusion

我们提出了YOLOv2和YOLO9000,实时的检测系统。YOLOv2是SOTA的,且比其他的检测系统都快。而且,它可以在多种尺寸的图像上运行,可在speed和准确率上进行平衡选择。

YOLO9000是实时的检测框架,可以检测超过9000类,通过联合训练。我们使用WordTree来组合不同数据集中的数据,同时在ImageNet和COCO上进行训练。YOLO9000是缩小检测和分类数据集尺寸之间的差距的重要一步。

我们的许多技术都可以推广到目标检测之外,我们的WordTree表示为图像分类提供了一种更丰富、更细节的输出空间。数据集组合使用了分层分类,在分类和分割领域会有用。多尺度训练的训练技巧可能会对一系列任务产生益处。

未来的工作,我们希望使用相似的技巧来进行弱监督的图像分割。我们也计划提升我们的检测结果,使用更有力的匹配策略来将弱标签分配到分类数据上。计算机视觉领域依赖于大量标注的数据,我们会继续寻找将不同来源和结构的数据组合到一起,形成更强的visual word模型的方法。