关于YOLOv3的一些细节

2023-05-16

原文链接:https://www.jianshu.com/p/86b8208f634f
本文是我对YOLO算法的细节理解总结,本文的阅读前提是已读过YOLO相关论文,文中不会谈及YOLO的发展过程,不会与其他对象检测算法进行对比,也不会介绍YOLO9000相关的内容,只总结YOLOv3算法的具体流程和实现细节。所以,下文中所有提到的YOLO,如非特别说明,均指YOLOv3。
如果需要了解更多对象检测算法,可以参考以下部分相关论文:

R-CNN
Fast R-CNN
Faster R-CNN
SSD
YOLO-LITE
YOLOv1
YOLOv2
YOLOv3
RetinaNet
最新关于对象检测的综述文献可以参考这篇论文:
Deep Learning for Generic Object Detection: A Survey

1.概述

在YOLO算法发表之前,大部分表现比较好的对象检测(Object Detection)算法都是以R-CNN为代表两阶段算法,这样的算法存在一个很明显的问题,那就是速度太慢,对于实时性要求很高的应用场景是不适用的。YOLO算法的作者没有走优化算法第一阶段或者第二阶段的老路子,而是直接提出一步完成预测,而且是在一个CNN网络模型中完成图片中所有位置对象的box和类别预测,推理速度大大提升,完全可以满足实时对象检测。

YOLO算法创新性地提出了将输入图片进行N*N的栅格化(每个小单元叫grid cell),然后将图片中某个对象的位置的预测任务交与该对象中心位置所在的grid cell的bouding box。简单理解的话,可以认为这也是一种很粗糙的区域推荐(region proposal),在训练的时候,我们通过grid cell的方式告诉模型,图片中对象A应该是由中心落在特定grid cell 的某个范围内的某些像素组成,模型接收到这些信息后就在grid cell周围以一定大小范围去寻找所有满足对象A特征的像素,经过很多次带惩罚的尝试训练后,它就能找到这个准确的范围了(说明不是瞎找,如滑动窗口),当然这个方位不仅是指长宽的大小范围,也包括小幅度的中心位置坐标变化,但是不管怎么变,中心位置不能越过该grid cell的范围。这大大限制了模型在图片中瞎找时做的无用功。这样将位置检测和类别识别结合到一个CNN网络中预测,即只需要扫描一遍(you only look once)图片就能推理出图片中所有对象的位置信息和类别。举例如下图。
在这里插入图片描述
以上是我个人理解的YOLO算法的核心思想,不管是YOLOv1还是v2、v3,其主要的核心还是以上所述,只是在bounding box的拟合方式、骨干网络的设计、模型训练的稳定性、精度方面有所提升罢了。下面对整个模型的网络结构、实现和训练细节进行阐述。

2.训练

既然已经有了you only look once的想法,那接下来就要将这个想法数学化,这样才能用数学的方法训练模型学习拟合坐标和类别的特征,用于后期的预测。YOLO算法几乎是输入原图就直接预测出每个grid cell“附近”是否有某个对象和具体的 box位置,那最终这个想法数学化后便体现在loss函数上,这里我先不给出loss函数的具体公式,因为在提出loss函数之前要先了解三个概念:anchor box、置信度(confidence)和对象条件类别概率(conditional class probabilities)。作者提出,在网络最后的输出中,对于每个grid cell对应bounding box的输出有三类参数:一个是对象的box参数,一共是四个值,即box的中心点坐标(x,y)和box的宽和高(w,h);一个是置信度,这是个区间在[0,1]之间的值;最后一个是一组条件类别概率,都是区间在[0,1]之间的值,代表概率。下面分别具体介绍这三个参数的意义。

2.1 anchor box(bounding box prior)

anchor box最初是由Faster RCNN引入的。anchor box(论文中也称为bounding box prior,后面均使用anchor box)其实就是从训练集的所有ground truth box中统计(使用k-means)出来的在训练集中最经常出现的几个box形状和尺寸。比如,在某个训练集中最常出现的box形状有扁长的、瘦高的和宽高比例差不多的正方形这三种形状。我们可以预先将这些统计上的先验(或来自人类的)经验加入到模型中,这样模型在学习的时候,瞎找的可能性就更小了些,当然就有助于模型快速收敛了。以前面提到的训练数据集中的ground truth box最常出现的三个形状为例,当模型在训练的时候我们可以告诉它,你要在grid cell 1附件找出的对象的形状要么是扁长的、要么是瘦高的、要么是长高比例差不多的正方形,你就不要再瞎试其他的形状了。anchor box其实就是对预测的对象范围进行约束,并加入了尺寸先验经验,从而可以有效解决对象多尺度的问题(Faster RCNN论文中指出的作用)。这篇文章对anchor box的作用进行了另外的解释,个人觉得也很有道理,将部分内容翻译如下:

