(12)YOLOv10算法基本原理

server/2024/12/27 3:08:00/

一、YOLOv10的介绍

目前,由清华大学开源的最新的 YOLOv10,包括从n到x各种型号的模型,其中 YOLOv10n 最小,YOLOv10x 最大,以满足

不同应用场景。

二、YOLOv10的主要贡献

一致的双重分配策略(Consistent Dual Assignments)YOLOv10提出了一种新的训练策略,用于无需非极大值抑制(NMS)的YOLO训练。这种策略结合了一对一(one-to-one)和多对一(one-to-many)的标签分配方式,以提供丰富的训练监督信号,并在推理时保持高效率。

在传统的YOLO系列模型中,通常采用多对一的标签分配策略,即一个真实目标对应多个正样本(anchor boxes)。这种方法虽然能够提供丰富的监督信号,有助于模型性能的提升,但需要依赖非极大值抑制(NMS)来进行后处理,这限制了模型的端到端部署,并增加了推理延迟。

为了解决这个问题,YOLOv10引入了双重标签匹配策略,它包括两个部分:一对多(one-to-many)和一对一(one-to-one)的头部(head)。在训练期间,两个头部一起被优化,其中一对多头部提供丰富的监督信号,而一对一头部则用于标签分配。这样,模型在训练时可以利用一对多头部的丰富监督,而在推理时则只使用一对一头部进行预测,从而避免了NMS的使用。

一致匹配度量(Consistent matching metric)

image-20241213161504788

为了使一对一头部在训练和推理时与一对多头部保持一致,YOLOv10提出了一致匹配度量。这个度量标准使用了一个统一的匹配度量公式,它考虑了分类得分p、预测框与真实框之间的IoU(Intersection over Union)以及空间先验s。通过调整这个匹配度量的参数α和β,可以使得一对一头部的预测与一对多头部的预测更加一致,从而提高模型的推理性能。具体来说,一致匹配度量的公式为:

$$
m(\alpha, \beta) = s \cdot p^\alpha \cdot IoU(\hat{b}, b)^\beta
$$

其中,p 是分类得分,\hat{b}和b分别表示预测框和真实框,s 表示空间先验,\alpha和\beta是平衡分类和定位任务影响的超参数。

一致匹配度量是YOLOv10中的一个重要创新,它通过统一的匹配度量标准,优化了一对一和一对多标签分配策略之间的协调性,减少了训练过程中的监督差距,并提高了模型的端到端性能。

image-20241213155916118

YOLOv10的训练配置中,双重标签分配策略是通过配置文件来实现的。这部分代码定义了模型的头部结构,包括上采样、连接和检测层的配置。以下是配置文件中的一段示例代码:

head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 19 (P4/16-medium)- [-1, 1, SCDown, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)

三、YOLOv10针对的问题

  1. 依赖于非极大值抑制(NMS):当前YOLO模型依赖于NMS进行后处理,这阻碍了YOLO模型的端到端部署,并增加了推理过程的延迟。

  2. 计算冗余YOLO模型中各个组件的设计缺乏全面和彻底的检查,导致了显著的计算冗余,限制了模型的能力,从而导致效率不佳,并有很大的性能提升潜力。

  3. 小目标检测挑战:尽管YOLOv10通过多尺度特征融合技术在小目标检测方面取得了进步,但在极端情况下,如非常小的目标或密集排列的目标,其检测精度仍存在一定的局限性。

