YOLOv1 学习笔记

概述

在这里插入图片描述上图,bounding box框的粗细表示包含物体置信度confidence的高低,下彩色图,每个grid cell还能生成所有类别的条件概率(假设包含物体的情况下,是某一类物体的概率)。故,每个bounding box的confidence*条件概率=每个bounding box的个类别概率。
在这里插入图片描述预测阶段:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述98个框,狗类,confidence,阈值置0,降序排列,NMS
在这里插入图片描述
NMS工作原理,狗类为例
在这里插入图片描述

在这里插入图片描述在这里插入图片描述依次比较97个。再从bb15蓝框开始,往后比。
在这里插入图片描述
最后保留:
在这里插入图片描述
20个类别,进行20次NMS。得到稀疏矩阵:
在这里插入图片描述
在这里插入图片描述bb3, bb4, bb97有些类别分数>0,
在这里插入图片描述
后处理,只在预测阶段进行NMS,训练阶段不需要。因为每一个框不管有没有用,都在损失函数起作用,

损失函数:目标检测问题转换成回归问题
在这里插入图片描述

参考这个大佬,写的很好了: YOLO v1深入理解

YOLO
YOLO意思是You Only Look Once,创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片(不用看两眼哦)就能知道有哪些对象以及它们的位置。

实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区(准确点说应该是预测区,因为并不是Faster RCNN所采用的Anchor)。也就是将图片划分为 7x7=49 个网格(grid),每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),该bounding box的中心点落在相应网格中,即由该网格生成,总共 49x2=98 个bounding box。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。

结构

去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别,最大的差异是最后输出层用线性函数做激活函数,因为需要预测bounding box的位置(数值型),而不仅仅是对象的概率。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示。
在这里插入图片描述

这里搬运一些重点:

输入和输出的映射关系
在这里插入图片描述
输入就是原始图像,唯一的要求是缩放到448x448的大小。主要是因为YOLO的网络中,卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。那么YOLO设计的尺寸就是448x448。输出是一个 7x7x30 的张量(tensor)

30维向量

在这里插入图片描述

① 20个对象分类的概率

因为YOLO支持识别20种不同的对象(人、鸟、猫、汽车、椅子等),所以这里有20个值表示该网格位置存在任一种对象的概率。可以记为
在这里插入图片描述
之所以写成条件概率,意思是如果该网格存在一个对象Object的前提下,那么它是Ci的概率是P(Ci|Object)。P(Ci|Object)意思是假设已经有一个对象在网格中了,这个对象具体是哪一个

② 2个bounding box的位置

每个bounding box需要4个数值来表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心点的x坐标,y坐标,bounding box的宽度,高度),2个bounding box共需要8个数值来表示其位置。注意:x,y,w,h∈(0,1)预测的中心点x,y是相对于该网格尺寸而言,预测的宽高w,h是相对于图像尺寸而言,所以是相对值,小数

③ 2个bounding box的置信度confidence

bounding box的置信度 = 该bounding box内存在对象的概率 * 该bounding box与该对象实际GT的IOU
用公式来表示就是
在这里插入图片描述
Pr(Object)是该网格预测的bounding box内存在对象的概率,值只能是0或1,即object中心点落在该网格时Pr(Object)=1,此时confidence=IOU,不存在中心点的网格Pr(Object)=0,此时confidence=0

在这里插入图片描述是 bounding box 与 对象真实GT 的IOU。要注意的是,现在讨论的30维向量中的bounding box是YOLO网络的输出,也就是预测的bounding box。所以在这里插入图片描述体现了预测的bounding box与真实GT的接近程度。

还要说明的是,虽然有时说"预测"的bounding box,但这个IOU是在训练阶段计算的。等到了测试阶段(Inference),这时并不知道真实对象在哪里,只能完全依赖于网络的输出,这时已经不需要(也无法)计算IOU了。

综合来说,一个bounding box的置信度Confidence意味着它是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确,置信度低表示可能没有对象 或者 即便有对象也存在较大的位置偏差

在测试时,每个物体的最终概率:P(Ci|Object) x Confidence
在这里插入图片描述

