目标检测系列之-YOLOV2

Scroll Down

引言

上篇博客已经分享了YOLOV1论文,那么今天就紧接着介绍一下YOLOV2

YOLOV2

YOLOv1虽然检测速度很快,但是在检测精度上却不如R-CNN系检测方法,YOLOv1在物体定位方面(localization)不够准确,并且召回率(recall)较低。YOLOv2共提出了几种改进策略来提升YOLO模型的定位准确度和召回率,从而提高mAP,YOLOv2在改进中遵循一个原则:保持检测速度,这也是YOLO模型的一大优势,下图是论文中给出的一些改进策略。
image.png

网络结构

YOLOv2提出了一种新的网络模型——Darknet-19,包含19个卷积层、5个最大值池化,下面是论文中给出的网络中各层输入和输出:
image.png
输入: 416x416
输出: 1000维向量

tricks

YOLOV2最主要的优势还是体现在那几个trick,下面开始分别介绍。

Batch Normalization(BN)

BN层现在基本已经是深度学习网络模型中的标配,一般用在卷积层后面,可以起到一定正则化效果,降低模型的过拟合,YOLOV2亦是如此,在每个卷积层后面都用了BN,mAP提升了2.4%

High Resolution Classifier

大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分,ImageNet分类模型基本采用大小为224x224的图片作为输入,分辨率相对较低,不利于检测模型,所以YOLOv2增加了在ImageNet数据集上使用 448x448 输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入,mAP提升了约4%

Convolutional With Anchor Boxes

在YOLOv1中,输入图片最终被划分为 7x7 网格,每个单元格预测2个边界框,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的。YOLOv2借鉴了Faster R-CNN中RPN网络的先验框(anchor boxes,prior boxes,SSD也采用了先验框)策略。RPN对CNN特征提取器得到的特征图(feature map)进行卷积来预测每个位置的边界框以及置信度(是否含有物体),并且各个位置设置不同尺度和比例的先验框,所以RPN预测的是边界框相对于先验框的offsets值。采用先验框使得模型更容易学习。所以YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。

为了使检测所用的特征图分辨率更高,移除其中的一个pool层。在检测模型中,YOLOv2不是采用 448x448 图片作为输入,而是采用416x416大小。因为YOLOv2模型下采样的总步长为32 ,对于 [公式] 大小的图片,最终得到的特征图大小为 13x13 ,维度是奇数,这样特征图恰好只有一个中心位置。对于一些大物体,它们中心点往往落入图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。所以在YOLOv2设计中要保证最终的特征图有奇数个位置。对于YOLOv1,每个cell都预测2个boxes,每个boxes包含5个值(x,y,w,h,c),前4个值是边界框位置与大小,最后一个值是置信度(confidence scores,包含两部分:含有物体的概率以及预测框与ground truth的IOU)。但是每个cell只预测一套分类概率值(class predictions,其实是置信度下的条件概率值),供2个boxes共享,YOLOv2使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值,使用anchor boxes之后,YOLOv2的mAP有稍微下降(这里下降的原因,我猜想是YOLOv2虽然使用了anchor boxes,但是依然采用YOLOv1的训练方法)。YOLOv1只能预测98个边界框(7x7x2),而YOLOv2使用anchor boxes之后可以预测上千个边界框(13x13xNum_anchors)。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%.

Dimension Clusters

在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
image.png
先验框的大小是相对于特征图(13x13)的大小,下面给出了yolo权值文件中的anchor数值:
image.png

Direct location prediction

YOLOV2中的坐标计算公式如下:预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)总结来看,根据边界框预测的4个offsets [公式] ,可以按如下公式计算出边界框实际位置和大小:
image.png
其中$c_x,c_y$为cell的左上角坐标,如图5所示,在计算时每个cell的尺度为1,所以当前cell的左上角坐标为(1,1) 。由于sigmoid函数的处理,边界框的中心位置会约束在当前cell内部,防止偏移过多。而 pw 和 ph 是先验框的宽度与长度,前面说过它们的值也是相对于特征图大小的,在特征图中每个cell的长和宽均为1,这里记特征图的大小为(W, H),从而计算出边界框相对于整张图片的位置和大小:
image.png
如果再将上面的4个值分别乘以图片的宽度和长度(像素点值)就可以得到边界框的最终位置和大小了

Fine-Grained Features

YOLOv2的输入图片大小为 416x416 ,经过5次maxpooling之后得到 13x13 大小的特征图,并以此特征图采用卷积做预测。 13x13 大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图,SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体,YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是26x26大小的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说就是大小为 26x26x512 的特征图,passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2x2的局部区域,然后将其转化为channel维度,对于26x26x512的特征图,经passthrough层处理之后就变成了 13x13x2048的新特征图,这样就可以与后面的 13x13x1024 特征图连接在一起形成 13x13x3072大小的特征图。

Multi-Scale Training

由于YOLOv2模型中只有卷积层和池化层,所以YOLOv2的输入可以不限于 416x416大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值:
{320,352,...608},输入图片最小为 320x320,此时对应的特征图大小为 10x10,最大为608x608,对应特征图大小为19x19,在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练

Loss

YOLOV2的损失函数计算公式如下所示:
image.png
这里的W WW和H HH代表的是特征图的高宽,都为13 1313,而A指的是Anchor个数,YOLOv2中是5,各个λ 值是各个loss部分的权重系数。我们将损失函数分成3大部分来解释:

  • 第一部分
    image.png
    这个loss是计算background的置信度误差,但是用哪些预测框来预测背景呢?这里需要计算各个预测框和所有的ground truth之间的IOU值,并且取最大值记作MaxIOU,如果该值小于一定的阈值,YOLOv2论文取了0.6,那么这个预测框就标记为background,既然是背景,肯定不能包含物体,$\lambda_
    =1$正好符合条件。

  • 第二部分
    image.png
    这一部分是计算Anchor boxes和预测框的坐标误差,但是只在前12800个iter计算,这一项应该是促进网络学习到Anchor的形状

  • 第三部分
    image.png
    这一部分计算的是和ground truth匹配的预测框各部分的损失总和,包括坐标损失,置信度损失以及分类损失

    1. 坐标损失:这里的匹配原则是指对于某个特定的ground truth,首先要计算其中心点落在哪个cell上,然后计算这个cell的5个先验框和grond truth的IOU值,计算IOU值的时候不考虑坐标只考虑形状,所以先将Anchor boxes和ground truth的中心都偏移到同一位置,然后计算出对应的IOU值,IOU值最大的先验框和ground truth匹配,对应的预测框用来预测这个ground truth
    2. 置信度损失:在计算obj置信度时, 增加了一项$\lambda_$权重系数,也被称为rescore参数,当其为1时,损失是预测框和ground truth的真实IOU值(darknet中采用了这种实现方式)。而对于没有和ground truth匹配的先验框,除去那些Max_IOU低于阈值的,其它就全部忽略。YOLOv2和SSD与RPN网络的处理方式有很大不同,因为它们可以将一个ground truth分配给多个先验框。
    3. 分类损失:和YOLOV1一样

总结

YOLOv2借鉴和引入了很多新的tricks提升了map,值得我们好好学习

每日一语

不想做核算了啊啊啊!