【绝对有用】yolo系列目标检测 核心技术点 汇总

news2024/12/23 15:45:09

YOLO (You Only Look Once) 是一种高效的目标检测算法,它以速度和精度著称。YOLO 的工作原理是将目标检测视为一个回归问题,直接从图像的像素空间预测目标的类别和位置。YOLO 目标检测头包括以下几个关键部分:

  1. 输入图像处理

    • YOLO 接受大小固定的输入图像(如 416x416 或 608x608)。
    • 输入图像会被分成一个 SxS 的网格(如 13x13, 19x19)。
  2. 特征提取器

    • 通常使用一个卷积神经网络(如 Darknet)来提取图像的特征。
    • 特征提取器的输出是一个特征图,该特征图的尺寸比输入图像小得多,但保留了图像中的关键信息。
  3. 检测头

    • 检测头的输入是特征提取器的输出特征图。
    • 每个网格单元预测 B 个边界框,每个边界框由 5 个参数(x, y, w, h, confidence)和 C 个类别概率组成。
      • x 和 y 是边界框中心相对于网格单元的位置。
      • w 和 h 是边界框的宽度和高度,相对于整个图像。
      • confidence 是边界框中包含目标的置信度。
      • C 个类别概率用于表示该边界框属于每个类别的概率。
    • 因此,检测头的输出尺寸为 SxSx(B*(5+C))。
  4. 损失函数

    • YOLO 的损失函数包括三个部分:
      • 位置损失(Localization Loss):预测的边界框与真实边界框之间的差异。
      • 置信度损失(Confidence Loss):预测的置信度与实际是否包含目标的差异。
      • 分类损失(Classification Loss):预测的类别概率与实际类别的差异。
  5. 非极大值抑制(NMS)

    • YOLO 可能会产生多个重叠的边界框,为了去除冗余,使用非极大值抑制(NMS)来过滤掉置信度较低的框,保留置信度最高的框。

具体细节如下:

  1. 输入图像处理

    • 图像被调整到一个固定的大小,并标准化处理。
    • 图像被划分为 SxS 的网格,每个网格单元负责检测一个特定区域内的目标。
  2. 特征提取器(例如 Darknet-53)

    • 由一系列的卷积层、池化层和激活函数(如 ReLU 或 Leaky ReLU)组成。
    • 输出一个特征图,这个特征图包含了图像的空间特征。
  3. 检测头

    • 在 YOLOv3 中,使用了多尺度检测,分别在三个不同的尺度上进行预测。
    • 每个尺度的检测头会输出不同大小的特征图(例如 13x13、26x26、52x52),每个特征图的每个单元预测多个边界框。
  4. 边界框预测

    • 每个网格单元预测 B 个边界框,每个边界框包含 4 个位置参数(tx, ty, tw, th)、1 个置信度、以及 C 个类别概率。
    • 使用以下公式将网络的输出转换为实际边界框坐标:
      • bx = σ(tx) + cx
      • by = σ(ty) + cy
      • bw = pw * e^tw
      • bh = ph * e^th
      • 其中 (cx, cy) 是网格单元的左上角坐标,pw 和 ph 是预测框的预设宽度和高度。
  5. 损失函数

    • YOLO 的损失函数由位置误差、置信度误差和分类误差组成。
    • 使用均方误差(MSE)计算位置误差。
    • 使用交叉熵损失(Cross-Entropy Loss)计算分类误差。
  6. 后处理(如非极大值抑制)

    • 通过非极大值抑制(NMS)去除冗余的边界框,只保留最可信的检测结果。

以上是 YOLO 目标检测头的详细解析,如果你有更具体的问题或需要进一步的细节,可以继续提问。