四、YOLOv10的改进点:

  1. 一致匹配度量(Consistent Matching Metric):为了减少一对一和多对一头之间的监督差距,YOLOv10引入了一致匹配度量,使得两个头(branch)在训练时能够更加协调。

  2. 轻量级分类头(Lightweight Classification Head)YOLOv10设计了一个轻量级的分类头,以减少分类任务的计算开销,同时保持性能。

  3. 空间-通道解耦下采样(Spatial-Channel Decoupled Downsampling)YOLOv10提出了一种新的下采样方法,将空间缩减和通道增加操作分开进行,以提高信息保留率和性能。

  4. 等级引导的块设计(Rank-Guided Block Design)YOLOv10利用内在秩分析来确定模型中哪些阶段存在冗余,并用更紧凑的架构设计替换这些阶段的基本构建块,以提高效率。

  5. Compact Inverted Block (CIB):CIB 被引入作为 YOLOv10 中的基本构建块,用于提高模型的效率。CIB 结构利用深度卷积(depthwise convolutions)进行空间混合,以及成本效益高的逐点卷积(pointwise convolutions)进行通道混合。

    image-20241213155553695

  6. 大核卷积(Large-Kernel Convolution)YOLOv10在深层阶段使用大核深度卷积来扩大感受野并增强模型能力。YOLOv10在CIB中使用了大核卷积,具体来说,将CIB中的第二个3×3深度卷积的核大小增加到7×7,同时采用结构重参数化技术引入另一个3×3深度卷积分支,以缓解优化问题,而无需推理开销。

  7. 部分自注意力模块(Partial Self-Attention, PSA):为了在保持低成本的同时增强模型性能,YOLOv10提出了一种有效的部分自注意力模块设计。

    image-20241213154917295

    部分自注意力模块 (PSA) 实现YOLOv10在关键区域引入了部分自注意力模块,以下是PSA模块的实现代码:

    class Attention(nn.Module):def __init__(self, dim, num_heads=8, attn_ratio=0.5):super().__init__()self.num_heads = num_headsself.head_dim = dim // num_headsself.key_dim = int(self.head_dim * attn_ratio)self.scale = self.key_dim ** -0.5nh_kd = nh_kd = self.key_dim * num_headsh = dim + nh_kd * 2self.qkv = Conv(dim, h, 1, act=False)self.proj = Conv(dim, dim, 1, act=False)self.pe = Conv(dim, dim, 3, 1, g=dim, act=False)
    ​def forward(self, x):B, _, H, W = x.shapeN = H * Wqkv = self.qkv(x)q, k, v = qkv.view(B, self.num_heads, -1, N).split([self.key_dim, self.key_dim, self.head_dim], dim=2)attn = (q.transpose(-2, -1) @ k) * self.scaleattn = attn.softmax(dim=-1)x = (v @ attn.transpose(-2, -1)).view(B, -1, H, W) + self.pe(v.reshape(B, -1, H, W))x = self.proj(x)return x
    ​
    class PSA(nn.Module):def __init__(self, c1, c2, e=0.5):super().__init__()assert(c1 == c2)self.c = int(c1 * e)self.cv1 = Conv(c1, 2 * self.c, 1, 1)self.cv2 = Conv(2 * self.c, c1, 1)self.attn = Attention(self.c, attn_ratio=0.5, num_heads=self.c // 64)self.ffn = nn.Sequential(Conv(self.c, self.c*2, 1),Conv(self.c*2, self.c, 1, act=False))
    ​def forward(self, x):a, b = self.cv1(x).split((self.c, self.c), dim=1)b = b + self.attn(b)b = b + self.ffn(b)return self.cv2(torch.cat((a, b), 1))

五、YOLOv10的改进效果

1、不同核尺寸的效果

随着核尺寸的增加,性能有所提升,并在7×7的核尺寸附近趋于稳定,这表明了大感知场的优势。

2、精度提升

YOLOv10通过上述改进,在保持实时目标检测的高效率的同时,也实现了优异的准确性。

image-20241213152148350

六、往期回顾

yolo入门教程:《吐血录制,yolo11猫狗实时检测实战项目,从零开始写yolov11代码》,视频全程25分钟。

(1)yolo11猫狗实时检测实战项目,从零开始写yolov11代码

(2)从零开始学yolo之yolov1的技术原理

(3)YOLOv1训练过程,新手入门

(4)YOLOv2和yolov1的差异

(5)YOLOv3和yolov1、yolov2之间的差异

(6)YOLOv4算法基本原理以及和YOLOv3 的差异

(7)YOLOv5算法基本原理大揭秘!

(8)YOLOv6算法基本原理

(9)YOLOv7算法基本原理

(10)YOLOv8算法基本原理

(11)YOLOv9算法基本原理

(13)10张结构图,深入理解YOLOv11算法各个模块

高清视频,3分钟揭秘神经网络技术原理

Transfermer的Q、K、V设计的底层逻辑


http://www.ppmy.cn/server/153502.html

相关文章

Linux -- 互斥的底层实现

lock 和 unlock 的汇编伪代码如下: lock:movb $0,%alxchgb %al,mutexif(al 寄存器的内容>0)return 0;else挂起等待;goto lock;unlock:movb $1,mutex唤醒等待 mutex 的线程;return 0; 我们来理解以下上面的代码。 首先线程 1 申请锁&…

hive常用函数有哪些

Hive是一个基于Hadoop的数据仓库工具,它提供了类似于SQL的接口,用于数据查询和分析。Hive提供了许多内置函数,这些函数可以分为几种类型,包括: • 字符串函数:用于处理字符串数据。 • concat()&#xff1…

量子模拟器市场的增长潜力与未来趋势

随着全球对量子计算技术的高度关注,量子模拟器市场正迎来前所未有的增长机遇。量子模拟器是一种利用经典计算机模拟量子力学系统的装置,它能够在无需实际构建量子计算机的情况下,测试和验证量子算法,并为开发真正的量子计算机奠定…

Git在软件开发中的核心作用:如何利用Git进行版本控制和团队协作?

在当今数字化时代,软件开发项目日益复杂,团队协作的紧密程度和效率对于项目的成功交付起着至关重要的作用。而Git,作为一款强大的分布式版本控制系统,已经成为软件开发领域不可或缺的工具。它不仅能够帮助开发者高效地管理代码版本…

DevEco Studio支持鸿蒙应用的全生命周期开发

DevEco Studio支持鸿蒙应用的全生命周期开发 一、引言 随着科技的发展,软件开发流程日益复杂,从最初的概念到最终的产品发布和后续维护,涉及多个阶段。对于移动操作系统而言,其应用开发工具链的支持尤为关键。HarmonyOS&#xf…

纯Dart Flutter库适配HarmonyOS

纯Dart Flutter库适配HarmonyOS介绍: Flutter基本组件、Flutter布局组件、Flutter图片组件、Flutter字体、Flutter图标、Fluter路由、flutter动画、 Flutter表单、flutter异步等,纯Dart库无需任何处理,可以直接编译成HarmonyOs应用。 具体步…

电脑ip地址会变化吗?电脑ip地址如何固定

在数字化时代,IP地址作为网络设备的唯一标识符,对于网络通信至关重要。然而,许多用户可能会发现,自己的电脑IP地址并非一成不变,而是会随着时间的推移或网络环境的变化而发生变化。这种变化有时会给用户带来困扰&#…

Python PyMupdf 去除PDF文档中Watermark标识水印

通过PDF阅读或编辑工具,可在PDF中加入Watermark标识的PDF水印,如下图: 该类水印特点 这类型的水印,会在文件的字节流中出现/Watermark、EMC等标识,那么,我们可以通过改变文件字节内容,清理掉…