YOLOv13模型结构详解:DS-C3k2 | DSConv | HyperACE | FullPAD | 超图 | 顶点 | 超边

在这里插入图片描述
Real-Time Object Detection with Hypergraph-Enhanced Adaptive Visual Perception
基于超图增强自适应视觉感知的实时目标检测


在讲解YOLOv13中各个模块的原理之前,我们先来简单了解一下YOLOv13的网络结构。

在这里插入图片描述

nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov13n.yaml' will call yolov13.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024]   # Nano
  s: [0.50, 0.50, 1024]   # Small
  l: [1.00, 1.00, 512]    # Large
  x: [1.00, 1.50, 512]    # Extra Large

backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv,  [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv,  [128, 3, 2, 1, 2]] # 1-P2/4
  - [-1, 2, DSC3k2,  [256, False, 0.25]]
  - [-1, 1, Conv,  [256, 3, 2, 1, 4]] # 3-P3/8
  - [-1, 2, DSC3k2,  [512, False, 0.25]]
  - [-1, 1, DSConv,  [512, 3, 2]] # 5-P4/16
  - [-1, 4, A2C2f, [512, True, 4]]
  - [-1, 1, DSConv,  [1024, 3, 2]] # 7-P5/32
  - [-1, 4, A2C2f, [1024, True, 1]] # 8

head:
  - [[4, 6, 8], 2, HyperACE, [512, 8, True, True, 0.5, 1, "both"]]
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [ 9, 1, DownsampleConv, []]
  - [[6, 9], 1, FullPAD_Tunnel, []]  #12     
  - [[4, 10], 1, FullPAD_Tunnel, []]  #13    
  - [[8, 11], 1, FullPAD_Tunnel, []] #14 
  
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 12], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, DSC3k2, [512, True]] # 17
  - [[-1, 9], 1, FullPAD_Tunnel, []]  #18

  - [17, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 13], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, DSC3k2, [256, True]] # 21
  - [10, 1, Conv, [256, 1, 1]]
  - [[21, 22], 1, FullPAD_Tunnel, []]  #23
  
  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 18], 1, Concat, [1]] # cat head P4
  - [-1, 2, DSC3k2, [512, True]] # 26
  - [[-1, 9], 1, FullPAD_Tunnel, []]  

  - [26, 1, Conv, [512, 3, 2]]
  - [[-1, 14], 1, Concat, [1]] # cat head P5
  - [-1, 2, DSC3k2, [1024,True]] # 30 (P5/32-large)
  - [[-1, 11], 1, FullPAD_Tunnel, []]  
  
  - [[23, 27, 31], 1, Detect, [nc]] # Detect(P3, P4, P5)

从整体来看,YOLOv13YOLOv12的基础上增加了HyperACE超图机制,并利用FullPAD范式增强网络的特征表达和信息流动能力,改善梯度传播,提升检测性能。此外还提出了DSConvDS-C3k2模块,来降低参数量和计算复杂度。因此YOLOv13提出的创新模块为:

  1. HyperACE超图机制
  2. FullPAD范式
  3. DSConv模块
  4. DS-C3k2模块

🧠 一、HyperACE模块整体架构

设计目标:解决传统目标检测中局部卷积和成对注意力(pairwise attention)无法建模高阶多对多语义关联的问题(如“人-杯子-桌子”的复杂交互)。

代码实现

class HyperACE(nn.Module):
    def __init__(self, c1, c2, n=1, num_hyperedges=8, dsc3k=True, shortcut=False, e1=0.5, e2=1, context="both", channel_adjust=True):
        super().__init__()
        self.c = int(c2 * e1) 
        self.cv1 = Conv(c1, 3 * self.c, 1, 1)
        self.cv2 = Conv((4 + n) * self.c, c2, 1) 
        self.m = nn.ModuleList(
            DSC3k(self.c, self.c, 2, shortcut, k1=3, k2=7) if dsc3k else DSBottleneck(self.c, self.c, shortcut=shortcut) for _ in range(n)
        ) # 低阶空间分支 (DSConv)
        self.fuse = FuseModule(c1, channel_adjust)  # 多尺度特征融合
        self.branch1 = C3AH(self.c, self.c, e2, num_hyperedges, context) # 高阶语义分支1
        self.branch2 = C3AH(self.c, self.c, e2, num_hyperedges, context) # 高阶语义分支2
                    
    def forward(self, X):
        x = self.fuse(X)
        y = list(self.cv1(x).chunk(3, 1))
        out1 = self.branch1(y[1])
        out2 = self.branch2(y[1])
        y.extend(m(y[-1]) for m in self.m)
        y[1] = out1
        y.append(out2)
        return self.cv2(torch.cat(y, 1))

