YOLO v1深入了解

YOLO(你只看一次)是一种基于深度神经网络的物体识别和定位算法。它最大的特点是运行速度非常快,可以用于实时系统。

现在YOLO已经发展到v3版本,但是新版本是在原版本的基础上不断改进和进化的,所以本文首先分析YOLO v1版本。

对于YOLOv2/YOLO9000的分析和理解,请移至YOLO v2/YOLO 9000。

输入一张图片,输出其中包含的对象,以及每个对象的位置(包含对象的矩形框)。

物体识别和定位可以看作是两个任务:在图片中找到物体存在的区域,然后识别哪个物体在该区域内。

近年来,基于CNN卷积神经网络的各种方法在物体识别(一幅图片只包含一个物体,基本占据图片的整个范围)方面取得了很好的效果。所以要解决的主要问题是物体在哪里。

最简单的思路是遍历图片中所有可能的位置,地毯式搜索每个不同大小、不同长宽比、不同位置的区域,逐个检测是否有物体,选择概率最高的结果作为输出。显然,这种方法效率太低。

RCNN开创了区域建议的方法。首先,它从图片中搜索出一些选择性搜索,大约2000个,然后识别每个候选人。物体识别和定位的效率大大提高。

但是RCNN的速度还是很慢,处理一张图片需要49秒左右。于是,Fast RCNN和更快的RCNN也随之而来,RCNN的神经网络结构和候选区域算法不断改进,更快的RCNN已经能够达到0.2秒左右的处理速度。以下图片来自R-CNN,快速R-CNN,快速R-CNN,YOLO?—?目标检测算法

但总的来说,RCNN系列还是两阶段处理模式:先提出候选区域,再识别候选区域内的物体。

YOLO的意思是你只看一次,它创造性地将候选区域和物体识别两个阶段结合起来,你一眼就能知道哪些物体及其位置(不用看两遍)。

实际上,YOLO并没有真正去除候选区域,而是采用了预定义的候选区域(准确的说应该是预测区域,因为不是更快RCNN采用的锚点)。也就是说,图片被分成7*7=49个网格,每个网格允许预测2个包围盒(包含一个物体的矩形框),总共有*** 49*2=98个包围盒。可以理解为98个候选区域,大致覆盖了图片的整个区域。

RCNN虽然会找一些候选区域,但毕竟只是候选。真正识别出对象后,有必要对候选区域进行微调,使其更接近真实的边界框。这个过程是边界回归:候选边界框被调整为更接近真实边界框。

既然反正最后是要调整的,何必先找候选区域呢?只是有一个区域范围,所以YOLO做到了。

不过话说回来,为什么边界回归行得通,我觉得本质上是因为分类信息已经包含了位置信息。就像你看到主人的脸和身体,你可以推断出你的耳朵和屁股的位置。

让我们具体看看YOLO的实施方案。

1)结构

去掉候选区域后,YOLO的结构很简单,就是简单的卷积和池化,最后加两层全连接。单看网络结构,和普通的CNN物体分类网络几乎没有本质区别。最大的区别是最终的输出层使用了一个线性函数作为激活函数,因为需要预测包围盒的位置(数值型),而不仅仅是物体的概率。所以大致来说,YOLO的整个结构就是输入图像经过神经网络变换得到一个输出张量,如下图所示。

因为只是一些常规的神经网络结构,所以在理解YOLO的设计时,了解输入和输出之间的映射关系是很重要的。

2)输入和输出之间的映射关系

3)输入

参考图5,输入的是原始图像,唯一的要求是缩放到448*448的大小。主要原因是,在YOLO的网络中,卷积层最终与两个全连通层相连,全连通层需要一个固定大小的向量作为输入,因此后推需要原图像具有固定大小。那么YOLO设计的尺寸是448*448。

4)输出

输出是一个7*7*30的张量。

4.1)7*7网格

根据YOLO的设计,输入图像被分成7*7个网格,输出张量中的7*7对应输入图像的7*7个网格。或者我们把7*7*30的张量看成7*7=49个30维向量,即输入图像中的每个网格输出一个30维向量。参考上面的图5,例如,输入图像左上角的网格对应于输出张量左上角的向量。

