论文笔记-YOLO9000:Better,Faster,Stronger

1. 简单介绍

目前,用于目标检测的数据集的体量远远小于用于图像分类的数据集的体量,因为给目标检测数据集人工标记标签要比为分类数据集标记标签要昂贵的多。

2. Better

YOLOv1相对于Fast R-CNN来说,在对象定位上有更大的误差;相对基于推荐区域的方法,YOLO的召回率也更低。因此,YOLOv2版本在保持分类精度的基础上,要着重提高召回率和定位精度。
这里写图片描述
作者在YOLOv2版本中,尝试了许多想法的不同组合,并计算出使用不同想法组合的平均精度,如上图。

Batch Normalization

使用批量归一化能够在不使用其它正则化方法时,增加模型的收敛度。在YOLO所有的卷积层上使用batch normalization,平均精度上升超过2%。使用batch normalization,可以帮助我们矫正模型,同时可以不使用dropout,也不会出现过拟合的情况。

高分辨率的分类器

当前最先进的检测方法都会使用在ImageNet数据集上预训练的分类器。YOLOv1版本在训练时,采用的输入图像的分辨率为224*224,然后在检测时,将分辨率提高到448*448。这就意味着网络在学习目标检测的同时,还要适应新的输入分辨率。

对于YOLOv2版本,首先在ImageNet上使用完全的448*448分辨率的图片训练了10 epoches,以此来微调分类网络。这给予网络更多的时间来调整filters,以适应高分辨率的图像。使用以高分辨率图像训练的分类器网络,对于平均精度提高了几乎4%。

使用Anchor Boxes的卷积

YOLOv1版本使用网络最后的全连接层来预测边界框的坐标,YOLOv2版本移除了最后的全连接层,并且使用anchor boxes来预测边界框。首先,在网络结构上,去掉了最后的池化层,增加了卷积层输出的特征映射的分辨率,同时将输入图像的分辨率从448*448缩小到416*416,这样卷积层输出的特征映射的高和宽就都为奇数,有一个中心单元格。这样的话,大的对象就可以使用这个中心单元格来预测,而不是使用中心的4个单元格来预测。卷积层的总下采样因子为32,得到的特征映射就为13*13。

把预测类别的机制从空间位置(cell)中解耦,由anchor box同时预测类别和坐标。因为YOLOv1是由每个cell来负责预测类别,每个cell对应的2个bounding box 负责预测坐标(回想YOLO中 最后输出7*7*30的特征,每个cell对应1*1*30,前10个主要是2个bounding box用来预测坐标,后20个表示该cell在假设包含物体的条件下属于20个类别的概率,具体请参考YOLOv1) 。YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定一起,而是全部放到anchor box中。下面是特征维度示意图(仅作示意并非完全正确)位置预测仍然遵循v1版本,采用预测边界框和真实边界框的交并比(IOU),分类预测为在预测框内有一个对象的前提下的条件概率。
这里写图片描述

使用了anchor boxes,在准确度上有所下降。v1版本一张图像只预测了98个边界框,使用anchor boxes则超过1000个。v1版本的召回率为81%,平均精度为69.5,使用anchor boxes后,召回率为88%,平均精度为69.2。

Dimension Clusters

使用anchor时,作者发现Faster-RCNN中anchor boxes的个数和宽高维度往往是手动精选的先验框(hand-picked priors),设想能否一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置。解决办法就是统计学习中的K-means聚类方法,通过对数据集中的ground true box做聚类,找到ground true box的统计规律。以聚类个数k为anchor boxs个数,以k个聚类中心box的宽高维度为anchor box的维度。

如果按照标准k-means使用欧式距离函数,大boxes比小boxes产生更多error。但是,我们真正想要的是产生好的IOU得分的boxes(与box的大小无关)。因此采用了如下距离度量:
这里写图片描述
聚类的结果如下图:
这里写图片描述
作者对选择了不同的k值,画出了上图的曲线。随着k的增大,IOU也在增大,但是网络的复杂度也在增加,最后在平衡IOU和网络复杂度的情况下,选择了k=5。聚类得到的边框与人工精选的边框完全不同,扁长的较少,瘦高的较多。

