YOLO_v2目标检测算法深入剖析

 目录

一、YOLOv2引入

二、网络结构

1、结构纵览

2、passthrougth层

三、Batch Normalization

四、微调分类模型

五、Anchor思想

六、预测边框的位置

七、多尺度图像训练

八、YOLO_v2训练过程

九、损失函数

十、总结


 论文地址:https://arxiv.org/abs/1612.08242

一、YOLOv2引入

        YOLOv2相对于v1版本,继续保持了很高的处理速度,但是在预测的准确率上有个很高的提高,但是其基本思想还是和v1版本是一致的,通过划分网格,以及使用简单的网络结构来处理分类问题。本文将逐步讲解YOLOv2的各个优化技巧。

二、网络结构

1、结构纵览

preview
图一:YOLO_v2网络结构

        根据图一,我们知道v2版本的网络结构依旧非常的简洁,但是v2版本摒弃了全连接层,而是将卷积的结果直接用于LOSS的计算,可以知道,喂进一张图片,然后经过卷积层之后图像缩小了32倍,输出网格边长数为13,个数为5,长度为25的张量(具体这些表示着什么,之后会讲解,这里先熟悉一个整个网络的结构)。

2、passthrougth层

        根据论文的意思,passthrough层是用来检测颗粒度特征的,如下图二:

preview
图二:passthrough

       

preview
图三:1拆4方法

        该图的意思是,在最后的pooling层之前,将大小为截面大小为26x26的张量,分为四个截面为13x13的张量(备份下来),然后将预先的26x26的张量进行最后以此pooling和卷积,然后将该结果和备份的四个截面为13x13的张量按顺序连接起来,形成一个13x13x3072大小的张量。当然在论文中其实际上是将512的长度通过1x1卷积降维到64,然后拼接长度为256,而原先的张量经过pooling之后,再经过1x1卷积,升高维度到1024维度,然后再去和1拆4之后的256维度拼接,最后形成了1280维度长度,那么这里的维度长度如何变化成上图一对应的125维长度呢?通过1x1卷积即可。(为何1x1卷积有这样的作用,请参考彻底理解Faster R-CNN内涵,以及目标检测(看部分即可))。

三、Batch Normalization

        v2版本的YOLO将BN层引入其中,因为BN有助于解决反向传播过程中梯度消失和梯度爆炸的问题,降低一些超参数的敏感性,并且对每一个batch分别进行归一化,起到了一定的正则的效果,从而获得更高的收敛速度。关于BN的理论部分参考BN原理详解

四、微调分类模型

        图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 224*224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448*448 的图像作为输入。但这样切换对模型性能有一定影响。

        所以v2版本在采用 224*224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448*448 的分辨率。然后再使用 448*448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。

五、Anchor思想

        引入了Anchor思想,v2将每一个网格的预测窗口个数提升到了5个,并对该5个窗口进行了预设定,我们知道,Faster R-CNN是的Anchor大小个数,都是认为设定的,但是YOLO_v2没有采用认为设定的方式,而是采取了聚类的方法。

        所谓聚类的方法,就是在训练集上进行预测框的距离(预测框的参数x1,y1,x2,y2),那么如何定义聚类的距离了,因为距离小的将被合并,距离大的将被分离,所以用1-IoU来判断两个预选框的距离,如果IoU大,表示两个预选框重合面积大,可以进行合并,如果IoU小,表示两个预选框重合面积大,需要进行分离。然后论文最后选出了5个预选框。如下图所示

preview
图四:Anchor的聚类选取

六、预测边框的位置

        在知道了结构,之后,我们需要考虑的是,如何约束预测边框的位置,假设预测的中心坐标、宽高和置信度为t_{x},t_{y},t_{w},t_{h},t_{o},那么先验框(预选框)的宽高为p_{w},p_{h},c表示偏移量offset,有了这些数据之后,我们就可以计算出预测框的位置了

b_{x}=\sigma (t_{x}) + c_{x}

b_{y}=\sigma (t_{y}) + c_{y}

b_{w}=p_{w}e^{t_{w}}

Pr(object)*IOU(b, object)=\sigma (t_{o})

preview
图五:预测框与预选框

七、多尺度图像训练

        由于去掉了全连接层,所以YOLO_v2可以适应任何尺寸的输入。因为整个网络的缩小倍数是32,作者用了{320,352,...,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,...19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。

八、YOLO_v2训练过程

  • 第一阶段:在ImageNet分类数据集上预训练Darknet-19,模型输入为224x224,训练160epochs
  • 第二阶段:将输入图像尺寸调整为448x448,继续在ImageNet数据集上进行微调分类模型,训练10epochs
  • 第三阶段:移除Darknet-19的最后一个卷积层、global avgpooling层、softmax层,移除之后在其后增加三个卷积核为3x3,通道数为1024的卷积层,然后再增加一个passthough层,最后通过1x1卷积层输出预测结果,通道个数为anchors\times (5+classes),由于anchors数为5,对于VOC数据集(20种分类对象)输出的channels数就是125,最终的预测矩阵T的shape为 (batch_size, 13, 13, 125),可以先将其reshape为 (batch_size, 13, 13, 5, 25) ,其中 T[:, :, :, :, 0:4] 为边界框的位置和大小,T[:, :, :, :, 4] 为边界框的置信度,而 T[:, :, :, :, 5:] 为类别预测值。

九、损失函数

preview
图六:损失函数

        损失函数其实结构上和v1没什么区别,就是计算计算相应部分的损失,但是v2版本还是有些许的改变的,正如下面所示:

  • 1_{MaxIOU<Thresh}:意思是预测边框中,与真实对象边框IOU最大的那个,其IOU<阈值Thresh,此系数为1,即计入误差,否则为0,不计入误差。YOLO2使用Thresh=0.6
  • b_{ijk}^{o}:标识第i、j个网格中的第k个anchor的置信度,右上角是 r 标识的是回归框,右上角是 c 表示的是分类结果
  • 1_{t<128000}:意思是前128000次迭代计入误差。注意这里是与先验框的误差,而不是与真实对象边框的误差。可能是为了在训练早期使模型更快学会先预测先验框的位置
  • 1_{k}^{truth}:意思是该边框负责预测一个真实对象(边框内有对象)
  • \lambda:其中的lambda是为了调节不同类型之间的误差的系数

十、总结

        综上所讲解,v2相比较v1,是在保存了v1的优点之后,继续提高了其mAP,也就是预测的准确度,通过引入了Anchor思想,并且在Anchor尺寸的选择上,采取了聚类的方法,引入了有关结构改变的passthrough层,将原先丢失的颗粒细节信息重新吸收,并且摒弃了全连接层,将网络适用于不同的像素。以上就是就YOLO_v2的讲解。

发布了351 篇原创文章 · 获赞 174 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/Triple_WDF/article/details/104427769