模块结构:

在这里插入图片描述

工作流程

  1. 输入:Backbone输出的多尺度特征图(B3, B4, B5)
  2. 特征融合FuseModule对齐分辨率并拼接特征
  3. 特征拆分:通道拆分为三路 → 高阶分支1、高阶分支2、低阶分支
  4. 并行处理
    • 两个C3AH分支建模全局高阶语义
    • DSConv分支提取局部细节
  5. 输出融合:拼接所有分支结果 → 1×1卷积输出增强特征

总结:超图关联增强阶段(HyperACE 模块)以多尺度特征图为输入,通过自适应超图计算,动态生成超边并进行超图卷积,实现特征聚合与增强。包含基于 C3AH 模块的全局高阶感知分支和基于 DS-C3k 块的局部低阶感知分支,同时保留快捷连接信息,实现全局 - 局部、高 - 低阶的互补视觉关联感知。

HyperACE模块的超图部分由C3AHAdaHGComputationAdaHGConvAdaHyperedgeGen模块实现,其包含关系如下:

AdaHyperedgeGenAdaHGConvAdaHGComputationC3AHHyperACE

接下来将对这些子模块进行分析。


🔧 二、核心子模块详解

📌 2.1 AdaHyperedgeGen:动态超边生成器

作用:自适应生成超边参与度矩阵 A ∈ [0,1]^{N×M},表示N个像素与M个超边的关联权重。

代码关键步骤(此对对代码做了一些简化,目的更容易理解模块结构,完整代码可参考源码):

# Step1: 提取全局上下文
context_cat = torch.cat([X.mean(dim=1), X.max(dim=1)], dim=-1)  # [B, 2D]

# Step2: 动态生成超边原型
prototype_offsets = self.context_net(context_cat)  # [B, M, D]
prototypes = self.prototype_base + prototype_offsets  # 基础超边+偏移

# Step3: 多头相似度计算 (线性复杂度)
logits = torch.bmm(X_heads_flat, proto_heads_flat) / math.sqrt(head_dim)
A = F.softmax(logits, dim=1)  # 参与度矩阵

模块结构:
在这里插入图片描述

工作流程

  1. 提取全局上下文特征

为了捕捉图像的整体语义背景,AdaHyperedgeGen首先对输入特征图进行全局信息聚合。

  • 对顶点特征(像素级特征)分别执行全局平均池化全局最大池化,得到两个上下文向量 f_avgf_max
  • 将两个向量沿通道维度拼接,生成融合全局信息的上下文向量 f_ctx,公式如下:
    f c t x = ( f a v g f m a x ) ∈ R 2 C f_{ctx}=\left(\begin{array}{l} f_{avg} \\ f_{max } \end{array}\right) \in \mathbb{R}^{2C} fctx=(favgfmax)R2C
    其中, C C C 为输入特征的通道数,f_ctx 维度为 2 C 2C 2C,包含了特征图的整体统计信息(如亮度、纹理分布、主要目标的语义趋势等)。
  1. 动态生成超边原型

超边原型是建模高阶关联的“模板”,AdaHyperedgeGen通过学习方式动态生成,而非依赖手工设定。

  • 生成全局偏移量:通过映射层 ϕ : R 2 C → R M × C \phi: \mathbb{R}^{2C} \to \mathbb{R}^{M \times C} ϕ:R2CRM×Cf_ctx 进行处理,得到超边原型的偏移量 Δ P \Delta P ΔP M M M 为超边数量);
  • 融合基础原型与偏移量:将可学习的基础超边原型 P 0 ∈ R M × C P_0 \in \mathbb{R}^{M \times C} P0RM×C 与偏移量 Δ P \Delta P ΔP 相加,得到动态超边原型 P P P
    P = P 0 + Δ P P = P_0 + \Delta P P=P0+ΔP
    这一步使超边原型能够根据输入图像的语义(如“室内场景”“运动场景”)自适应调整,增强对复杂场景的适应性。
  1. 计算顶点-超边参与度矩阵

