YOLOV2详解

yolov2

YOLOv2论文中英文对照翻译_IT修炼家的博客-CSDN博客

YOLOv2 论文笔记Jesse_Mx的博客-CSDN博客yolov2论文

精读目标检测5——yolo2详解及其预测代码复现cv君的博客-CSDN博客yolo2

目标检测|YOLOv2原理与实现(附YOLOv3) - 知乎 (zhihu.com)

YOLO v2 - ZhicongHou - 博客园 (cnblogs.com)

YOLO v2算法详解AI之路的博客-CSDN博客yolov2算法

如何更好?(better)

    YOLO 作者对比了 Fast R-CNN 发现 YOLO 有一些短板,那就是比较低的召回率和比较高的定位误差。
    YOLO有两个缺点:一个缺点在于定位不准确,另一个缺点在于和基于region proposal的方法相比召回率较低。因此YOLOv2主要是要在这两方面做提升。另外YOLOv2并不是通过加深或加宽网络达到效果提升,反而是简化了网络。大概看一下YOLOv2的表现:YOLOv2算法在VOC 2007数据集上的表现为67 FPS时,MAP为76.8,在40FPS时,MAP为78.6.
    首先讲一下这篇文章一共介绍了YOLO v2和YOLO9000两个模型,二者略有不同。前者主要是YOLO的升级版(关于YOLO v1的介绍可以参考:YOLO v1算法详解),后者的主要检测网络也是YOLO v2,同时对数据集做了融合,使得模型可以检测9000多类物体。而提出YOLO9000的原因主要是目前检测的数据集数据量较小,因此利用数量较大的分类数据集来帮助训练检测模型。
​
所以,让 YOLO 变得更好指的是保持准确率的情况下:
    提升召回率
    降低定位误差

1. 引入 Batch Normalization

YOLOV2详解_第1张图片

    Batch Norm 是一种很有效的正则化手段,所有的卷积层后面引入正则化之后,YOLO 表现如何呢?
    mAP 提升了 2%,可以去掉了 Dropout 仍然不出现过拟合
    BN(Batch Normalization)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快点。原来的YOLO算法(采用的是GoogleNet网络提取特征)是没有BN层的,因此在YOLOv2中作者为每个卷积层都添加了BN层。另外由于BN可以规范模型,所以本文加入BN后就把dropout去掉了。实验证明添加了BN层可以提高2%的mAP。

2. 高分辨率图像分类器(High Resolution Classifier)

    所有比较先进的目标检测网络,它的图像分类器都是在 ImageNet 做预训练的,但从 AlexNet 开始,大多数分类器接受的图片尺寸都比较小,低于 256 * 256,YOLOv1 训练图像分类时,图片尺寸是 224224,之后训练检测时,图片尺寸是 448 × 448,这代表模型需要同时应对学习检测和分辨率的变化。
    YOLOv2 做了相应的改变。
    通过对 YOLOv1 的模型进行 finetune,用 448*448 的图片尺寸训练了 10 epoches,主要目的是想让卷积核适应高分辨率,这个步骤相当于做了减法,减轻了网络的学习任务,让它忽略图片尺寸的变化,专心应对目标检测任务,这种尝试,让 mAP 涨了近 4 个点。
    首先fine-tuning的作用不言而喻,现在基本跑个classification或detection的模型都不会从随机初始化所有参数开始,所以一般都是用预训练的网络来finetuning自己的网络,而且预训练的网络基本上都是在ImageNet数据集上跑的,一方面数据量大,另一方面训练时间久,而且这样的网络都可以在相应的github上找到。
    原来的YOLO网络在预训练的时候采用的是224*224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLOv2则将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的MAP。