YOLO检测头的输出尺寸为SxSx(B(5+C))。这是通过分析YOLO的设计和预测目标检测框的方式得出的。下面是详细的解释:*

  1. 网格划分(Grid Division)

    • 输入图像被划分为一个SxS的网格。例如,假设输入图像大小为 416x416,YOLO可能会将其划分为一个 13x13 或 19x19 的网格。
    • 每个网格单元负责预测该单元内是否有目标,以及目标的具体信息。
  2. 每个网格单元的预测

    • 每个网格单元预测 ( B ) 个边界框。典型的值为 ( B = 2 ) 或 ( B = 3 )。
    • 每个边界框包含5个预测参数和C个类别概率。
  3. 边界框参数

    • 5个预测参数分别为:
      • ( x ) 和 ( y ):边界框中心相对于网格单元的位置偏移。
      • ( w ) 和 ( h ):边界框的宽度和高度,相对于整个图像的比例。
      • ( confidence ):该边界框包含目标的置信度。
  4. 类别概率

    • 每个边界框预测C个类别概率,即该框属于每个类别的概率分布。
    • 因此,对于每个边界框,我们需要预测 ( 5 + C ) 个值。
  5. 总输出

    • 对于每个网格单元,预测 ( B ) 个边界框,每个边界框包含 ( 5 + C ) 个值。
    • 因此,每个网格单元的输出尺寸为 ( B x (5 + C) )。

将这些结合起来,整个输出特征图的尺寸为 SxSx(B*(5+C))。

具体例子

假设我们使用YOLOv3,输入图像被划分为 13x13 的网格,B=3,C=80(例如在COCO数据集上):

  1. 网格划分

    • ( S = 13 ),输入图像被划分为 13x13 的网格。
  2. 每个网格单元的预测

    • 每个网格单元预测3个边界框。
    • 每个边界框包含 ( 5 + 80 ) 个值(x, y, w, h, confidence + 80个类别概率)。
  3. 总输出

    • 每个网格单元的输出尺寸为 ( 3 x (5 + 80) = 3 x 85 = 255 )。
    • 因此,整个输出特征图的尺寸为 ( 13 x 13 x 255 )。

YOLO检测头的输出尺寸为 ( S x Sx (B x (5 + C)) ) 是通过考虑每个网格单元的预测边界框数量、每个边界框的参数数量以及类别数量计算得出的。这种设计使得YOLO能够在单次前向传递中完成目标检测。


在YOLO中,边界框预测是通过将网络的输出转换为实际的边界框坐标来实现的。以下是详细的解释和一个例子:

详细解释

  1. 输出预测

    • 每个网格单元预测B个边界框,每个边界框包含4个位置参数(( t_x, t_y, t_w, t_h ))、1个置信度、以及C个类别概率。
    • ( t_x ) 和 ( t_y ) 是相对于网格单元左上角的偏移,范围在0到1之间。
    • ( t_w ) 和 ( t_h ) 是边界框宽度和高度的对数尺度。
  2. 转换公式

    • 将网络输出的4个位置参数转换为实际的边界框坐标。
    • ( b_x = S(t_x) + c_x ):边界框中心的x坐标。( S) 是sigmoid函数,将输出限制在0到1之间。( c_x ) 是网格单元左上角的x坐标。
    • ( b_y = S(t_y) + c_y ):边界框中心的y坐标。( c_y ) 是网格单元左上角的y坐标。
    • ( b_w = p_w x e^{t_w} ):边界框的宽度。( p_w ) 是预设的宽度锚点。
    • ( b_h = p_h x e^{t_h} ):边界框的高度。( p_h ) 是预设的高度锚点。

举例

假设我们有一个13x13的网格,输入图像大小为416x416,使用了3个边界框预测(B=3),每个边界框的锚点宽度和高度分别为(pw, ph)。

  1. 假设网格单元 (i, j)

    • 该网格单元的左上角坐标为 (i, j)。
    • 假设 i=5, j=7,那么 ( c_x = 5 ), ( c_y = 7 )。
  2. 预测参数

    • 网络输出的预测参数 ( t_x = 0.5 ), ( t_y = 0.6 ), ( t_w = -0.2 ), ( t_h = 0.3 )。
    • 锚点宽度和高度分别为 ( p_w = 1.2 ), ( p_h = 1.8 )。
  3. 转换实际边界框坐标
    在这里插入图片描述

  4. 实际边界框坐标

    • 边界框中心坐标: ( (5.622, 7.645) )
    • 边界框宽度和高度: ( (0.982, 2.428) )

