YOLO v2 论文笔记

Better

首先说一下YOLO的缺点一是与Fast R-CNN相比有更多的定位误差;二是与基于region proposal的检测方法相比,YOLO的召回率较低。因此YOLOv2相较于YOLO,是在保持分类精度的情况下提升召回率和定位的准确度。一般来说,使用更大更深的网络或者将多个模型结合起来,能得到更好的性能。但是YOLOv2反其道而行之,它不仅没有扩大网络规模,反而对网络进行了简化,这样可以使检测速度依然很快。接下介绍一下使用的一些方法。

1.batch normalization

在YOLOv2的每个卷积层中都添加了batch normalization,也就是对每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,提升了模型的收敛速度。同时batch normalization对模型也有一定的正则化效果,而不需要其他形式的正则化。在添加batch normalization后,可以去掉dropout层,并且也不会出现过拟合。实验证明添加batch normalization后mAP提升了2%。

2.high resolution classifier

目前的目标检测方法中,都会在ImageNet上预训练一个模型(classifier)来提取图像特征,然后用预训练的网络来fine-tuning自己的网络。YOLO在预训练时采用的是224 × 224的输入图像,然后在检测时增大为448 × 448。这样做有一个坏处是:网络在从分类模型转换到检测模型的时候,需要适应新的输入图像的分辨率。在YOLOv2中,预训练分为两步:先用224 × 224的输入图像训练网络,大概经过160个epoch,然后对网络进行fine-tuning,用448 × 448的输入图像训练网络,大概经过10个epoch。注意这两步都是在ImageNet上进行的。经过这样的预训练,网络可以更好的适应高分辨率图像的输入。最后在检测网络上进行fine tune,实验表明,通过输入高分辨率的图像进行预训练,mAP提升了4%。

3.convolutional with anchor boxes

在YOLO中,直接用全连接层预测边界框(bounding box)的坐标,而在YOLOv2中,借鉴了Faster R-CNN中RPN网络的anchor boxes策略(先验框,prior boxes,在SSD中也采用了先验框),RPN为每个anchor boxes预测offset和置信度,其中offset是边界框相对于anchor boxes的转换得到的。
在YOLOv2中,移除了YOLO中的全连接层,采用卷积层和anchor boxes来预测边界框。首先,去掉了一个池化层,以使卷积层输出的特征图的分辨率更高。然后缩减网络,用416 × 416的输入代替原来448 × 448的输入。之所以这么做是因为希望得到的特征图都有奇数大小的宽和高。当特征图的长和宽都为奇数时,在后来划分cell时,恰好只有一个中心cell。作者发现,一些目标,尤其是比较大的目标,常常会占据图像的中心位置,当特征图的长和宽为奇数时,恰好可以用中心的cell来预测这种目标,否则就要用四个相邻的cell来预测。YOLOv2的卷积层对输入图像下采样(factor为32),最终得到的特征图为13 × 13。
在YOLO中,每个cell预测一套类别概率(cell中的目标属于每个类的概率),由cell中的两个边界框共享。而在YOLOv2中,每个cell中的每个anchor box都要预测一套类别概率。
YOLO中将每个图像划分为7 × 7的网格,每个cell仅预测两个边界框,因此每个图象仅预测98个边界框。但在YOLOv2中,通过引入anchor box,可以预测超过一千个边界框。实验表明,加入anchor box后mAP略有下降(69.5到69.2),但召回率明显提高(81%到88%)。

4.dimension clusters

引入anchor box后遇到了两个问题,第一个问题就是,在Faster R-CNN中anchor box的尺度和比例是预先设定好的,网络在训练时会调整anchor box的大小。但如果一开始就能找到合适尺寸的anchor box,那么网络可以更好地做出预测。
本文中作者用k-means算法对训练集中的边界框做聚类分析,以自动地找到合适的anchor box。但是如果用标准的欧几里得距离的k-means算法,大的边界框会比小的边界框产生更多的误差。而设置anchor box的真正目的是让边界框与真实框(ground truth box)的IoU值最大,这与边界框的大小是没有关系的。因此聚类分析时选用边界框与聚类中心边界框之间的IOU值作为距离指标:
在这里插入图片描述
在这里插入图片描述
上图左边表示聚类的簇个数(k)与IoU之间的关系,两条曲线分别代表两个不同的数据集。作者发现,当k=5时,模型复杂度与召回率之间达到了很好的平衡。上图右边是通过聚类选出的5个anchor box,它们与手动设置的anchor box差别很大,大多是高瘦的,很少有矮宽的。
在这里插入图片描述
从上表可以看出,仅使用5中anchor box的IoU(61.0)就和Faster R-CNN中使用9种anchor box的IoU相当(60.9)。如果使用更多的anchor box,会达到更高的IoU(67.2)。

