经典论文解读YOLOv2 目标检测

Posted 一颗小树x

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典论文解读YOLOv2 目标检测相关的知识,希望对你有一定的参考价值。

前言

YOLO是一种目标检测方法,它的输入是整张图片,输出是n个物体的检测信息,可以识别出图中的物体的类别和位置。YOLOv2相对v1版本,更准确,速度更快,识别对象更多。

v2版本主要的改进是采用先验框Anchor Boxes、聚类提取先验框尺度、约束预测边框的位置这点和v1版本差异较大,v1版本没有采用先验框,每个网格只预测两个边界框。

v1版本这两个边界框“没有预先设计”框的大小和形状,而是模型生成,然后回归调整的;也没有对每个边界框输出一个对象预测,而是一个网格只预测一个对象类别。

还有一些其他改进:使用批归一化BN、去除全连接层,多尺度图像训练、使用高分辨率图像微调分类模型、passthrough层检测细粒度特征 等。

论文地址:YOLO9000: Better, Faster, Stronger

开源代码:https://github.com/pjreddie/darknet

一、网络结构

v2版本的网络结构依然比较简单,常规的卷积、池化最后加了passthrough层;去掉了全连接层。画了一个草图,便于大家理解: 

1.1 整体网络结构

输入是一张图片,RGB三维;采用Darknet-19网络进行特征提取,经过32倍下采样,输入416*416变为了13*13.

输出是13*13*5*25的张量;13*13 是网格数、5 是先验框的个数、25 20种类别+边界框中心x,y +边界框的宽、高+边界框的置信度。

1.2 Darknet-19 特征提取网络

下面介绍一下Darknet-19网络:

Darknet-19有19个卷积层和5个MaxPooling层。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5,以保证更快的运算速度。

1.3 passthrough层

 上面提到的:v2版本的网络结构依然比较简单,常规的卷积、池化最后加了passthrough层;去掉了全连接层。下面介绍一下passthrough层。

passthrough层的方法在特征图中保留一些细节信息,具体来说,就是在最后一个pooling之前,特征图的大小是26*26*512,将其1拆4,直接传递(passthrough)到pooling后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。

passthrough流程如下图所示:

 二、主要改进措施

 v2版本主要的改进是采用先验框Anchor Boxes、聚类提取先验框尺度、约束预测边框的位置;

2.1 采用先验框(Anchor Boxes)

借鉴Faster RCNN的做法,YOLO2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。

效果:召回率大幅提升到88%,同时mAP轻微下降了0.2。

进一步了解先验框:RPN(Region Proposal Network)提取候选框

2.2 聚类提取先验框尺度

背景:之前先验框都是手工设定的, Faster R-CNN中的九个Anchor Box的宽高是事先设定好的比例大小,一共设定三个面积大小的矩形框,每个矩形框有三个宽高比:1:1,2:1,1:2,总共九个框。

改进:在v2中尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。

设计:于是v2,Anchor Box的宽高不经过人为获得,而是将训练数据集中的矩形框全部拿出来,用kmeans聚类得到先验框的宽和高。例如使用5个Anchor Box,那么kmeans聚类的类别中心个数设置为5。

聚类算法最重要的是选择如何计算两个边框之间的“距离”,但我们关心的是边框的IOU;YOLO2在聚类时采用以下公式来计算两个边框之间的“距离”。

 centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。YOLO2给出的聚类分析结果如下图所示:

上图左边是选择不同的聚类k值情况下,得到的k个centroid边框,计算样本中标注的边框与各centroid的Avg IOU。显然,边框数k越多,Avg IOU越大。YOLO2选择k=5作为边框数量。

上图右边显示了5种聚类得到的先验框,VOC和COCO数据集略有差异。

实现的关键步骤