3、 引入 Anchor Box(Convolutional With Anchor Boxes)

 

 

    YOLOv1 最终是通过全连接网络直接预测目标位置,另外一个优秀的目标检测模型 Fast R-CNN 是通过 Anchor Box 的形式,两种方法相比,Anchor Box 更容易学习,因为它是通过手选的,然后通过 RPN(Region Proposal Network) 全卷积层预测每一个位置相对于 Anchor Box 的偏移和置信度。
    所以,YOLO 作者把 YOLOv1 进行了改造:
        · 最后的全连接层去掉了
        · 用 Anchor Box 预测 b-box
        · 移除一个 pool 层,使得卷积层输出更高分辨率
        · 缩放网络使其能够接受 416x416 的分辨率,目的是最终生成的 featuremap 只有一个中心 cell,方便定位。
        · 将分类和空间检测解耦,跟随 YOLOv1 的思路,预测每一个 anchor box 的对象 objectness 分数,这个是 anchor box 和 groundtruth 的 IOU 分数,也是一个条件概率,针对的是某个 cell 中有无对象时的概率取值。
    在论文中,作者花了很长的篇幅讲解 anchor box 相关,引入 anchor box 后,YOLO 模型的 accuracy 发生了些许下降,未引入 anchor box 时,YOLO 预测 98 个 bbox,引入后,总共预测的 bbox 能多达 1000 多个,相比于精度的少许损失,召回率提升明显,文章开头说 YOLOv2 的改良有个目标就是提高召回率,而 Anchor BOX 的引入确实起了很明显的效果。
    
    原来的YOLO是利用全连接层直接预测bounding box的坐标,而YOLOv2借鉴了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,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为13*13为例,每个grid cell有9个anchor box的话,一共就是13*13*9=1521个,当然由后面第4点可知,最终每个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)

    在引入 Anchor BOX 到 YOLO 的过程,遇到了 2 个问题:第一个问题就是 Anchor BOX 的尺寸是手选的,虽然网络可以渐进学习,但是如果一开始的时候就分配好合理的先验尺寸,那么这无疑会加快学习的速度。相比于人为指定 anchor box 的尺寸比例,YOLO 作者想到了一个自动化的手段,那就是选择 k-means 聚类手段,在数据训练集中运行 k-means 算法,可以得到 k 个尺寸比例。
​
    我们知道在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。
    另外作者发现如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关:
d(box,centroid) = 1 - IOU(box,centroid)
    如下图Figure2,左边是聚类的簇个数核IOU的关系,两条曲线分别代表两个不同的数据集。在分析了聚类的结果并平衡了模型复杂度与recall值,作者选择了K=5,这也就是Figure2中右边的示意图是选出来的5个box的大小,这里紫色和黑色也是分别表示两个不同的数据集,可以看出其基本形状是类似的。而且发现聚类的结果和手动设置的anchor box大小差别显著。聚类的结果中多是高瘦的box,而矮胖的box数量较少。
    可以看到,k 从 1 到 15 都有做过测试,最终选择了 k=5,选择 5 的原因是在模型复杂度和召回率之间过一个平衡。经实验,效果很不错,聚类出来的 anchor box 尺寸如下图所示:

YOLOV2详解_第2张图片

YOLOV2详解_第3张图片 

YOLOV2详解_第4张图片

t = -1,x 相当于 anchor box a 左移动一个自身宽度
t = 1, x 相当于 anchor box a 右移动一个自身宽度
y 也是同样的逻辑,这里不再赘述。
    上面的坐标转换很容易懂,但不好训练。因为 x,y 并没有遵守什么约束,所以可能预测的 bbox 会遍布一张图片任何角落。

5、Direct Location prediction

    作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测box的(x,y)值。我们知道在基于region proposal的object detection算法中,是通过预测下图中的tx和ty来得到(x,y)值,也就是预测的是offset。另外关于文中的这个公式,个人认为应该把后面的减号改成加号,这样才能符合公式下面的example。这里xa和ya是anchor的坐标,wa和ha是anchor的size,x和y是坐标的预测值,tx和ty是偏移量。文中还特地举了一个例子:A prediction of tx = 1 would shift the box to the right by the width of the anchor box, a prediction of tx = -1 would shift it to the left by the same amount.

YOLOV2详解_第5张图片

 

这里贴一下Faster R-CNN里面的公式,和上面这个公式将减号变成加号是一致的。

 

	在这里作者并没有采用直接预测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得到的结果。

YOLOV2详解_第6张图片

 

	如果对上面的公式不理解,可以看Figure3,首先是cx和cy,表示grid cell与图像左上角的横纵坐标距离,黑色虚线框是bounding box,蓝色矩形框就是预测的结果。

YOLOV2详解_第7张图片

 

