天天看点

YOLO v2详解

YOLO v2和YOLO9000是同一篇论文提出的两个模型,二者略有不同。前者主要是YOLO的升级版,比YOLO拥有更高的精度和速度,后者的主要检测网络也是YOLO v2,同时对数据集做了融合,使用联合训练算法,使得模型可以检测9000多类物体。

一、Better(更准)

YOLO 一代有很多缺点,作者希望改进的方向是改善 recall,提升定位的准确度,同时保持分类的准确度。

目前计算机视觉的趋势是更大更深的网络,更好的性能表现通常依赖于训练更大的网络或者把多种模型综合到一起。但是 YOLO v2 则着力于简化网络。具体的改进见下表:

YOLO v2详解

1、Batch Normalization(批处理标准化)

BN(Batch Normalization)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快一点,同时还消除了对其它形式的正则化(regularization)的依赖,即作者加入BN后就把dropout去掉了。通过对 YOLO 的每一个卷积层增加 Batch Normalization,最终使得 mAP (平均精度均值)提高了 2%。

2、High resolution classifier(高分辨率分类器)

目前业界标准的检测方法,都是用预训练的网络来fine-tuning自己的网络,而不是从随机初始化所有参数开始。原来的YOLO网络在预训练的时候采用的是224*224的输入(因为从 Alexnet 开始,大多数的分类器都运行在小于 256*256 的图片上),然后在检测(detection)的时候输入调整到448*448,这就意味着网络需要适应新的输入分辨率。而YOLOv2则将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch(循环训练所有数据160趟),然后再将输入调整到448*448,再训练10个epoch,让网络有时间调整滤波器(filters)。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的mAP。

3、Convolution with anchor boxes(使用anchor boxes卷积)

YOLO 一代包含有全连接层,从而能直接预测 Bounding Boxes 的坐标值。  Faster R-CNN 的方法只用卷积层与 Region Proposal Network 来预测 Anchor Box 偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易,即YOLO v2借鉴了Faster R-CNN的思想,引入anchor。

首先将原网络的全连接层和最后一个pooling层去掉,使得最后的卷积层可以有更高分辨率的特征;然后缩减网络,用416*416大小的输入代替原来448*448。这样做的原因在于希望得到的特征图都有奇数大小的宽和高,奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个center cell(比如可以划分成7*7或9*9个cell,center cell只有一个,如果划分成8*8或10*10的,center cell就有4个)。为什么希望只有一个center cell呢?因为大的object一般会占据图像的中心,所以希望用一个center cell去预测,而不是4个center cell去预测。网络最终将416*416的输入变成13*13大小的feature map输出,也就是缩小比例为32。

我们知道原来的YOLO算法将输入图像分成7*7的网格,每个网格预测两个bounding box,因此一共只有98个box,但是在YOLO v2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为13*13为例,每个grid cell有9个anchor box的话,一共就是13*13*9=1521个,当然由论文后面可知,最终每个grid cell选择了5个anchor box)。顺便提一下在Faster RCNN在输入大小为1000*600时的boxes数量大概是6000,在SSD300中boxes数量是8732。显然增加box数量是为了提高object的定位准确率。

作者的实验表明:虽然加入anchor使得mAP值(平均精度均值)下降了一点(69.5降到69.2),但是提高了recall(81%提高到88%)。

4、Dimension clusters(聚类的维度)

我们知道在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络更好地预测。所以作者采用k-means(K-均值算法)的方式对训练集的bounding boxes做聚类(无监督学习的常用方法),试图找到合适的anchor box。

同时作者发现如果用标准的欧式距离的 k-means,尺寸大的框比小框产生更多的错误。而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关:

YOLO v2详解

通过分析实验结果如下图(Figure 2),左边是聚类的簇个数和IOU的关系,两条曲线分别代表两个不同的数据集。在分析了聚类的结果并平衡了模型复杂度与recall值,作者选择了K=5,这也就是Figure2中右边的示意图是选出来的5个box的大小,这里紫色和黑色也是分别表示两个不同的数据集,可以看出其基本形状是类似的。而且发现聚类的结果和手动设置的anchor box大小差别显著。聚类的结果中多是高瘦的box,而矮胖的box数量较少。