解释关键点

  • Sigmoid函数:用来将 ( t_x ) 和 ( t_y ) 的输出值限制在0到1之间,这样它们可以表示相对于网格单元的偏移量。
  • 指数函数:用来将 ( t_w ) 和 ( t_h ) 的对数尺度转换为实际的边界框宽度和高度,锚点宽度和高度是预设的,表示预测框的基本尺度。

完整公式

在这里插入图片描述

通过这些公式,YOLO可以将网络输出的预测参数转换为实际的边界框坐标,用于目标检测。


YOLO 的损失函数由三个主要部分组成:位置损失(Localization Loss)、置信度损失(Confidence Loss)和分类损失(Classification Loss)。以下是每个部分的详细解释及举例:

1. 位置损失(Localization Loss)

在这里插入图片描述

2. 置信度损失(Confidence Loss)

在这里插入图片描述

3. 分类损失(Classification Loss)

在这里插入图片描述

损失函数的总和

总损失函数是位置损失、置信度损失和分类损失的总和。

在这里插入图片描述

举例

假设一个13x13的网格,B=2,C=3(例如3个类别:猫、狗、鸟)。输入图像大小为416x416,锚点宽度和高度分别为(pw, ph)。

假设:
  • 真值(ground truth)边界框中心点 (bx_gt, by_gt) = (5.5, 7.2),宽度和高度 (bw_gt, bh_gt) = (2.0, 3.0),类别为猫(类别索引0)。
  • 预测边界框中心点 (bx, by) = (5.6, 7.1),宽度和高度 (bw, bh) = (2.1, 2.9),置信度 = 0.8,类别概率 [0.7, 0.2, 0.1](分别对应猫、狗、鸟)。
位置损失:

在这里插入图片描述

置信度损失:

在这里插入图片描述

分类损失:

在这里插入图片描述

总损失:

在这里插入图片描述

通过这些计算,可以看到如何从YOLO的预测结果和真值计算出总损失。这些损失会用于反向传播,以优化YOLO网络的参数,使得模型预测的边界框和类别越来越准确。


非极大值抑制(NMS)是一种在目标检测中常用的后处理技术,用于去除多余的检测框。YOLO 在预测过程中,可能会生成多个重叠的边界框,这些边界框可能会对同一个目标进行多次检测。NMS 的目标是通过保留置信度最高的边界框,去除那些冗余的、置信度较低的边界框,从而精简检测结果。

NMS 的工作原理

  1. 输入

    • 一组边界框,每个边界框包括坐标(x, y, w, h)和一个置信度分数。
  2. 步骤

    1. 按置信度排序:将所有边界框按照置信度分数从高到低排序。
    2. 选取最高置信度框:选取置信度最高的边界框,称之为 A,并将其加入最终的检测结果中。
    3. 计算重叠区域:计算 A 与剩余边界框之间的重叠区域(IoU,Intersection over Union)。
    4. 移除重叠框:移除与 A 的重叠程度超过某一阈值的边界框(例如 IoU > 0.5)。
    5. 重复步骤:从剩余的边界框中再次选取置信度最高的框,并重复上述过程,直到所有的框都处理完毕。
  3. 输出

    • 经过筛选后的边界框集合,每个边界框代表一个独立的目标检测。

举例

假设我们有5个边界框,它们的置信度和坐标如下:

框ID置信度xywh
A0.930405060
B0.832424858
C0.7528385262
D0.61002003040
E0.429395161
步骤1:按置信度排序

排序后的边界框为:A, B, C, D, E

步骤2:选取置信度最高的框A

将边界框A加入最终检测结果中。