σ 是 logistic 函数,此函数限定了 tx 和 ty 的取值范围是 0 ~ 1.
然后,这里有个细节需要认真琢磨一下,那就是每个坐标变量的实际含义。
说实话,因为 YOLO 系列文章写得比较随性,很多细节作者没有题,所以需要自己去推断,我当时学习的时候坐标这个想了好久,好来阅读别人的笔记才意识到问题所在。1
YOLOv2 坐标预测每个 bbox 预测 5 个值:
	tx、ty、tw、th、to
	bx 和 by 是公式转换出来的,是预测的 bbox 相对于 featuremap 的中心位置偏移,YOLO 作者论文中忽略了它应当和 feature map 的 WH 相比
	bw 和 bh 也是公式转换出来的,是预测的 bbox 相对于 featuremap 的尺寸比值
	pw 和 ph 是 anchor box 先验尺寸,想对于 featuremap 的尺寸比例。

6、Fine-Grained Features

	这里主要是添加了一个层:passthrough layer。这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样做的原因在于虽然13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。也容易理解,越小的object,经过层层卷积和pooling,可能到最后都不见了,所以通过合并前一层的size大一点的feature map,可以有效检测小的object。

7、Multi-Scale Training

	为了让YOLOv2模型更加robust,作者引入了Muinti-Scale Training,简单讲就是在训练时输入图像的size是动态变化的,注意这一步是在检测数据集上fine tune时候采用的,不要跟前面在Imagenet数据集上的两步预训练分类模型混淆,本文细节确实很多。具体来讲,在训练网络时,每训练10个batch(文中是10个batch,个人认为会不会是笔误,不应该是10个epoch?),网络就会随机选择另一种size的输入。那么输入图像的size的变化范围要怎么定呢?前面我们知道本文网络本来的输入是416*416,最后会输出13*13的feature map,也就是说downsample的factor是32,因此作者采用32的倍数作为输入的size,具体来讲文中作者采用从{320,352,…,608}的输入尺寸。
	这种网络训练方式使得相同网络可以对不同分辨率的图像做detection。虽然在输入size较大时,训练速度较慢,但同时在输入size较小时,训练速度较快,而multi-scale training又可以提高准确率,因此算是准确率和速度都取得一个不错的平衡。
	Table3就是在检测时,不同输入size情况下的YOLOv2和其他object detection算法的对比。可以看出通过multi-scale training的检测模型,在测试的时候,输入图像在尺寸变化范围较大的情况下也能取得mAP和FPS的平衡。不过同时也可以看出SSD算法的表现也十分抢眼。

YOLOV2详解_第8张图片

 

总的看下这些技巧对mAP的贡献:

YOLOV2详解_第9张图片

	High Resolution Classifier的提升非常明显(近4%),另外通过结合dimension prior+localtion prediction这两种方式引入anchor也能带来近5%mAP的提升。

如何更快?(Faster)

新的模型 Darknet-19
快是 YOLO 系列模型最大的优势,YOLOv2 如何在这方面精进的呢?
    在 YOLOv2 的版本,作者换了一个新的分类器。
    大多数目标检测模型是基于 VGG-16 的,它很简单,准确率也很高,但 YOLO 作者认为它太慢了。处理一张 224x224 的图片,VGG-16 需要 30.69 BFLOPs,要想快,这个地方肯定可以动刀子,YOLO 作者带来了新的模型 Darknet-19,Darknet-19 是基于 GoogLeNet 的架构,它比 VGG-16 快,原因在于它的前向推断只要 8.52 BFLOPs。
    设计 Darknet-19 参考了很多同行经验。
        基于 GoogLeNet 架构
        借鉴 VGG 大量运用 3x3 filter,并且在每个 pool 层之后,将卷积核的个数翻倍
        借鉴 NIN 运用 global aveage pool,在 3x3 filter 之间插入 1x1 卷积层
        引入 Batch Normal 层

	在YOLO v1中,作者采用的训练网络是基于GooleNet,这里作者将GooleNet和VGG16做了简单的对比,GooleNet在计算复杂度上要优于VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5准确率要稍低于后者(88% VS 90%)。而在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。

1、Darknet-19

	Table6是最后的网络结构:Darknet-19只需要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%的准确率。

YOLOV2详解_第10张图片

19 个卷积层和 5 个 maxpool 层。

