YOLO V1原理详解

简介: YOLO V1原理详解

d1d4b32e72c64dada21c48c2bd6b470b.pngYOLO系列是=一阶段目标检测算法(其中YOLO v1—YOLO v5基于Anchor based,从YOLO v6开始基于Anchor Free)。与以Faster R-CNN为代表的二阶段算法相比,一阶段算法不需要region proposal阶段,直接产生物体的类别概率和位置坐标值。

因此,一阶段算法有更快的检测速度。但是一个网格(grid)只预测有限个bbox,覆盖率较低,精度相较于二阶段算法较低。

YOLO V1是该系列的基础,更高的网络皆由此做出改变,下面对YOLO V1进行总结:

✨1 网络结构

YOLO v1将图像划分成多个网格,然后为每一个网格同时预测边界框并给出相应概率(一个全卷积神经网络端到端实现检测物体)。

网络结构如图所示:

72d4d7649cf047e2a5710026b8c40cd7.png

图1 网络结构

其中输入维度是448x448x3,输出7x7x30的特征图。具体结构件上图。

该网络中,存在参数量来十分巨大的问题。使用卷积实现7x7x1024维度到4096维度过程中,产生的参数量十分巨大。因此事实上作者是在中间加一层,使维度先由7x7x1024变化为256x1,最终形成4096x1。但是这样维度仍然很大,该问题在yolo v1中并没有得到解决。

✨2 检测原理

d1d4b32e72c64dada21c48c2bd6b470b.png

🐬2.1 网络输出

上图中,经过网络输出维度是7x7x30。相信很多人不明白这是如何来的和这代表着什么。

首先,7x7由原图448下采样64倍得到,代表着将图像7x7等分。接下来,我们会在7x7个得到每个网格中同时预测边界框并给出相应概率。

