YOLOv2论文笔记

论文:YOLO9000:Better, Faster, Stronger.Joseph Redmon, Ali Farhadi.from 华盛顿大学,艾伦AI研究所


摘要

    本文提出YOLO9000,一个SOTA、实时的目标检测系统,可以检测超过9000类目标。首先提出Darknet-19分类模型,在 YOLOv1的基础上各种改进,提出YOLOv2,在PASCAL VOC和COCO上获得SOTA。使用多尺度训练方法,YOLOv2可以在不同的分辨率上运行,在速度和精度之间达到一个较好的平衡。YOLOv2可以67 PFS的运行帧率在VOC 2007上达到76.8mAP。可以40FPS的运行帧率达到78.6mAP,比Faster R-CNNSSD更快、精度更高。在此基础上,提出一种目标检测与分类联合训练的方法,在COCO目标检测数据集和ImageNet分类数据集上同时训练出YOLO9000。这个联合训练方法允许YOLO9000预测没有标记检测数据的目录类别。在ImageNet目标检测任务上验证,在200类只有44类标注数据的情况下,YOLO9000获得19.7mAP。YOLO可以预测超过9000种目标,而且可以实时运行。


引言

    目标检测数据集的规模相比于分类数据集小的多,而且其标注成本也高得多。本文提出一个方法,利用大规模的分类数据集来拓展目标检测系统的检测能力。本方法使用目标分类的层级视图,将不同数据集组合在一起。还提出了一种联合训练算法,使得模型可以在检测和分类的联合数据集上训练目标检测模型。该方法利用标注检测的图像学习目标定位,而使用标注分类的图像增加模型的词汇量(检测的类别)和鲁棒性。

    使用这个方法,本文训练了YOLO9000,一个可以预测9000种目标的SOTA、实时的目标检测器。代码开源:http://pjreddie.com/yolo9000/ 

图片1.jpg

图片2.jpg

图片3.jpg


YOLOv1

    YOLOv1是一个非常快、直观的目标检测模型,它直接对特征图预测包围框和置信度,因此可以达到非常快的速度。其检测过程如下:

3_20191230235948_991.jpg

    YOLOv1的网络架构如下:

4_20191231000158_541.jpg



Better

    与Fast R-CNN相比,YOLOv1的误差分析表明其定位误差较大,而且其召回率相对基于区域推荐的方法要更低。所以这里着重于提升召回率和定位精度,而且是想要YOLO在保持高速的情况下,提高精度,从而得到升级版YOLO:YOLOv2。与其直接扩大网络,不如将其简化,然后使模型更容易学习表示。将之前工作提出的各种各样的idea与YOLO概念结合起来,以提高表现,结果如下:

图片4.jpg

Batch Normalization:BN在消除了其它形式的正则化的同时,显著改善了收敛性。通过在YOLOv1的所有卷积层后增加BN层,YOLOv2可以提高2%的mAP。BN还有助于正则化,使用BN后可以舍弃dropout。

High Resolution Classifier:所有的SOTA目标检测模型都使用ImageNet预训练的backbone。从AlexNet开始,大多数分类器的输入分辨率小于256x256。比如YOLOv1就是在224x224分辨率下训练分类器,然后在448分辨率下训练目标检测。对于YOLOv2,首先将预训练的分类器在ImageNet上以448x448 fine-tune 10轮,这样网络能更好的适应高分辨率的输入。然后再以高分辨率 fine-tune目标检测。这种方法使mAP提高了4%。

Convolutional With Anchor Boxes:YOLOv1在特征抽取器的顶端使用fc层直接预测包围框,而Faster R-CNN基于先验框(anchor boxes)预测包围框。使用RPN预测anchor boxes的偏置和置信度,偏置是相对值而不是绝对坐标,这使得网络更加容易学习。这里去掉YOLOv1中的fc层,而是使用卷积+先验框预测包围框。

    首先,去掉网络中的一个池化层,使用特征抽取器输出的特征图分辨率更高。接收416分辨率的输入图像,而不是448x448,因为是希望输出特征图有奇数个位置,这样特征图只有一个中心位置。对于大目标,通常占据在图像中心,因此最好在中心有一个位置预测这些大目标。经过backbone下采样32倍,最终得到的是13x13的特征图,而YOLOv1则使用的是7x7的特征图。

    此外,与YOLOv1将包围框和类别结合在一起预测不同,这里将包围框预测和类别预测进行解耦,为每个anchor box预测类别和位置。与YOLO一样,目标预测器预测生成的包围框与gt包围框的IoU,类别预测器预测给定存在目标的条件概率。

    如 Table2 所示,使用了先验框(anchor boxes)后,精度反而略微下降。YOLO对每个位置仅预测2个包围框,整个每个图片仅预测98个(7x7x2)包围框。但是如果使用先验框的话,总共预测13x13xnum_anchors个包围框。不使用先验框时达到69.5% mAP和81%的召回率,使用先验框后是69.2% mAP和88%的召回率,虽然精度下降了一点,但是召回率大大提升了。

    当想在YOLO中使用先验框的时候,遇到两个问题。