5.direct location prediction

引入anchor box后遇到的第二个问题是模型的不稳定性,尤其是在早期迭代的时候。大多数的不稳定来自于对边界框中心位置(x,y)的预测。在Faster R-CNN中,是用下面的式子计算边界框相对于anchor box的offset的,其中 t i t_{i} 表示边界框的4个坐标经过转换后的预测值,也就是offset, ( x , y , w , h ) (x,y,w,h) 表示边界框, ( x a , y a , w a , h a ) (x_{a},y_{a},w_{a},h_{a}) 表示anchor box:
在这里插入图片描述
经过转换可以得到边界框中心 ( x , y ) (x,y) 的值为:
在这里插入图片描述
这个等式是无约束的:当 t x = 1 t_{x}=1 时,边界框将向右偏移一个anchor box的宽度;当 t x = 1 t_{x}=-1 时,边界框将向左偏移一个anchor box的宽度。因此,每个位置预测的边界框可以落在图片任何位置,导致模型的不稳定,在训练时需要很长时间才能预测出正确的offset。
在YOLOv2中使用的是YOLO中的方法,即预测的是边界框的中心点相对于对应cell左上角的偏移值。为了将边界框中心点约束在cell中,使用sigmoid函数处理偏移值,让偏移值的范围在[0,1]内。在输出的13 × 13特征图中,每个cell预测5个边界框,每个边界框有5个值, t x , t y , t w , t h t_{x},t_{y},t_{w},t_{h} t o t_{o} ,前四个是坐标,最后一个是置信度。可以按如下式子计算边界框实际位置:
在这里插入图片描述
下面根据下图说一下每个参数的含义:
在这里插入图片描述
图中蓝色的矩形框是边界框,黑色虚线框是anchor box。从图上可以看出, t x t_{x} t y t_{y} 是边界框中心相对于对应cell左上角的偏移值, b h b_{h} b w b_{w} 是边界框的高和宽, p h p_{h} p w p_{w} 是anchor box的高和宽(是相对于特征图来说的), c x c_{x} c y c_{y} 是对应的cell相对于特征图左上角的偏移值。
约束边界框的位置预测值使模型更稳定,通过与上一步经过聚类分析得到anchor box相结合,YOLOv2的mAP提升了5%。

5.fine-grained features

YOLOV2输入图像大小为416 × 416,经过5次最大池化后得到13 × 13的特征图,在此特征图上采用卷积做预测。13 × 13的特征图对于预测比较大的目标来说是足够的,但是对于较小的目标来说,需要更精细的特征图(fine-grained feature)。在SSD中是使用多尺度特征图来检测不同大小的目标,在YOLOv2中,加入了一个passthrough层,将26 × 26的特征图(最后一个最大池化层的输入,对于Darknet-19模型来说就是大小为2626512的特征图)与13 × 13的特征图进行连接。
passthrough层叠加相邻的特征到不同的通道中,而不是空间位置。也就是抽取前面层的每个2 × 2的局部区域,然后将其转换为通道的维度,对于26 × 26 × 512的特征图,经过passthrough层处理后就变为13 × 13 × 2048的新特征图,这样就可以和最后的13 ×13 × 1024的特征图连接在一起形成13 ×13 × 3072的特征图,并在此特征图上做检测,这让模型的性能提升了1%。

6.multi-scale trainging

YOLO中输入图像的分辨率为448 × 448,YOLOv2引入了anchor box,因此将输入图像的分辨率调整为416×416。为了让YOLOv2对不同大小的图像做检测时的鲁棒性更强,作者引入了multi-scale trainging。注意这一步是在检测数据集上训练时采用的,并不是在之前的预训练中。具体来说,就是在训练网络时,每隔几个iteration,就随机选择新的输入图像的大小。因为模型本来输入的是416×416的图像,经过factor为32的下采样后,最终生成的特征图大小为13×13,因此输入图像的大小从一系列32倍数的值中随机选择{320,352,……608}。输入图像最小为320×320,最大为608×608。
这种训练方式使一个网络可以对不同分辨率的输入图像做检测。当输入图像的分辨率较小时,检测速度较快;当输入图像的分辨率较大时,检测速度较慢,但multi-scale training可以提高检测精度,因此这也是达到了速度和精度之间的平衡。