通过相似度计算,确定每个像素(顶点)对超边的归属强度,生成参与度矩阵 A ∈ [ 0 , 1 ] N × M A \in [0,1]^{N \times M} A[0,1]N×M N N N 为顶点数量)。

  • 顶点查询向量生成:通过投影层将每个顶点特征 x i x_i xi 转换为查询向量 z i z_i zi
    z i = W p r e x i ∈ R C z_i = W_{pre} x_i \in \mathbb{R}^C zi=WprexiRC
    • 多头相似度计算
    • z i z_i zi 和超边原型 P P P 沿通道维度拆分到 h h h 个子空间(多头机制),得到子向量 z ^ i τ \hat{z}_i^\tau z^iτ p ^ m τ \hat{p}_m^\tau p^mτ τ = 1 , 2 , . . . , h \tau=1,2,...,h τ=1,2,...,h);
    • 在每个子空间中计算顶点与超边原型的相似度:
      s i , m τ = < z ^ i τ , p ^ m τ > d h s_{i,m}^\tau = \frac{\left<\hat{z}_i^\tau, \hat{p}_m^\tau\right>}{\sqrt{d_h}} si,mτ=dh z^iτ,p^mτ
      其中 d h = C / h d_h = C/h dh=C/h 为子空间维度,通过归一化避免维度偏差;
  • 参与度矩阵归一化
    • 对所有子空间的相似度取平均,得到总相似度 s ˉ i , m = 1 h ∑ τ = 1 h s i , m τ \bar{s}_{i,m} = \frac{1}{h}\sum_{\tau=1}^h s_{i,m}^\tau sˉi,m=h1τ=1hsi,mτ
    • 通过Softmax函数对相似度归一化,得到参与度矩阵 A A A
      A i , m = exp ⁡ ( s ˉ i , m ) ∑ j = 1 N exp ⁡ ( s ˉ j , m ) A_{i,m} = \frac{\exp(\bar{s}_{i,m})}{\sum_{j=1}^N \exp(\bar{s}_{j,m})} Ai,m=j=1Nexp(sˉj,m)exp(sˉi,m)
      A i , m A_{i,m} Ai,m 表示第 i i i 个顶点对第 m m m 个超边的关联权重,取值范围为 [0,1]。

创新优势

  • 动态适应性:超边原型根据每张图的语义背景动态调整
  • 多头机制:多头点积相似度增强超边多样性
  • 轻量化设计:全局池化替代全连接,降低计算量

总结:AdaHyperedgeGen 的工作流程本质是从全局到局部的动态关联建模:先通过全局上下文捕捉图像语义,再生成适配场景的超边原型,最后通过多头相似度计算确定像素与超边的关联强度。这种设计摆脱了传统超图方法中手工设定阈值的局限,使超边能够自适应场景变化,为后续超图卷积的高阶特征聚合提供了精准的关联指导。


在 YOLOv13 的 HyperACE 机制中,顶点(Vertex)和超边(Hyperedge)是超图计算的核心概念,用于建模图像中复杂的高阶多对多语义关系。以下是具体解析:

🔍 2.1.1 顶点(Vertex)

  • 定义
    顶点是特征图(Feature Map)中每个空间位置的特征向量。例如,一张特征图的尺寸为 H×W×C(高×宽×通道数),展平后得到 N = H×W 个顶点,每个顶点是一个 C 维向量,代表该位置的视觉特征。
  • 作用
    顶点对应图像中的局部区域(如物体的边缘、纹理或语义部件),是超图计算的基本单元。
  • 代码对应
    # 特征图展平为顶点序列
    tokens = x.flatten(2).transpose(1, 2)  # [B, C, H, W] → [B, N, C]
    

🔍 2.1.2 超边(Hyperedge)

  • 定义
    超边是一组语义相关联的顶点集合,代表图像中潜在的“高阶关系组”。例如,“人拿杯子”场景中,人手、杯子、桌面可能属于同一超边。
  • 动态生成
    超边并非固定,而是通过可学习模块 AdaHyperedgeGen 动态生成:
    1. 提取全局语义:对顶点特征做全局平均池化 + 最大池化,生成上下文向量。
    2. 生成超边原型:基础超边原型 + 上下文驱动的偏移量 → 动态超边。
    3. 计算参与度:顶点与超边的相似度经 Softmax 归一化,得到参与度矩阵 A ∈ [0,1]^{N×M},表示每个顶点对每条超边的归属强度。
  • 代码关键步骤
    # AdaHyperedgeGen 生成参与度矩阵 A
    context = torch.cat([X.mean(dim=1), X.max(dim=1)], dim=-1)  # 全局语义
    prototype_offsets = self.context_net(context)               # 动态偏移
    prototypes = base_prototypes + prototype_offsets           # 超边原型
    logits = dot_product(vertex_queries, prototypes)           # 相似度
    A = softmax(logits, dim=1)                                 # 参与度矩阵
    

💡 2.1.3 为什么需要顶点和超边?