步骤3:计算重叠区域(IoU)

计算A与剩余边界框(B, C, D, E)之间的IoU:

  • IoU(A, B)
  • IoU(A, C)
  • IoU(A, D)
  • IoU(A, E)

假设计算的IoU如下:

  • IoU(A, B) = 0.85
  • IoU(A, C) = 0.8
  • IoU(A, D) = 0.0
  • IoU(A, E) = 0.82
步骤4:移除重叠框

设定阈值为0.5,移除IoU超过0.5的框(B, C, E),仅保留框D。

步骤5:重复步骤
  1. 从剩余的框中选取置信度最高的框,即D。
  2. 将D加入最终检测结果中。
  3. D没有与其他框重叠的情况,结束过程。
最终结果

经过NMS后的最终检测结果为:

  • 框A(置信度0.9,坐标[30, 40, 50, 60])
  • 框D(置信度0.6,坐标[100, 200, 30, 40])

代码示例(Python)

下面是一个使用Python实现NMS的简单代码示例:

import numpy as np

def iou(box1, box2):
    x1, y1, w1, h1 = box1
    x2, y2, w2, h2 = box2
    xi1 = max(x1, x2)
    yi1 = max(y1, y2)
    xi2 = min(x1 + w1, x2 + w2)
    yi2 = min(y1 + h1, y2 + h2)
    inter_area = max(0, xi2 - xi1) * max(0, yi2 - yi1)
    box1_area = w1 * h1
    box2_area = w2 * h2
    union_area = box1_area + box2_area - inter_area
    return inter_area / union_area

def non_max_suppression(boxes, scores, iou_threshold):
    idxs = np.argsort(scores)[::-1]
    selected_idxs = []
    while len(idxs) > 0:
        current = idxs[0]
        selected_idxs.append(current)
        idxs = idxs[1:]
        idxs = [i for i in idxs if iou(boxes[current], boxes[i]) < iou_threshold]
    return selected_idxs

# Example usage:
boxes = [[30, 40, 50, 60], [32, 42, 48, 58], [28, 38, 52, 62], [100, 200, 30, 40], [29, 39, 51, 61]]
scores = [0.9, 0.8, 0.75, 0.6, 0.4]
iou_threshold = 0.5

selected_idxs = non_max_suppression(boxes, scores, iou_threshold)
print("Selected boxes after NMS:", [boxes[i] for i in selected_idxs])

总结

非极大值抑制(NMS)通过保留置信度最高的边界框并移除重叠的置信度较低的边界框,有效地去除了冗余检测框,使得目标检测结果更加精简和准确。


下面是iou函数的详细理论计算过程:

Intersection over Union (IoU) 的计算

IoU 是衡量两个边界框重叠区域与它们的联合区域之间比值的一种指标。计算过程分为以下几步:

在这里插入图片描述
在这里插入图片描述

代码详细注释

def iou(box1, box2):
    # 获取第一个边界框的坐标和尺寸
    x1, y1, w1, h1 = box1
    # 获取第二个边界框的坐标和尺寸
    x2, y2, w2, h2 = box2
    
    # 计算交集区域的左上角坐标
    xi1 = max(x1, x2)
    yi1 = max(y1, y2)
    
    # 计算交集区域的右下角坐标
    xi2 = min(x1 + w1, x2 + w2)
    yi2 = min(y1 + h1, y2 + h2)
    
    # 计算交集区域的宽度和高度(确保交集宽高不为负)
    inter_width = max(0, xi2 - xi1)
    inter_height = max(0, yi2 - yi1)
    
    # 计算交集区域的面积
    inter_area = inter_width * inter_height
    
    # 计算两个边界框的面积
    box1_area = w1 * h1
    box2_area = w2 * h2
    
    # 计算联合区域的面积
    union_area = box1_area + box2_area - inter_area
    
    # 计算 IoU(交集面积 / 联合面积)
    return inter_area / union_area

举例