作者对用聚类方法选出的边界框的平均IOU与人工挑选的平均IOU作了对比。如下图:
这里写图片描述
当采用5个anchor boxes时,聚类方法的平均IOU与与采用9个anchor boxes,人工挑选的平均IOU基本相等,分别为61和60.9。如果增大anchor boxes的数量到9时,采用聚类方法的平均IOU就达到了67.2。这意味着,聚类方法产生的边界框能够对原图对象有更好的表征,同时使网络更容易学习检测任务。

直接位置预测 Direct location prediction

使用anchor boxes会使模型不稳定,尤其在早期迭代时。大部分不稳定因素来源于预测边界框的坐标(x, y)。在RPN中,网络预测tx和ty,(x,y)采用下式计算:
这里写图片描述
这种计算方法有一定问题。例如,如果tx=1,边界框就会向右边移动一个anchor box的宽度;如果tx=-1,边界框就会向左移动一个anchor box的宽度。

这种方法对位置没有任何的限制,所以任何一个anchor box可以出现在图像中的任何一个点上。随机初始化模型后,会需要很长的时间来使模型稳定下来。因此作者采用预测相对于网格位置的坐标。这使得真实坐标值x和y均在0到1之间。使用logistic激活来限制预测坐标值tx和ty也在0到1之间。

每一个网格预测5个边界框,对于每一个边界框预测5个坐标值,分别为tx,ty,tw,th,to。如果网格位置相对图像左上角的补偿为(cx,cy),真实边界框的宽和高为pw,ph,那么边界框的位置坐标采用下式计算:
这里写图片描述
这里写图片描述
在限制了预测框的位置后,参数更容易学习,使得网络更稳定。

这里再稍微解释一下每一个边界框输出的5个值,tx,ty,tw,th,to所代表的意义:
tx:预测边界框中心点距所在网格左边的距离
ty:预测边界框中心点距所在网格上边的距离
tw:预测边界框的宽度,除以图像宽度归一化后的值
th:预测边界框的高度,除以图像高度归一化后的值
to:预测对象置信分数
上面的5个值所代表的意义是根据真实标签数据而来的,网络的优化函数就是基于5个预测值和5个真实标签值的误差。

细粒度特征 Fine-Grained Features

YOLOv2在一个13*13的特征映射上预测。这个分辨率预测大的对象是足够的,但是当预测小的对象时,更高的分辨率往往更好。Faster R-CNN和SSD都是在不同细粒度的特征映射上运行RPN,然后得到一系列不同的分辨率。YOLOv2在高分辨率层和低分辨率层之间加了一个passthrough层,用来连接两个分辨率层。该层以26*26*512的分辨率作为输入,输出的分辨率为13*13*2048。模型在13*13*2048的分辨率上运行,表现提升了1%。

多规模训练 Multi-Scale Training

YOLOv1使用的图片输入为448*448,加上anchor boxes后,尺寸变为416*416,为了使v2版本能够适应不同尺寸的图像,作者将不同尺寸的图像放入到训练集中,因为filters的下采样因子为32,所以尺寸以32递增,{320*320,352*352,…,608*608},每10批训练,随机选取不同尺寸的图像,然后将网络调整到相应维度,继续训练。这就使得同样的网络能够预测不同分辨率的图像。

YOLOv2在速度和准确度上达到新的平衡。在228*228的输入下,v2的速度超过90fps,准确度和Fast R-CNN一样好。在高分辨率输入下,v2在VOC 2007数据集上能够达到78.6的平均精度,同时远超实时的速度。下图是YOLOv2与其它算法在性能上的对比:
这里写图片描述

更多的实验 Further Experiments

下图是YOLOv2与其它算法的对比:
这里写图片描述

3. Faster

YOLOv2旨在有更高预测精度的前提下,保持快速性。因为在机器人和无人驾驶等领域,需要实时的进行预测。

很多预测网络都是以VGG-16作为基础特征提取器。VGG-16很有效,但是过于复杂。VGG-16的卷积层对于输入图像为224*224进行一次前向传播,需要进行306.9亿次浮点数计算。
YOLOv1使用的网络是在GoogleNet的基础上,进行了一些修改,比VGG-16快,一次前向传播只需要进行85.2亿次浮点数计算。但是准确度没有VGG-16高,224*224的输入,YOLO的top-5准确度为88%,而VGG-16为90%。