传统模型缺陷超图解决方案优势
卷积只能捕捉局部特征超边连接多个顶点 → 建模物体间关系解决遮挡、小物体漏检问题
自注意力计算复杂度高(O(N²))超图卷积复杂度 O(N+M)大幅降低计算量,适合实时检测
只能建模两两关系(Pairwise)超边支持多对多关联(Multi-to-Multi)理解“人-车-路标”等复杂场景

总结:顶点是图像特征的载体,超边是动态生成的“语义关系组”。二者通过超图卷积实现高效的高阶信息传递,让 YOLOv13 在复杂场景中更鲁棒。


📌 2.2 AdaHGConv:超图卷积核

作用:实现“顶点↔超边”的双向信息流动,注入高阶语义关联。

前向传播流程

def forward(self, X):
    A = self.edge_generator(X)        # 获取参与度矩阵 [B, N, M]
    He = torch.bmm(A.transpose(1,2), X)  # 顶点→超边聚合 [B, M, D]
    He = self.edge_proj(He)           # 超边语义增强 (MLP)
    X_new = torch.bmm(A, He)           # 超边→顶点传播 [B, N, D]
    return self.node_proj(X_new) + X   # 残差连接

模块结构:

在这里插入图片描述
工作流程

  1. 顶点到超边的特征聚合

首先,基于AdaHyperedgeGen生成的参与度矩阵 A ∈ [ 0 , 1 ] N × M A \in [0,1]^{N \times M} A[0,1]N×M N N N 为顶点数, M M M 为超边数),每个超边会聚合所有顶点的特征。

  • 对于第 m m m 个超边,其特征 f m f_m fm 由该超边关联的所有顶点特征加权求和得到,权重为参与度矩阵中的 A i , m A_{i,m} Ai,m
  • 随后通过超边投影权重 W e W_e We 进行线性变换,并应用激活函数 σ \sigma σ增强非线性表达能力,公式如下:
    f m = σ ( W e ∑ i = 1 N A i , m x i ) f_{m} = \sigma\left(W_{e} \sum_{i=1}^{N} A_{i, m} x_{i}\right) fm=σ(Wei=1NAi,mxi)
    其中, x i x_i xi 为第 i i i 个顶点的特征,这一步实现了多个相关顶点特征向超边的聚合,捕捉高阶关联信息(如“人-杯子-桌子”的交互语义)。
  1. 超边到顶点的特征传播

在得到超边特征后,需将其反馈给顶点以更新顶点特征。

  • 对于第 i i i 个顶点,其更新特征 x ~ i \tilde{x}_i x~i 由该顶点参与的所有超边特征加权求和得到,权重同样为 A i , m A_{i,m} Ai,m
  • 再通过顶点投影权重 W v W_v Wv 进行线性变换和激活函数处理,公式如下:
    x ~ i = σ ( W v ∑ m = 1 M A i , m f m ) \tilde{x}_{i} = \sigma\left(W_{v} \sum_{m=1}^{M} A_{i, m} f_{m}\right) x~i=σ(Wvm=1MAi,mfm)
    这一步将超边聚合的高阶关联信息传播回顶点,使每个顶点特征融入全局语义关联。

计算优势

操作复杂度vs 自注意力
顶点→超边聚合O(N·M)远低于O(N²)
超边→顶点传播O(N·M)避免成对计算

总结:Hypergraph Convolution 通过 “顶点→超边→顶点” 的双向信息流动,实现了多对多高阶关联的建模。与传统卷积的局部聚合或自注意力的两两关联不同,其以超边为中介,在保持线性计算复杂度(O(N⋅M))的同时,有效捕捉了全局范围内的复杂语义关联,为后续特征增强提供了高阶关联指导。


📌 2.3 AdaHGComputation:图-张量转换器

作用:桥接2D特征图与1D超图计算,保持空间结构不变。

AdaHGComputation 主要负责在保持空间结构不变的情况下,实现 2D 特征图与 1D 超图计算之间的转换。在超图计算中,它使得特征图的处理能够与超图的计算方式相适配,从而有效利用超图来建模高阶语义关联。

def forward(self, x):
    tokens = x.flatten(2).transpose(1, 2)  # [B, C, H, W] → [B, N, D]
    tokens = self.hgnn(tokens)             # 超图卷积
    return tokens.transpose(1,2).view_as(x) # 还原形状

在代码层面,其前向传播过程先将输入的特征图 x 进行展平操作,从 [B, C, H, W] 的维度变为 [B, N, D](其中 N = H×W,D = C),将特征图转换为适合超图计算的顶点序列形式。接着,对这些顶点序列进行超图卷积操作,即 self.hgnn(tokens)。完成超图卷积后,再将结果还原为与输入特征图相同的形状,从 [B, N, D] 变回 [B, C, H, W],以适配后续的网络结构。通过这样的操作,实现了在不改变下游网络结构的前提下,将超图计算融入到特征处理过程中。