Dimension Clusters:第一个问题是先验框的尺度和数量需要手动指定,更好的尺度可以使得网络更容易生成好的包围框。这里对训练集的gt包围框运行k-means,以自动找到好的先验框。如果像标准k-means那样使用欧几里德距离,则产生的大的box比小的box产生更多误差,因此这里使用的距离是:d(box,centroid)=1-IOU(box,centroid)。尝试使用不同的k值运行k-means,并绘制与每个簇中心box的IoU,得到下图:

图片5.jpg

    如上图左,k=5达到模型recall和复杂度的平衡。右图是VOC和COCO的相对中心,相比于手动设置的先验框,有更多的高、瘦的先验框。下表比较了聚类策略的最近值和手动设置先验框的平均IOU:

图片6.jpg

    仅有5个聚类中心时,该方法与先验框差不多,当使用9个聚类中心时,聚类方法得到的IoU高得多。这表明使用k-means设置初始包围框可以得到更好的表现。

Direct location prediction:使用先验框碰到的第二个问题是:模型不稳定性,尤其是在训练早期。这种不稳定性来源于预测包围框的位置(x,y)。对于包围框,传统网络预测的是tx和ty值,则包围框的中心坐标计算公式:

    x=(tx*wa)-xa,y=(ty*ha)-ya其中(xa,ya)为先验框的中心坐标,(wa,ha)是先验框的宽高。比如当tx=1时,相当于将 box 向右移动一个先验框的宽度。但是该公式不受约束,又由于参数的随机初始化,故模型需要花长时间才能稳定预测。

    跟 YOLOv1一样,这里预测相对坐标,则限制其值0-1。对每个包围框,网络预测5个值:tx,ty,tw,th,to。如果该先验框中心相对于图像左上角的坐标为(cx,cy),且先验框的宽高是pw和ph,对应预测的包围框(bx,by,bw,bh) 是:

图片7.jpg

    这样限制预测参数的范围,使得它更容易学习,让网络更加稳定。使用dimension clusters和直接预测包围框中心位置可以提高接近5%的mAP。

图片8.jpg

Fine-Grained Features YOLOv1使用7x7特征图,而YOLOv2使用13x13的特征图预测。这对于大目标来说足够了,但是更精细的特征图可能带来提升。Faster R-CNNSSD在各种尺度的特征图上运行RPN,而这里采用不同思路:增加一个直接通路连接到前面的26x26特征图。这个思路类似于ResNet,该通路层连接高分辨率低层次特征的特征图和低分辨率高层次特征的特征图。直接将26x26x512的特征图展开为13x13x2048的特征图,并与低分辨率的特征图concat。这可以给后面的网络带来更加精细的特征。这可以带来1%精度的提升。

Multi-Scale Training YOLOv1使用448x448分辨率作为输入,而YOLOv2使用416x416输入。本模型仅由卷积层和池化层组成,可以输入任意分辨率的图像。为了使用模型对不同输入分辨率更加鲁棒,这里每隔几轮更换一次分辨率。具体地说,由于backbone的下采样系数为32,因此每隔10batch,网络就随机从32的倍数:{320,352,...,608}分辨率中随机选择一个,即最小使用320x320分辨率,最大使用608x608分辨率。

    这个方法强迫YOLOv2学习目标的尺度不变性。在较小分辨率上运行时更快,因此模型可以达到速度和准确度之间的平衡。在288x288分辨率时,可以达到90FPS,而此时的精度可以媲美Fast R-CNN。这对弱鸡GPU、高帧率视频、多视频流是非常友好的。而在高分辨率时YOLOv2可以达到SOTA精度:在VOC2007上达到78.6mAP,而且仍然可以实时运行。下表是YOLOv2和其它模型在VOC 2007上的比较:

图片9.jpg

    下图是更直观的比较:

图片10.jpg

Further Experiments:在VOC2012上训练YOLOv2,下表展示了与其它SOTA模型的比较。

图片11.jpg

    可以看到YOLOv2的精度基本可以跻身一线了,而且速度比其它模型快的多。我们也在COCO上进行了比较,结果如下:

图片12.jpg



Faster

    除了精度之外,速度作为YOLO系列的卖点也很重要。大多数目标检测系统使用VGG16作为backbone,这是一个强大、精确的网络,但是模型规模大了些。一个224x224的图像,VGG16需要30.69 billion浮点计算前向传播。

     YOLOv1使用Googlenet架构,一张图片仅需要8.52billion浮点计算,但是它的精度比VGG16稍微差些。

Darknet-19:这里提出新的分类网络作为YOLOv2的基础,借鉴了之前的一些idea。与VGG一样,使用3x3卷积,每次池化后,将特征图通道数加倍。与NIN一样,使用GAP预测,同时使用1x1卷积。使用BN稳定训练、加速收敛、正则化。将这个模型称之为Darknet-19,拥有19个卷积层和5个最大池化层。下表是Darknet-19的详细情况:

图片13.jpg

    Darknet-19仅需要5.58billion浮点计算,在ImageNet上可以达到72.9%的Top-1精度和91.2%的Top-5精度。与之相比, YOLOv1使用的backbone的Top5精度为88.0%,VGG16为90.0%。

Darknet-19的训练:在1000分类的ImageNet上训练160轮,初始学习率为0.1,使用指数为4的polynomial学习率衰减方案,权重衰减系数为0.0005,动量系数为0.9。使用Darknet神经网络框架。使用标准的数据增强:随机裁剪、旋转、色调改变、饱和度改变和曝光改变。

    正如前面所说,初始训练后进行高分辨率的fine-tune,即将数据集缩放至448,然后在训练10轮,使用初始学习率为0.001。使用这个更高的分辨率,Darknet-19可以达到76.5%的Top1精度和93.3%的top5精度。

目标检测模型的训练:将上面训练好的分类模型转换为目标检测模型:去掉最后一个卷积层,增加3个1024滤波器的3x3卷积,最后再接1x1卷积,设置检测需要的滤波器数量。对于VOC,每个位置预测5个boxes,每个boxes预测5个坐标值和20个类别,所以需要设置5x(5+20)个通道。此外,还从前面的3x3x512卷积层增加一个通路到倒数第二层卷积层,以至于模型可以获取更加精细的特征。

    训练该网络160轮,初始学习率0.001,到60和90轮时学习率除以10。使用权重衰减系数为0.0005,动量系数0.9。使用的数据增强策略与YOLOv1和SSD一样。