Faster

大多数的检测网络依赖VGG-16做特征提取部分,VGG-16是一个很强大、精度很高的网络,但它太复杂了。当输入单个大小为224×224的图像时,VGG-16中的卷积层需要做30.69billion次浮点运算。
YOLO的结构是基于Googlenet网络,这个网络比VGG-16要快(8.52billion次计算),但它的精度远远比不上VGG-16。YOLOv2使用Darknet-19作为基础模型(classifier)。

1.Darknet-19

YOLOv2使用Darknet-19作为基础模型(classifier),它包括19个卷积层和5个最大池化层,模型结构如下图所示。与VGG类似,主要采用3 × 3的卷积,采用2 × 2的最大池化层之后,使特征图的维数降低2倍,通道增加2倍。与NIN(Network in Network)类似,采用全局平均池化层做最后的检测,在3 × 3的卷积之间使用1 × 1的卷积压缩特征图,以降低模型计算量和参数。在每个卷积层都加入了batch normalization以使训练过程稳定,同时加速收敛,降低模型过拟合。
在这里插入图片描述

2.trainging

整个YOLOv2的训练过程包括三个阶段:
第一阶段:在ImageNet数据集上从头开始训练Darknet-19,输入图像大小为224 × 224,训练160个epoch,使用初始学习率为0.1的SGD(stochastic gradient descent),在训练时采用了标准的数据扩增方式,比如随机裁剪,旋转以及色度,亮度的调整等。
第二阶段:在ImageNet数据集上对分类模型进行fine tune,将网络的输入调整为448 × 448,训练10个epoch,初始学习率为 1 0 3 10^{-3}
第三阶段:将之前预训练得到的分类模型修改为检测模型,在检测数据集上继续对网络fine tune。对网络的修改包括:移除最后一个卷积层、全局平均池化层和softmax层,添加3个3 × 3 × 1024的卷积层,同时增加一个passthrough层,最后用1 × 1的卷积层输出预测结果。每个cell预测5个边界框,每个边界框有5个值,在VOC数据集中有20个类,因此最后的1 × 1的卷积层输出的通道数为: f i l t e r n u m = n u m × ( c l a s s e s + 5 ) = 5 × ( 20 + 5 ) = 125 filternum = num × (classes + 5) = 5 × (20 + 5) = 125
YOLOv2训练的三个阶段如下图所示:
在这里插入图片描述

YOLOv2的anchor box是怎么匹配的呢?
和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个anchor box所对应的边界框负责预测它,具体是哪个边界框预测它,需要在训练中确定,即由那个与ground truth的IOU最大的边界框预测它,而剩余的4个边界框不与该ground truth匹配。YOLOv2同样需要假定每个cell至多含有一个grounth truth,而在实际上基本不会出现多于1个的情况。与ground truth匹配的anchor box计算坐标误差、置信度误差(此时target为1)以及分类误差,而其它的边界框只计算置信度误差(此时target为0)。

YOLOv2的损失函数
在这里插入图片描述
其中:

  1. W W H H 指anchor box的宽与高, A A 指的是anchor box的数目(这里是5),各个 λ \lambda 值是各项loss值的权重系数。
  2. 第一项loss计算的是背景的置信度误差。用哪些边界框来预测背景呢?首先计算各个边界框和所有ground truth的IoU值,并且取最大值Max_IoU,如果该值小于一定的阈值(YOLOv2使用的是0.6),那么这个边界框就预测背景。
  3. 第二项是计算anchor box与边界框的坐标误差。
  4. 第三大项计算与某个ground truth匹配的边界框各部分loss值,包括坐标误差、置信度误差以及分类误差。在计算置信度误差时,在YOLOv1中target=1,而YOLOv2增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IoU值。对于那些没有与ground truth匹配的边界框,除去那些Max_IoU低于阈值的(也就是背景),其它的就全部忽略,不计算任何误差。

参考

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

发布了39 篇原创文章 · 获赞 1 · 访问量 1224

猜你喜欢

转载自blog.csdn.net/qq_30146937/article/details/104260181