应该注意,这并不意味着只有网格中的信息被映射到30维向量。神经网络对输入的图像信息进行提取和转换后,网格周围的信息也会被识别和整理出来,最终编码成那个30维向量。

4.2)30维向量

具体来说,每个网格对应的30维向量包含哪些信息。

①20个对象的分类概率

因为YOLO支持识别20种不同的物体(人、鸟、猫、汽车、椅子等。),有20个值代表任何物体存在于这个网格位置的概率。它可以写成条件概率,意思是如果网格中有一个物体,那么它的概率就是。(记不住条件概率的同学可以参考理解贝叶斯定理。)

②两个包围盒的位置。

每个包围盒需要四个数值来表示其位置,(Center_x,Center_y,width,height),即(包围盒中心点的x坐标,y坐标,包围盒的宽度和高度),两个包围盒* * *需要八个数值来表示其位置。

③2个包围盒的置信度

包围盒的置信度=包围盒中有物体的概率*包围盒的IOU和物体的实际包围盒。

它是用公式表示的。

是包围盒中有物体的概率,与上面第一点不同。Pr(Object)不管是哪个对象,它反映的是有或者没有对象的概率。点(1)的意思是假设网格中已经有一个对象,是哪个对象?

是对象的边界框和实际边界框的IOU(交集/并集)。需要注意的是,我们讨论的30维向量中的包围盒是YOLO网络的输出,也就是预测的包围盒。因此,它反映了预测包围盒和真实包围盒之间的接近程度。

还需要注意的是,虽然有时候会说“预测”的包围盒,但是这个IOU是在训练阶段计算出来的。说到影响,我们不知道真实物体在哪里,只能依靠网络的输出。这个时候就不再需要(也不可能)计算IOU了。

整体来说,包围盒的可信度是指它是否包含物体和精确定位的程度。置信度高表示此处有物体且位置准确,置信度低表示可能没有物体或即使有物体也存在较大的位置偏差。

简单解释一下欠条。下图来自吴恩达的深度学习课程,其中IOU=交集面积/并集面积,两个盒子完全重叠时IOU=1,不相交时IOU=0。

一般来说,30维向量= 20个对象的概率+2个包围盒* 4个坐标+2个包围盒的置信度。

4.3)讨论

①一张图片最多可以检测49个物体。

每个30维向量中只有一组(20)概率的物体分类,所以只能预测一个物体。所以7*7=49个30维向量的输出,最多代表49个对象。

②总共有49 * * * 2 = 98个包围盒。

在每个30维向量中有2组包围盒,因此总共* * *是98个候选区域。

③ YOLO的包围盒不是更快的RCNN的锚。

有些算法,比如更快的RCNN,采用的是在每个网格中手动设置N个锚点的设计,每个锚点都有不同的大小和长宽比。YOLO的边界框看起来像网格中的两个锚点,但它们不是。YOLO没有预设两个边界框的大小和形状,也没有预测每个边界框中一个对象的输出。这仅仅意味着为一个对象预测了两个包围盒,并且选择了具有相对准确预测的一个。

这里使用了两个包围盒,这不是一个完全监督算法,而是像一个进化算法。如果是监督算法,我们需要事先根据样本给出一个正确的包围盒作为回归目标。然而,YOLO的两个边界框事先不知道它们会在哪里。只是正向计算后,网络会输出两个包围盒,这两个包围盒会用样本中物体的实际包围盒来计算IOU。此时,可以确定具有大IOU值的包围盒被用作负责预测对象的包围盒。

在训练开始时,网络预测的包围盒可能都是混乱的,但总是选择IOU较好的那个。随着训练的进展,每个包围盒会逐渐变得擅长预测某些情况(可能是物体大小,长宽比,不同类型的物体等。).所以,这是一种进化或者无监督学习的思路。