Darknet-19

在YOLOv2上,使用了一种新的网络。与VGG相似,该网络使用了3*3的filters,在每一个池化操作后,都将通道增加二倍。最后采用全局平均池化,在3*3卷积之间,使用1*1的filters来压缩特征表征。使用batch normalization来使训练稳定,加速收敛和正则化模型。

最终的模型叫做Darknet-19。有19个卷积层和5个最大池化层。该网络仅需要进行55.8亿次浮点数操作,在ImageNet数据集上,top-1准确度达到72.9%,top-5达到91.2%。整个网络架构如下图:
这里写图片描述

分类训练

作者使用Darknet-19在标准1000类的ImageNet上训练了160次,用随机梯度下降法,开始learning rate 为0.1,polynomial rate decay 为4,weight decay为0.0005 ,momentum 为0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。

正如上文所说的,在以224*224的输入进行初始化训练后,作者调整了训练的网络,448*448。对于这次微调,只使用上面训练好的参数由训练了10次,以0.001的学习率。网络的top-1达到了76.5%,top-5达到了93.3%。

检测训练

为了把分类网络改成检测网络,去掉原网络最后一个卷积层,增加了三个 3 * 3 (1024 filters)的卷积层,并且在每一个卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需数量。

对于VOC数据集,预测5种boxes,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。
这里写图片描述
也添加了passthrough layer,从最后3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。

学习策略是:先以10^{-3}的初始学习率训练了160次,在第60次和第90次的时候学习率减为原来的十分之一。weight decay为0.0005,momentum为0.9,以及类似于Faster-RCNN和SSD的数据扩充(data augmentation)策略: random crops, color shifting, etc。使用相同的策略在 COCO 和VOC上训练。

4. Stronger

作者提出了一种在分类数据集和检测数据集上联合训练的机制。使用检测数据集的图片去学习检测相关的信息,例如bounding box 坐标预测,是否包含物体以及属于各个物体的概率。使用仅有类别标签的分类数据集图片去扩展可以检测的种类。

训练过程中把监测数据和分类数据混合在一起。当网络遇到一张属于检测数据集的图片就基于YOLOv2的全部损失函数(包含分类部分和检测部分)做反向传播。当网络遇到一张属于分类数据集的图片就仅基于分类部分的损失函数做反向传播。

这种方法有一些难点需要解决。检测数据集只有常见物体和抽象标签(不具体),例如 “狗”,“船”。分类数据集拥有广而深的标签范围(例如ImageNet就有一百多类狗的品种,包括 “Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”等. )。必须按照某种一致的方式来整合两类标签。

大多数分类的方法采用softmax层,考虑所有可能的种类计算最终的概率分布。但是softmax假设类别之间互相排斥,但是整合之后的数据类别是有包含关系的,例如 “Norfolk terrier” 和 “dog”。 所以整合数据集没法使用这种方式(softmax 模型)。

作者最后采用一种不要求互不包含的多标签模型(multi-label model)来整合数据集。这种方法忽略了数据集的结构(例如 COCO数据集的所有类别之间是互不包含的)。

Hierarchical classification(层次式分类)

ImageNet的标签参考WordNet(一种结构化概念及概念之间关系的语言数据库)。例如:
这里写图片描述
很多分类数据集采用扁平化的标签。而整合数据集则需要结构化标签。

WordNet是一个有向图结构(而非树结构),因为语言是复杂的(例如“dog”既是“canine”又是“domestic animal”),为了简化问题,作者从ImageNet的概念中构建了一个层次树结构(hierarchical tree)来代替图结构方案。

创建层次树的步骤是:

1、遍历ImageNet的所有视觉名词
2、对每一个名词,在WordNet上找到从它所在位置到根节点(“physical object”)的路径。 许多同义词集只有一条路径。所以先把这些路径加入层次树结构。
3、然后迭代检查剩下的名词,得到路径,逐个加入到层次树。路径选择办法是:如果一个名词有两条路径到根节点,其中一条需要添加3个边到层次树,另一条仅需添加一条边,那么就选择添加边数少的那条路径。
4、最终结果是一棵 WordTree (视觉名词组成的层次结构模型)。用WordTree执行分类时,预测每个节点的条件概率。例如: 在“terrier”节点会预测:
这里写图片描述
如果想求得特定节点的绝对概率,只需要沿着路径做连续乘积。例如:如果想知道一张图片是不是“Norfolk terrier ”需要计算:
这里写图片描述
分类时假设图片包含物体:Pr(physical object) = 1。

