带你一文读懂YOLO v2

YOLO v2论文详解

YOLO v2是在论文YOLO9000: Better, Faster, Stronger提出的,这篇论文先在结构上进行了一些改变从而提出了YOLO v2。然后,在YOLO v2的基础之上提出了一种将分类和检测融合的新型训练方式,使得模型可以识别9000多种类别,所以取名叫YOLO9000。
因为YOLO v2的原理其实和YOLO v1类似,所以这篇博客我就顺着原论文的思路进行分析,主要看YOLO v2有哪些创新和改进之处,而不再直接从YOLO v2的原理上面分析。

0. Abstract

 Abstract这里说明了整篇文章所做的最主要的两点contributions:

  1. 在结构和训练方式上面有所改进,产生了YOLO v2,使得该模型可以运行在不同size的图片之上,并且能够很好地平衡speed和accuracy。
  2. 提出了一个利用object detection和classification的数据集进行互补的训练策略,这个策略使得模型可以迅速扩充分类的vocabulary,从而产生了YOLO9000这个可以一次识别9000类物体的模型。

1. Introduction

 Introduction这个部分其实主要在说前面contributions的第二点。由于object detection数据集的标注难度远大于classification的数据集(因为人要从一张图片中提取所有物体的类别和位置本身就很有难度,并且从数据集的角度上来说,各个物体的数量分布也很难做到均匀)。所以现有的object detection数据集受限制于只有少量的物体类别,例如PASCAL VOC仅仅有20类物体,COCO数据集也只有80类物体。所以对于以前的detection system来说,仅仅利用这些数据集会非常限制系统的识别能力。而classification的数据集由于标注简单,所以类别可以有很多,例如ImageNet数据集中总共包含了上万种类别。所以作者准备利用classification数据集去扩充detection system的vocabulary。

2. Better

 这一部分主要介绍了YOLO v1到YOLO v2是如何变得更好的。下面我对这七个改进点一一进行分析。

2.1 Batch Normalization

  关于BN为什么能够加速网络收敛,并且起到一定正则化作用的解释请移步我的另一篇博客《带你一文读懂Batch Normalization》,作者在YOLO的每一个卷积层后面都添加了BN层,然去掉了Dropout层,并获得了2个点的提升。

2.2 High Resolution Classifier

 在当时所有state-of-the-art的检测方法都是用了在ImageNet上pre-trained的classifier,而从AlexNet开始后的classifier数据图像都是小于 256 × 256 256 imes 256 256×256的。以前的YOLO v1输入图像也是 224 × 224 224 imes 224 224×224的。对于YOLO v2来说,作者开始fine tune这个classifier的时候使用了 448 × 448 448 imes 448 448×448大小的输入图像在ImageNet上迭代了10个epochs,然后再fine tune detection的网络。高分辨率的classifier给整个网络带来了4个点的提升。

2.3 Convolutional With Anchor Boxes

  对于YOLO v1来说,最主要的错误就是recall error和localization error这两部分组成的。作者首先采用了全卷积的结构,把最后输出的 7 × 7 7 imes 7 7×7的ceils扩大为 13 × 13 13 imes 13 13×13的ceils(注意,这里的网络是被shrink了,输入图像为 416 × 416 416 imes 416 416×416而不是 448 × 448 448 imes 448 448×448,进过backbone降采样32倍才变成了 13 × 13 13 imes 13 13×13),主要目的是为了保证奇数个ceils,可以是输出中间是一个单个的ceil。
 然后,作者还使用了Anchor Boxes,虽然Anchor Box使得mAP少量下降了,但是让recall得到了大大地提升,这也就意味着模型有着更大的提升空间。(其实加Anchor Boxes提升recall的原理就是让proposals变多,proposals越多就越有机会框住object,那些region-base的detection system就是因为region proposals特别多,所以recall才比较好,当然这也意味着precision有可能会比较低)。

2.4 Dimension cluster

使用Anchor Boxes会遇到的问题之一:Anchor Box需要手选,而这样的话就十分依赖操作者的经验和运气。所以,作者在这里引入了k-means进行了Anchor Boxes的聚类。作者首先将训练集中的BBoxes(就是ground truth)分散到整个平面,然后使用k-means聚类,不断改变参数,在保证k较小(即模型复杂度较小)的情况下,使得簇中心的centroid boxes和其他boxes有着更高的IOU。作者通过实验得出了k=5的时候比较合适。
 由于作者想要的是更高的IOU,所以这里的distance公式不是传统的欧几里得距离,而是:
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box,centroid) = 1 − IOU(box,centroid) d(box,centroid)=1IOU(box,centroid)
在这里插入图片描述

 这里我说一下我对整个过程的理解(因为现在还没看源代码):本来k-means这个算法是用来点聚类的,但是作者在这里用来进行矩形聚类,所以需要进行适当外推。即更新k个中心簇的时候不再仅仅是该簇所有boxes中心点的x,y均值作为新簇中心矩形的中心,还应该取该簇所有boxes的w、h均值作为新簇中心矩形的w、h。

