欢迎光临
我们一直在努力

【模型改进】DORGM 改进 YOLO 系列:面向 VisDrone 小目标检测的多尺度特征解耦与软路由增强

任务:VisDrone2019-DET 无人机目标检测
改进对象:YOLOv8l、YOLOv10l、YOLO11l、YOLO12l、YOLO26l
改进模块:DORGM(Deep Orthogonal-Enhanced Generative Module)
插入位置:YOLO 检测头 P3/P4/P5 三个输出端
训练设置:300 epochs,imgsz=640,batch=128,8 GPU,seed=42

本文面向初学者,完整介绍如何把 DORGM 思想迁移到 YOLO 系列目标检测模型中。文章先给出改进效果,再解释为什么需要改进、DORGM 的来源与原理、代码和 YAML 如何修改,最后给出 5 个改进模型的 drawio 架构图和实验总结。


1. 改进效果先看结论

本轮实验只测试了 5 个 DORGM 改进模型。整体结果如下:

ModelParams(M)Inference(ms)mAP50mAP50-95PrecisionRecall
YOLO12l-DORGM 29.55 4.04 0.4336 0.2564 0.5635 0.4435
YOLOv8l-DORGM 46.79 5.18 0.4188 0.2444 0.5555 0.4268
YOLOv10l-DORGM 28.93 5.09 0.4155 0.2436 0.5534 0.4251
YOLO11l-DORGM 28.47 4.13 0.4133 0.2433 0.5488 0.4256
YOLO26l-DORGM 29.35 2.91 0.4061 0.2385 0.5569 0.4165

最直接的结论是:

指标最优模型数值
Best mAP50 YOLO12l-DORGM 0.4336
Best mAP50-95 YOLO12l-DORGM 0.2564
Best Precision YOLO12l-DORGM 0.5635
Best Recall YOLO12l-DORGM 0.4435
Fastest YOLO26l-DORGM 2.91 ms

也就是说,YOLO12l-DORGM 是当前精度最优方案,YOLO26l-DORGM 是当前速度优先方案。


2. 与原始 YOLO 基线的对比

为了判断 DORGM 是否有效,必须和原始 YOLO 基线对比。基线结果如下:

ModelParams(M)Inference(ms)mAP50mAP50-95PrecisionRecall
YOLO12l 26.40 3.34 0.4259 0.2514 0.5574 0.4299
YOLO11l 25.32 2.24 0.4181 0.2464 0.5483 0.4336
YOLOv8l 43.64 2.71 0.4152 0.2427 0.5503 0.4273
YOLOv10l 25.78 2.56 0.4115 0.2425 0.5488 0.4185
YOLO26l 26.19 2.24 0.4065 0.2381 0.5512 0.4150

把 DORGM 改进前后的变化列出来更直观:

ModelΔParams(M)ΔInference(ms)ΔmAP50ΔmAP50-95ΔPrecisionΔRecall
YOLO12l-DORGM +3.15 +0.70 +0.0077 +0.0050 +0.0061 +0.0136
YOLOv8l-DORGM +3.15 +2.47 +0.0036 +0.0017 +0.0052 -0.0005
YOLOv10l-DORGM +3.15 +2.53 +0.0040 +0.0011 +0.0046 +0.0066
YOLO11l-DORGM +3.15 +1.89 -0.0048 -0.0031 +0.0005 -0.0080
YOLO26l-DORGM +3.16 +0.67 -0.0004 +0.0004 +0.0057 +0.0015

从对比可以看出,DORGM 并不是对所有 YOLO 结构都同等有效。它对 YOLO12l 的提升最明显,对 YOLOv8l 和 YOLOv10l 有稳定小幅增益;对 YOLO26l 基本保持精度,同时仍然保留较高速度;但对 YOLO11l 出现轻微下降。这说明 DORGM 更适合作为一种特征增强模块,需要结合不同 YOLO 架构做插入位置和参数消融,而不能简单认为“加了模块一定提升”。


3. 为什么 VisDrone 需要这种改进