此外,论文中还经常提到responsible。例如,我们的系统将输入图像划分成一个s * s网格。如果对象的中心落入网格单元,则该网格单元负责检测该对象。这个责任有点混乱,预测“负责”是什么意思。其实也没什么意思,就是一个物体只被一个网格预测,不要让多个网格抢着预测同一个物体。更具体地说,在设置训练样本时,样本中的每个对象属于一个且仅属于一个网格,即使有时对象跨越多个网格,也只指定其中一个。具体是计算物体包围盒的中心位置,中心位置落在哪个网格上,该网格对应的输出向量中物体的类别概率为1(该网格负责预测物体),其他所有网格对该物体的预测概率设置为0(不负责预测物体)。

另外:yolo预测每个网格单元的多个边界框。在训练时,我们只希望一个边界框预测器负责每个对象。类似地,尽管在一个网格中会有两个边界框,我们将选择一个作为预测结果,而另一个将被忽略。将更清楚地看到训练样本的以下部分。

④网格和包围盒的数量可以调整。

7*7网格,每个网格有2个包围盒,对于448*448的输入图像来说有点粗糙。我们也可以设置更多的网格和更多的边界框。设网格数为S*S,每个网格生成b个边框。该网络支持不同物体的识别。此时,输出向量长度为:

整个输出的张量是:

YOLO选择7*7个网格,2个包围盒,20种对象,所以输出向量长度= 20+2 * (4+1) = 30。整个输出的张量是7*7*30。

由于网格和包围盒设置稀疏,训练后的YOLO这个版本的预测准确率和召回率都不是很理想,后续的v2和v3版本会有所提高。当然,由于其速度能够满足实时处理的要求,所以对工业界来说还是相当有吸引力的。

5)训练样本的构建

作为监督学习,我们需要构造训练样本,然后模型才能从中学习。

对于一个输入图片,输出的7*7*30张量(也就是监督学习中通常提到的标签Y或者label)应该填什么数据?

首先,输出的7*7维度对应于输入的7*7网格。

然后详细看看30维向量的填充(请参考上面的图6)。

①20个对象的分类概率

对于输入图像中的每个对象,首先找到它的中心点。比如图8中的自行车,中心点在黄点位置,落在黄色网格内,那么在这个黄色网格对应的30维向量中,自行车的概率是1,其他物体的概率是0。在所有其他48个网格的30维向量中,自行车的概率为0。这就是所谓的“中心点所在的网格负责预测物体”。狗和车的分类概率也用同样的方法填写。

②两个包围盒的位置。

训练样本的包围盒位置应该填充在对象的实际包围盒中,但是一个对象对应两个包围盒。我应该填哪一个?如上所述,需要根据网络输出和物体实际包围盒的IOU来选择,所以在训练过程中需要动态决定填充哪个包围盒。请参考下面的第③点。

③2个包围盒的置信度

上面讨论了置信度公式。

可以直接计算,即利用网络输出的两个包围盒和物体的真实包围盒计算出IOU。

然后看两个边界框的IOU。哪一个更大(更接近物体的实际包围盒),哪一个包围盒负责预测物体是否存在,即物体的实际包围盒的位置也填充在包围盒中。另一个不负责预测的边界框。

一般来说,最接近对象实际包围盒的包围盒,属于网格的其他包围盒。

举个例子,比如上图中自行车的中心点位于一个4行3列的网格中,那么输出张量中4行3列的30维向量如下图所示。

在4行3列的网格中有一辆自行车,它的中心点在这个网格中,它的位置边界是边界框1中填充的自行车的实际边界。

注意图中自行车的位置放在包围盒1中,但实际上训练过程中网络输出后,两个包围盒与自行车实际位置的IOU进行比较,自行车的位置(实际包围盒)放在IOU比较大的包围盒中(图中假设为包围盒1),包围盒的置信度设置为1。

6)损失函数

损耗是网络的实际输出值与样本标签值之间的偏差。

YOLO给出的损失函数如下

在公式中

意味着在网格I中有物体。

意味着在网格I的第j个包围盒中有一个物体。

意味着在网格I的第j个包围盒中没有对象。

一般来说,网络输出和样本标签内容之间的误差平方和作为样本的总误差。

损失函数中的几项对应于输出30维向量的内容。

①物体分类错误