2.5 Direct location prediction

使用Anchor Boxes会遇到的问题二:region proposal networks预测的box是全局的偏移量,这就会导致box会结束与图形中的任意一点。这样让一开始随机初始化的模型需要花费很多时间才能让预测结果稳定下来。
 YOLO v2吸取了上述的缺点,采用相对于每个grid的方式进行预测,对于每一个预测的bbox由5个量代表: t x , t y , t w , t h , t o t_x, t_y, t_w, t_h, t_o tx,ty,tw,th,to。整个预测公式如下:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h P r ( o b j e c t ) ∗ I O U ( b , O b j e c t ) = σ ( t o ) b_x = sigma(t_x) + c_x \ b_y = sigma(t_y) + c_y \ b_w = p_we^{t_w} \ b_h = p_he^{t_h} \ Pr(object) * IOU(b, Object) = sigma(t_o) bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=phethPr(object)IOU(b,Object)=σ(to)
在这里插入图片描述
 结合上图,我解释一下公式的含义:首先 c x , c y c_x, c_y cx,cy是要预测box的grid的左上角坐标,在这里就是第(1 , 1)个格子(0-index)。前面两个公式是计算box的 x , y x, y x,y, 这里用了sigmoid函数是为了让整个range落在(0, 1)之内,即中心一定在这个格子里面。然后两个公式是计算box的 w , h w, h w,h,这里用了指数是为了不让w、h出现负数。最后一个公式就是每一个anchor box都有一个confidence, 这里和YOLO v1类似。

2.6 Fine-Grained Features

 作者通过整合更细粒度的特征来提升detection的精度。YOLO v2的backbone输出是一个 13 × 13 13 imes 13 13×13的feature map,为了添加更细粒度的特征,作者加入了一个passthrough layer,把前面 26 × 26 26 imes 26 26×26的特征通过channel这个维度concatenate起来。当然,为了能够concatenate就需要把前面 26 × 26 × 512 26 imes 26 imes 512 26×26×512的feature map变成 13 × 13 × 2048 13 imes 13 imes 2048 13×13×2048。这给模型带来了大概1个点的提升。

2.7 Multi-Scale Training

 原始的YOLO v2输入是 448 × 448 448 imes 448 448×448,加入了anchor boxes就是 416 × 416 416 imes 416 416×416。但是作者希望YOLO v2能够更加鲁棒,所以训练的时候每10个batches,网络都会从{320, 352, …, 608}(32倍数),中选择一个不同的size进行训练。

3. Faster

3.1 Darknet19

 作者将YOLO v2的backbone从vgg16升级到了Darknet19,参数减少了很多,因此变快了很多,精度也很不错,作者还用c语言写了一个darknet框架(nb!)。这个网络之所以叫Darknet19是因为它有19个卷积层和5个max pooling。网络的卷积层都采用了same padding,max pooling的kernel_size和stride都是2,所以提取特征时降采样32倍。网络结构如下图:
在这里插入图片描述

3.2 Training for classification

 作者在标准的ImageNet 1000类别分类数据集中使用SGD训练了160个epochs,具体参数请看原论文。

3.3 Training for detection

 对于VOC数据集来说,网络预测结果结构为5个box,每个box由前面提到的5个变量代表,并且每个box都有着20个类别的one-hot code,因此结果是 5 × ( 5 + 20 ) = 125 5 imes(5+20)=125 5×(5+20)=125维。

4. Stronger

 这个部分就主要说的是YOLO 9000是怎么训练出来的。前面已经提到了,由于detection的数据集物体种类很少,所以为了让网络能够识别更多的物体种类,就需要用classification的数据集去补充网络的vocabulary。当然,想法听起来挺简单的,但是做起来还是比较麻烦。首先需要解决的问题就是detection数据集和classification数据集的类别对应的关系,只有解决了这个类别对应关系才能把两个数据集的label合起来。因此,作者利用了WordNet寻找两类数据集标签的上位和下位关系,然后添加了一些中间节点,构建出了以下的WordTree,红色的是ImageNet(classification)中的词,蓝色的是COCO(detection)中的词:
在这里插入图片描述
 如下图所示,最后的预测方式就由上面flatten的one-hot编码变成了下面树状(下图虽然也是flatten了,但是树和线性表是可以对应起来的)的softmax预测,利用条件概率的乘法就可以得到最后类别的预测概率。
在这里插入图片描述

原文地址:https://www.cnblogs.com/lsl1229840757/p/14122570.html