[经典论文重读]YOLOv2

1. 前言

YOLOV2是YOLO目标检测系列算法的第二个版本。

第一部分:在YOLOV1基础上进行了若干改进优化,得到YOLOV2,提升算法准确度和速度。特别是增加了Anchor机制,改进了骨干网络。

第二部分:提出分层树状的分类标签结构WordTree,在目标检测和图像分类数据集上联合训练,YOLO9000可以检测超过9000个类别的物体。

CVPR 2017论文:YOLO9000: Better, Faster, Stronger,获得CVPR 2017 Best Paper Honorable Mention。

2. better(更准确)

为了获得更好的性能,v2在v1的基础上尝试了很多trick,也获得了很好的提升效果。

2. 1. Batch Normalization

增加BN层,使得网络训练时更好收敛,同时等效于正则化,使得网络避免过拟合,提高泛化性能,并且在模型上得到了2%的map改善。

1.1.bn

如上图,为BN层的概念和计算,不过这是全连接层的做法,对于全连接层,BN作用在特征维,也就是上面说的,对一个神经元该批次得到的32个响应值上面做操作。

但是对于卷积层,BN操作作用在通道维,也就是李沐老师说的,把每个像素看作是一个样本,通道维是这个样本的特征,因此对于卷积层,每个通道计算均值和标准差,然后再作归一化。

神经网络中传递的张量数据,其维度通常记为[N, H, W, C],其中N是batch_size,H、W是行、列,C是通道数。

均值的计算,就是在一个批次内,将每个通道中的数字单独加起来,再除以N*H*W。举个例子:该批次内有10张图片,每张图片有三个通道RBG,每张图片的高、宽是H、W,那么均值就是计算10张图片R通道的像素数值总和除以10*H*W ,再计算B通道全部像素值总和除以10*H*W,最后计算G通道的像素值总和除以10*H*W,方差的计算类似。如果我们吧HW拉平为一个维度,如下图所示,那么每个通道的均值和标准差按照蓝色部分作为集合进行计算,然后算下一个通道的均值和方差。

v2-65a596c7473e1e95cd884e3ff5393e8f_720w

可训练参数γ,β的维度等于张量的通道数,在上述例子中,RBG三个通道分别需要一个γ和一个 β ,所以 、γ,β 的维度等于3。

另外,由于一般的训练的数据量很大,一般无法在全部数据上计算均值和方差用来作为测试阶段用,因此一种常用的方法是通过移动平均估算整个训练数据集的样本均值和方差,具体做法是在每个batch中算出这个批次的均值为mean,方差为var,更新公式为:

        moving_mean = momentum * moving_mean + (1.0 - momentum) * mean
        moving_var = momentum * moving_var + (1.0 - momentum) * var

moving_mean和moving_var初始化为0,然后momentum一般取0.9。

2.2. High Resolution Classifier

1.2.High Resolution Classifier

这个的主要思路是,原来的backbone(分类器)是在224*224分辨率的图片上进行训练的,然后目标检测的输入尺寸是448*448,v1的做法是在224*224的图片上训练分类器,然后直接用来对448*448的图片进行检测,会导致模型不适应。V2的做法就是,分类器也在448*448的分辨率进行训练,就能够更好的进行目标检测了。具体做法是在224*224分辨率上训练原始分类器,然后在448*448分辨率上进行分类任务微调,然后在448*448分辨率上进行目标检测微调,最后提高了3.5%map。

2.3. Anchor

1.3. anchor

在V1中,每个grid cell有两个Bounding box对物体进行预测,而这两个bbox的x,y,w,h都是野蛮生长的,对网络来说,预测难度很大,因此也导致了v1的定位误差较大。V2引入了anchor机制,对每个grid cell 分配n个具有一定宽高比的anchor box,通过不同的anchor去拟合不同形状的gt。

另外,v2也使用了一个trick,调整输入大小为416, 使得最后输出的feature map的宽高均为奇数,好处是如果有物体的中心点落在图片的中心,有唯一的grid cell负责去预测这个物体而不是由周围四个去争,如下图所示。

1.4.odd feature map

另外,每个anchor预测的内容也改变了,需要预测x,y,w,h,c之外,还需要预测c个class的类别概率,因此在v2中,每个anchor预测4+1+20=25个数据,如下图所示:

1.5输出维度

因此,网络的输入如下图所示:13*13*(5*(4+1+20))

 

1.5.3输出维度-总框架

使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。

2.4. Dimension Cluster

至于anchor如何挑选,本文使用对anchor的宽高比进行了聚类,

并使用框的IOU作为距离度量指标,公式如下:

聚类指标

为了选出更合适的框,分别在VOC和COCO数据集上,尝试使用不同数量的anchor进行聚类,并算出数据集中的框与聚类中心框的平均IOU,最后在好的recall及复杂度的权衡下选择了k=5,如下图所示。

1.6cluster-anchor聚类

2.5. Direct location prediction

V2还对anchor的位置预测值进行了优化。在V1中,虽然假定每个grid cell中所有bbox预测的物体的中心点都落在这个grid cell,具体是预测x,y,表示相对于grid cell左上角坐标的偏移量,但实际上网络最后输出的x,y值域是在实数域,导致最后bbox的中心点会在图片的任何一个地方,因此V2对这种情况进行了改进。