1)提取所有训练数据的 bounding boxes的宽高数据。将坐标数据转化为宽高大小,计算方法:  长=右下角横坐标-左上角横坐标、宽=右下角纵坐标-左上角纵坐标。
2)初始化k个 anchor box,通过在所有的 bounding boxes中随机选取k个值作为k个 anchor boxes的初始值。
3)计算每个 bounding box与每个 anchor box的iou值:

 4)分类:我们通过比较每个 bounding box其对于每个 anchor box的误差大小d(i,1), d(i,2),…,d(i,k)选取最小误差的那个 anchor box,将这个 bounding box分类给它,对于每个bounding box都做这个操作,最后记录下来每个 anchor box有哪些 bounding box属于它。
5.)Anchor box更新:对于每个 anchor box中的那些 bounding box,我们再求这些 bounding box的宽高中值大小,将其作为该 anchor box新的尺寸。
6)重复操作第3步到第5步,直到在第五步中发现对于全部 bounding box其所属的 anchor box类与之前所属的 anchor box类完全一样。(这里表示所有 bounding box的分类已经不再更新)

效果:聚类提取先验框尺度,结合约束预测边框的位置,使得mAP有4.8的提升。

2.3 约束预测边框的位置

借鉴于Faster RCNN的先验框方法,在训练的早期阶段,其位置预测容易不稳定,于是对边界框添加了约束。

  详细约束解释,请看论文:https://arxiv.org/pdf/1612.08242.pdf

预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。

三、其他改进措施

v2版本还有一些其他改进:使用批归一化BN、去除全连接层,多尺度图像训练、使用高分辨率图像微调分类模型 等。

 3.1 batch normalization 批归一化(BN)

网络中的位置:在“该层网络输出后”和“激活函数之前”增加一个BN层。

批归一化的处理:对该层网络输出的特征量分别进行归一化处理,分别使每个特征的数据分布变换为均值0,方差1。特征值数范围控制在[0,1]之间。

批归一化的效果:有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLO2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。

检测系列的网络结构中,BN逐渐变成了标配。在Yolov2的每个卷积层中加入BN之后,mAP提升了2.4%,并且去除了Dropout。

3.2 使用高分辨率图像微调分类模型

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

mAP提升了3.7。

3.3 多尺度图像训练

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

多尺度图像训练对mAP有1.4的提升。

3.4 高分辨率图像的对象检测

v2版本调整网络结构后能够支持多种尺寸的输入图像。通常是使用416*416的输入图像,如果用较高分辨率的输入图像,比如544*544,则mAP可以达到78.6,有1.8的提升。

四、损失函数

损失函数和v1本版差不多,误差依然包括边框位置误差、置信度误差、对象分类误差。

 意思是预测边框中,与真实对象边框IOU最大的那个,其IOU<阈值Thresh,此系数为1,即计入误差,否则为0,不计入误差。YOLO2使用Thresh=0.6。 

 意思是前128000次迭代计入误差。注意这里是与先验框的误差,而不是与真实对象边框的误差。可能是为了在训练早期使模型更快学会先预测先验框的位置。

 意思是该边框负责预测一个真实对象(边框内有对象)。

各种 是不同类型误差的调节系数。

五、模型效果

YOLOv2 在不同的分辨率下运行,以便在速度和精度之间轻松权衡。

 YOLOv2在COCO test-dev2015检测结果

目标检测效果:

 参考:https://zhuanlan.zhihu.com/p/74540100https://zhuanlan.zhihu.com/p/47575929

论文地址:YOLO9000: Better, Faster, Stronger

开源代码:https://github.com/pjreddie/darknet

本文只供大家学习和参考,谢谢。

以上是关于经典论文解读YOLOv2 目标检测的主要内容,如果未能解决你的问题,请参考以下文章

目标检测论文解读7——YOLO v2

【目标检测算法解读】yolo系列算法二

经典论文解读YOLO 目标检测

经典论文解读YOLOv3 目标检测

经典论文解读YOLO 目标检测

经典论文解读YOLOv3 目标检测