当我们只对图片中一个对象(且图片中只有一个对象)进行box回归时,我们只需要一个box回归器,但是当我们对图片中多个对象进行回归时(甚至一个类别会有多个对象),这时使用多个box回归器预测多个对象位置时就会发生冲突,因为每个预测器都可能不受约束地预测图片中任何一个对象的位置和类别。这时,我们就可以使用anchor来对每个回归器进行约束,只让每个回归器负责一块独立区域内的对象box回归。以YOLO算法举例,每个grid cell的位置其实也可以看做是anchor的位置(这不同于SSD或者Faster RCNN的anchor),如果最终的输出为13x13,也即有13x13个grid cell,每个grid cell有三个anchor的话,整个模型就有13x13x3个回归器,每个回归器只负责相应grid cell附近的对象预测。

*要在模型中使用这些形状,总不能告诉模型有个形状是瘦高的,还有一个是矮胖的,我们需要量化这些形状。YOLO的做法是想办法找出分别代表这些形状的宽和高,有了宽和高,尺寸比例即形状不就有了。*YOLO作者的办法是使用k-means算法在训练集中所有样本的ground truth box中聚类出具有代表性形状的宽和高,作者将这种方法称作维度聚类(dimension cluster)。细心的读者可能会提出这个问题:到底找出几个anchor box算是最佳的具有代表性的形状。YOLO作者方法是做实验,聚类出多个数量不同anchor box组,分别应用到模型中,最终找出最优的在模型的复杂度和高召回率(high recall)之间折中的那组anchor box。作者在COCO数据集中使用了9个anchor box,我们前面提到的例子则有3个anchor box。

那么有了量化的anchor box后,怎么在实际的模型中加入anchor box的先验经验呢?我们在前面中简单提到过最终负责预测grid cell中对象的box的最小单元是bounding box,那我们可以让一个grid cell输出(预测)多个bounding box,然后每个bounding box负责预测不同的形状不就行了?比如前面例子中的3个不同形状的anchor box,我们的一个grid cell会输出3个参数相同的bounding box第一个bounding box负责预测的形状与anchor box 1类似的box,其他两个bounding box依次类推。*作者在YOLOv3中取消了v2之前每个grid cell只负责预测一个对象的限制,也就是说grid cell中的三个bounding box都可以预测对象,当然他们应该对应不同的ground truth。*那么如何在训练中确定哪个bounding box负责某个ground truth呢方法是求出每个grid cell中每个anchor box与ground truth box的IOU(交并比),IOU最大的anchor box对应的bounding box就负责预测该ground truth,也就是对应的对象,后面还会提到负责预测的问题。

到此,还有最后一个问题需要解决,我们才能真正在训练中使用anchor box,那就是**我们怎么告诉模型第一个bounding box负责预测的形状与anchor box 1类似,第二个bounding box负责预测的形状与anchor box 2类似?**YOLO的做法是不让bounding box直接预测实际box的宽和高(w,h),而是将预测的宽和高分别与anchor box的宽和高绑定,这样不管一开始bounding box输出的(w,h)是怎样的,经过转化后都是与anchor box的宽和高相关,这样经过很多次惩罚训练后,每个bounding box就知道自己该负责怎样形状的box预测了。这个绑定的关系是什么?那就是下面这个公式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于anchor box训练相关的问题除了与loss函数相关的基本上都解释清楚了,但是预测的问题还没有解释清楚,还存在一个很关键的问题:在训练中我们挑选哪个bounding box的准则是选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优的bounding box呢?这就需要另外的参数了,那就是下面要说到的置信度。

2.2 置信度(confidence)

在这里插入图片描述

2.3 对象条件类别概率(conditional class probabilities)

在这里插入图片描述

2.4 损失函数

介绍完模型最终输出中有哪些参数后,我们应该可以定义loss函数了,作者使用了最简单的差平方和误差(sum-squared error),使用的原因很简单,因为好优化。那我们试着给出loss函数的公式:

