YOLO算法系列之YOLOv1精讲

目录

YOLOv1网络结构

YOLOv1输入与输出映射

YOLOv1损失函数

坐标损失函数

置信度损失函数

类别损失函数

总结


大家好,我是羽峰,今天要和大家分享的是YOLOv1算法. 本文有文字和视频,感兴趣的话可以看视频,视频在我主页能找到,可能视频讲的更细。

YOLOv1算法是YOLO系列算法的基础,理解YOLOv1可以更好的理解YOLO系列算法。希望通过本文的讲解,能帮助你更好的理解YOLO系列算法。

YOLOv1网络结构

首先我们要理解的是yolo的网络结构,如图1所示,其实网络结构比较简单,就是简单的CNN网络,池化操作,以及全连接网络。我们主要理解输入与输出之间的映射关系,中间网络只是求取这种映射关系的一种工具。网络的输入是448*448*3的一个彩色图像,而网络的输出是7*7*30的多维向量。下面我们将详细的来解释这种映射关系,这种映射关系也是YOLOv1的根本。

                                                                                                 图1 YOLOv1网络结构

YOLOv1输入与输出映射

YOLO的输入与输出如图2所示,左边是一张图片,中间的圆形可看作是目标物体,当图片输入到网络中,YOLOv1首要做的是将图片分成7*7的网格,从中间图像中可以看出,红色代表的是网格,蓝色代表的是目标物体的中心,然后黄色代表的是真实的物体边框。这里有个最重要的一个概念就是:当物体中心落在某个网格中心时,那么这个网格就负责预测这个物体,这是yolov1的一个基础。每个网格预先都会生成两个预测框,这样YOLOv1一共生成7*7*2=98个预测框,相比于faster rcnn 成百上千的预测框来说,YOLO的预测框明显少了很多,这是YOLO非常快速的一个原因。

    每个预测框都会对应一个30维的向量,这30维向量是2*5+20得来的,其中20是20个类别,这里之所以为20,是因为原论文所做的就是对20个物体进行分类。如果我们自己的数据集有n个类别,那么这里的20就可以改为n个类别。然后2代表的是2个边框,因为最开始每个网格会生成两个预测框,而5则代表每个边框中有五个参量,分别是边框的中心坐标(x, y),边框的宽w和高h,还有一个是框的置信度,置信度公式计算如图公式所示,置信度大的那一个预测框就会被选为该网格的预测边框。网络的输出就是7*7*30维的向量,与输入存在一个数学上的映射关系,而中间的yolo网络只是求这个映射关系的一种工具。接下来我们将重点研究一下yolo的损失函数。

                                                                                                      图2 输入与输出的映射关系

YOLOv1损失函数

损失函数大致分为3个部分,第一个是坐标的预测,分别是边框的x, y, w, h。第二个是物体的置信度预测,第三个是物体的类别预测,损失函数与7*7*30维的向量相对应,是求取输入与输出之间映射关系的“数学表达式”。

                                                                                                    图3 YOLOv1的损失函数

坐标损失函数

首先我们看一下坐标损失函数,如图4所示。每个参数的意义如图所示,之所以采用根号来计算物体的长和宽,是因为根号后的大物体的长宽损失与小物体的长宽损失相近,这样整个损失函数不会被大物体所操纵。若不采用根号计算,那么大物体的损失要比小物体损失大很多,那么这个损失函数会对大物体比较准确而忽略了小物体。公式前的系数是一个超参数,这是设置为5,因为物体检测过程中,我们所要检测的物体相对与背景来说要少的很多,所以加入这个超参数是为了平衡“非物体”对结果的影响。

 

                                                                                             图4 坐标损失函数

置信度损失函数

置信度的损失函数如图5所示,每个参数的意义如图所示,这里为什么要加入“非物体”的置信度呢,是因为网络要想学习分类n个物体,那他实际要学n+1个类别,那多出的“1”是背景或者就是真实意义上的非物体,这一类是占有很大一部分比例的,所以必须要学习这一类,才能保证网络的准确性。那这里为什么要在“非物体”的置信度前边加上超参数呢?也是因为我们所检测的目标物体相对于“非物体”是很少的,如果不加入这个超参数,那么“非物体”的置信度损失就会很大,所占权重比较大,这样会导致网络只学习到了“非物体”特征,而忽略了目标物体特征。

                                                                             图5 置信度损失函数

类别损失函数

最后则是类别损失函数,如图6所示,类别损失是一个很粗暴的两个类别做减法,这是YOLOv1不可取的一部分,当然后续就改掉了。

                                                                                         图6 类别损失函数

总结

最后我们来做个总结,YOLO的优点就是速度快,YOLOv1缺点也很明显,

  1. 对拥挤物体检测不太好:因为拥挤物体的中心有可能都落在一个网格中心,那么这个网格可能就要预测两个物体,这是很不好的。

  2. 对小物体检测效果不好,小物体损失虽然使用的超参数或者根号进行了平衡,但小物体的损失占比还是小,网络主要学习的还是大物体特征。

  3. 对非常规的物体形状或者比例,检测效果不好

  4. 没有batch normalize.

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
YOLOv1(You Only Look Once)是一种经典的目标检测算法,其网络结构图可以分为两部分:特征提取部分和检测部分。 首先,特征提取部分采用了一个卷积神经网络(CNN)作为主干网络,用于从输入图像中提取特征。该网络主要由24个卷积层和2个全连接层组成,通过一系列卷积和池化操作,逐渐将输入图像的维度降低,并提取出图像的高层次特征。特征提取部分的输出是一个固定大小的特征图,包含了输入图像中的目标信息。 其次,检测部分将特征提取部分的输出特征图作为输入,并使用一个全连接层将其转换为固定长度的向量表示。这个向量表示包含了图像中所有目标的位置信息和类别信息。为了检测不同尺度的目标,YOLOv1在特征图上采用了不同大小的感受野(receptive field),例如使用1x1和3x3的卷积核来捕捉不同大小的目标。此外,为了提高检测准确性,还在特征提取部分的某些层添加了跳跃连接(skip connection),将低层次和高层次的特征进行融合。 最后,通过对检测部分输出的向量进行解码,可以得到目标的位置和类别。YOLOv1使用了一个锚框(anchor box)的概念,将目标的位置表示为相对于锚框的偏移量,并通过回归预测目标的宽度和高度。同时,使用softmax函数对目标的类别进行预测,并根据预测得分进行筛选和定位。 总的来说,YOLOv1网络结构图简洁高效,通过将目标检测问题转化为回归和分类任务,实现了实时目标检测,并在各个评价指标上取得了很好的性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽峰码字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值