假设有两个边界框:

  • 边界框1:左上角坐标为(2, 3),宽度和高度分别为4和5。
  • 边界框2:左上角坐标为(3, 4),宽度和高度分别为5和6。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

通过这些步骤,我们计算出了两个边界框之间的 IoU 值为约 0.316。这表示两个边界框的重叠区域占它们联合区域的 31.6%。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1870037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

检信智能推出我国首款Allemotion OS基于AI生理心理参数服务开发者平台

检信Allemotion OS生理心理开发者平台是根据世界人工智能高速发展的特点,为实现脑机交互的行业需求&#xff0c;由检信智能推出我国首款检信Allemotion OS生理心理开发者平台。检信Allemotion OS生理心理开发者平台集成了振动影像心理情绪20项情绪参数、11项生理相关参数&#…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的登山之旅01(100分)- 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

【MySQL备份】lvm-snapshot篇

目录 1.简介 1.1.如何工作 1.2.应用场景 1.3.注意事项 1.4.优缺点 2.为什么选择lvm快照备份&#xff1f; 3.创建LVM 3.1.操作流程 3.2.正常安装MySQL后进行备份 3.3.MySQL运行一段时间后进行备份 3.3.1.准备lvm及文件系统//先添加一块磁盘 3.3.2.将数据迁移到LVM …

python API自动化(基于Flask搭建MockServer)

接口Mock的理念与实战场景: 什么是Mock: 在接口中&#xff0c;"mock"通常是指创建一个模拟对象来代替实际的依赖项&#xff0c;以便进行单元测试。当一个类或方法依赖于其他类或组件时&#xff0c;为了测试这个类或方法的功能&#xff0c;我们可以使用模拟对象来替代…

java基于ssm+jsp 大学生校园兼职系统

1前台首页功能模块 大学生校园兼职系统&#xff0c;在大学生校园兼职系统可以查看首页、企业信息、招聘信息、论坛信息、留言反馈、我的、跳转到后台等内容&#xff0c;如图1所示。 图1系统首页界面图 学生登录&#xff0c;通过学生登录填写账号、密码等信息进行登录操作&…

鸿蒙期末项目(完结)

两天仅睡3个小时的努力奋斗之下&#xff0c;终于写完了这个无比拉跨的项目&#xff0c;最后一篇博客总体展示一下本项目运行效果兼测试&#xff0c;随后就是答辩被同学乱沙&#xff08;悲 刚打开软件&#xff0c;会看到如下欢迎界面&#xff0c;介绍本app的功能和优点 随后我们…

服务器部署—虚拟机安装nginx并部署web网页

该篇博客用于讲解Linux的Centos7发行版中如何通过Linux安装Nginx&#xff0c;然后将静态页面部署到Nginx中&#xff0c;通过浏览器访问。 非常适用于新手小白学习项目部署相关的知识。建议收藏&#xff01;&#xff01;&#xff01; 需要大家提前准备好虚拟机和CentOS7操作系统…

智慧公厕系统在办公楼卫生管理中的作用,高效、便捷、智能

在现代化的办公楼中&#xff0c;卫生管理是营造舒适、高效工作环境的重要环节。而智慧公厕系统的引入&#xff0c;正以其高效、便捷、智能的特点&#xff0c;为办公楼的卫生管理带来了革命性的变革。 一、智慧公厕系统首先展现出了令人瞩目的高效性。 传统的公厕管理往往依赖人…

2024年6月17日~2024年6月26日周报

一、前言 在上周主要完成了可变形卷积的学习的部署。 本周&#xff0c;结合前段时间的工作与闵老师的讨论&#xff0c;思考了接下来的一些尝试方向。本周重新在之前的网络上尝试添加可变形卷积v4&#xff0c;或者将可变形卷积v2修改为可变形卷积v4。另外&#xff0c;继续学习了…

LCR 068. 搜索插入位置

给定一个排序的整数数组 nums 和一个整数目标值 target &#xff0c;请在数组中找到 target &#xff0c;并返回其下标。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 思路&#xff1a; 常规的二分查找&am…