VisDrone 是无人机视角目标检测数据集,典型特点是:

  • 小目标多。行人、车辆、摩托车在图像中经常只占很小区域。
  • 场景密集。城市道路、十字路口、停车区域中目标数量非常多。
  • 尺度变化明显。无人机高度和俯仰角变化会导致目标尺寸剧烈变化。
  • 遮挡严重。行人、车辆、三轮车等目标之间经常互相遮挡。
  • 背景复杂。道路、建筑、树木、阴影和标线都会干扰检测。
  • 原始 YOLO 系列已经具备较强的多尺度检测能力,但在 VisDrone 上仍然会遇到两个问题:

    • 特征耦合:不同尺度、不同场景、不同遮挡程度的目标特征混在一起,模型难以区分真正有用的目标模式和背景噪声。
    • 条件差异:同一类别在不同拍摄高度、光照和密集程度下表现差异很大,固定卷积参数不一定能适配所有样本。

    DORGM 的设计正好对应这两个问题:它通过正交投影减少特征干扰,通过软路由专家分支让不同样本获得不同的特征修正。


    4. DORGM 原始思想简介

    DORGM 来自论文 Deep Orthogonal-Enhanced Generative Model for robust pavement crack segmentation。原始任务是路面裂缝分割,论文链接和代码链接如下:

    • ScienceDirect: https://www.sciencedirect.com/science/article/pii/S1569843225006351

    原论文主要解决的是裂缝图像在不同环境条件下的鲁棒分割问题,例如光照、雨水、阴影、雾霾、路面材料差异等。它的核心思想包括两点:

  • 正交约束模块:把隐藏特征投影到正交空间,使不同条件下的特征尽量解耦,减少条件噪声对目标模式的干扰。
  • 软标签路由模块:使用贝叶斯聚类思想,为每个样本生成软分配权重,并把样本路由到不同专家分支。
  • 原论文是分割任务,且包含较完整的变分推断和生成模型建模。本文不是直接完整复现原论文的数学优化过程,而是将其核心思想工程化迁移到 YOLO 检测任务中。


    5. 从裂缝分割到 YOLO 检测的适配思路

    在 YOLO 中,检测头通常接收 P3、P4、P5 三个尺度的特征:

    特征层下采样倍率作用
    P3 8x 更关注小目标
    P4 16x 更关注中等目标
    P5 32x 更关注大目标和高语义信息

    VisDrone 中小目标多,因此不能只增强 P5。本文把 DORGM 插入到 P3、P4、P5 三个检测特征输出端:

    – [-1, 1, C3k2, [256, True]] # P3 output
    – [-1, 1, DORGM, [4]] # P3-DORGM

    – [-1, 1, Conv, [256, 3, 2]]
    – [[-1, 13], 1, Concat, [1]]
    – [-1, 2, C3k2, [512, True]] # P4 output
    – [-1, 1, DORGM, [4]] # P4-DORGM

    – [-1, 1, Conv, [512, 3, 2]]
    – [[-1, 10], 1, Concat, [1]]
    – [-1, 1, C3k2, [1024, True, 0.5, True]] # P5 output
    – [-1, 1, DORGM, [4]] # P5-DORGM

    – [[17, 21, 25], 1, Detect, [nc]]

    这个放置方式有三个好处:

  • DORGM 直接作用在最终送入检测头的特征上,影响路径明确。
  • P3/P4/P5 都得到增强,符合 VisDrone 小目标和多尺度目标并存的特点。
  • DORGM 保持输入输出 shape 不变,不破坏 YOLO 原有 PAN-FPN 结构。

  • 6. DORGM 模块结构

    本文代码中的 DORGM 模块包含四个关键部分。

    6.1 OrthoProj:正交投影

    原论文中使用 QR 分解构造正交映射。为了更适合深度网络训练,代码中使用 Cayley 变换参数化一个正交 1×1 卷积:

    q = torch.linalg.solve(eye + a, eye – a)
    return F.conv2d(x, q.view(c, c, 1, 1))

    它的作用是把输入特征投影到正交空间,减少不同条件特征之间的耦合。

    6.2 SoftRouter:软路由

    软路由通过全局平均池化和 MLP 得到每个样本属于不同专家分支的权重:

    z = self.pool(x).view(b, c)
    phi = F.softmax(self.fc(z), dim=–1)

    这里的 phi 可以理解为原论文中软标签后验分布的工程化近似。

    6.3 Expert:轻量专家分支

    每个专家分支由 depthwise 3×3 卷积和 pointwise 1×1 卷积组成:

    DWConv 3×3 -> PWConv 1×1 -> BN -> SiLU

    它用于学习不同条件下的特征修正项。

    6.4 Residual Gamma:残差回注

    DORGM 最终输出为:

    out = x + gamma * delta

    其中 gamma 初始化为 0。这样模块刚插入时近似恒等映射,训练初期不会突然破坏原始 YOLO 特征流。

    6.5 论文中“改进方法”部分的推荐写法

    本文针对 VisDrone 无人机目标检测中小目标密集、尺度变化剧烈、遮挡严重以及背景干扰强等问题,在 YOLO 系列模型的检测头阶段引入 DORGM 特征增强模块。原始 YOLO 检测头直接利用 P3、P4 和 P5 三个尺度特征进行目标预测,虽然具备多尺度检测能力,但不同场景条件下的目标特征、背景噪声和尺度变化信息容易在特征空间中发生耦合,进而影响小目标定位和召回性能。为缓解这一问题,本文借鉴深度正交增强生成模型中的正交特征解耦和软标签路由思想,构建适用于目标检测任务的轻量化 DORGM 模块,并将其分别嵌入到 P3、P4 和 P5 三个检测特征输出端。

    具体而言,DORGM 首先通过正交投影层对输入特征进行变换,使特征在潜在空间中获得更强的解耦表达能力,从而降低复杂背景、遮挡和尺度变化带来的干扰。随后,模块利用全局平均池化和多层感知机生成样本级软路由权重,根据输入图像的特征分布自适应地分配不同专家分支的重要性。每个专家分支由轻量卷积结构构成,用于学习不同条件下的特征修正项。最后,多个专家输出按照软路由权重加权融合,并通过残差连接回注到原始特征中。由于该模块保持输入输出通道数和空间尺寸不变,因此能够无缝插入 YOLO 检测头,而不会破坏原有 PAN-FPN 多尺度特征融合结构。

    在结构设计上,本文没有将 DORGM 插入主干网络早期层,而是选择在检测头最终输出的 P3、P4 和 P5 三个尺度上进行增强。这样设计的原因在于:P3 特征主要负责小目标检测,P4 特征兼顾中等尺度目标,P5 特征包含更强语义信息;对三个检测尺度同时增强,可以使模型在保持原有多尺度检测能力的基础上进一步提升复杂场景下的特征判别能力。改进后的检测头可表示为:原始多尺度融合特征首先经过对应尺度的 DORGM 模块进行正交解耦和条件自适应修正,然后再输入 Detect 或 v10Detect 层完成分类和边界框回归。

    需要说明的是,本文并非直接复现 DORGM 原论文中的完整变分贝叶斯生成建模过程,而是将其核心思想工程化适配到 YOLO 检测框架中。相比原始方法,本文实现更加轻量,训练流程与 YOLO 原有端到端检测训练保持一致,便于在不同 YOLO 版本中快速迁移和验证。实验结果表明,引入 DORGM 后,YOLO12l-DORGM 在 VisDrone 数据集上取得了最优综合性能,说明该模块能够有效增强无人机复杂场景下的多尺度目标特征表达能力。


    7. 代码改进过程

    7.1 放入模块文件

    将 dorgm.py 放入:

    ultralytics/nn/modules/dorgm.py

    代码如下:

    """DORGM: Deep Orthogonal-Enhanced Generative Model.

    即插即用模块,来源于论文 "Deep Orthogonal-Enhanced Generative Model for robust
    pavement crack segmentation"。核心思想:
    1. 正交约束:将隐藏特征投影到正交子空间,解耦条件特异性噪声与固有目标模式。
    2. 软标签路由:通过可微的贝叶斯风格聚类,把样本自适应地分配到 K 个专家支路。
    3. 残差+门控融合:专家输出与主分支相加,保证即插即用且不破坏原始特征流。

    该实现面向检测任务(YOLO26),做了三点工程化调整:
    – 正交层用 Cayley 变换 + 正交初始化参数化一个 1×1 卷积,保证前向/反向
    都保持正交,避免论文中每个 batch 做 QR 分解的开销与数值不稳定。
    – 软路由改为 GAP + MLP + softmax,等价于论文中
    变分后验 q_phi(z_n) 的分类分布,复杂度 O(C·K)。
    – 专家支路做成轻量 depthwise 3×3 + 1×1,参数量可控。
    """
    from __future__ import annotations

    import torch
    import torch.nn as nn
    import torch.nn.functional as F

    __all__ = ("DORGM", "OrthoProj", "SoftRouter")

    class OrthoProj(nn.Module):
    r"""正交 1×1 投影层。

    用一个可学习方阵 A,通过 Cayley 变换 Q = (I – A_skew)(I + A_skew)^{-1}
    得到正交矩阵 Q(A_skew = A – A^T 为反对称阵),再作为 1×1 卷积的权重。

    这样无论怎么训练,Q 始终严格正交:Q^T Q = I。
    论文式 (2) 要求 \\hat{h}^T \\hat{h} = I,这里用 Cayley 参数化直接满足。
    """

    def __init__(self, channels: int):
    super().__init__()
    self.channels = channels
    w = torch.empty(channels, channels)
    nn.init.orthogonal_(w)
    self.weight = nn.Parameter(w – w.t())

    def _ortho_matrix(self) –> torch.Tensor:
    # torch.linalg.solve 在 CUDA 上不支持 fp16,AMP/半精度训练时需在 fp32 下求解
    w = self.weight.float()
    a = w – w.t()
    eye = torch.eye(self.channels, device=a.device, dtype=a.dtype)
    q = torch.linalg.solve(eye + a, eye – a)
    return q

    def forward(self, x: torch.Tensor) –> torch.Tensor:
    q = self._ortho_matrix().to(dtype=x.dtype)
    return F.conv2d(x, q.view(self.channels, self.channels, 1, 1))

    class SoftRouter(nn.Module):
    """软标签路由器。

    对应论文中 q_phi(z_n) 的分类后验:对输入做全局统计 -> MLP -> softmax,
    得到每个样本对 K 个聚类的软分配 phi ∈ [B, K]。
    """

    def __init__(self, channels: int, num_clusters: int, reduction: int = 4):
    super().__init__()
    mid = max(channels // reduction, num_clusters)
    self.pool = nn.AdaptiveAvgPool2d(1)
    self.fc = nn.Sequential(
    nn.Linear(channels, mid, bias=False),
    nn.GELU(),
    nn.Linear(mid, num_clusters, bias=True),
    )

    def forward(self, x: torch.Tensor) –> torch.Tensor:
    b, c, _, _ = x.shape
    z = self.pool(x).view(b, c)
    return F.softmax(self.fc(z), dim=–1)

    class _Expert(nn.Module):
    """单个条件专家:DWConv3x3 + PWConv,建模某一条件下的修正项。"""

    def __init__(self, channels: int):
    super().__init__()
    self.dw = nn.Conv2d(channels, channels, 3, padding=1, groups=channels, bias=False)
    self.pw = nn.Conv2d(channels, channels, 1, bias=False)
    self.bn = nn.BatchNorm2d(channels)
    self.act = nn.SiLU(inplace=True)

    def forward(self, x: torch.Tensor) –> torch.Tensor:
    return self.act(self.bn(self.pw(self.dw(x))))

    class DORGM(nn.Module):
    """Deep Orthogonal-Enhanced Generative Module (plug-and-play).

    前向流程:
    y = OrthoProj(x) # 正交解耦
    phi = SoftRouter(y) # [B, K] 软分配
    e_k = Expert_k(y) # K 个专家输出
    delta = sum_k phi_k * e_k # 软路由加权融合
    out = x + gamma * delta # 残差 + 可学习缩放
    论文式 (9) 的训练目标 F(x) + phi * F_hat(x) 在这里对应
    "x + gamma * sum phi_k e_k",gamma 初始化为 0 使模块一开始等于恒等映射,
    便于直接插入预训练主干而不破坏原有表征。

    Args:
    c1: 输入通道(= 输出通道,保持 shape 不变,便于即插即用)。
    num_clusters: 聚类数 K,论文消融中常用 3~5。
    reduction: 路由 MLP 中的压缩比。
    """

    def __init__(self, c1: int, num_clusters: int = 4, reduction: int = 4):
    super().__init__()
    assert c1 > 0
    self.c1 = c1
    self.num_clusters = num_clusters

    self.ortho = OrthoProj(c1)
    self.router = SoftRouter(c1, num_clusters, reduction=reduction)
    self.experts = nn.ModuleList([_Expert(c1) for _ in range(num_clusters)])
    self.gamma = nn.Parameter(torch.zeros(1))

    def orthogonality_loss(self) –> torch.Tensor:
    """返回 ||Q^T Q – I||_F^2,供外部作为辅助损失(通常已被 Cayley 参数化保证为 0,
    这里仍保留接口,便于监控数值误差)。"""

    q = self.ortho._ortho_matrix()
    eye = torch.eye(self.c1, device=q.device, dtype=q.dtype)
    return torch.linalg.norm(q.t() @ q – eye, ord="fro") ** 2

    def forward(self, x: torch.Tensor) –> torch.Tensor:
    y = self.ortho(x)
    phi = self.router(y)
    outs = torch.stack([e(y) for e in self.experts], dim=1)
    w = phi.view(phi.size(0), self.num_clusters, 1, 1, 1)
    delta = (outs * w).sum(dim=1)
    return x + self.gamma * delta

    if __name__ == "__main__":
    m = DORGM(64, num_clusters=4)
    x = torch.randn(2, 64, 40, 40)
    y = m(x)
    print(x.shape, "->", y.shape, "ortho_err=", m.orthogonality_loss().item())

    7.2 在 modules 中导出

    在 ultralytics/nn/modules/__init__.py 中导入:

    from .dorgm import DORGM, OrthoProj, SoftRouter

    并加入 __all__,这样 YAML 解析时能识别 DORGM。

    7.3 修改 parse_model

    在 ultralytics/nn/tasks.py 中导入 DORGM,并在 parse_model() 中加入特殊解析逻辑:

    elif m is DORGM:
    c2 = ch[f]
    args = [c2, *args]

    原因是 DORGM 是 shape-preserving 模块,它不需要像 Conv 那样在 YAML 中显式传入输出通道。解析器会自动把当前输入通道 ch[f] 传给 DORGM。

    7.4 新增改进模型 YAML

    本文新增了 5 个模型配置:

    模型YAML
    YOLOv8l-DORGM ultralytics/cfg/models/v8/yolov8l-dorgm.yaml
    YOLOv10l-DORGM ultralytics/cfg/models/v10/yolov10l-dorgm.yaml
    YOLO11l-DORGM ultralytics/cfg/models/11/yolo11l-dorgm.yaml
    YOLO12l-DORGM ultralytics/cfg/models/12/yolo12l-dorgm.yaml
    YOLO26l-DORGM ultralytics/cfg/models/26/yolo26l-dorgm.yaml

    各模型 Detect 输入如下:

    模型检测头类型Detect 输入
    YOLOv8l-DORGM Detect [16, 20, 24]
    YOLOv10l-DORGM v10Detect [17, 21, 25]
    YOLO11l-DORGM Detect [17, 21, 25]
    YOLO12l-DORGM Detect [15, 19, 23]
    YOLO26l-DORGM Detect [17, 21, 25]

    7.5 修改 benchmark 脚本

    benchmark_visdrone_fixed.py 中新增 DORGM 模型列表,并将默认测试集改成只跑 DORGM 版本:

    DORGM_YOLO_MODELS = {
    "YOLOv8l-DORGM": "ultralytics/cfg/models/v8/yolov8l-dorgm.yaml",
    "YOLOv10l-DORGM": "ultralytics/cfg/models/v10/yolov10l-dorgm.yaml",
    "YOLO11l-DORGM": "ultralytics/cfg/models/11/yolo11l-dorgm.yaml",
    "YOLO12l-DORGM": "ultralytics/cfg/models/12/yolo12l-dorgm.yaml",
    "YOLO26l-DORGM": "ultralytics/cfg/models/26/yolo26l-dorgm.yaml",
    }

    默认参数:

    parser.add_argument(
    "–variant",
    choices=("baseline", "dorgm", "both"),
    default="dorgm",
    )

    这样直接运行脚本时,只会测试 5 个 DORGM 改进模型。


    8. 一键训练和验证

    建议使用项目 Conda 环境运行:

    python benchmark_visdrone_fixed.py

    如果在 Linux 服务器上运行:

    python benchmark_visdrone_fixed.py \\
    –data ultralytics/cfg/datasets/VisDrone.yaml \\
    –epochs 300 \\
    –batch 128 \\
    –imgsz 640 \\
    –device 0,1,2,3,4,5,6,7 \\
    –workers 4

    脚本会依次完成:

  • 训练 YOLOv8l-DORGM。
  • 训练 YOLOv10l-DORGM。
  • 训练 YOLO11l-DORGM。
  • 训练 YOLO12l-DORGM。
  • 训练 YOLO26l-DORGM。
  • 每个模型训练完成后,单独启动验证进程。
  • 汇总输出 CSV 和 Markdown 结果。

  • 9. 改进后的 drawio 架构图

    图中颜色含义如下:

    颜色含义
    紫色 Backbone 或 Neck 中的主特征模块
    绿色 SPPF、PSA、C2PSA 等上下文增强模块
    红色 Upsample
    黄色 Concat
    蓝色 下采样卷积或 SCDown
    橙色 DORGM 模块
    青色 Detect / v10Detect

    9.1 YOLOv8l-DORGM

    YOLOv8l-DORGM 以 C2f 为主要特征模块,在 SPPF 后进入 PAN-FPN 结构。本文在最终 P3、P4、P5 检测特征后分别接入 DORGM。

    在这里插入图片描述

    9.2 YOLOv10l-DORGM

    YOLOv10l-DORGM 使用 C2fCIB、SCDown、PSA 和 v10Detect。DORGM 插入后,v10Detect 读取三个增强后的检测特征。

    在这里插入图片描述

    9.3 YOLO11l-DORGM

    YOLO11l-DORGM 使用 C3k2、SPPF 和 C2PSA。实验中该模型加入 DORGM 后精度略降,说明 DORGM 与不同 YOLO 结构存在适配差异。

    在这里插入图片描述

    9.4 YOLO12l-DORGM

    YOLO12l-DORGM 是本轮实验中综合性能最好的模型。它大量使用 A2C2f 结构,加入 DORGM 后 mAP50、mAP50-95、Precision 和 Recall 均达到本轮最优。

    在这里插入图片描述

    9.5 YOLO26l-DORGM

    YOLO26l-DORGM 的精度基本与原版持平,但速度仍然最快。它适合作为实时性优先的版本。

    在这里插入图片描述


    10. 实验结果分析

    10.1 为什么 YOLO12l-DORGM 最强

    YOLO12l 原始基线已经是 5 个原始 YOLO 中精度最好的模型。加入 DORGM 后,它的提升仍然最明显:

    指标YOLO12lYOLO12l-DORGM提升
    mAP50 0.4259 0.4336 +0.0077
    mAP50-95 0.2514 0.2564 +0.0050
    Precision 0.5574 0.5635 +0.0061
    Recall 0.4299 0.4435 +0.0136

    这说明 YOLO12l 的 A2C2f 特征结构和 DORGM 的正交解耦、软路由增强较为兼容。尤其是 Recall 提升明显,说明 DORGM 对减少漏检有帮助。

    10.2 为什么 YOLO26l-DORGM 仍然值得保留

    YOLO26l-DORGM 的 mAP50-95 只比原版高 0.0004,精度提升很小。但它的推理耗时为 2.91 ms,是 5 个 DORGM 模型中最快的。

    如果应用场景更关注实时性,例如无人机边缘端快速检测,那么 YOLO26l-DORGM 仍然有价值。它可以作为速度优先方案,而 YOLO12l-DORGM 作为精度优先方案。

    10.3 为什么 YOLO11l-DORGM 没有提升

    YOLO11l-DORGM 的 mAP50 和 mAP50-95 相比原始 YOLO11l 略有下降。这说明 DORGM 不是简单堆叠就一定有效。可能原因包括:

  • YOLO11l 的 C3k2 与 C2PSA 结构本身已经具备较强特征建模能力。
  • DORGM 插入后改变了 P3/P4/P5 向 Detect 传递的特征分布。
  • 当前 K=4 不一定适合 YOLO11l。
  • 串联式插入可能对 YOLO11l 的特征流扰动偏大。
  • 因此,后续可以针对 YOLO11l 单独测试 P3 only、P3+P4、并联式 Detect 前增强 等插入方式。

    10.4 类别层面的观察

    从 YOLO12l-DORGM 的类别结果看,car 和 bus 仍然是最容易检测的类别:

    ClassmAP50mAP50-95
    car 0.8122 0.5712
    bus 0.6297 0.4565

    而 bicycle 和 awning-tricycle 仍然较弱:

    ClassmAP50mAP50-95
    bicycle 0.1686 0.0737
    awning-tricycle 0.1499 0.0963

    这符合 VisDrone 的任务特点:这些类别目标小、遮挡多、形态变化大,而且容易和背景混淆。DORGM 能增强特征鲁棒性,但不能完全解决极小目标和严重遮挡问题。


    11. 初学者复现 checklist

    如果你想从零复现本实验,可以按下面顺序检查:

  • 确认 dorgm.py 已放入 ultralytics/nn/modules/。
  • 确认 ultralytics/nn/modules/__init__.py 已导入 DORGM。
  • 确认 ultralytics/nn/tasks.py 的 parse_model() 已支持 DORGM。
  • 确认 5 个 *-dorgm.yaml 文件存在。
  • 运行下面命令检查模型能否构建:
  • python -c "from ultralytics import YOLO; YOLO('ultralytics/cfg/models/12/yolo12l-dorgm.yaml')"

  • 运行 benchmark:
  • python benchmark_visdrone_fixed.py

  • 查看输出:
  • benchmark_results_VisDrone_fixed.csv
    benchmark_results_VisDrone_fixed.md
    runs/benchmark_VisDrone/

  • 打开 drawio:
  • assets/dorgm_yolo_visdrone/dorgm_yolo_architectures.drawio


    12. 后续改进方向

    当前结果已经证明 DORGM 对 YOLO12l 有明确增益,但还可以继续做消融实验。

    12.1 聚类数 K 消融

    原论文指出不同数据集的最优 K 不相同。当前实验使用 K=4,后续建议测试:

    K = 3, 4, 5

    优先在 YOLO12l-DORGM 上测试,因为它当前表现最好。

    12.2 插入位置消融

    当前插入方式是:

    P3 + P4 + P5

    后续可以测试:

    P3 only
    P3 + P4
    P4 + P5
    Detect 前并联增强

    这样可以判断 DORGM 到底是对小目标层 P3 更有效,还是对多尺度整体增强更有效。

    12.3 轻量化 DORGM

    DORGM 会增加约 3.15M 参数。对于速度敏感场景,可以尝试:

  • P3 使用更小 K。
  • 只在 P4/P5 插入 DORGM。
  • 减少专家分支中的 1×1 卷积开销。
  • 使用共享专家权重。
  • 12.4 结合 P2 小目标检测层

    VisDrone 中极小目标很多,P3 仍然可能不够细。后续可以尝试在 YOLO12l-DORGM 上加入 P2 检测层,再观察 pedestrian、people、bicycle、motor 等类别是否提升。


    13. 总结

    本文将 DORGM 的正交解耦和软路由思想迁移到 YOLO 系列目标检测任务中,并在 VisDrone2019-DET 数据集上进行了验证。实验表明:

  • YOLO12l-DORGM 取得最佳综合精度,mAP50 达到 0.4336,mAP50-95 达到 0.2564。
  • YOLO12l-DORGM 相比原始 YOLO12l,mAP50 提升 0.0077,mAP50-95 提升 0.0050,Recall 提升 0.0136。
  • YOLO26l-DORGM 仍然是最快模型,推理耗时为 2.91 ms,适合实时检测场景。
  • DORGM 对不同 YOLO 架构的收益不一致,说明模块插入位置、聚类数 K 和主干结构之间存在适配关系。
  • 对 VisDrone 这类小目标密集数据集,DORGM 能改善多尺度检测特征的表达能力,但仍需结合 P2 检测层、轻量化设计或更细粒度特征融合进一步提升极小目标检测效果。
  • 整体来看,DORGM 不是简单的注意力模块,而是一种带有“正交解耦 + 条件路由 + 专家修正”思想的特征增强模块。对于场景复杂、尺度变化明显、目标密集的无人机检测任务,它提供了一条值得继续深入研究的改进方向。

    赞(0)
    未经允许不得转载:171主机测评 » 【模型改进】DORGM 改进 YOLO 系列:面向 VisDrone 小目标检测的多尺度特征解耦与软路由增强
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址