30是候选框的预测参数(20+2*(4+1):20代表类别数量,(这里以Pasical Voc数据集为例,该数据集共20个类别)。每个网格预测2个bounding bbox,每个bounding bbox包含一个置信度C,一个矩形框参数(Cx, Cy, w, h)

💫 2.1.1 置信度C

置信度C分为两部分:

  1. 边界框是否含有目标,如果有Pr(Object)=1,如果没有为Pr(Object)=0。
  2. 边界框的准确定,这部分计算与真实框之间的IOU。

最终置信度C将两部分结合,公式如下:

🚵‍♀️ 2.1.2 矩形框参数

8e6ad3624a2a46b889dc246676b1b5dc.png

==C_x和C_y==是中心点相对网格的偏移,一般在0-1之间。 如果==w和h==采用原图中物体框的宽和高,那肯定远远大于1,这样在训练计算损失时,会导致计算C_x,C_y和w,h两部分差异过大。因此,我们取w和h为==原图中物体框的宽和高与原图宽和高的比==,公式如下:

🐬2.2 流程

测试时:

  1. 每个预测框根据类别置信度选取值最大的那个类别作为其预测标签,设置其值为Pr(class)
  2. 根据矩形框参数计算每一个bbox的位置(此时共有7x7x2=98个bbox)(边界框回归
  3. 计算每个bbox的score:

060c5e7493534261b9639c8396806fb8.png

  1. 设置阈值,将小于该阈值的score排除。
  2. 对剩下的预测框进行nms处理(单独总结),得到结果

训练与预测不同,只需要根据预测的参数计算损失即可:

  1. 利用网络输出的特征图找到正样本和负样本。
  2. 利用正样本和负样本参数计算置信度损失、类别损失和边界框回归损失(负样本只参与置信度损失)

👻 2.3 边界框回归

假设有一个预测框K,其预测的置信度为C,矩形框参数,我们的目的是将预测参数映射成原图中bbox的坐标。

中心坐标计算公式:

9605acfab2bd4e27bcfae8131f78c4a5.png

其中,, 如图3所示, stride是特征图相对于原图的下采样倍率

宽和高计算公式:

其中是原图的宽和高。

✨3 损失函数

最后,再介绍一下损失函数,公式如下:

36f8684d69624dfab957f77deaf6aa18.png

第一个是中心坐标误差,第二个高宽误差,第三个是包含目标的边界框的置信度误差,第四个是不包含目标的边界框的置信度误差,第五个是包含目标单元格的分类误差项。

所有的误差都采用均方差,但是不同的误差权重不同,如第一项和第二项的定位误差权重为5,第三项和第四项的置信度误差权重为0.5。

❤️ 3.1 中心坐标误差和高宽误差

其中代表第i个单元格的第j个预测的bbox存在该目标。

同时我们注意到这里的w和h都是带根号,这是因为较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测。

=====================================================================

Pasical Voc中,训练集标注的是原图中检测物体的位置(xmin, ymin, xmax, ymax),与损失函数需要的不符,需要进行处理:

将(xmin, ymin, xmax, ymax)转化为center_x, center_y, w, h

ba18d08a94a247bc894fe4375251723d.png

原图中心点映射到特征图中

  1. 计算偏差,得到与矩形框参数对应的参数Cx, Cy
  2. 计算与矩形框对应的参数w和h:
  3. =====================================================================

🎄3.2 置信度误差

第三项是包含目标的边界框的置信度误差,很多地方说是预测框与真实框计算的IOU,但这这应该是从训练集label中生成的,感觉有些问题。

这里猜测是1,使我们预测的可以在优化中不断趋近1。

第四项是不包含目标的边界框的置信度误差,是0,使后面预测的趋近于0。

🍕3.3 包含目标单元格的分类误差项

第五项是包含目标单元格的分类误差项,其中为目标真实分类,是预测分类。

🥓 4 YOLO v1不足

  1. 当某个框内存在两个物体,预测结果只能存在一个。
  2. 精度较低,尤其对小目标预测效果差。
  3. 参数量大
  4. 没有采用BN层来防止梯度消失和梯度爆炸的问题
  5. 线性输出器可能导致输出的C_x, C_y不满足属于0到1的条件,或w和h不满足大于0的条件。
相关文章
|
机器学习/深度学习 编解码 算法
【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)
【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)
2191 0
【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)
|
机器学习/深度学习 人工智能 自然语言处理
视觉 注意力机制——通道注意力、空间注意力、自注意力
本文介绍注意力机制的概念和基本原理,并站在计算机视觉CV角度,进一步介绍通道注意力、空间注意力、混合注意力、自注意力等。
12683 58
|
数据处理 开发工具 git
coco2017数据集转换为yolo格式(记录过程)
最近做一个yolov5的落地应用项目,用的anylabeling打标,需要将coco2017的数据集转为yolo格式,故写下记录过程!
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
PyTorch基础之网络模块torch.nn中函数和模板类的使用详解(附源码)
1337 0
|
机器学习/深度学习 编解码 算法
yolo原理系列——yolov1--yolov5详细解释
yolo原理系列——yolov1--yolov5详细解释
1702 0
yolo原理系列——yolov1--yolov5详细解释
|
机器学习/深度学习 算法 计算机视觉
深度学习目标检测系列:一文弄懂YOLO算法|附Python源码
本文是目标检测系列文章——YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣。
53181 0
|
机器学习/深度学习 算法 数据挖掘
YOLO系列算法全家桶——YOLOv1-YOLOv9详细介绍 !!(一)
YOLO系列算法全家桶——YOLOv1-YOLOv9详细介绍 !!(一)
2353 1
|
9月前
|
机器学习/深度学习 资源调度 算法
YOLOv11改进策略【损失函数篇】| 引入Soft-NMS,提升密集遮挡场景检测精度,包括GIoU-NMS、DIoU-NMS、CIoU-NMS、SIoU-NMS、 EIou-NMS
YOLOv11改进策略【损失函数篇】| 引入Soft-NMS,提升密集遮挡场景检测精度,包括GIoU-NMS、DIoU-NMS、CIoU-NMS、SIoU-NMS、 EIou-NMS
3476 6
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
20263 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
10月前
|
机器学习/深度学习 算法 前端开发
图解前向、反向传播算法,一看就懂!
前向传播是神经网络中信息从输入层经过隐藏层传递到输出层的过程。每个神经元接收前一层的输出,通过加权求和和激活函数处理后传递给下一层,最终生成预测结果。此过程涉及输入信号、加权求和、激活函数应用等步骤。前向传播用于生成预测结果,在训练阶段与真实标签比较以计算损失函数,并在推理阶段直接生成预测值。反向传播则利用链式法则计算损失函数相对于权重的梯度,调整参数以减小误差,从而优化模型性能。两者结合实现神经网络的有效训练和预测。