YOLO v2详解

下表Table1中作者采用的5种anchor(Cluster IOU)的Avg IOU是61,这个值要比不用聚类的方法的 60.9 要高。选择值为 9 的时候,AVG IOU 更有显著提高。总之就是说明用聚类的方法是有效果的。

YOLO v2详解

5、Direct location prediction(直接定位预测)

用 Anchor Box 的方法,会让 model 变得不稳定,尤其是在最开始的几次迭代的时候。作者认为大多数不稳定因素产生自预测 Box 的(x,y)位置的时候。我们知道在基于region proposal的object detection算法中,是通过预测下图中的tx和ty来得到(x,y)值,也就是预测的是offset。

在这里作者并没有采用直接预测offset的方法,还是沿用了YOLO算法中直接预测相对于grid cell的坐标位置的方式,前面提到网络在最后一个卷积层输出13*13大小的feature map,然后每个cell预测5个bounding box,然后每个bounding box预测5个值:tx,ty,tw,th和to(这里的to类似YOLOv1中的confidence),如下图,tx和ty经过sigmoid函数处理后范围在0到1之间,这样的归一化处理也使得模型训练更加稳定;cx和cy表示一个cell相对于图像左上角的偏移量,pw和ph表示bounding box的宽高,这样bx和by就是cx和cy这个cell附近的anchor来预测tx和ty得到的结果。

YOLO v2详解

它们的关系如下图(Figure3),可以看出cx和cy表示grid cell与图像左上角的横纵坐标距离,黑色虚线框是bounding box,蓝色矩形框就是预测的结果。

YOLO v2详解

因为使用了限制让数值变得参数化,也让网络更容易学习、更稳定。Dimension clusters和Direct location prediction,使得模型比其他使用 Anchor Box 的版本提高了近5%。

6、Fine-Grained Features(细粒度的特征)

这里主要是添加了一个层:passthrough layer。这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样做的原因在于虽然13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。通过这个passthrough layer把高分辨率特征与低分辨率特征联系在了一起,联系起来的方法是把相邻的特征堆积在不同的 Channel(通道) 中,这一方法类似与 Resnet(残缺网络) 的 Identity Mapping(恒等映射),从而把 26*26*512 变成 13*13*2048。YOLO 中的检测器位于扩展后(expanded )的特征图的上方,所以他能取得细粒度的特征信息,这提升了 YOLO 1% 的性能。

7、Multi-Scale Training(多尺度训练)

为了能让YOLO v2具有更好的鲁棒性能运行于不同尺寸的图片之上,即为了接受输入图像的大小size是动态变化的,作者采用了以下做法。(注意这一步是在检测数据集上fine tune时候采用的,不要跟前面在Imagenet数据集上的两步预训练分类模型混淆)

具体来讲,在训练网络时,每训练10个batch,网络就会随机选择另一种size的输入。前面我们知道本文网络本来的输入是416*416,最后会输出13*13的feature map,由于使用了下采样参数是  32,所以不同的尺寸大小也选择为 32 的倍数 {320,352…..608},最小 320*320,最大 608*608,网络会自动改变尺寸,并继续训练的过程。

区别于之前的补全图片的尺寸的方法,YOLOv2 每迭代几次都会改变网络参数。每 10 个 Batch,网络会随机地选择一个新的图片尺寸,这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在 YOLOv2 的速度和精度上进行权衡。

下图是在 voc2007 上的速度与精度

YOLO v2详解
YOLO v2详解

8、Further Experiments(进一步实验)

作者在VOC 2012上训练,下表Table4展示了其与其它最先进的检测系统相比的性能。可以看出YOLO v2在速度上远远超过其它方法。

YOLO v2详解

下表Table5示作者在COCO上与其它方法的比较,VOC指标(IOU=5)

YOLO v2详解

二、Faster(更快)

YOLO 使用的是 GoogLeNet 架构,比 VGG-16 快,YOLO 完成一次前向过程只用 85.2 亿次运算(8.52 billion operation),而 VGG-16 要 306.9 亿次(30.69 billion operation),但是 YOLO 精度(88%)稍低于 VGG-16(100%)。而在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。