目标分类任务的训练技巧
	要做好目标检测,首先就要做好目标分类。
	目标分类是在 ImageNet 上做的,预测 1000 个分类。
        随机梯度下降法做训练
        224x224 尺寸的图片训练 160 epoches
        初始学习率是 0.1,多项式学习率衰减策略,power 为 4
        权重衰减系数为 0.0005,动量为 0.9
    常见的数据增强手段
    	224x224 训练完成后,在 448x448 尺寸数据集上再训练 10 epoches ,除了初始学习率为 0.003 外,其它参数保持不变。
    
在高分率的数据集上,Darknet-19 Top-1 ACC 为 76.5%,Top-5 ACC 为 93.3%.

目标检测任务的训练细节
	Darknet-19 是一个目标分类模型,最后一层输出了 1000 个分类的概率,需要做一些改造才能进行目标检测任务的训练。
    去掉最后 1 个卷积层,然后用 连续 3 个 3x3 的卷积层代替。
    每个 3x3 的卷积层卷积核数量是 1024 个。
    每一个 3x3 的卷积层后面都跟着 n 个 1x1 的卷积核,n 是要检测目标的类别数
    在 VOC 数据集中,类别数目是 20, 网络中每个 grid 预测 5 个 box,每一个 box 需要预测 5 个值(x,y,w,h,conf) 和 20 个类别的概率,所以需要 125 个 filter。
    添加 passthrough 层从最后一个 3x3x512 卷积层到最后一个卷积层,目的是为了获取更精细的 feature。

2、Training for Classification

	这里的2和3部分在前面有提到,就是训练处理的小trick。这里的training for classification都是在ImageNet上进行预训练,主要分两步:
	1、从头开始训练Darknet-19,数据集是ImageNet,训练160个epoch,输入图像的大小是224*224,初始学习率为0.1。另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等。
	2、再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(与YOLOv1不同,在YOLOv1中每个grid cell有30个filter,还记得那个7*7*30的矩阵吗,而且在YOLOv1中,类别概率是由grid cell来预测的,也就是说一个grid cell对应的两个box的类别概率是一样的,但是在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由grid cell决定,因此这边每个box对应25个预测值(5个坐标加20个类别值),而在YOLOv1中一个grid cell的两个box的20个类别值是一样的)。
	另外作者还提到将最后一个3*3*512的卷积层和倒数第二个卷积层相连。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。

如何更强?(stronger)

YOLOv2 的更强指的是作者提出了一种目标检测和目标分类联合训练的方法。
	当遇到目标检测数据集中的图片时,模型反向传播更新整个 YOLOv2 的 loss 函数。
	当遇到目标分类数据集中的图片时,反向传播只更新 YOLO 分类的那一部分结构。
	另外,将分类进行层次化处理,使得 YOLO 能够识别超过 9000 种类别,这就是 YOLO9000。

	这部分看得不是很懂,简单介绍,欢迎指正。带标注的检测数据集量比较少,而带标注的分类数据集量比较大,因此YOLO9000主要通过结合分类和检测数据集使得训练得到的检测模型可以检测约9000类物体,那么这是怎么做到的呢?一方面要构造数据集,另一方面要解决模型训练问题,前者采用WordTree解决,后者采用Joint classification and detection。

	先来介绍下怎么做据集的融合,我们知道分类和检测数据集存在较大差别:Detection datasets have only common objects and general labels, like “dog” or “boat”. Classification datasets have a much wider and deeper range of labels. ImageNet has more than a hundred breeds of dog, including “Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”.

	ImageNet的标签来自WordNet,这种结构不是tree,举个例子,狗这个label即属于犬科也属于家畜,这就很复杂了,完全是个图结构,因此作者采用WordTree来解决分类和检测数据集的标签问题,也就是说在这个树里面任意一个节点只能属于唯一一个节点(跟WordNet是有区别的)。
	这样的话,在WordTree的某个节点上就可以计算该节点的一些条件概率值,比如在terrier这个节点,可以得到如下条件概率值:

 

	如果要预测一个节点的概率,可以根据WordTree将该节点到根节点的条件概率依次相乘得到,如下式:如前图;
另外:如后图;

YOLOV2详解_第11张图片

 

 

	按照这种方式,就可以得到Figure5,也就是在Imagenet1k数据集上采用WordTree方式得到的类别(主要是增加了369个中间节点,比如dog等)。然后作者分别在Figure5的两个数据集上用相同训练方法训练Darknet-19模型,最后在Imagenet1k数据集上的top-1 accuracy为72.9%,top-5 accuracy为91.2%;在WordTree1k数据集上的top-1 accuracy为71.9%,top-5 accuracy为90.4%。在WordTree1k数据集上的准确率要稍低一点,主要是因为那些新的类别的影响。

