系列文章地址
YOLO系列基础(一)卷积神经网络原理详解与基础层级结构说明-CSDN博客
YOLO系列基础(二)Bottleneck瓶颈层原理详解-CSDN博客
YOLO系列基础(三)从ResNet残差网络到C3层-CSDN博客
YOLO系列基础(四)归一化层(BN层)的前世今生!-CSDN博客
YOLO系列基础(五)从神经元共适应性到模型Dropout层-CSDN博客
YOLO系列基础(六)YOLOv1原理详解原理如此清晰-CSDN博客
目录
背景
随着YOLOv11版本的发布,YOLO算法在视觉检测领域独领风骚,本系列旨在从小白出发,给大家讲解清楚视觉检测算法的前世今生,并讲清楚YOLOv11版本算法的所有模块功能!
经过前面几个栏目的学习与掌握,我们已经具备理解和掌握YOLOv1的基本能力。今天,我们来精讲YOLOv1的原理!
YOLOv1的网络结构
YOLOv1网络结构图
YOLOv1的网络结构图很简单,主要的需要注意的点如下:
- 输入图像大小为448*448。
- 经过若干个卷积层与池化(具体是24个卷积层和4个最大池化层),变为7*7*1024张量(图一中倒数第三个立方体)。
- 最后经过两层全连接层,输出张量维度为7*7*30。
- 在第一个连接层之后,还有一层dropout层,其丢弃率设置为0.5。
- 除了最后一层使用了线性激活函数外,其余层的激活函数为Leaky ReLU 。
这就是Yolo v1的整个神经网络结构。没有BN层等后续复杂的层级结构,在那个年代,神经网络还很清晰单纯......
下图为整个结构图的说明解释,官方给的图有点容易让人混淆了,特别是上面的立方体和下面的层不对应......也是有点无语了......
YOLOv1原理的高层级理解
如果一上来就把原理揉碎了开始长篇大论,个人感觉效果会很不好,听者也会云里雾里。所以我们先从YOLOv1的高层级理解开始,先给自己一个大致的感觉~
YOLOv1网络将输入的图片resize成480*480之后,再把这个图片分割为7*7的格网(也称grid_cell),如下图所示。想必大家都已经看腻下面的图片了吧(笑)。在代码中,下图的 S = 7。
在该图片中,假设我们需要检测狗、自行车、和白车。我人工标注了一下三个检测框和中心点。白色框框选狗,白色小圆圈标记框的中心点,以此类推......
YOLO算法流程
- 首先获取每一个检测框的中心点,也就是上图中的白色、红色、蓝色圆圈坐标。
- 获取到坐标之后,该坐标点对应的grid_cell(也就是对应的格子)就需要负责该类别的检测,一共需要获取三个内容(中心点坐标、检测框坐标、类别ID)
- YOLO的训练策略为:非中心点所在的cell需要极力让自己格子内检测框的置信度C降低,中心点所在的cell则需要让自己的检测框的置信度上升、中心点的坐标和检测框的IoU要极力去拟合,当然还有类别的概率。
也就是说,无论是检测中心点还是检测框,都是由中心点所在的cell来预测的,和其他的cell没有任何关系。但是每个cell都需要进行中心点、检测框、类别的预测,然后在训练过程中,将预测置信度不断提高(有物体) or 降低(无物体)!
显然,以cell为检测单位,导致每一个cell仅能针对一个类别进行预测,若两个类别的中心点位同一个cell,那么YOLOv1就会直接开摆~
有了上诉的一些概念,我们进行原理详解与论文精读
YOLOv1原理详解
传统的视觉识别算法分两步走:
- 检测中心和检测框的回归问题
- 目标对象的分类问题
在YOLO中,我们把对象的分类问题也看成回归问题去解决,使得整个网络大为精简(端到端直接全部输出类别、检测框......)
YOLOv1网格详解
我们已知YOLO会将输入图像分成S×S(其中S=7)的网格,如果一个物体的中心点落入到一个cell中,那么该cell就要负责预测该物体,一个格子只能预测一个物体,并生成B个检测框(其中B=2,意味着每次检测都会尝试两次)。
针对每一个grid_cell
- 我们会输出B个(B=2)检测框,大小、高度都无所谓,但是检测框的中心点坐标一定是落于该cell内的
- 我们针对每一个检测框,都会输出检测框的置信度,代表该处存在物体的可能性以及IoU
注意,每一个检测框的置信度是由该处存在物体的可能性和检测框的IoU决定的,公式如下:
:表示预测框内存在物体的概率
:表示预测框与真实框之间的交并比。
- 所以每个检测框包含5个元素(x,y,w,h,c)分别代表中心点坐标(x,y),检测框大小(w,h)以及置信度。每个格子一共两个检测框,所以一共有10个值输出。
图例如下
注意,上面的x,y,w,h均是归一化到(0,1)的值,和整个图像大小之间进行归一化。有的博主认为中心点坐标xy是和网格cell之间的偏移量进行归一化,但是私以为,应该还是和原图像进行的归一化。
(若有错漏请指正
输出结构内容详解
我们已知YOLOv1的输出结构为7*7*30,这里的7*7指的是输出特征的大小,是由原图像(480*480)通过4层最大池化层和一层卷积层(步长均为2)来进行缩减的,也就是说每一个格子,对应64*64的原像素区域。
在YOLOv1的官方示例中,官方采用了20种标签来进行训练。由于YOLOv1采用回归的方式解决分类问题,所以输出的结果还有该网格中所有类别的分类置信度(一共20个)。
所以输出结构就很清晰了:
- 7*7代表7*7的格子
- 30代表两个检测框的(x,y,w,h,c)和20个类别的分类置信度
举个例子,以下就是30的含义:
| 第一个检测框 ||||| 第二个检测框 ||||| 所有类别的置信度 |||||
x1 | y1 | w1 | h1 | c1 | x2 | y2 | w2 | h2 | c2 | cls1 | cls2 | ...... | cls19 | cls20 |
---|
至此,YOLOv1的输出结构已经说明完毕。
到此为止,YOLOv1的网络结构都已经解构完成,我们只缺损失值的计算。
YOLOv1损失函数详解
直接先给出YOLOv1损失函数!
看着头晕晕?没关系,其实很简单!我们一行行来:
第一行损失函数详解
这一行主要是针对中心点进行差距损失的计算。
- 其中(等于5)是一个参数,暂时没啥特别的(后面详解)
- 用以遍历所有的格子
- 用以遍历每一个格子中的检测框
以我们普遍的理念看来,假设我们需要针对中心点进行拟合,我们能想出来的损失函数应当如下所示:
这是我们好理解的,可是剩下的 是个什么东西??
- 这表明在第 i 个格子存在待测物体的中心点。
- 且单元i中的第j个边界框预测器"负责"该预测。
这个部分最重要的就是确保该检测框正确召回了物体!也就是说确保该检测框检测出了待测物体,尽管可能IOU不高、类别不精准。
大家可以想象,若没有这个条件约束,后面的计算就毫无意义。
第二行损失函数详解
简单,和第一行一样,这次计算的是检测框宽和高的损失。
第三、四行损失函数详解
此为检测框置信度的损失值计算,但是这里出现了 和 这是为什么呢?实际上,和上面的含义刚好相反,表示该检测框成功召回了物体,则表示该检测框没有召回物体。显然这里的损失函数的两面的:
- 针对成功召回的检测框,我们需要计算检测框和目标检测框的IOU之间的差距来表示损失值。
- 针对没有召回的检测框,此时的目标置信度为0,我们需要将这些失败的检测框的置信度下降。
第五行损失函数详解
显然,这里的意思就是:
遍历所有的检测框,如果检测框内存在目标物体的中心点,则针对该检测框内的分类结果对所有的类别的目标进行损失的计算并求和。
至此YOLOv1的全部内容详解完毕!
总结
YOLOv1虽然已经是将近10年前的算法了,但是作为目标检测之王的初代版本,依旧有很多可以学习和借鉴的内容,实际上,博主光是准备此篇博客就花费了整整两天的时间。恳请广大读者不要吝啬手中的点赞哦!