YOLOv2解读

YOLOV2解读

建议看代码理解细节!
YOLOv2代码pytorch实现链接

简介

YOLOv2是在YOLOv1基础上改进而来的,它使用了一种新颖的多尺度的训练方法,与YOLOv1相比,相同的YOLOv2模型可以运行在不同大小的图片上,提供精度与速度之间的轻松权衡。最后提出了一种联合训练目标检测和分类的方法,使用这种方法可以同时在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000,并且此联合训练方法允许YOLO9000预测没有标记检测数据的目标类。这个YOLO9000训练此处不讲。

Better

这部分是作者针对YOLO的缺陷而进行的一些改进,那么YOLO有哪些缺陷呢?YOLO存在两个缺点,与faster-rcnn相比,第一:定位不明确,产生了大量定位错误;第二:与基于region proposal的方法相比,YOLO的召回率相对较低。 因此,YOLO主要朝着这两方面去提升。而在现在的计算机视觉领域,通常朝着更大更深的网络去提升性能,更好的性能通常取决于训练更大的网络或者将多个模型整合在一起。然而对于YOLOv2,反而是简化网络,大概看一下YOLOv2的表现:YOLOv2算法在VOC 2007数据集上的表现为67 FPS时,MAP为76.8,在40FPS时,MAP为78.6.

1、Batch Normalization

现在神经网络对图片训练前,都要对图片进行预处理,将图片数据分布归一化0和1之间,这样做的目的是可以加快训练收敛速度,防止梯度消失。问题在于对图像数据进行归一化只在神经网络第一层进行,那么随着网络深度加深或者在训练过程中,其数据分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

在这里插入图片描述
而在论文中,BN(Batch Normalization)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快点。原来的YOLO算法(采用的是GoogleNet网络提取特征)是没有BN层的,因此在YOLOv2中作者为每个卷积层都添加了BN层。另外由于BN可以规范模型,所以本文加入BN后就把dropout去掉了。实验证明添加了BN层可以提高2%的mAP。

在上图的代码中可以看到,在每层的卷积层后都加上了一个BN层!

2、High Resolution Classifier

在原始YOLO中,用224×224分辨率的图片尺寸训练分类网络,接着又用448×448分辨率的图片尺寸训练检测网络。这种训练方法意味着从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变 。而YOLOv2将训练分成两步,首先先以224×224分辨率输入从头开始训练网络,训练160个epochs,然后再将输入调整到448×448分辨率,再训练10个epochs。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。 作者的实验表明这样可以提高几乎4%的MAP。此处pytorch代码未实现对分类网络的训练,而是直接导入已经训练完的分类网络的权重进行检测网络的训练。

3、Convolutional With Anchor Boxes

在原始的YOLO中,在卷积特征提取后,直接用全连接层预测bounding boxes的坐标。 作者借鉴在faster-rcnn中的思想,在YOLOv2也引入了anchor,并将原网络(指的的分类网络)的全连接层和最后一个pooling层去除,使得最后的一个卷积层有更高的分辨率的特征,并使得可以用卷积层预测bounding boxes的坐标。

然后缩减网络,用416×416的输入代替原来的448,这么做的原因是因为想让特征图的位置数量为奇数个,以便以产生一个center cell(比如7×7和13×13就是只有一个center cell,而8×8就有四个center cell)。那么为什么要只有一个center cell呢?因为大的物体往往都占据图像中心,因此最好在中心位置使用一个单元来预测这些物体,而不要使用附近的四个位置。 网络最终将416×416的输入变成13×13大小的feature map输出,也就是缩小比例为32。

在原来的YOLO中,每张图像一共预测98个boxes,但是在YOIOv2中改变了策略,在13×13的特征图中,每个网格(也就是特征图的每个像素点)都有9个anchor,那么一共有13×13×9 超过1000的anchor boxes,当然由后面的第四点表明,每个cell选择的anchors数为5最为合适。作者实验表明,使用更多的anchor boxes虽然在准确度上有所下降(MAP由69.5降到69.2),但在recall上有极大提升(81%提高到88%)。

4、Dimension Clusters

在原来的YOLO中,使用anchor boxes存在两个问题,第一个就是anchors的选取是手选的(比如faster-rcnn中的三个尺寸,三种比例的设定),虽然可以经过网络训练使得anchors调整到正确的位置上,但是如果一开始就能选取相对于gt_boxes更好的anchors,这将使网络更容易学习,以此得到更好的检测结果。

因此在YOLOv2中,抛弃了过往的手选anchors的方法,提出了 k-means聚类算法,对训练集的所有gt_boxes的宽和高当作数据集,再利用给定的k个聚类中心点,然后利用 k-means聚类算法,最后得出K个聚类中心点(也就是由聚类算法得出的anchors,坐标是宽和高),而这由聚类算法得出K个anchors是和所有gt_boxes最为匹配的anchors,K的值作者认为取5最为合适,因为K为5时可以在recall和模型复杂度之间有一个很好的权衡,如下图所示。
在这里插入图片描述
另外有一个比较注意的点就是,在聚类算法迭代计算中,如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关:
在这里插入图片描述
Table1中作者采用的5种anchor(Cluster IOU)的Avg IOU是61,而采用9种Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是说本文仅选取5种box就能达到Faster RCNN的9中box的效果。
在这里插入图片描述

5、Direct Location prediction