YOLOV2详解_第12张图片

 

	介绍完了WordTree的原理,就可以用WordTree来融合分类和检测的数据集了。Figure6是COCO和ImageNet数据集以及WordTree的示意图。在WordTree中用颜色区分了COCO数据集和ImageNet数据集的label节点。

YOLOV2详解_第13张图片

 

===================


YoloV2

深度学习算法之YOLOv2_linolzhang的博客-CSDN博客

YOLOV2详解_第14张图片

一、改进地方(相较于yolov1)

YOLOV2详解_第15张图片 

 

A) Batch Normalization(批量规范化)

YOLOV2详解_第16张图片

 

	先建立这样一个观点: 对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。
    批量规范化  正是基于这个假设的实践,对每一层输入的数据进行加工。示意图:

YOLOV2详解_第17张图片

 

	Batch Normalization,简称 BN,由Google提出,是指对数据的 归一化、规范化、正态化。BN 作为近几年最火爆的Trick之一,主流的CNN都已集成。
	
该方法的提出基于以下背景:
	1)神经网络每层输入的分布总是发生变化,通过标准化上层输出,均衡输入数据分布,加快训练速度;可以设置较大的学习率和衰减,而不用去care初始参数,BN总能快速收敛,调参狗的福音。
	2)通过规范化输入,降低激活函数在特定输入区间达到饱和状态的概率,避免 gradient vanishing 问题;举个例子:0.95^64 ≈ 0.0375    计算累积会产生数据偏离中心,导致误差的放大或缩小。
	3)输入规范化对应样本正则化,在一定程度上可以替代 Drop Out;Drop Out的比例也可以被无视了,全自动的节奏。BN 的做法是 在卷积池化之后,激活函数之前,对每个数据输出进行规范化(均值为 0,方差为 1)。

YOLOV2详解_第18张图片

 

	公式很简单,第一部分是 Batch内数据归一化(其中 E为Batch均值,Var为方差),Batch数据近似代表了整体训练数据。
     第二部分是亮点,即引入 附加参数 γ 和 β(Scale & Shift),Why? 因为简单的归一化 相当于只使用了激活函数中近似线性的部分(如下图红色虚线),破坏了原始数据的特征分布,这会降低模型表达能力。

YOLOV2详解_第19张图片

 

这两个参数需要通过训练得到:
关于这一层的函数定义、反向求导 等具体推理本章不再做进一步介绍

YOLOV2详解_第20张图片

 

B)High Resolution Classifier

	YOLO 对应训练过程分为两步,第一步是通过 ImageNet 训练集 进行高分辨率的预训练,这一步训练的是分类网络;第二步是训练检测网络,是在分类网络的基础上进行 fine tune。
    之前的 YOLO v1以分辨率224*224训练分类网络,YOLO v2 将分类网络的分辨率提高到 448*448,高分辨率样本对于效果有一定的提升(文中mAp提高了约4%)。

    高分辨率对于精度的提高是显而易见的,这点我们不去论证。

C)New Network(新网络)

YOLOV2详解_第21张图片

YOLOV2详解_第22张图片 

 

为保证后续 Anchor Boxes 讲解的连续性,这里将New Network提前。
作者对网络进行了改进:
	1)不同于SSD的VGG-16网络,作者采用的基础网络是Googlenet,并且加入了自己的订制,来看数据对比:
GoogLeNet VGG-16
前向传播运算量(一次) 85.2亿次 306.9亿次
精度(224 * 224) 88% 90% single-crop,top-5 accuracy
整体来看,VGG-16整体精确度较高,但计算量过于复杂,性价比不高。

	2)YOLO v2采用了常用的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling)做预测,把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。
	YOLO v2包含19个卷积层、5个最大值池化层(max pooling layers )。

D)Convolutional With Anchor Boxe

	Faster的 Anchor 机制又一次得到印证,与SSD一样,Anchor建立了和原始坐标的对应关系:
定义了不同的Scale和宽高比,一个中心对应K个不同尺度和宽高比的Boxes。

YOLOV2详解_第23张图片 