在这里插入图片描述
如果看过YOLOv1的论文你会发现,这里的公式和论文中的公式虽然相似,但是差别还是很大的。其实,作者是在上面这个公式的基础上加了很多限制和优化参数,上面的公式只是我为了更好说明YOLO的loss公式而给出的对比公式,这样有助于更好的理解YOLO的loss函数公式中加入的每个参数的意义,下面给出真正的YOLO loss函数公式(这个公式是我根据YOLO三篇论文前后的发展总结出来的,v3论文中未给出此类似的公式):

在这里插入图片描述
细心的你一定也注意到了,这个公式和YOLOv1论文中的公式是不一样的。那是因为在YOLOv3中,作者将置信度和条件类别概率放到了每个bounding box中,即每个bounding box都有一对置信度和条件类别概率,而v1中所有的bounding box共用一对置信度和条件类别概率,上文中在说明输出的各个参数时,默认解释的是v3的输出格式,关于v1的细节不再赘述。下面几点是loss函数的几点细节:

在这里插入图片描述
在这里插入图片描述
grid cell的个数S如何确定
自v2后,YOLO算法网络结构中只使用卷积和池化操作进行特征提取和推理运算,去掉了传统的全连接层,这样的做法有一个好处,就是理论上整个网络不再限制输入图片的尺寸因为卷积层本来就对输入的尺寸没有限制。作者在这样的基础上,每隔一段训练周期随意改变输入层的尺寸后再进行下一阶段训练,这样就让模型在不同尺寸的图片上都表现良好,作者将之称为Multi-Scale training。当然,输入的尺寸并不是随心所欲地改变,而是在(10 * 32, 11 * 32, 12 * 32, 13 * 32, 14 * 32, 15 * 32, 16 * 32, 17 * 32, 18 * 32, 19 * 32这几个尺寸中随机选择。当确定了输入层的大小后,模型通过卷积层输入输出尺寸公式计算后,便能预先知道在某个输入尺寸前提下,最后的输出层尺寸是多少了,也就是grid cell的个数,即loss函数中S的值。其实,S的取值只可能在集合(10 * 10,11 * 11, 12 * 12,…,19 * 19)中,因为YOLO模型的降采样(down-sample)因子是32。

2.5 跨尺寸预测(Predictions across scales)

YOLO算法从三个不同的尺寸预测对象box,这三个不同的尺寸来自不同层级的卷积层的输出。该方法借鉴了feature pyramid network的思想: 由于卷积层每隔几层,特征映射(feature mapping)的宽和高就会减少,而通道数会增加,随着网络层次的加深,特征映射组成的形状类似于金字塔,如果将不同层级的特征映射转换为最终的输出,那么将有助于提升模型在对象不同尺度大小上的表现,即有助于提高模型从小目标到大目标的综合检测(box的精度)能力,关于feature pyramid network的具体内容,此处不详细展开,可参考论文。我们先看下YOLO模型的网络结构,我们以检测COCO数据集输入尺寸为416*416的网络结构为例(COCO数据集类别数为80,anchor box总数为9):

在这里插入图片描述
从上面的模型的网络结构图我们可以明显看出基于darknet-53的最新的模型结构有以下几个特点:

从网络的不同层次映射不同尺寸的输出,如图中从79层(外加两个卷积层)得到13 * 13的的输出;从91层(外加两个卷积层)得到26*26的输出;最后再得到52 * 52的输出。
后面的高层结合使用低层特征(图中的86、98层,分别使用了61层和36层的特征映射),使高层能使用细粒度(fine grained)特征和更多的语义信息。
最后一个尺寸输出使用了前两个尺寸计算的特征映射,使得最后的尺寸输出也能使用细粒度。
每个YOLO输出层中,每个grid cell的bounding box数量为3,而不是9,这样不同的YOLO输出层便能负责不同尺寸大小的对象预测了,这个思想来自SSD。例如,COCO数据集中,作者让YOLO scale1负责预测的尺寸有(10,13)、 (16,30)和 (33,23), YOLO scale2负责预测的尺寸有(30,61)、(62,45)和(59,119),YOLO scale3负责预测的尺寸有(116,90)、(156,198)和(373,326)。

先就到这里,以后有新的发现再添加~~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于YOLOv3的一些细节 的相关文章

随机推荐