讨论

① 一张图片最多可以检测出49个对象
每个30维向量中只有一组(20个)对象分类的概率,也就只能预测出一个对象。所以输出的 7*7=49个 30维向量,最多表示出49个对象。

② 总共有 49*2=98 个候选区(bounding box)
每个30维向量中有2组bounding box,所以总共是98个候选区。

③ YOLO的bounding box并不是Faster RCNN的Anchor
Faster RCNN等一些算法采用每个grid中手工设置n个Anchor(先验框,预先设置好位置的bounding box)的设计,每个Anchor有不同的大小和宽高比。YOLO的bounding box看起来很像一个grid中2个Anchor,但它们不是。YOLO并没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个

另外论文中经常提到responsible。比如:Our system divides the input image into an S*S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. (我们的系统将输入图像划分为S * S网格。 如果对象的中心落入网格单元,则该网格单元负责检测该对象)这个 responsible 有点让人疑惑,对预测"负责"是啥意思。其实没啥特别意思,就是一个Object只由一个grid来进行预测,不要多个grid都抢着预测同一个Object。更具体一点说,就是在设置训练样本的时候,样本中的每个Object归属到且仅归属到一个grid,即便有时Object跨越了几个grid,也仅指定其中一个。

样本:具体就是计算出该Object的bounding box的中心位置,这个中心位置落在哪个grid,该grid对应的输出向量中该对象的类别概率是1(该gird负责预测该对象),所有其它grid对该Object的预测概率设为0(不负责预测该对象),即在30维向量中赋值

还有:YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object.(YOLO预测每个网格单元有多个边界框。 在训练时,我们只希望一个边界框预测变量对每个对象负责) 同样,虽然一个grid中会产生2个bounding box,但我们会选择其中一个作为预测结果,另一个会被忽略。下面构造训练样本的部分会看的更清楚。

④ 可以调整网格数量、bounding box数量
7x7网格,每个网格2个bounding box,对448*448输入图像来说覆盖粒度有点粗。我们也可以设置更多的网格以及更多的bounding box。设网格数量为 SxS,每个网格产生B个边框,网络支持识别C个不同的对象。这时,输出的向量长度为:
在这里插入图片描述
整个输出的tensor就是:
在这里插入图片描述
YOLO选择的参数是 7x7网格,2个bounding box,20种对象,因此 输出向量长度 = 20 + 2 * (4+1) = 30。整个输出的tensor就是 7x7x30。

因为网格和bounding box设置的比较稀疏,所以这个版本的YOLO训练出来后预测的准确率和召回率都不是很理想,后续的v2、v3版本还会改进。当然,因为其速度能够满足实时处理的要求,所以对工业界还是挺有吸引力的。

训练样本(标签)的构造

作为监督学习,我们需要先构造好训练样本,才能让模型从中学习。
在这里插入图片描述
对于一张输入图片,其对应输出的7x7x30的张量(也就是通常监督学习所说的标签y或者label)应该填写什么数据呢。

具体看下30维样本标签向量的填写:

① 20个对象分类的概率

对于输入图像中的每个对象,先找到其中心点。比如上图中的自行车,其中心点在黄色圆点位置,中心点落在黄色网格内,所以这个黄色网格对应的30维向量中,自行车的概率是1,其它对象的概率是0。所有其它48个网格的30维向量中,该自行车的概率都是0。这就是所谓的"中心点所在的网格对预测该对象负责"。狗和汽车的分类概率也是同样的方法填写。

② 2个bounding box的位置

训练样本的bounding box位置应该填写对象实际的bounding box,但一个对象对应了2个bounding box,该填哪一个呢?上面讨论过,需要**根据网络输出的bounding box与对象实际bounding box的IOU来选择**,所以要在训练过程中动态决定到底填哪一个bounding box。参考下面第③点。

③ 2个bounding box的置信度

