目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

YOLOv2与YOLO9000

YOLO9000: Better, Faster, Stronger

一、简述YOLOv1 -> YOLOv2 -> YOLO9000

​ YOLOv1取得了实时的检测速度,但是仍不能算是最先进的目标检测模型,因为它的准确率还不够高(对YOLO的错误分析显示它在定位上犯了大量的错误)。由此Joseph Redmon等人在YOLO的基础上,一步一步地添加已有的提高准确度的各种技术,也就是说YOLOv2 = YOLOv1+许多提高准确率的技巧。在堆叠了大量技术后,YOLOv2达到了state-of-the-art,准确率可以与Faster RCNN一较高下。

论文中的原话是“我们将过去工作中的大量想法与一些新的概念结合来提高YOLO的表现”

​ 在得到了YOLOv2后,作者转向解决一个新的问题:目前的目标检测只能检测很少的目标类型(几十类),这是因为对用于目标检测的数据打标签要更加昂贵,所以用于目标检测的数据量要远少于用于分类的数据。作者希望能利用大量的分类数据,设计一种联合训练的方式***,使模型可以同时使用检测和分类的数据进行训练,以此来扩展检测的种类*。作者对YOLOv2模型进行了修改,使用ImageNet和COCO的数据进行联合训练,最终得到了YOLO9000,顾名思义它可以对超过9000个类进行目标检测。

二、从YOLOv1到YOLOv2:Better and Faster

多数检测框架使用VGG-16作为特征提取器,它效果很好,但是过于庞大,30.69billion的浮点运算,YOLO使用基于GoogLeNet的结构,需要8.52 billion的浮点运算,但是准确率比VGG低。因而作者提出了Darknet-19。

堆叠了 3 × 3 3\times 3 3×3 1 × 1 1\times 1 1×1的filter,引入全局平均池化与batch normalization,最终的模型包括19个卷积层与5个池化层,5.58 billion的运算量。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

1)Batch Normolization:

使收敛速度加快,可以省去其他正规化方法,如dropout。使mAP上升2.4.

一次训练会输入一批样本进入网络,batch normalization在神经网络的每一层,在**函数之前层架一个批归一化层(BN),它对该批样本点各特征量分别进行归一化处理,使其均值为0,方差为1,然后再做一次线性变换,上一步的操作可能改变特征数据的分别,增加线性变换可以使它有机会恢复原本的信息。

批归一化有利于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数的敏感性,起到一定正则化的效果,从而得到更快的收敛速度。

2)High Resolution Classifier更高分辨率的分类器

预训练的分类图片通常是224*224分辨率,得到的模型适应此分辨率,而不适合分辨率更高的检测图像,所以对分类网络使用 448 × 448 448\times 448 448×448分辨率的图片进行微调,进行10个epoch,带来4% mAP的提升。

3)Anchor Box与Dimension Clusters

引入anchor:

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

YOLOv2在每个位置预设一组anchor,用来识别此位置的的多种尺度的目标。作者将预测类与预测空间位置的机制拆解开,变为为每一个anchor box预测位置以及目标置信度。

对网络做相应的修改:

A. 将 448 × 448 448\times 448 448×448的输入改为 416 × 416 416\times 416 416×416,主要目的是最后的特征图为 13 × 13 13\times 13 13×13大小,使一个特征可以负责中心位置。

B. 将全连接层去掉,减少一个池化层,使用全局平均池化+softmax。

C. YOLO中输出为 S × S × ( B ∗ 5 + C ) S\times S\times (B*5+C) S×S×(B5+C), 也就是以栅格为单位预测; 在YOLOv2中变为每一个位置输出 a n c h o r n u m × ( 5 + c l a s s n u m ) anchornum\times (5+classnum) anchornum×(5+classnum)

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

使用anchor的结果:

产生超过1000个anchor boxes,但是mAP有些许下降69.5=>69.2,有点是召回率上升,81%=>88%,这代表着有更大的提升空间。

通过聚类找到最适合的一组anchor:

Faster RCNN人工选出9种不同大小与比例的anchor boxes。

​ 相比人工挑选anchor box比例的不确定性,作者又希望使用一种方法来自动找出最好的anchor box的比例和数量,这个技术叫Dimension Clusters。作者对所有ground-truth box做聚类分析,找出平均IOU最好的一组anchor。使用这种方法找到的5个anchor优于人工选择9个anchor,这也是作者使用的方案。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

4)Direct location prediction

原方法:直接预测box的坐标,预测出的坐标可能在图片的任何位置,不稳定,难收敛。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