1、Draknet19

YOLO v2 基于一个新的分类模型,有点类似于 VGG。YOLO v2 使用 3*3 的 filter,每次池化之后都增加一倍 Channels 的数量。YOLO v2 使用全局平均池化,使用 Batch Normilazation 来让训练更稳定,加速收敛,使模型规范化。

Darknet-19只需要55.8亿次运算(5.58 billion operation)。这个网络包含19个卷积层和5个max pooling层,而在YOLO v1中采用的GooleNet,包含24个卷积层和2个全连接层,因此Darknet-19整体上卷积卷积操作比YOLO v1中用的GoogleNet要少,这是计算量减少的关键。最后用average pooling层代替全连接层进行预测。这个网络在ImageNet上取得了top-5的91.2%的准确率。

YOLO v2详解

2、Training for classification(分类训练)

这里的training for classification都是在ImageNet上进行预训练,主要分两步:

①从头开始训练Darknet-19,数据集是ImageNet,训练160个epoch,输入图像的大小是224*224,初始学习率为0.1。另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等。

②再fine-tuning 网络,这时候采用448*448的输入,参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001,并训练10个epoch。

结果表明fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%,而如果按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。因此可以看出第1,2两步分别从网络结构和训练方式两方面入手提高了主网络的分类准确率。

3、Training for Detection(检测训练)

在前面第2步之后,就开始把网络移植到detection,并开始基于检测的数据再进行fine-tuning。

首先把最后一个卷积层去掉,然后添加3个3*3的卷积层,每个卷积层有1024个filter,而且每个后面都连接一个1*1的卷积层,1*1卷积的filter个数根据需要检测的类来定。

比如对于VOC数据,由于每个grid cell我们需要预测5个box,每个box有5个坐标值和20个类别值,所以每个grid cell有125个filter(与YOLO 不同,在YOLO中每个grid cell有30个filter,而且在YOLO中,类别概率是由grid cell来预测的,也就是说一个grid cell对应的两个box的类别概率是一样的,但是在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由grid cell决定,因此这边每个box对应25个预测值(5个坐标加20个类别值),而在YOLO 中一个grid cell的两个box的20个类别值是一样的)。

另外作者还提到将最后一个3*3*512的卷积层和倒数第二个卷积层相连。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。

三、Stronger(更强)

在训练的过程中,当网络遇到一个来自检测数据集的图片与标记信息,那么就把这些数据用完整的 YOLO v2 loss 功能反向传播这个图片。当网络遇到一个来自分类数据集的图片和分类标记信息,只用整个结构中分类部分的 loss 功能反向传播这个图片。

但是检测数据集只有粗粒度的标记信息,像“猫“、“ 狗”之类,而分类数据集的标签信息则更细粒度,更丰富。比如狗这一类就包括”哈士奇“”牛头梗“”金毛狗“等等。所以如果想同时在监测数据集与分类数据集上进行训练,那么就要用一种一致性的方法融合这些标签信息。

再者,用于分类的方法,大多是用 softmax layer 方法,softmax 意味着分类的类别之间要互相独立的。而盲目地混合数据集训练,就会出现比如:检测数据集的分类信息中”狗“这一分类,在分类数据集合中,就会有的不同种类的狗:“哈士奇”、“牛头梗”、“金毛”这些分类,这两种数据集之间的分类信息不相互独立。所以使用一种多标签的模型来混合数据集,假设一个图片可以有多个分类信息,并假定分类信息必须是相互独立的规则可以被忽略。

1、Hierarchical classification(层次分类法)

WordNet 的结构是一个直接图表(directed graph),而不是树型结构。因为语言是复杂的,狗这个词既属于‘犬科’又属于‘家畜’两类,而‘犬科’和‘家畜’两类在 WordNet 中则是同义词,所以不能用树形结构。