YOLOV2详解_第24张图片 

 

 YOLO v1:    S*S* (B*5 + C)   =>  7*7(2*5+20)
 	其中B对应Box数量,5对应 Rect 定位+置信度。
    每个Grid只能预测对应两个Box,这两个Box共用一个分类结果(20 classes),
    这是很不合理的临时方案,看来作者为第二篇论文预留了改进,没想被 SSD 抢了风头。

YOLO v2:    S*S*K* (5 + C)   =>  13*13*9(5+20)
	一个grid cell里面含有(4+1+20)*5 = 125
    分辨率改成了13*13,更细的格子划分对小目标适应更好,再加上与Faster一样的K=9,计算量增加了不少。
    通过Anchor Box改进,mAP由69.5下降到69.2,Recall由81%提升到了88%。
     
SSD(-):    S*S*K*(4 + C)  => 7*7*6*( 4+21 )
    对应C=21,代表20种分类类别和一种 背景类。

E)Dimension Clusters(维度聚类)

	还是针对Anchors,Faster的Anchor对应 K=9,那么为什么等于9呢?宽高比为什么定位成这样(1:1,1:2,2:1)?
    对于SSD选择了K=6,那么K到底等于几合适?宽高比又该怎么设计? 作者给出了解决方案,这个解决方案就是聚类。
    作者在 VOC和COCO上通过Ground Truth进行聚类统计(采用K-means算法),得到如下两个有用信息:
       1)从K=1到K=5,IOU曲线上升较快(对应匹配度高),因此从效果和复杂度进行Trade Off, 选定了 Anchor Box个数为5;对应左图
       2)统计发现,瘦高的框比扁平的框要多一些(人比车多?),选定了5种不同 宽高比+Scale 的 Anchor Box;对应右图

YOLOV2详解_第25张图片

 

注:k-mans 采用的距离函数(度量标准) 描述为:
    d(box,centroid) = 1 - IOU(box,centroid)
    作者实验发现,5种boxes的Avg IOU(61.0)就和Faster R-CNN的9种Avg IOU(60.9)相当。 说明K-means方法的生成的boxes更具有代表性。

F)Direct location prediction(直接位置预测)

YOLOV2详解_第26张图片

 

	直接Anchor Box回归导致模型不稳定,对应公式也可以参考 Faster-RCNN论文,该公式没有任何约束,中心点可能会出现在图像任何位置,这就有可能导致回归过程震荡,甚至无法收敛:

 

针对这个问题,作者在预测位置参数时采用了强约束方法:
    1)对应 Cell 距离左上角的边距为(Cx,Cy),σ定义为sigmoid激活函数,将函数值约束到[0,1],用来预测相对于该Cell 中心的偏移(不会偏离cell);
    2)预定Anchor(文中描述为bounding box prior)对应的宽高为(Pw,Ph),预测 Location 是相对于Anchor的宽高 乘以系数得到;
    如下图所示:

YOLOV2详解_第27张图片YOLOV2详解_第28张图片

 

 作者通过使用 维度聚类 和 直接位置预测 这两项Anchor Boxes改进方法,将 mAP 提高了5%。

G)Fine-Grained Features(细粒度特征)

 YOLOV2详解_第29张图片

YOLOV2详解_第30张图片

 

YOLOV2详解_第31张图片

YOLOV2详解_第32张图片 

 

	SSD通过不同Scale的Feature Map来预测Box来实现多尺度,而YOLO v2则采用了另一种思路:添加一个passthrough layer,来获取上一层26x26的特征,并将该特征同最后输出特征(13*13)相结合,以此来提高对小目标的检测能力。
    通过Passthrough 把26 * 26 * 512的特征图叠加成13 * 13 * 2048的特征图,与原生的深层特征图相连接。
    YOLO v2 使用扩展后的的特征图(add passthrough),将mAP提高了了1%。
    PS:这里实际上是有个Trick,网络最后一层是13*13,相对原来7*7的网络来讲,细粒度的处理目标已经double了,再加上上一层26*26的Feature共同决策,这两层的贡献等价于SSD的4层以上,但计算量其实并没有增加多少。

H)Multi-Scale Training(多尺度训练)

YOLOV2详解_第33张图片YOLOV2详解_第34张图片

 

 

	为了让 YOLOv2 适应不同Scale下的检测任务,作者尝试 通过不同分辨率图片的训练来提高网络的适应性。
    PS:网络只用到了卷积层和池化层,可以进行动态调整(检测任意大小图片)