上面讨论过置信度公式
在这里插入图片描述
在这里插入图片描述
可以直接计算出来,就是用网络输出的2个bounding box与对象真实GT一起计算出IOU。然后看2个bounding box的IOU,哪个比较大(更接近对象实际的GT),就由哪个bounding box来负责预测该对象是否存在,即该输出的bounding box的
在这里插入图片描述
同时对象真实GT的位置也就填入或放置在该bounding box(前面写入后面)。另一个不负责预测的bounding box的
在这里插入图片描述
总的来说,与对象实际GT最接近的那个bounding box,其
在这里插入图片描述
该网格的其它bounding box的
在这里插入图片描述
举个例子,比如上图中自行车的中心点位于4行3列网格中,所以输出tensor中4行3列位置的30维向量如下图所示。
在这里插入图片描述
训练样本的一个30维向量

即:4行3列网格位置有一辆自行车,它的中心点在这个网格内,它的位置边框是bounding box1所填写的自行车实际边框

注意,图中将自行车的位置放在bounding box1,但实际上是在训练过程中等网络输出以后,比较两个bounding box与自行车实际位置的IOU,自行车的位置(实际bounding box)放置在IOU比较大的那个bounding box(图中假设是bounding box1),且该bounding box的置信度设为1。(这里,“且该bounding box的置信度设为1”应该是“且该bounding box的Pr(object)设为1”,按照前面说法的话,我感觉更应该是计算的confidence=IOU,进行填写

损失函数

损失就是网络实际输出值与样本标签值之间的偏差。
在这里插入图片描述
样本标签与网络实际输出

YOLO给出的损失函数如下:
在这里插入图片描述
在这里插入图片描述即:含object的GT box的confidence=1(个人觉得错了,不是1 ,是上面计算的IOU),不含object的GT box的confidence=0

在这里插入图片描述
总的来说,就是用一个网格的网络输出样本标签的各项内容误差平方和作为一个样本的整体误差。转化成了回归问题
损失函数中的几个项是与输出的30维向量中的内容相对应的。
在这里插入图片描述在这里插入图片描述

训练

YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测。
YOLO的网络结构如下图所示:
在这里插入图片描述
YOLO的最后一层采用线性激活函数,其它层都是Leaky ReLU。训练中采用了drop out和数据增强(data augmentation)来防止过拟合。更多细节请参考原论文。

预测(inference)

训练好的YOLO网络,输入一张图片,将输出一个 7x7x30 的张量(tensor)来表示图片中所有网格包含的对象(概率)以及该对象可能的2个位置(bounding box)和可信程度(置信度)。
为了从中提取出最有可能的那些对象和位置,YOLO采用NMS(Non-maximal suppression,非极大值抑制)算法。

NMS(非极大值抑制)

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

YOLO的NMS计算方法如下。
网络输出的7x7x30的张量,在每一个网格中,对象Ci位于第j个bounding box的得分
在这里插入图片描述
它代表着某个对象Ci存在于第j个bounding box的可能性。

每个网格有:20个对象的概率*2个bounding box的置信度,共40个得分(候选对象)。49个网格共1960个得分。Andrew Ng建议每种对象(每个类别)分别进行NMS,那么每种对象有 1960/20=98 个得分。

NMS步骤如下:
1)设置一个Score的阈值,例如0.2,低于该阈值的候选对象排除掉(即将其Score设为0)
2)遍历每一个对象类别
 2.1)遍历该对象的98个得分
  2.1.1)找到Score最大的那个对象及其bounding box,添加到输出列表
  2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU
  2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)
  2.1.4)如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象
3)输出列表即为预测的对象

小结

YOLO以速度见长,处理速度可以达到45fps,其快速版本(网络较小)甚至可以达到155fps。这得益于其识别和定位合二为一的网络设计,而且这种统一的设计也使得训练和预测可以端到端的进行,非常简便。
不足之处是小对象检测效果不太好(尤其是一些聚集在一起的小对象),对边框的预测准确度不是很高,总体预测精度略低于Fast RCNN。主要是因为网格设置比较稀疏,而且每个网格只预测两个边框,另外Pooling层会丢失一些细节信息,对定位存在影响。由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。

感谢参考:
https://blog.csdn.net/c20081052/article/details/80236015

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值