作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在早期迭代的时候。作者认为这种不稳定主要来自预测box的(x,y)值。在区域建议网络中,预测 (x,y)以及 tx,ty 使用的是如下公式:
在这里插入图片描述
这个公式是由faster_rcnn中变形而来,我们来看看原公式是怎样的:
在这里插入图片描述
公式中,符号的含义解释一下:x是坐标预测值,xa 是anchor坐标(预设固定值),x∗ 是坐标真实值(标注信息,其他变量 y,w,h 以此类推,t变量是偏移量。

看过faster_rcnn代码你会发现,真实偏移量t*是anchor boxes与gt_boxes之间的偏移量,而预测偏移量t是anchor boxes与预测boxes之间的偏移量,因此在训练过程中,预测偏移量t的值要不断向真实偏移量不断逼近,才能在测试时达到一个比较好的效果。

所以这个公式的缺点就在于: tx=1,就会把box向右边移动一定距离(具体为anchor box的宽度),预测 tx=−1,就会把box向左边移动相同的距离。这个公式没有任何限制,我的理解是,tx没有数值限定,可能会出现在训练一开始预测框检测很远的目标box的情况(因为训练一开始,预测偏移量t的值和真实偏移量t*可能还存在着很大差距),效率比较低,从而造成早期迭代训练过程中模型不稳定的问题。 正确做法应该是每一个预测框只负责检测周围正负一个单位以内的目标box)。模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。

所以在这里作者并没有采用直接预测offset的方法,还是沿用了YOLO算法中直接预测相对于grid cell的坐标位置的方式。

前面提到网络在最后一个卷积层输出13*13大小的feature map,然后每个cell→5个anchor boxes进行检测,然后每个anchor box预测5个值:tx,ty,tw,th和to(这里的to类似YOLOv1中的confidence)。看下图,tx和ty经过sigmoid函数处理后范围在0到1之间,这样的归一化处理也使得模型训练更加稳定;cx和cy表示一个cell和图像左上角的横纵距离;pw和ph表示anchor boxes的宽高,这样bx和by就是cx和cy这个cell附近的anchor来预测tx和ty得到的结果。
在这里插入图片描述
如果对上面的公式不理解,可以看Figure3,首先是cx和cy,表示grid cell与图像左上角的横纵坐标距离,黑色虚线框是anchor boxes,蓝色矩形框就是预测的结果。
在这里插入图片描述

6、Fine-Grained Features

这里添加了一个层:passthrough layer ,这个层的作用就是将在经过conv1s层的26×26×512的特征图转化为13×13×2048的特征图,然后在passthrough layer将conv3层的特征图(conv3的特征图维度是13×13×2048)与转化为13×13×2048的特征图进行连接,因此passthrough layer生成的特征图为维度为13×13×4096。这样做的原因在于虽然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数据集上的两步预训练分类模型混淆。(YOLOv2模型首先是在Imagenet数据集对网络进行分类训练,然后得到模型参数,再利用得到的模型参数对网络进行检测训练,得到最终的权重参数,将最终的权重参数更新到网络中,最后将测试数据集输入网络,得出测试结果)

作者规定,在训练检测网络时,每10个batch(假设训练集一共1000张图像,每一个step训练16张图片,那么一个batch就等于16,而一个epoch就等于1000/16),网络就会随机选择另一种size的输入,
那么输入图像的size的变化范围要怎么定呢?前面我们知道本文网络本来的输入是416416,最后会输出1313的feature map,也就是说downsample的factor是32,因此作者采用32的倍数作为输入的size,具体来讲文中作者采用从{320,352,…,608}的输入尺寸。

这种网络训练方式使得相同网络可以对不同分辨率的图像做detection。 虽然在输入size较大时,运行速度较慢,但准确率较高,同时在输入size较小时,运行速度较快,准确率稍有下降,因此算是准确率和速度都取得一个不错的平衡。
Table3就是在检测时,不同输入size情况下的YOLOv2和其他object detection算法的对比。可以看出通过multi-scale training的检测模型,在测试的时候,输入图像在尺寸变化范围较大的情况下也能取得mAP和FPS的平衡。
在这里插入图片描述
总结看下这些技巧对mAP的贡献:
在这里插入图片描述

Faster

大量的检测框架都是依赖于VGG-16作为特征提取器,VGG-16确实是一个强大的准确的分类网络,但它的卷积层需要以224×224的分辨率对单幅图像进行306.9亿个浮点运算。而原始的YOLO框架,作者采用的训练网络是基于GooleNet,这个网络架构是比VGG-16更快,因为它只需要8.52亿个浮点运算。

1、Darknet-19

所以为了让检测结果不只是准确,还要让它检测变得更快,作者基于原始的YOLO模型提出了新的模型–Darknet-19,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%的准确率。Table6是最后的网络结构:在这里插入图片描述

2、Training for Classification

这里的training for classification都是在标准ImageNet上1000类分类数据集上进行预训练,主要分两步:1、从头开始训练Darknet-19,数据集是ImageNet,训练160个epoch,输入图像的大小是224×224,初始学习率为0.1,多项式率衰减为4的幂,权重衰减为0.0005,动量为0.9。另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等。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,还记得那个7730的矩阵吗,而且在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。

参考文章:

https://blog.csdn.net/u014380165/article/details/77961414
https://blog.csdn.net/shiheyingzhe/article/details/83995213
https://www.cnblogs.com/guoyaohua/p/8724433.html

发布了3 篇原创文章 · 获赞 0 · 访问量 411

猜你喜欢

转载自blog.csdn.net/qq_36506038/article/details/105019479