目标检测之YOLO V2

YOLO版本论文全名叫“YOLO9000: Better, Faster, Stronger”,主要有两个大方面的改进:

  1. 使用了一系列的方法对原来的YOLO多目标检测框架做了大量改进,在保持原有速度优势的基础上,精度上得以提升。
  2. 提出了一种目标分类与检测的联合训练方法,通过这种方法,YOLO9000可以同时在COCO和ImageNet数据集中进行训练,训练后的模型可以实现多达9000种物体的实时检测。

Better

先总体看一下YOLOv2用了什么技巧:
图片

Batch Normalization

对于深度神经网络来说,每一层里都对输入乘以权重后得到输出。当很多层这样的相乘累计在一起时,一个输入数据较小的改变都可能导致输出产生巨大变化,从而带来不稳定性,大大降低网络的训练速度和泛化能力。YOLOv2通过在每一个卷积层后添加batch normalization,极大的改善了收敛速度同时减少了对其它正则化方法的依赖(舍弃了Dropout优化后依然没有过拟合),使得mAP获得了2%的提升。

High Resolution Classifier

目前的目标检测方法中,基本上都会使用ImageNet预训练过的模型(classifier)来提取特征,从AlexNet开始,多数分类器都把输入图像resize到$256\times 256$,这会容易丢失一些小物体的信息,给检测带来困难。 YOLOv1先使用$256\times 256$的分辨率来训练分类网络,在训练检测网络的时候再切换到$448\times 448$的分辨率,这意味着YOLOv1的卷积层要重新适应新的分辨率同时YOLOv1的网络还要学习检测网络。

对于YOLOv2,作者首先对分类网络(自定义的darknet)进行了fine tune,分辨率改成$448\times 448$,在ImageNet数据集上训练10轮(10 epochs),训练后的网络就可以适应高分辨率的输入了。然后,作者对检测网络部分(也就是后半部分)也进行fine tune。这样通过提升输入的分辨率,mAP获得了4%的提升。

Convolutional With Anchor Boxes

YOLOv1使用全连接层数据进行bounding box预测(要把$14701$的全链接层reshape为$77*30$的最终特征),这会丢失较多的空间信息导致定位不准。YOLOv2借鉴了Faster RCNN中的anchor的思想:在卷积特征图上进行滑窗操作,每个中心预测9种不同大小和比例的建议框,这样很好的保留的空间信息。

  1. 去掉全连接层。
  2. 输入图片分辨率变为为$416\times416$,而不是$448\times448$。这一步的目的是为了让后面产生的卷积特征图宽高都为奇数($7\times7$ v.s. $8\times8$ grid cell),这样就可以产生一个center cell。因为大物体通常占据了图像的中间位置,这样就可以只用中心的一个cell来预测这些物体的位置。
  3. 去掉一个池化层,使网络卷积层输出具有更高的分辨率。这样最终得到$13\times13$的卷积特征图。
  4. 把预测类别的机制从空间位置(Cell)中解耦,由anchor Box同时预测类别和坐标。因为YOLO是由每个cell来负责预测类别,每个cell对应的2个bounding box 负责预测坐标。YOLOv2中,不再让类别的预测与每个Cell(空间位置)绑定一起,而是让全部放到Anchor Box中。下面是特征维度示意图(仅作示意并非完全正确)。

图片

加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。YOLOv1每张图像只预测98个边界框,但是使用锚盒的模型预测超过1000。假设每个cell预测9个建议框,那么总共会预测$13\times13\times9= 1521$个boxes。但准确率只有小幅下降,而召回率则提升了7%。

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之间的交集除以并集),这样error就和box的尺度无关,最终的距离函数为:

图片
可以看到,平衡复杂度和IOU之后,最终得到k值为5,意味着作者选择了5种大小的box维度来进行定位预测,这与手动选择的box维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论如不通过聚类实验恐怕是发现不了的。

使用聚类方法,仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。

Direct Location Prediction(直接位置预测)

在YOLO上使用anchor boxes会遇到一个问题:模型不稳定。尤其是在早期迭代中。论文认为模型不稳定的原因来自于预测bbox的$(x,y)$。

在Faster R-CNN的inference时,偏移因子$t_x,t_y$是没有限制的,使得无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点。模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。而正确做法应该是每一个anchor只负责检测周围的一个部分区域。

所以YOLO的方法改为预测相对于网格单元位置的位置坐标,并使用Sigmoid函数将偏移量限制在0-1(这里的尺度是针对grid cell),计算公式如下:

Sigmoid实际意义是使anchor只负责周围的box,有利于提升效率和网络收敛。$\sigma(t_x)$是bounding box的中心相对栅格左上角的横坐标,$\sigma(t_y)$是纵坐标,$\sigma(t_o)$是bounding box的confidence score。$b_x,b_y,b_w,b_h$是预测的bbox的中心点坐标和宽高,中心点坐标的尺度是相对于grid cell。如下图:

图片

使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。

Fine-Grained Features

网络最后的feature map尺寸为$13\times13$,对于检测大尺寸的目标是够的。如果是要检测小尺寸的物体,就有点勉强。Faser RCNN和SSD都在不同层次的特征图上产生区域建议(SSD直接就可看得出来这一点),获得了多尺度的适应性。这里使用了一种不同的方法,简单添加了一个转移层( passthrough layer),这一层要把分辨率为$26\times26\times512$的浅层特征图reshape成$13\times13\times2048$,然后连接到深层特征图。它可以拥有更好的细粒度特征,使得模型的性能获得了1%的提升。如下图所示(下图应为$26\times26\times512$和$13\times13\times2048$,直接copy别人的图,勿喷):