充电桩小程序:引领未来,携手共创绿色充电新纪元

着新能源汽车市场的迅猛增长&#xff0c;充电桩行业正迎来前所未有的发展机遇。然而&#xff0c;在这个充满竞争和机遇并存的时代&#xff0c;如何快速、高效地满足用户需求&#xff0c;成为充电桩行业老板们关注的焦点。为此&#xff0c;我们推出了全新的充电桩小程序&#xf…

记录跨度3年的SqlServer数据同步项目分析

目录 技术选型决策阶段 发布订阅 自定义开发 Datax Datax废除主外键关系和自增ID ER模型分组 废掉库表主外键 维度划分Datax任务 基于ID同步 基于TIME时间同步 基于全表ALL同步 废掉自增ID DataX废除主外键关系手动拷贝 手动拷贝 Datax任务分组触发器 Datax全表…

实践案例:使用Jetpack Navigation创建一个新闻应用

在这个实践案例中&#xff0c;我们将使用Jetpack Navigation创建一个简单的新闻应用。这个应用将包含以下功能&#xff1a; 新闻列表页面&#xff1a;显示一组新闻文章。新闻详情页面&#xff1a;显示选定新闻文章的详细信息。用户资料页面&#xff1a;显示用户的资料信息。 …

前端 Array.sort() 源码学习

源码地址 V8源码Array 710行开始为sort()相关 Array.sort()方法是那种排序呢&#xff1f; 去看源码主要是源于这个问题 // In-place QuickSort algorithm. // For short (length < 22) arrays, insertion sort is used for efficiency.源码中的第一句话就回答了我的问题…

Python第三方库GDAL 安装

安装GDAL的方式多种&#xff0c;包括pip、Anaconda、OSGeo4W等。笔者在安装过程中&#xff0c;唯独使用pip安装遇到问题。最终通过轮子文件&#xff08;.whl&#xff09;成功安装。 本文主要介绍如何下载和安装较新版本的GDAL轮子文件。 一、GDAL轮子文件下载 打开Github网站…

【Java Web】Element-plus组件库

目录 一、Element-plus组件库概述 二、Element-plus组件库基本用法 一、Element-plus组件库概述 Element-plus组件库是由饿了么团队基于Vue3框架编写的前端UI设计组件库。通俗点讲就是将用户页面设计所需的按钮、表格、导航栏等前端代码编写生成的组件元素都封装好了、用户在进…

40.设计HOOK引擎的好处

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;39.右键弹出菜单管理游戏列表 以 39.右键弹出菜单管理游戏列表 它的代码为基础进行修改 效果图&#xff1a; 实现步骤&#xff1a; 首…

elk对于集群实例的日志的整合-基于logstash采集日志

说明&#xff1a;基于logstash采集日志 环境&#xff1a; 物理机192.168.31.151 一.启动2个测试实例&#xff0c;每5-10s随机生成一条订单日志 实例一 包位置&#xff1a;/home/logtest/one/log-test-0.0.1-SNAPSHOT.jar 日志位置:/docker/elastic/logstash_ingest_data/l…

《2024年新生代妈妈真实孕育状态洞察报告》

专注于行业分析与市场研究的专业机构易观分析,正式发布了其最新研究成果——《2024年新生代妈妈真实孕育状态洞察报告》。该报告深入探讨了新生代妈妈在孕育过程中的实际需求与挑战,通过对母婴行业的市场规模、消费行为、用户触媒习惯、用户关怀以及特定品类场景的细致分析,揭示…

easyui的topjui前端框架使用指南

博主今天也是第一次点开easyui的商业搜权页面&#xff0c;之前虽然一直在使用easyui前端框架&#xff08;easyui是我最喜欢的前端ui框架&#xff09;&#xff0c;但是都是使用的免费版。 然后就发现了easyui的开发公司居然基于easyui开发出了一个新的前端框架&#xff0c;于是我…