经典论文解读YOLOv3 目标检测
Posted 一颗小树x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典论文解读YOLOv3 目标检测相关的知识,希望对你有一定的参考价值。
前言
YOLO是一种目标检测方法,它的输入是整张图片,输出是n个物体的检测信息,可以识别出图中的物体的类别和位置。YOLOv3相对v2版本,准确度和速度差不多,但对小目标检测更好。
v3版本主要的改进是使用Darknet-53主干网络提取特征、多尺度特征检测(FPN结构)、预测对象分类采用Logistic取代softmax。
它延续了v2版本部分特点:采用先验框Anchor Boxes、聚类提取先验框尺度、约束预测边框的位置、批归一化BN、去除全连接层。
v1版本没有采用先验框,每个网格只预测两个边界框。这两个边界框“没有预先设计”框的大小和形状,而是模型生成,然后回归调整的;也没有对每个边界框输出一个对象预测,而是一个网格只预测一个对象类别。
论文地址:YOLOv3: An Incremental Improvement
开源代码:https://github.com/pjreddie/darknet
目录
2.4 batch normalization 批归一化(BN)
一、网络结构
这里首先分析输入映射到输出的关系、再看看整体网络、最后了解Darknet-53主干网络提取特征。
1.1 输入映射到输出
输入一张图像,v3模型将其映射到3种尺度的输出张量,分别是13*13*255、26*26*255、52*52*255;这里体现了多尺度特征检测的特点。为什么要输出3种尺度的张量呢?
低层高分辨的特征 对于检测小物体是很有帮助的,低层高分辨的特征 对应52*52;(相对于输出416*416图像,做了8倍下采样,感受野较小)
高层抽象的特征 适合检测大物体,高层抽象的特征 对应13*13;(相对于输出416*416图像,做了32倍下采样,感受野较大)
26*26 适合检测一般大小的物体,感受野中等大小。
说明:此图是引用YOLOv3 深入理解文章的框图。
看看输出3种尺度的张量,3*13*255、26*26*255、52*52*255。为什么都是输出255维的呢?
一个网格的维度 = 先验框数量 *( 坐标x、坐标y、宽度、高度、置信度 + 类别 )
即:255= 3 * (5 + 80)
先验框数量 在每个尺度的特征图的每个网格设置3个先验框。即:每种尺度的输出张量,都有互不相同的3个先验框Anchor Boxes;13*13 用来检测大物体,使用3个尺寸较大的先验框;52*52 用来检测小物体,使用3个尺寸较小的先验框;26*26 用来检测一般大小物体,使用3个尺寸中等的先验框。这里一共有9个不同大小的先验框。
先验框维度 先验框中心坐标x、y;框的宽、高;这4个维度用来表达先验框的位置信息;还是框的置信度,是表示框内包含物体的概率。一共5维。
类别 作者用COCO数据集训练,一共有80种物体。
1.2 整体网络
输入416X416 的图片,Darknet-53 网络后得到了 3 个分支,这些分支在经过一系列的卷积、上采样以及合并等操作后最终得到了三个尺寸不一的 feature map,形状分别为 [13, 13, 255]、[26, 26, 255] 和 [52, 52, 255]。
说明:此图是引用YOLOv3 算法的一点理解文章的框图。
1.3 Darknet-53主干网络提取特征
Darknet-53 的主体框架如下图所示,Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路(shortcut connections)。
注意,最后三层 Avgpool、Connected 和 softmax layer 是用于在 Imagenet 数据集上作分类训练用的。当我们用 Darknet-53 层对图片提取特征时,是不会用到这三层的。
上图的Darknet-53网络采用256*256*3作为输入,最左侧那一列的1、2、8等数字表示多少个重复的残差组件。每个残差组件有两个卷积层和一个快捷链路,示意图如下:
残差模块通过恒等映射(identity mapping)的方法使得输入和输出之间建立了一条直接的关联通道,从而使得网络集中学习输入和输出之间的残差。 它能缓解在神经网络中增加深度带来的梯度消失问题,从而使得神经网络变得更容易优化。
Darknet-53 对比其他模型:(精度和速度还可以的)
v2版本使用 Darknet-19 作为主干网络,提取特征。v3版本使用 Darknet-53 作为主干网络,提取特征。
二、延续经典
v3版本延续了v2版本部分特点:采用先验框Anchor Boxes、聚类提取先验框尺度、约束预测边框的位置、批归一化BN、去除全连接层。
2.1 采用先验框(Anchor Boxes)
借鉴Faster RCNN的做法,v2版本采用先验框,v3版本也使用了先验框。在每个特征图中的网格预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
进一步了解先验框:RPN(Region Proposal Network)提取候选框
v3版本采用9种尺度的先验框;它为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
13*13特征图,相对于输出416*416图像,做了8倍下采样,最大的感受野,使用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。
说明:蓝色框为聚类得到的先验框。黄色框式ground truth,红框是对象中心点所在的网格。
26*26特征图,做了16倍下采样,有中等感受野,使用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。
52*52特征图,做了32倍下采样,有较小的感受野,使用用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
2.2 K-means聚类提取先验框尺度
背景:之前先验框都是手工设定的, Faster R-CNN中的九个Anchor Box的宽高是事先设定好的比例大小,一共设定三个面积大小的矩形框,每个矩形框有三个宽高比:1:1,2:1,1:2,总共九个框。
改进:在v2中尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。于是v2,Anchor Box的宽高不经过人为获得,而是将训练数据集中的矩形框全部拿出来,用kmeans聚类得到先验框的宽和高。例如使用5个Anchor Box,那么kmeans聚类的类别中心个数设置为5。
延续经典:v3也使用K-means聚类提取先验框尺度,设置kmeans聚类的类别中心个数设置为9,拿到9个先验框Anchor Box
聚类算法最重要的是选择如何计算两个边框之间的。“距离”,但我们关心的是边框的IOU;在聚类时采用以下公式来计算两个边框之间的“距离”。
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的分类已经不再更新)
2.3 约束预测边框的位置
借鉴于Faster RCNN的先验框方法,在训练的早期阶段,其位置预测容易不稳定,于是对边界框添加了约束。
详细约束解释,请看论文:https://arxiv.org/pdf/1804.02767.pdf
预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。
2.4 batch normalization 批归一化(BN)
网络中的位置:在“该层网络输出后”和“激活函数之前”增加一个BN层。
批归一化的处理:对该层网络输出的特征量分别进行归一化处理,分别使每个特征的数据分布变换为均值0,方差1。特征值数范围控制在[0,1]之间。
批归一化的效果:有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果,从而能够获得更好的收敛速度和收敛效果。
检测系列的网络结构中,BN逐渐变成了标配。
三、激活函数Logistic取代softmax
简介:预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签,即一个框对应多个标签)。
进一步解释:对于类概率预测,在YOLOv2中是直接利用softmax进行类概率预测。而在YOLOv3中对于每一个类,使用独立的logistic分类器,然后使用交叉熵损失计算类概率损失。用这种策略的原因是,考虑到在利用softmax分类时,需要把所有的类别独立开来(one hot编码的特点),但是一旦遇到如(女人 ,人)这种包含类别时,用softmax就不是那么合适了。因此才引入logistic分类器结合多标签,来处理此类问题。
小结:v3版本不使用Softmax对每个框进行分类,主要考虑因素有两个:
-
Softmax使得“每个框分配一个类别”,挑选score最大的一个;而对于Open Images这种数据集,目标可能有重叠的类别标签,即一个框对应多个标签,因此Softmax不再适用。
-
Softmax可被独立的多个logistic分类器替代,且准确率不会下降。
四、损失函数
损失函数主要包括:
- 边框位置损失(x、y、w、h),仅当预测框内包含物体时计算;
- 边框置信度损失(Confidence),判断预测框有无物体;
- 分类损失(class),判断预测框内的物体属于哪个类别。
五、NMS(非极大值抑制)
如下图所示,众多边界框在图片中: 密密麻麻的。这里保留了这么多边界框,预测中一个物体可能被多个边界框包围;实际物体只对应一个边界框,如何解决个问题呢?使用非极大值抑制 可以解决。
NMS核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。
NMS算法的要点:
- 首先丢弃概率小于预定IOU阈值(例如0.5)的所有边界框;对于剩余的边界框:
- 选择具有最高概率的边界框并将其作为输出预测;
- 计算”作为输出预测的边界框“,与其他边界框的相关联IoU值;舍去IoU大于阈值的边界框;其实就是舍弃与”作为输出预测的边界框“很相近的框框。
- 重复步骤2,直到所有边界框都被视为输出预测或被舍弃;
案例:如下图所示汽车不止一次被识别
NMS计算流程:
- 它首先查看与每次检测相关的概率并取最大的概率。在上图中,0.9是最高概率,因此首先选择概率为0.9的方框;
- 现在,它会查看图像中的所有其他框。与当前边界框较高的IoU的边界框将被抑制。因此,在示例中,0.6和0.7概率的边界框将被抑制。(此时面包车已经只剩一个边界框)
- 在部分边界框被抑制后,它会从概率最高的所有边界框中选择下一个,在例子中为0.8的边界框;
- 再次计算与该边界框相连边界框的IoU,去掉较高IoU值的边界框。
- 重复这些步骤,得到最后的边界框:
六、模型效果
在性能相当的情况下,YOLOv3的运行速度明显快于其他(RetinaNet-50、RetinaNet-101)检测方法。
YOLOv3比SSD模型要好得多,在AP50指标上可以与最先进的模型相媲美:
YOLOv3目标检测效果:
参考
[1] YOLOv3: An Incremental Improvement
[2] Deep Residual Learning for Image Recognition
[4] How to implement a YOLO (v3) object detector from scratch in PyTorch
[5] YOLOv3 深入理解
[6] YOLOv3 算法的一点理解
论文地址:YOLOv3: An Incremental Improvement
开源代码:https://github.com/pjreddie/darknet
本文只供大家学习和参考,谢谢。
以上是关于经典论文解读YOLOv3 目标检测的主要内容,如果未能解决你的问题,请参考以下文章