具体做法是:
   	每经过10批训练(10 batches)就会随机选择新的图片尺寸,尺度定义为32的倍数,( 320,352,…,608 ),
    为了最后一层得到特征图尺度为13*13(416=13*32),YOLO v2 输入图片尺寸为416 * 416,降采样参数为32。

二、损失函数

YOLOV2详解_第35张图片

 

三、训练过程

作者采用的深度学习框架是Darknet,该框架作者使用很少,具体不作描述。
a)预训练 - 训练分类网络(Training for classification)
     采用随机梯度下降法SGD,在 ImageNet-1000分类数据集 上训练了160个epochs,参数设定:
     初始学习率 - starting learning rate:0.1
     多项式速率衰减 - polynomial rate decay:4的幂次
     权值衰减 - weight decay:0.0005
     动量 - momentum:0.9
     
b)数据增广方法(Data augmentation)
      采用了常见的data augmentation,包括:
      随机裁剪、旋转 - random crops、rotations
      色调、饱和度、曝光偏移 - hue、saturation、exposure shifts

c)多分辨率训练
      通过初始的224 * 224训练后,把分辨率上调到了448 * 448,同样的参数又训练了10个epochs,然后将学习率调整到了10^{-3}。

d)训练检测网络 - Training for detection
      把分类网络改成检测网络,去掉原网络最后一个卷积层,增加了三个 3 * 3 (1024 filters)的卷积层,并且在每一个卷积层后面跟一个1 * 1的卷积层,输出个数是检测所需要的数量。
      初始学习率为10^{-3},训练了160个epochs(划分为60 | 10 | 90),权值衰减 与 momentum参数与前面一样。

四、 交叉数据集训练

大家都知道,不同的数据集有不同的作用,通常我们采用一个数据集进行训练,而作者提出了新的思路:
    通过ImageNet训练分类,COCO和VOC数据集来训练检测,这是一个很有价值的思路,可以让我们在公网上达到比较优的效果。 通过将两个数据集混合训练,如果遇到来自分类集的图片则只计算分类的Loss,遇到来自检测集的图片则计算完整的Loss。
    这里面是有问题的,ImageNet对应分类有9000种,而COCO则只提供80种目标检测,这中间如何Match?答案就是multi-label模型,即假定一张图片可以有多个label,并且不要求label间独立。
    
    还是通过作者Paper里的图来说明,由于ImageNet的类别是从WordNet选取的,作者采用以下策略重建了一个树形结构(称为分层树):
        1)遍历Imagenet的label,然后在WordNet中寻找该label到根节点(指向一个物理对象)的路径;
        2)如果路径直有一条,那么就将该路径直接加入到分层树结构中;
        3)否则,从剩余的路径中选择一条最短路径,加入到分层树。
    这个分层树我们称之为 Word Tree,作用就在于将两种数据集按照层级进行结合。

YOLOV2详解_第36张图片

 

	分类时的概率计算借用了决策树思想,某个节点的概率值等于 该节点到根节点的所有条件概率之积。
     另外,softmax操作也同时应该采用分组操作,下图上半部分为ImageNet对应的原生Softmax,下半部分对应基于Word Tree的Softmax:

YOLOV2详解_第37张图片

 

	通过上述方案构造WordTree,得到对应9418个分类,通过重采样保证Imagenet和COCO的样本数据比例为4:1(这个没有太明显的意义,你也可以改成6:1试试效果)。

五、 效果如何?

	YOLO v2 在大尺寸图片上能够实现高精度,在小尺寸图片上运行更快,可以说在速度和精度上达到了平衡。
     总结下不同分辨率下的震撼的效果:
        1)低分辨率 - 228 * 228,帧率达到90FPS,mAP几乎与Faster媲美;
        2)高分辨率,在VOC2007 上mAP达到78.6%,同时FPS=40;
看图说话:

YOLOV2详解_第38张图片

 

YOLOV2详解_第39张图片

 

	相比SSD,YOLOv2添加了诸多工程Trick,虽然在算法理论上并没有明确的突破,但效果着实提升不少,相信实用性仍是我们的第一出发点,为作者点赞!

===================


YOLOV2详解_第40张图片

 

YOLOV2详解_第41张图片

 

你可能感兴趣的:(计算机视觉,目标检测,深度学习,目标检测,计算机视觉)