作者希望根据 ImageNet 中包含的概念来建立一个分层树,为了建立这个分层树,首先检查 ImagenNet 中出现的名词,再在 WordNet 中找到这些名词,再找到这些名词到达他们根节点的路径(在这里设为所有的根节点为实体对象(physical object)。在 WordNet 中,大多数同义词只有一个路径,所以首先把这条路径中的词全部都加到分层树中。接着迭代地检查剩下的名词,并尽可能少的把他们添加到分层树上,添加的原则是取最短路径加入到树中。

为了计算某一结点的绝对概率,只需要对这一结点到根节点的整条路径的所有概率进行相乘。所以比如你想知道一个图片是否是 Norfolk terrier 的概率,则进行如下计算:

YOLO v2详解

为了验证这一个方法,在 WordTree 上训练 Darknet19 的模型,使用 1000 类的 ImageNet 进行训练,为了建立 WordtTree 1K,把所有中间词汇加入到 WordTree 上,把标签空间从 1000 扩大到了 1369。在训练过程中,如果有一个图片的标签是“Norfolk terrier”,那么这个图片还会获得”狗“(dog)以及“哺乳动物”(mammal)等标签。总之现在一张图片是多标记的,标记之间不需要相互独立。

如 Figure5 所示,之前的 ImageNet 分类是使用一个大 softmax 进行分类。而现在,WordTree 只需要对同一概念下的同义词进行 softmax 分类。 

使用相同的训练参数,这种分层结构的Darknet19达到71.9%top-1精度和90.4% top-5 精确度,精度只有微小的下降。

这种方法的好处:在对未知或者新的物体进行分类时,性能降低的很优雅(gracefully)。比如看到一个狗的照片,但不知道是哪种种类的狗,那么就高置信度(confidence)预测是”狗“,而其他狗的种类的同义词如”哈士奇“”牛头梗“”金毛“等这些则低置信度。

YOLO v2详解
YOLO v2详解

2、Datasets combination with wordtree(数据集与WordTree的结合)

用 WordTree 把数据集合中的类别映射到分层树中的同义词上,例如上图 Figure 6,WordTree 混合了 ImageNet 和 COCO。

3、Joint classification and detection(联合分类检测法)

作者的目的是:训练一个 Extremely Large Scale 检测器。所以训练的时候使用 WordTree 混合了 COCO 检测数据集与 ImageNet 中的 Top9000 类,混合后的数据集对应的 WordTree 有 9418 个类。另一方面,由于 ImageNet 数据集太大了,作者为了平衡一下两个数据集之间的数据量,通过过采样(oversampling) COCO 数据集中的数据,使 COCO 数据集与 ImageNet 数据集之间的数据量比例达到 1:4。

YOLO9000 的训练基于 YOLO v2 的构架,但是使用 3 priors 而不是 5 来限制输出的大小。当网络遇到检测数据集中的图片时则正常地反方向传播,当遇到分类数据集图片的时候,只使用分类的 loss 功能进行反向传播。同时作者假设 IOU 最少为 0.3。最后根据这些假设进行反向传播。

使用联合训练法,YOLO9000 使用 COCO 检测数据集学习检测图片中的物体的位置,使用 ImageNet 分类数据集学习如何对大量的类别中进行分类。 

为了评估这一方法,使用 ImageNet Detection Task 对训练结果进行评估。

评估结果: 

  • YOLO9000 取得 19.7 mAP。 在未学习过的 156 个分类数据上进行测试, mAP 达到 16.0。
  • YOLO9000 的 mAP 比 DPM 高,而且 YOLO 有更多先进的特征,YOLO9000 是用部分监督的方式在不同训练集上进行训练,同时还能检测 9000个物体类别,并保证实时运行。

虽然 YOLO9000 对动物的识别性能很好,但是对类别为“sungalsses”或者“swimming trunks”这些衣服或者装备的类别,它的识别性能不是很好,见 table 7。这跟数据集的数据组成有很大关系。

YOLO v2详解

四、总结

YOLO 9000 的网络结构允许实时地检测超过9000种物体分类,这归功于它能同时优化检测与分类功能。使用 WordTree 来混合来自不同的资源的训练数据,并使用联合优化技术同时在 ImageNet 和 COCO 数据集上进行训练,YOLO9000 进一步缩小了监测数据集与识别数据集之间的大小代沟。

参考:

https://blog.csdn.net/guleileo/article/details/80581858

https://blog.csdn.net/u014380165/article/details/77961414

继续阅读