1.7位置预测-偏移限制

如上图所示,将grid cell大小归一化为1*1,即每个grid cell 长度为1,然后anchor box预测的偏移值为tx,ty ,将最终的偏移量限制在[0,1],通过sigmoid函数对其进行限制。

最后中心点的坐标为限制后的偏移量加上grid cell左上角的坐标。

由于w,h偏移是正值,因此对预测的tw,th使用自然指数函数将值限制在0以上。

由于对是否含有物体的Confidence为0-1,因此也通过sigmoid函数进行限制,最后的输出如下图所示:

1.7.2位置预测公式png

2.6. Fine-Grained Features

即细粒度特征,具体操作如下图所示,在网络浅层,分为两路,一路继续进行卷积下采样,一路将feature map拆分为4份,并按照通道方向拼接起来,最后与另外一路的feature map在通道方向拼接在一起,这样网络既可以看到浅层特征也能看到深层特征,对改善小目标检测有很大帮助。

3.1Fine-Grained Features

具体的拆分方法如下图所示:

3.1.3Fine-Grained Features

不过在真实的代码中,在对细粒度feature map进行拆分之前,其实还对其通过1*1卷积进行了降维,然后再进行下一步的操作,如下图所示:

3.2Fine-Grained Features2

2.7. Multi-Scale Training

多尺度训练,其实就是在训练过程中,每隔一定epoch喂给模型不同分辨率的图片进行训练,如下图所示:

4.Multi-Scale Training

使用这个trick,最后能够增加1.5个map,另外,通过调整输入图片的大小,还可以实现速度与性能的权衡(高分辨率,高精度,低速度;低分辨率,低精度,高速度)。

2.8. Loss

原论文并没有给出Loss,国外大神通过代码总结出本文的loss函数,如下:

loss

蓝框表示loss遍历了所有anchor来求损失,λ为权重系数,黄色部分为指示函数,这个公式分为三部分:

第一部分loss是计算背景的置信度误差,选取的方式为:计算预测框与所有gt的IOU值(将Anchor与Gt框中心点重合,只看形状不看位置),并取最大值,如果小于阈值,那么这个预测框标记为背景,置信度误差为(0-b)^2.

第二部分是模型的前期(前12800次迭代),让anchor的各项位置偏移(xywh)去尽量拟合预测框,目的是让模型在训练前期学习到anchor的形状。

第三部分是计算与某个gt匹配的预测框(该anchor与gt的iou最大)各部分loss值,包括定位误差,置信度误差和分类误差,而还有一些与gt的IOU>thresh,但是并不是最大的,这部分anchor的损失直接忽略掉。

其中置信度误差中的IOU取值沿袭V1中的设定,即anchor与gt的IOU值。

3. faster

为了使网络速度更快,作者权衡不同网络的性能与速度,并将V2的backbone替换成Darknet19,如下图所示为候选网络的性能、计算量及速度数据:

6.faster骨干网络

Darkenet19分分类网络(下图左)和检测网络(下图右):

6.faster骨干网络-分类和检测

4. all tricks

5.all trick

从v1到v2,作者将以上的trick逐渐改善网络的性能,其中增阿基anchor boxes虽然降低了map,但是增加了recall。

V2与其他网络的性能对比,与当时SOTA的模型的性能在同一水平,并且速度要快很多:

7.结果

以上是yolov2的内容。

5. stronger

后面主要是介绍如何构建YOLO9000。

YOLO9000是在YOLOv2的基础上提出的一种可以检测超过9000个类别的模型,其主要贡献点在于提出了一种分类和检测的联合训练策略。众多周知,检测数据集的标注要比分类数据集打标签繁琐的多,所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。在YOLO中,边界框的预测其实并不依赖于物体的标签,所以YOLO可以实现在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。

作者选择在COCO和ImageNet数据集上进行联合训练,但是遇到的第一问题是两者的类别并不是完全互斥的,比如"Norfolk terrier"明显属于"dog",所以作者提出了一种层级分类方法(Hierarchical classification),主要思路是根据各个类别之间的从属关系(根据WordNet)建立一种树结构WordTree,结合COCO和ImageNet建立的WordTree如下图所示:

分类

WordTree中的根节点为"physical object",每个节点的子节点都属于同一子类,可以对它们进行softmax处理。在给出某个类别的预测概率时,需要找到其所在的位置,遍历这个path,然后计算path上各个节点的概率之积。

9.4分类结构softmax2

在训练时,如果是检测样本,按照YOLOv2的loss计算误差,而对于分类样本,只计算分类误差。在预测时,YOLOv2给出的置信度就是Pr(physical object),同时会给出边界框位置以及一个树状概率图。在这个概率图中找到概率最高的路径,当达到某一个阈值时停止,就用当前节点表示预测的类别。

通过联合训练策略,YOLO9000可以快速检测出超过9000个类别的物体,总体mAP值为19.7%。

不过后面的工作并没有再使用过类似的方法去构建模型了,可能是效果一般吧。

6. 参考

[1] 深度解析Batch normalization(批归一化)

[2] 目标检测|YOLOv2原理与实现(附YOLOv3)

[3] 【精读AI论文】YOLO V2目标检测算法

(完)

posted @ 2023-04-28 00:45  大师兄啊哈  阅读(218)  评论(0编辑  收藏  举报