YOLOv1学习笔记

YOLOv1学习笔记

我理解的YOLOv1是这样的,就是先用一个卷积网络+两层全连接层,最终生成一个7x7x30的tensor,之后计算置信度之类的都是在损失函数中完成的。网络最终输出的rensor,你只要知道代表的是什么含义就可以,之后在损失函数中,直接拿这个来计算损失,最后使得网络收敛就可以。
那么在预测阶段的时候,相当于网络已经训练好了,输出的7x7x30的tensor就能够满足我们的要求了,直接取出对应的量,来进行NMS等一系列操作就可以,最终就的到预测的结果了。

置信度的概念

置信度是这样来算的:如果当前网格中存在对象,那么他的概率pr(object)=1,否则为0。然后计算实际物体的框和预测框的交并比。
置信度=pr(object)*交并比。
这个置信度有两重含义:
1.网络预测出的一个框中,对于框内是否有物体的自信程度
2.网络预测

网络最后的输出为什么是7x7x30

首先7x7表示的是把整张图片分成了7个方格。
30=(4+1)x2 x20
4:表示需要回归的矩形框的信息(x,y,w,h,c) ,其中x是中心横坐标,y是中心纵坐标,w、h分别是宽和高
+1:c表示的是置信度。 就是上面的c
x2:表示每个方格分别回归两个矩形框。 这里是作者设置的,可以自己调,
x20:表示一共有20个类别。
这里20个类别,实际上是20个类别的条件概率,pr(C1|object),然后每个框还有一个置信度信息,如果这个框有物体,就为1X交并比,没有就是0,所以最终每个物体的概率是,pr(C1|object)X置信度。得到的这个概率就是说,该方块有物体,并且是C1类别的概率。
最后每个方格输出置信度大的那个回归框,即每个方格只能预测一个物体。也就是说当方格数目设置为7x7的时候,一共能够输出7x7=49个物体。
注意,这也导致该算法有一个 缺点,如果有多个比较小的物体落到同一个方格中,最终只能识别出其中的一个物体。

如何用全连接层生成最后7x7x30的输出张量

首先,原文是直接将卷积之后的张量展开,接着加上了一个4096个神经元的全连接层。这个全连接层后面跟着的是一个有7x7x30个神经元的全连接层,

损失函数的设计

YOLOv1学习笔记_第1张图片
在计算损失的时候,只计算负责预测目标的cell的损失。首先在制作训练集的target时候,首先判断实际的框落在了哪个grid_cell中,接着就给这个grid_cell填充信息(x,y,w,h,c(也就是1)),然后原文中一个cell负责产生两个预测框(可以改),填充数据的时候,这两个预测框的坐标位置信息填充一样的,也就是负责预测的cell,生成一个30维度的向量。第0-4以及5-9这五个数字是一样的,后面20个数字分别代表每种类别的概率,也就是有一个是1,剩下的19个全是0。不负责预测物体的cell里面全部置为0。

然后针对预测数据,一个cell负责产生两个预测框,那么这两个预测框用哪一个来计算损失呢?首先计算一下这两个预测框和实际的框的交并比,用交并比大的那个来进行损失的计算。

注意:这里不管是pred还是target,tensor中的每个数字都是0-1。
针对概率很好理解,对于那些坐标数据(x,y,w,h)就是除以图片对应的宽和高。置信度直接值为1。

在训练过程中

在训练过程中,如果一个物体的框(训练前人工标出来的)的中心落到哪一个cell里面,就用这个cell来预测这个物体。也就是说在计算损失函数的时候,用这个框的boundingbox来回归真实的物体的框。

在推理阶段使用非极大值抑制的方式

由以上分析可以的得知,论文原文中最终预测一张图片会生成7x7x2个预测框。这些框中,有很多重叠的部分,那么怎样去除重叠部分,并且找到最合适的框呢?
用到了NMS算法。

NMS算法

对于YOLOv1来说,一共生成了98个预测框。一共有20个类别,按照类别来。
假设第一个类别是猫,首先设置一个阈值,比如说阈值小于0.2的,我们全部认为这个框预测的不是猫,就将猫的预测概率置为0。接着将所有的预测框按照预测出猫的概率大小降序排列,选择选择是猫概率最大的那个框,用其他的框和这个计算交并比。这里可以设置一个阈值,注意,这个阈值设置的越小,相当于检测越严格,就是说你这个框和我选择的这个猫概率最大的框有一点点粘连,就认为你和我预测的是同一只猫。如果计算出的交并比,比设定的阈值大,那么就将这个框所预测的猫的概率置为0。这样循环一轮后,重新按照猫的概率降序排列,用预测猫的概率第二大的框来重复以上操作。这样一直循环下去,指导最后一个框。
接着按照下一个类别进行以上操作,一会循环下去,指导遍历完所有的类别。
这样得到的7730的向量中,会有很多的0,接下来取出每个预测框中概率最大的那一个,并且将这个框在图中画出来,并且标签打上概率最大的那个标签。如有遇到boundingbox的概率全是0,那么就直接跳过这个,这样就完成了推理阶段。

总结

YOLOv1最大的贡献就是实现了端到端的训练过程。但是也有一个致命的问题,就是针对多个小目标聚集的情况下,无法处理。
试想一下,如果有两个小目标的框,他们的中心点都落在了同一个cell里面,那么你这个cell怎么的target怎么整?只能是填充一个目标的数据,也就是说按照目前的规则,他是只能预测两个物体中的一个。这是他最大的一个缺点。

你可能感兴趣的:(学习,深度学习,人工智能)