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--yolov5详细解释
yolo原理系列——yolov1--yolov5详细解释
1253 0
yolo原理系列——yolov1--yolov5详细解释
|
7月前
|
机器学习/深度学习 算法 PyTorch
YOLO如何入门?
YOLO如何入门?
|
4月前
|
机器学习/深度学习 算法 数据挖掘
YOLO系列算法
8月更文挑战第13天
|
6月前
|
存储 API 计算机视觉
实战|YOLOv10 自定义目标检测
实战|YOLOv10 自定义目标检测
288 1
|
6月前
|
机器学习/深度学习 并行计算 算法
YOLO算法
YOLO(You Only Look Once)是一种实时目标检测算法,将目标检测视为回归问题,通过单个CNN模型预测边界框和类别。YOLOv1使用24个卷积层和2个全连接层,将输入图像划分为7x7网格,每个网格预测2个边界框。模型直接从448x448图像输出7x7x30的张量,每个单元负责检测中心在其内的目标。YOLO训练涉及构造训练样本和损失函数,常采用预训练的Backbone(如CSPDarknet53)和数据增强技术。YOLOv4是YOLO系列的改进版,包括SPP和PANet等结构,提升了精度和速度,使用IOU损失函数,并采用CutMix和马赛克数据增强。
|
7月前
|
算法 PyTorch Go
深入解析yolov5,为什么算法都是基于yolov5做改进的?(一)
深入解析yolov5,为什么算法都是基于yolov5做改进的?(一)
|
6月前
|
计算机视觉
实战|基于YOLOv10与MobileSAM实现目标检测与分割【附完整源码】
实战|基于YOLOv10与MobileSAM实现目标检测与分割【附完整源码】
|
7月前
|
机器学习/深度学习 监控 算法
YOLO及其原理介绍
YOLO及其原理介绍
|
7月前
|
算法 文件存储 计算机视觉
【YOLOv8改进】MobileNetV3替换Backbone (论文笔记+引入代码)
YOLO目标检测专栏探讨了MobileNetV3的创新改进,该模型通过硬件感知的NAS和NetAdapt算法优化,适用于手机CPU。引入的新架构包括反转残差结构和线性瓶颈层,提出高效分割解码器LR-ASPP,提升了移动设备上的分类、检测和分割任务性能。MobileNetV3-Large在ImageNet上准确率提升3.2%,延迟降低20%,COCO检测速度增快25%。MobileNetV3-Small则在保持相近延迟下,准确率提高6.6%。此外,还展示了MobileNetV3_InvertedResidual模块的代码实现。
|
机器学习/深度学习 人工智能 计算机视觉
【YOLOv8-seg】实战一:手把手教你使用YOLOv8实现实例分割
【YOLOv8-seg】实战一:手把手教你使用YOLOv8实现实例分割
4166 0
【YOLOv8-seg】实战一:手把手教你使用YOLOv8实现实例分割