YOLO v1深入了解
现在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