设计意义:适配CNN的张量布局,无需改动下游网络结构。


📌 2.4 C3AH:高阶语义建模单元

结构设计(融合CSP架构与超图):

class C3AH(nn.Module):
    def forward(self, x):
        x1 = self.cv1(x)          # 分支1: 超图计算路径
        x2 = self.cv2(x)          # 分支2: 原始特征直连
        x1 = self.m(x1)           # AdaHGComputation
        return self.cv3(torch.cat([x1, x2], 1))  # CSP式融合

模块结构:
在这里插入图片描述
工作流程

  1. 输入:输入特征图 X i n ∈ R C i n × H × W X_{in} \in \mathbb{R}^{C_{in} \times H \times W} XinRCin×H×W
  2. 特征投影:通过两个1×1卷积层将输入特征图投影到相同的隐藏维度,得到 X X X X l a t e r a l X_{lateral} Xlateral,其中 X , X l a t e r a l ∈ R C × H × W X, X_{lateral} \in \mathbb{R}^{C \times H \times W} X,XlateralRC×H×W C = ⌊ e C i n ⌋ C = \lfloor e C_{in} \rfloor C=eCin e e e为瓶颈压缩比), X X X用于自适应超图计算, X l a t e r a l X_{lateral} Xlateral用于侧向连接。
  3. 超图计算:将 X X X展平为顶点特征并送入自适应超图计算模块,得到关联增强特征 X h X_h Xh
  4. 特征融合:将 X h X_h Xh X l a t e r a l X_{lateral} Xlateral沿通道维度拼接,再通过1×1卷积层融合,得到C3AH块的输出。

核心价值

  • 互补特征融合:高阶语义(x1) + 原始细节(x2
  • 梯度稳定:残差直连缓解超图计算梯度消失
  • 参数量优化:通道压缩比 e 控制计算开销

总结:C3AH基于自适应超图计算范式设计,融合了CSP瓶颈分支拆分机制与超图计算模块,能够实现跨空间位置的全局高阶语义聚合。

“HyperACE是视觉关系的‘群体聊天室’,而传统注意力仅是‘私密对话’”

⚙️三、DSConv和DS-C3k2

📌3.1 DSConv模块

  1. 模块结构
    DSConv模块首先应用标准的深度可分离卷积层来提取特征,然后利用批量归一化SiLU激活函数来得到输出。
    其结构可表示为 X D S = S i L U ( B N ( D S C o n v ( X i n ) ) ) X_{DS}=SiLU\left(BN\left(DSConv\left(X_{in }\right)\right)\right) XDS=SiLU(BN(DSConv(Xin))) ,其中 X i n X_{in} Xin是输入特征, D S C o n v DSConv DSConv表示深度可分离卷积操作, B N BN BN表示批量归一化, S i L U SiLU SiLU是激活函数。
  2. 作用
    作为基本的特征提取单元,DSConv通过深度可分离卷积,将传统卷积的操作分解为深度卷积和逐点卷积,在减少参数数量和计算复杂度的同时,能够有效提取图像的特征。这使得模型在保持检测性能的前提下,提升了推理速度。

在这里插入图片描述

📌3.2 DS-C3k2模块

  1. 模块结构
    DS-C3k2模块源自C3k2结构

    • 它首先使用1×1卷积层统一通道,然后将特征分成两部分,一部分输入多个DS-C3k模块进行处理,另一部分则通过快捷连接直接传递。
    • 最后,将两部分的输出进行拼接,并使用1×1卷积层融合。
  2. 作用
    该模块在继承C3k2结构优点的基础上,结合深度可分离卷积的轻量化特性,进一步减少了模型的参数量和计算量。在YOLOv13模型中,DS-C3k2广泛应用于骨干网络和颈部网络,作为基本的特征提取模块,有助于提高模型整体的检测效率和性能。

总结:简单来说,文中提出了DSConv,利用其替换了Bottleneck中的普通卷积,并将Bottleneck重命名为DS-Bottleneck;然后利用DS-Bottleneck替换了C3k中的Bottleneck,并将C3k重命名为DS-C3k;最后在C3k2中利用DS-C3k替换了C3k,并将C3k2重命名为DS-C3k2。


以上便是YOLOv13中核心模块的解释,欢迎大家关注后续针对YOLOv13核心模块的相关改进~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Limiiiing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值