YOLOv2的架构:下图是YOLO v2的网络结构(图来自https://zhuanlan.zhihu.com/p/40659490):

20.jpg



Stronger

    这里提出一个机制来联合训练分类数据和检测数据。该方法使用目标检测标注数据来学习到特定信息,比如包围框坐标预测和目标的特征,以及学会如何分类常见的目标。使用只包含类别标注的图像去拓展模型可以检测的目标的类别。

    训练时,将目标检测数据集和分类数据集混合。当使用检测标注的图像时,反向传播整个损失函数;而当使用分类标注的图像时,仅反向传播分类部分的损失函数。

    该方法会遇到一些问题。目标检测数据集的类别标签通常比较宽泛,比如“dog”,“boat”等,而分类数据集比如ImageNet的类别分得比较细致,比如狗分为“Norfolk terrier”,“Yorkshire terrier”,“Bedlington terrier”。如果想联合这两个数据集,就需要融合它们的标签。

    大多数模型的实现分类是通过softmax得到预测类别,而softma会假设类别之间是互斥的,这会导致一些问题。比如,你想联合ImageNet和COCO数据集,但是发现“Norfolk terrier”和“dog”并不是互斥的。因此更好的办法是使用multi-label模型。

Hierarchical classification:ImageNet的标签是从WordNet中提取出来的,WordNet是一个预料库,用来构建概念以及概念之间的关系。在WordNet中,“Norfolk terrier”和“Yorkshire terrier”都是“terrier”的子类,terrier是“hunting dog”的一种,“hunting dog”是“dog”的一种,“dog”是“canine”的一种,等等。大多数分类方法对标签都采用flatten形式,但是对于联合数据集,需要一个结构。

    WordNet的结构是有向图,因为语言是复杂的。比如“dog”是“canine”的一种,同时也是“domestic animal”的一种。这里并不使用完整的图结构,而是根据WordNet中的概念构建一个hierarchical tree。

    为了构建hierarchical tree,我们检查ImageNet的标签名词,并查看它们在WordNet中到根节点的通路,这里的根节点是“physical object”。很多名词到根节点只有一条路,因此先增加这些路径到hierarchical tree中。接着迭代的检测剩下的名词,并尽可能少地添加使hierarchical tree生长的路径。因此,如果一个名词有两条到根节点的路径,一条路径将向tree添加三条边,而另一条只添加一条边,那么选择第一条。

    最后的WordTree,一个视觉名词的层级模型。为了使用WordTree进行分类,预测每个节点的条件概率,即,给定每个名词的子名词的概率。比如,在“terrier”节点,预测:

图片14.jpg

    如果想计算某个节点的绝对概率,直接按到根节点的路径展开条件概率即可。比如想要计算”Norfolk terrier”的概率,则展开如下:

图片15.jpg

    分类时,当某个图像包含一个目标时:Pr(object)=1。

    为了验证这种方法,这里在使用1000类ImageNet构建的WordTree上训练Darknet-19模型。为了构建WordTree1k,添加了所有中间节点,这些节点将标签空间从1000扩展到1369。训练时,在tree上面传播gt标签,比如一张图片被标注为“Norfolk terrier”,那么它同样被标注为“dog”和“mammal”。

    为了计算条件概率,这里会预测一个1369个值的向量,计算同一名字下所有子名词的softmax,如下图所示:

图片16.jpg

    从上图中可以看到,ImageNet1k对一个向量执行softmax,而WordTree对每个子树都执行softmax。

使用跟前面的训练参数,这个hierarchical Darknet-19达到了71.9%的top-1精度和90.4%的top-5精度。尽管额外增加了369个额外中标签,但是精度仅仅轻微下降。

    这种机制同样可以用于目标检测。此时不再假设每张图片有一个目标,而是使用YOLOv2来给出Pr(object)的值。YOLOv2预测包围框和树的概率。从树的顶端往下遍历,每次分叉时,采用最高置信度的路径,直到某个阈值,然后就认定该类。

Dataset combination with WordTree

    可以使用WordTree以合理的方式联合多个数据集。最简单的方式是直接将数据集标签的名字映射到WordTree上面。下图展示了使用了WordTree联合ImageNet和COCO:

图片17.jpg

图片18.jpg

Joint classification and detection:使用WordTree联合数据集之后,可以训练模型。这里使用COCO目标检测数据集和整个ImageNet分类数据集。对应WordTree有9418个类别。ImageNet是一个大得多的数据集,因此我们通过对COCO进行过采样来平衡数据集,这样ImageNet只比COCO大4:1倍。

    使用这个数据集训练得到YOLO9000,使用的是YOLOv2架构,但是每个位置只预测3个先验框以控制输出大小。当输入标注检测的图像时,会正常的进行反向传播。对于分类损失,只反向传播对应标签和该标签在WordTree的上级的损失。

    当输入标注分类的图像时,仅反向传播分类损失。仅需要找到最高置信度的包围框,然后计算其分类损失。我们还假设,当预测的包围框与gt包围框的IOU大于0.3时,反向传播边框损失。

使用这种联合训练,YOLO9000从COCO检测数据集中学习找到目标,在ImageNet分类数据集中学习分类目标。

    最后YOLO9000在ImageNet目标检测任务中进行评估。该任务的类别与COCO检测数据集只有44种类别是重叠的。这意味着YOLO9000评估时看到的数据,它训练时大多是分类的。最终YOLO9000获得了19.7mAP,其中对156类为使用检测标注数据训练过获得16.0的mAP。

当我们分析YOLO9000在ImageNet上的性能时,发现它很好地学习了新品种的动物,但是对设备和衣服等类别学习的不是很好。这是因为COCO里面有很多动物,因此模型能拥有较强的泛化能力,而COCO里面没有标注衣服,因此YOLO9000无法学习到比较好的知识。如下表:

图片19.jpg



上一篇:
下一篇:

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于