现方法:将预测框的中心限制在某个栅格内。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

5)Fine-Grained Features

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

ResNet中的残差块:将前面某层卷积层的输出与当前输出直接相加然后通过relu。基本思想是:如果网络已经足够大,目前已经学到了很好的特征,那么特征是不需要在变动的,但是后面的卷积层想要与之前得到的结果相同是十分困难的,由此将残差块作为捷径将它们连接。

许多目标尺寸很小,所以作者希望模型预测时能有更细的粒度,类似于ResNet的思想,作者在最后一个池化层之前,将特征图拆为4份,然后与池化后的结果堆叠在一起。带来了1%的提升。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

6)Multi-Schale Training

采用不同尺寸的输入进行训练:{320,352,…,608}。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

结果:

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

三、从YOLOv2到YOLO9000:Stronger

作者希望找到一种机制,使模型可以同时使用分类与检测数据进行训练,以此来达到扩展检测种类的目的。基本思想是:如果遇到一张检测图像就按照YOLOv2的损失函数进行反向传播,如果遇到一张分类图像,则只传播分类损失。

  1. 分类数据与检测数据的标签不互斥问题

通常如果我们想把两个数据集合并,需要满足的条件是他们的标签要么相同要么互斥,但是相比检测数据,分类数据种类更细致,比如检测的标签是dog,分类数据的标签则有更细致的Norfolk terrier(某个狗的种类),它们并不互斥。

解决方法:Hierarchical classification 层级分类

1)启发:

WordNet,一个语言数据库,将许多概念按关系组织起来,比如Yorkshire terrier与terrier和hunting dog相连,然后又与dog相连,最终所有概念都被组织在了一张网中。

2)简化:创建WordTree

作者找到所有的类对应的WordNet的节点,把它们与它们直到根节点的路径保留下来,如果不止一条路径,则仅保留最短的那条,那么作者就为他的数据构建出了一颗树,越向根节点走,概念越泛化,最终的根节点是physical object。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

3)与YOLOv2结合:

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

这种层级结构正好匹配我们对条件概率的理解,如果想要计算某一个节点的概率,只需要按照路径将从这个节点到根节点的所有概率相乘就可以。如果一个目标是柴犬,那么用1代表,同时它的上层,比如狗,哺乳动物等等也可以用1代表,而它下层的节点则用0代表。按照这种方式,每个节点的概率都可以计算:

举个例子:原本Darknet-19是基于1000个类的ImageNet建立的,加上WordTree中的所有中间节点,标签空间从1000扩展到1369,使用一个1369大小的向量代表。不需要对原来的网络结构做修改,因为扩展的节点可以用数学方法计算:对每个语义集使用一个softmax,相当于计算得到了它们的父节点的概率。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

当数据的非互斥问题解决后,我们就可以将ImageNet 和COCO数据集合并了。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

4)优点:当网络不能识别是哪类的狗时,至少可以识别出来dog类。

​ 缺点:识别准确率略微下降

  1. 使用联合数据集进行分类与检测

实际使用的数据是COCO目标检测数据集与ImageNet的前9000个类以及ImageNet detection challenge的数据,最终一共9418个类。为了减少计算了,将5个anchor减少为3个anchor。YOLOv2的输出是13135*(4+1+20),现在YOLO9000的输出是13133*(4+1+9418)。

对于分类损失计算的修改:对于一个检测样本,它的分类误差只包含该标签节点以及到根节点路径上所有节点的误差。如果一个样本的标签是狗,那么就没有必要计算它的子节点的误差,因为没有这些信息。对于分类样本只计算分类误差,直接找到类的预测概率最高的bbox,然后在它的树的路径上计算损失。

  1. 结果

YOLO9000整体取得19.7%的mAP,其中156个类是完全没有任何用于检测的标签的,这156个类仍有16.0%的mAP。对YOLO9000结果的分析显示,它对新的动物类型的检测效果很好,但是对一些衣服、物品的效果不好,这是因为COCO里有关于动物和人的图片,但没有任何关于衣服的数据。

目标检测模型 YOLOv2 与 YOLO9000 (YOLO9000: Better, Faster, Stronger)

四、Conclusion

YOLOv1=>更换CNN模型、添加各种提高准确率的技术(Faster、Better)=>YOLOv2

YOLOv2=>WordTree融合数据,检测种类扩展(Stronger)=>YOLO9000

五、参考

YOLO9000:Better, Faster, Stronger

简书:YOLOv2/YOLO9000深入理解

https://www.jianshu.com/p/517a1b344a88