为了验证这种方法作者在WordTree(用1000类别的ImageNet创建)上训练了Darknet-19模型。为了创建WordTree1k作者天添加了很多中间节点,把标签由1000扩展到1369。训练过程中ground truth标签要顺着向根节点的路径传播:例如 如果一张图片被标记为“Norfolk terrier”它也被标记为“dog” 和“mammal”等。为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算softmax,其中“同义词集”是同一概念的下位词。
这里写图片描述
使用相同的训练参数,层次式Darknet-19获得71.9%的top-1精度和90.4%top-5精度。尽管添加了369个额外概念,且让网络去预测树形结构,精度只有略微降低。按照这种方式执行分类有一些好处,当遇到新的或未知物体类别,预测精确度降低的很温和(没有突然巨幅下降)。例如:如果网络看到一张狗的图片,但是不确定狗的类别,网络预测为狗的置信度依然很高,但是,狗的下位词(“xx狗”)的置信度就比较低。

这个策略也同样可用于检测。不在假设每一张图片都包含物体,取而代之使用YOLOv2的物体预测器(objectness predictor)得到Pr(physical object)的值。检测器预测一个bounding box和概率树(WordTree)。沿着根节点向下每次都走置信度最高的分支直到达到某个阈值,最终预测物体的类别为最后的节点类别。

Dataset combination with WordTree

可以使用WordTree把多个数据集整合在一起。只需要把数据集中的类别映射到树结构中的同义词集合(synsets)。使用WordTree整合ImageNet和COCO的标签如下图:
这里写图片描述

Joint classification and detection

使用WordTree整合了数据集之后就可以在数据集(分类-检测数据)上训练联合模型。我们想要训练一个检测类别很大的检测器,所以使用COCO检测数据集和全部ImageNet的前9000类创造一个联合数据集。为了评估我们使用的方法,也从ImageNet detection challenge 中向整合数据集添加一些还没有存在于整合数据集的类别。相应的WordTree有9418个类别。由于ImageNet是一个非常大的数据集,所以通过oversampling COCO数据集来保持平衡,使ImageNet:COCO = 4:1。

使用上面的数据集训练YOLO9000。采用基本YOLOv2的结构,anchor box数量由5调整为3用以限制输出大小。

当网络遇到一张检测图片就正常反向传播。其中对于分类损失只在当前及其路径以上对应的节点类别上进行反向传播。

当网络遇到一张分类图片仅反向传播分类损失。在该类别对应的所有bounding box中找到一个置信度最高的(作为预测坐标),同样只反向传播该类及其路径以上对应节点的类别损失。反向传播objectness损失基于如下假设:预测box与ground truth box的重叠度至少0.31 IOU。

采用这种联合训练,YOLO9000从COCO检测数据集中学习如何在图片中寻找物体,从ImageNet数据集中学习更广泛的物体分类。

作者在ImageNet detection task上评估YOLO9000。ImageNet detection task和COCO有44个物体类别是相同的。这意味着YOLO9000只从大多数测试数据集中看到过分类数据而非检测数据。最终整体精度为19.7mAP,在从未见过的156个物体检测数据类别上精度为16.0mAP。这个结果高于DPM,但是YOLO9000是在不同数据集上进行半监督训练。而且YOLO9000可以同时实时检测9000多种其它物体类别。

作者也分析了YOLO9000在ImageNet上的性能,发现可以学习新的动物表现很好,但是学习衣服和设备这类物体则不行。因为从COCO数据集上动物类别那里学习到的物体预测泛化性很好。但是COCO数据集并没有任何衣服类别的标签数据(只有”人”类别),所以YOLO9000很难对“太阳镜”,“游泳裤”这些类别建模。

猜你喜欢

转载自blog.csdn.net/liven_zhu/article/details/80715746