论文:YOLO9000:Better, Faster, Stronger
论文链接:https://arxiv.org/abs/1612.08242
工程链接:https://pjreddie.com/
参考链接:
1、https://blog.csdn.net/guleileo/article/details/80581858
2、https://zhuanlan.zhihu.com/p/37668951
3、https://blog.csdn.net/u014380165/article/details/77961414
与Yolo v1的对比:
首先,yolo存在两个问题:定位不准确;recall较低;针对这两个问题,yolo v2提出了一系列解决方法,这个在better部分有体现。
faster是通过对网络结构进行调整,提出darknet。
stronger:目前检测数据集标注成本较大,所以数量和类别上都少于分类数据集。本文提出一种联合训练方式,将检测和分类数据集混合一起,同时在这两种数据集上训练物体检测器,用检测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的数量,提高鲁棒性。最后得到一个yolo9000的模型,这个模型可以检测识别出9000多种类别。
本文一共提出了两个模型,yolo v2和yolo 9000,前者主要是在yolo的基础上进行了一系列改进,后者是将检测数据集和识别数集进行合并,从而扩充检测目标的种类数。所以基本也是按照better、faster、stronger这三部分介绍。
YOLO v2: At 67 FPS, YOLOv2 gets 76.8 mAP on VOC 2007. At 40 FPS, YOLOv2 gets 78.6 mAP, outperforming state-of-the-art methods like Faster RCNN with ResNet and SSD while still running significantly faster.
YOLO9000: YOLO9000 gets 19.7 mAP on the ImageNet detection validation set despite only having detection data for 44 of the 200 classes. On the 156 classes not in COCO, YOLO9000 gets 16.0 mAP. But YOLO can detect more than just 200 classes; it predicts detections for more than 9000 different object categories. And it still runs in real-time.
针对YOLO v1,提高 recall,提升定位的准确度,并保持分类的准确度。
目前计算机视觉的趋势是更大更深的网络,更好的性能表现通常依赖于训练更大的网络或者把多种模型综合到一起。但是 YOLO v2 则着力于简化网络。
以下是论文给出的改进方法:
下面具体阐述每一种策略:
没啥好说的,添加了BN层,使 mAP 提高了 2%。
调整输入数据的分辨率。原先yolo在预训练时的输入是224224的,然后在检测时采用448448的输入,这样导致从分类模型切换到检测模型时,模型要适应图像分辨率的改变。yolo v2这里使用448*448的输入对分类网络进行finetune,训练10个epoch,给网络调整的时间以在高分辨率上有好的结果。然后再finetune这个结果进行检测。最后可以提高近4%的mAP。
yolo v1直接使用全连接层进行预测bounding box的坐标,yolo v2借鉴faster rcnn的思想,引入anchor。先说结论:虽然加入anchor使得mAP值下降了一点(69.5降到69.2),但是提高了recall(81%提高到88%)。
我们知道原来的YOLO算法将输入图像分成7x7的网格,每个网格预测两个bounding box,因此一共只有98个box,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为13x13为例,每个grid cell有9个anchor box的话,一共就是13x13x9=1521个,当然由后面第4点可知,最终每个grid cell选择5个anchor box)。顺便提一下在Faster RCNN在输入大小为1000x600时的boxes数量大概是6000,在SSD300中boxes数量是8732。显然增加box数量是为了提高object的定位准确率。
在Faster R-CNN中anchor box的大小和比例是根据人工经验设定的。但如果选择合适尺寸的anchor box,可以帮助网络更好地预测detection。因此采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。
如果用标准的欧式距离的 k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高 IOU 分数,希望误差与box的尺寸大小没有关系,因此重新定义以下距离函数:
下图中,左图是不同聚类簇个数下的平均iou,分别是coco和voc数据集,在分析模型复杂度和recall后,选择K=5。右图是两个数据集聚类中心,大多是高瘦型的anchor
下表中,说明用 K-means 选择 Anchor Boxes 时,当 Cluster IOU 选择值为 5 时,AVG IOU 的值是 61,这个值要比不用聚类的方法faster rcnn的 60.9 要高。选择值为 9 的时候,AVG IOU 达到了67.2。聚类的效果还是很明显的。
当使用anchor box时,模型训练会很不稳定,这种不稳定大部分是由于预测box的(x,y)位置。在使用proposal region的目标检测方法时,是通过预测下图公式中的tx\ty来计算x\y,其中tx\ty为偏置,xa\ya为anchor的坐标,wa\ha为anchor的宽高。
作者举例,当tx=1时,使得box沿着宽向右偏移,tx=-1,使得box向左偏移。
yolo v2并没有采用预测偏置的方式,而是延续yolo v1中直接采用预测相对于grid cell的坐标位置。这使得ground Truth 的值介于 0 到 1 之间。为了让网络的结果能落在这一范围内,使用 Logistic Activation 来对于网络预测结果进行限制。
网络对每个cell预测5个bounding box,对每个bounding box预测5个坐标,tx\ty\th\tw\to。如果这个cell偏离了图像中心的左上(cx,cy),并且先验的bounding box的宽高为pw\ph,则预测为:
因此,作者得到结论,位置预测相对更容易一点,且网络训练更稳定。使用维度聚类直接预测bounding box中心的定位,相对于其他版本的anchor,yolo提高了5%的mAP。
添加了一个passthrough layer。之前得到的yolo最后的feature map的大小为13,x13,这个尺寸对于检测图片中的大尺寸物体够了,但是对小尺寸物体不太好。因此,yolo v2没有采用什么特征金字塔的方式,而是加了一个passthrough layer,将之前的26x26 feature map相结合,即高低分辨率特征都有了。类似resnet中的Identity Mapping,将26x26x512 变成 13x13x2048,从而yolo v2提升了1%的mAP。
作者希望yolo v2能对不同尺寸的输入有强鲁棒性,因此提出multi-scale training,在训练时不断调整输入数据的尺寸。每10个batch后,随机选择一个新的图像尺寸,由于下采样的参数是32,这里不同的尺寸大小选择为32的倍数,即{320,352,…,608}。这样网络对不同分辨率的输入有适应性,虽然大尺寸的输入会增加运行时间,但小尺度的输入运行时间比较少,所以总体来说,速度还可以,如下图,不同size下准确率和速度的影响。
一下就是在voc2012和coco数据集的比较结果。
作者不仅想要得到高准确率,也要速度很快,希望能最大化yolo v2的性能。
大部分检测框架都是使用vgg16作为基础特征提取器,vgg16确实很强大,但是其参数量过多。过去的yolo采用Googlenet架构,这个比vgg16要快,但是其准确率要稍微弱一点,对于224x224,其top5的准确率,yolo 过去的模型在ImageNet上只有88.0%,而vgg16是90.0%。
Darknet-19. 作者提出一个新的分类模型来作为yolo的基础模型。这个模型建立在先前网络设计的基础上。类似VGG,使用3x3卷积核,在每一次pooling后都两倍通道数量。遵循network in network的工作,使用全局平均池化,并且使用BN来正则模型,加快收敛。
Darknet-19只需要5.58 billion operation,包含19个卷积层和5个max pooling层,在ImageNet上取得了top-5的91.2%的准确率。
后面的两部分就是训练分类和训练检测的一些tricks。直接引用博客
Training for classification.
结果表明fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%。
而如果按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。
Training for detection. 在进行完训练分类步骤后,就开始把网络移植到detection,并开始基于检测的数据再进行fine-tuning。
好了,到了一个本人比较关心的地方了,yolo9000是如何检测出9000多种目标的呢,这部分给出解释。
目前检测数据集的目标种类比较少,但是分类数据集种类比较大,因为yolo9000通过结果检测和分类数据集来训练一个可以检测9000类目标的模型。
主要通过两个方式实现:构造融合数据集,通过Wordtree实现;模型训练问题,通过joint classification and detection实现。
以下正文:作者提出一个机制,在分类和检测数据集上联合训练,使用检测数据学习bounding box的坐标预测和有无目标,使用分类数据来扩展检测的种类数。
在训练时,作者混合了检测和分类数据。当网络遇到一个来自检测数据集的输入时,则把这些数据用完整的 YOLO v2 loss 功能反向传播。当网络遇到一个来自分类数据集的输入时,只用整个结构中分类部分的 loss 功能反向传播。
这种方法带来了一些挑战,检测数据集只有一些常见的目标和通用的标签,如dog\boat。分类数据集的标签更宽、更深。ImageNet含有100多个品种的狗,如 “Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”。如果想在这两个数据集上训练,需要用一个连贯的方式合并这些标签。
大多数分类使用softmax层计算最终类别的概率分布。使用了softmax就假设这些类别是互斥的,但是这给组合数据集带来个问题,例如,你不希望结合ImageNet和coco数据集来使用模型,因为类别 “Norfolk terrier” and “dog” 不是完全互斥的。
但是我们可以使用multi-label来结合数据集,这不需要假设互斥。这种方法忽略了我们已知的数据结构,例如,所有coco类别都是互斥的。
Hierarchical classification. ImageNet标签来自于Wordnet,一个语言数据库,“Yorkshire terrier”是terrier的上义词,terrier是hunting dog的一种,hunting dog是dog的一种,dog是canine的一种。大多数分类方法都假设标签是一种扁平结构,但是对于结合数据集来说,结构恰恰是我们所需要的。
Wordnet是一种有向图的结构,而不是树结构。因为于洋是复杂的,dog是canine的一种,也是domestic animal的一种,他们都Wordnet中的同义词。作者没有使用整个图结构,而是将问题简化,通过从ImageNet概念中建立一个Hierarchical tree。
为了构建这个树,作者检测了ImageNet中的视觉名词,并且查看他们通过Wordnet图到达根节点的路径,在本例中是physical object。很多同义词在图中只有一条路径,因此首先将这种路径添加到tree中。然后检测剩下的概念,并且尽可能的少添加路径到tree中如果一个概念有两条路径到达根节点,一条路径需要在tree中添加3条边,另一个只需要1条,选择短的那条。
如果要计算特定节点的绝对可能性,只需要遵循达到根节点的路径,并乘以这些条件概率。例如,如果我们想知道,一幅图中是否有Norfolk terrier,需要这样计算,
为了分类,假设
为了验证这个方法,作者在建立在1000个类别的ImageNet的wordtree上训练了darknet-19模型。为了建立Wordtree1K,作者添加了所有中间节点,从1000扩展为1369。在训练时,将groundtruth label铜鼓tree传播,因此,如果一个图像被标记为Norfolk terrier”,也会得到标记dog,mammal等。为了计算条件概率,模型预测一个1369值的向量,然后通过计算所有同义词的softmax,这些同义词是同一个概念的下位词,如下图所示。
使用与之前相同的训练参数,hierarchical darknet-19实现71.9%的top1,90.5%的top5准确率。尽管添加了369个额外的概念,网络预测一个树结构,准确率也只下降一点。以这种方式进行分类,也有一些好处。在一些新的或者未知的目标类别上性能下降比较优雅。例如,如果网络认识到这个图中的狗,但不确定是那种狗,但它仍然高置信度的预测出了狗,但是下位词的置信度要低一点。
这种计算同样也适用于检测。现在,不是假设每个图像都有一个目标,作者适用yolo v2目标检测器,给定了Pr(physical object)这样一个值。这个检测器预测一个bounding box和树可能性。然后通过遍历树,在每个分叉的节点,采用最高置信度的路径,直达达到了某个阈值,我们就可以预测这个类别。
Dataset combination with WordTree. 我们可以使用Wordtree,以一种合理的方式结合多个数据集。只需要将数据集的类别映射到tree中的同义词上。图6展示了使用Wordtree的一个例子,将ImageNet和coco的label结合。Wordtree是极其多样性的,因此这种方法可以就用在很多数据集上。
Joint classification and detection. 现在已经使用了Wordtree将数据集结合起来了,可以训练分类和检测的联合模型了。我们先训练一个极其大范围的检测器,因此我们使用coco检测数据集和从整个ImageNet开放的前9000个类别。我们也需要验证我们的方法,因此我们也添加了尚未保存在ImageNet检测比赛中的任何类。这使得最后的Wordtree有9418个类别。ImageNet是一个相当大的数据集,因此为了平衡数据集,需要对coco进行过采样,这样,ImageNet只会大4:1。
使用这个数据集,作者训练了yolo9000。我们使用yolo v2的基础架构,但是为了限制输出的size,只使用3个priors而不是5。当网络看到一个检测图像时,正常进行反向传播损失。对于分类损失,我们只传播与之想对应标签的损失。例如,如果标签是dog,我们会在tree中进一步预测error,如果是“German Shepherd” versus “Golden Retriever”,则不会,因为我们没有这些信息。
当网络看到一个分类图像时,我们只反向传播分类损失。为了做到这点,我们只需要找到预测该类最高可能性的bounding box,然后计算预测tree的损失。我们假设,预测box与groundtruth label至少重叠0.3iou,基于这个假设反向传播对象损失。
使用这个联合训练,yolo9000使用coco的检测数据学习找到图像中的目标,使用ImageNet的数据学习分类更多样性的目标。
我们在ImageNet 检测任务上验证了yolo9000。这个ImageNet的检测任务与coco数据集共享了44个目标类别,因此这意味着yolo9000只见过测试图像中大多数的分类数据,而不是检测数据。yolo9000最终得到19.7mAP,在156个未见过带标签的测试数据上,达到16.0mAP。这个mAP比DPM要高一点,但是Yolo9000是在不同数据集上训练的,且只有部分监督。它也能实时检测其他9000类目标类别。
我们在ImageNet上分析了yolo9000的性能,发现它可以很好的学习到新的动物种类,但是对学习衣服和装饰等类别不太好。新的动物更容易被学习是因为目标预测从coco中的动物泛化的比较好。相反,coco中没有任何衣服类别的bounding box label,仅限于人因为,yolo9000对训练类别太阳镜、泳裤等类别仍有难度。
下图是yolo9000最好和最差的几个类别。
作者结束扫了yolo v2和yolo9000两个实时检测系统。yolo v2是目前在多种检测数据集上均比其他检测系统要快的state-of-the-art。进一步,它可以运行在不同size图像上,在速度和准确率上有一个平滑的过度。
yolo9000是一个通过联合检测和分类,可以实时检测出超过9000类目标的框架。使用Wordtree融合不同源的数据,在ImageNet和coco上联合优化技术训练。yolo9000是很重要的一步,将检测和分类之间的差距拉近。
我们的很多技术都可以泛化在目标检测之外。我们对ImageNet的Wordtree的表示方法,对图像分类提供一种更丰富、更多细节的输出空间。使用分级分类的数据集结合,在分类和分割领域都是有用的。像multi-scale训练的这些训练技术都可以对不同的任务提供好处。
未来工作,我们希望使用类似的方法可以用在弱监督的图像分割上,我们也计划使用更强大的匹配策略,在训练时为分类数据提高弱标签,来提高检测结果。计算机视觉是基于大量标注数据的。我们将继续寻找方法,将不同源、不同结构的数据结合到一起,来得到视觉世界更强大的模型。