图片

Multi-Scale Training

YOLOv1网络使用固定的$448\times448$图片作为输入,加入anchor boxes后,输入变成了$416\times416$。网络只用到了卷积层和池化层,所以可输入任意大小的图片。作者希望YOLOv2对不同尺寸图片具有良好的鲁棒性,因此在训练的时候也考虑了这一点。

不同于固定输入网络的图片尺寸的方法,YOLOv2在几次迭代后就会微调网络。每经过10个epoch,就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么就使用32的倍数进行尺度池化${320,352,…,608}$。最终最小的尺寸为$320\times320$,最大的尺寸为$608\times608$,在新的输出尺寸上进行训练。

这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务。在小尺寸图片检测中,YOLOv2成绩很好,输入为$228\times228$的时候,帧率达到90FPS,mAP几乎和Faster RCNN的水准相同。使得其在低性能GPU、高帧率视频、多路视频场景中更加适用。在大尺寸图片检测中,YOLOv2达到了先进水平,VOC2007 上mAP为78.6%,仍然高于平均水准。

Faster

YOLO一向是速度和精度并重。大多数检测网络有赖于VGG-16作为特征提取部分,VGG-16的确是一个强大而准确的分类网络,但是复杂度有些冗余。$224\times224$的图片进行一次前向传播,卷积层就需要多达306.9亿次浮点数运算。

YOLOv2使用的是基于Googlenet的定制网络,比VGG-16更快,一次前向传播仅需85.2亿次运算。但它的精度要略低于VGG-16,单张$224\times224$取前五个预测概率的对比成绩为88%和90%(低一点点也是可以接受的)。

Darknet-19

YOLOv2使用了一个新的分类网络作为特征提取部分,使用了较多的$3\times3$卷积核,在每一次池化操作后把通道数翻倍。借鉴network in network的思想,网络使用了全局平均池化(global average pooling),把$1\times1$的卷积核置于$3\times3$的卷积核之间,用来压缩特征。也使用了batch normalization稳定模型训练。

最终得出的基础模型就是Darknet-19,如下图,其包含19个卷积层、5个最大值池化层(maxpooling layers ),下图展示网络具体结构。

图片

Training for classification

论文以Darknet-19为模型在ImageNet上用SGD跑了160epochs。

参数 数值
learning rate 0.1
polynomial rate decay 4
weight decay 0.00005
momentum 0.9
data augmentation数据增强 random crops, rotations等tricks

跑完了160 epochs后,把输入尺寸从$224\times224$上调为$448\times448$,这时候lr调到0.001,再跑了10 epochs,这时候DarkNet达到了top-1准确率76.5%,top-5准确率93.3%。

Training for dectection

在上面训练好的DarkNet-19的基础上,把分类网络改成detect网络,去掉原先网络的最后一个卷积层,取而代之的是使用3个$3\times3\times1024$的卷积层,并且每个新增的卷积层后面接$1\times1$的卷积层,输出维度是检测所需的数量。对于VOC数据集,预测5种boxes大小,每个box包含5个坐标值和20个类别,所以总共是$5\times(5+20)=125$个输出维度。同时也添加了转移层(passthrough layer),从最后那个$3\times3\times512$的卷积层连到倒数第二层,使模型有了细粒度特征。

参数 数值
训练次数 160 epochs
learning rate 起始0.001,在60和90 epochs时衰减10倍
weight decay 0.0005
momentum 0.9
data augmentation random crops,color shifting,etc
data augmentation数据增强 random crops, rotations等tricks

Stronger

论文提出了一种联合训练的机制:使用detection数据集训练模型detection相关parts,使用classification数据集训练模型classification相关parts。

这样训练会有一些问题:detection datasets的标签更为“上层”,例如狗,船啊啥的。而对应的classification datasets的标签就“下层”了很多,比如狗就有很多种,例如“Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”等等。

而我们一般在模型中分类使用的是softmax,softmax计算所有种类的最终的概率分布。softmax会假设所有种类之间是互斥的,但是,实际过程中,“上层”和“下层”之间是有对应的关系的。(例如中华田园犬,博美都属于狗),照着这样的思路,论文整出了一个层次性的标签结构。

Hierarchical classification

ImageNet的标签的来源是WordNet一种结构化概念及概念之间关系的语言数据库)。例如:
图片

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

创建层次树的步骤是:

  • 遍历ImageNet的所有视觉名词
  • 对每一个名词,在WordNet上找到从它所在位置到根节点(“physical object”)的路径。 许多同义词集只有一条路径。所以先把这些路径加入层次树结构。
  • 然后迭代检查剩下的名词,得到路径,逐个加入到层次树。路径选择办法是:如果一个名词有两条路径到根节点,其中一条需要添加3个边到层次树,另一条仅需添加一条边,那么就选择添加边数少的那条路径。

最终结果是一颗 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.31IOU。

采用这种联合训练,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很难对“太阳镜”,“游泳裤”这些类别建模。

参考文献

[1]. YOLO9000: Better, Faster, Stronger
[2]. YOLO9000, Better, Faster, Stronger论文翻译
[3]. Real-time Object Detection with YOLO, YOLOv2 and now YOLOv3
[4]. YOLOv2 论文笔记
[5]. 目标检测之YOLOv2
[6]. Object Detection — 论文YOLO2(YOLO9000:Better, Faster, Stronger)解读
[7]. 知乎专栏:YOLO2

持续技术分享,您的支持将鼓励我继续创作!