在公式的第五行中,注意意味着对象的网格在包含错误之前就存在了。

②包围盒的位置误差

公式的第1和2行。

A) All with意味着只有“负责的”边界框的数据(IOU相对较大)将被包括在误差中。

b)先取第二条线的宽和高的平方根,因为如果直接取差,大的物体对差的敏感度较低,而小的物体对差的敏感度较高,所以取平方根可以减少敏感度的差异,使大的物体和小的物体在尺寸误差中的权重相近。

c)乘以用于调整边界框的位置误差的权重(相对分类误差和置信度误差)。YOLO设定,即增加位置误差的权重。

③包围盒的置信度误差

公式的第3行和第4行。

a)第三行是对象的边界框的置信误差。“有”意味着只有“负责的”(IOU相对较大)预测框的置信度将被包括在误差中。

b)第四行是没有对象的边界框的置信误差。因为包围盒里没有物体,所以要老老实实说“我这里没有物体”,也就是输出尽可能低的置信度。如果它不恰当地输出高置信度,就会与真正负责物体预测的包围盒混淆。其实就像物体分类一样,正确的物体概率最好是1,其他所有物体的概率最好是0。

c)将第4行乘以权重(相对于其他误差),以调整没有对象的边界框的置信度。YOLO设置,即降低没有对象的包围盒的置信度误差的权重。

7)培训

YOLO使用ImageNet数据集预训练前20层卷积网络,然后使用完整的网络在PASCAL VOC数据集上训练和预测物体识别和定位。YOLO的网络结构如下图所示:

YOLO的最后一层采用线性激活函数,其他各层都是漏ReLU。在训练中使用退出和数据增强来防止过拟合。更多细节请参考原论文。

8)预测(推断)

一个经过训练的YOLO网络会输出一个7*7*30的张量来表示图片中所有网格所包含的对象(概率),以及对象可能的两个包围盒和置信度(置信度)。

为了提取最可能的物体和位置,YOLO采用了NMS(非最大抑制)算法。

9)NMS(非最大抑制)

NMS方法并不复杂,其核心思想是:选择得分最高的输出,去掉与输出的重叠部分,重复这个过程,直到处理完所有的备选方案。

YOLO的NMS计算方法如下。

网络输出的7*7*30的张量,在每个网格中,位于第j个包围盒中的物体的得分:

它表示对象存在于第j个边界框中的可能性。

每个网格有:20个对象的概率* 2个边界框的置信度,***40个分数(候选对象)。49格***1960分。吴恩达建议每个物体都应该是NMS,所以每个物体都有1960/20=98个分数。

NMS步骤如下:

1)设置一个分数阈值,低于阈值的考生被排除(设置分数为0)。

2)遍历每个对象类别。

?2.1)遍历了对象的98个分数。

?2.1.1)找到得分最大的对象及其包围盒,并将其添加到输出列表中。

?2.1.2)对于每个分数不为0的候选对象,用上面2.1.1输出对象的包围盒计算其IOU。

?2.1.3)根据预设的IOU阈值,排除所有高于此阈值(重叠度高)的候选项(设置分值为0)。

?2.1.4)如果所有的边界框都在输出列表中或者得分=0,则完成该对象类别的NMS,并且过程返回到步骤2以处理下一个对象。

3)输出列表是预测对象。

10)汇总

YOLO以速度著称,处理速度可以达到45fps,其快速版(带小网)甚至可以达到155fps。这得益于其融合了识别和定位的网络设计,这种统一的设计也使得训练和预测可以端到端进行,非常简单。

缺点是对小物体的检测效果不是很好(尤其是一些聚集在一起的小物体),对边界的预测精度不是很高,整体预测精度略低于Fast RCNN。主要原因是网格设置稀疏,每个网格只预测两个边界。另外,池层会丢失一些详细信息,对定位有影响。

更多细节请参考原论文。

最后,如果你坚持看到这个地方,觉得还是有帮助的,请给我点个赞:)?

你只看一次:统一的,实时的对象检测

吴恩达深度学习工程师-04卷积神经网络

图形YOLO

你真的了解yolo吗?

目标探测的原理与实现|YOLO