在 YOLOv12 中移植 DMMA 的过程与训练记录

简单记录一下把 YOLOv5 的 DMMA 结构移植到 YOLOv12 的流程,以及当前的训练结果和下一步计划。

### YOLOv5 方案要点

  • WindowAttention + minusSigmoid 构成 DMMA(models/newMSA3.py:24-110),对 q/k/v/m 做归一化、差分掩码计算再送入 softmax。

    image-20251128164832933.png

  • SwinTransformerLayer 在窗口注意力输出后乘以 ECA 通道权重、并交替使用 SW-MSA(models/newMSA3.py:309-356)。

    image-20251128164945991.png

  • C3STR 将上述 Swin 块内嵌到 C3 结构 (models/common2.py:367-379),并在椭圆 YAML 中用于检测头。

    image-20251128165042576.png

当前 YOLOv12 实现

  • ultralytics/nn/modules/transformer.py:431-696 新增 DMMALayer:重写 DMMA、ECA、DropPath、窗口划分等,移除 timm 依赖。

    image-20251128165320164.png

  • ultralytics/nn/modules/block.py:475-517 定义 C2fDMMA,以 YOLOv12 默认的 C2f 结构封装 DMMA block。

    image-20251128165439595.png

  • ultralytics/nn/modules/__init__.py:26ultralytics/nn/tasks.py:32ultralytics/nn/tasks.py:983ultralytics/nn/tasks.py:1018 将新模块注册到构建流程。

  • ultralytics/cfg/models/v12/yolov12-dmma.yaml:15-45 给出全新的 backbone/head,P4/P5 backbone 与 P3–P5 head 均替换为 C2fDMMA

    image-20251128165748439.png

移植一致性与差异

项目YOLOv5 (来源)YOLOv12 (现状)备注
注意力核心WindowAttention + 差分掩码 (newMSA3.py:24-110)DifferenceMaskAttention (transformer.py:431-550)逻辑一致,但实现语言改为纯 PyTorch,无 timm 依赖
通道门控ECA 乘性增强 (newMSA3.py:309-347)DMMAChannelAttention (transformer.py:572-585)功能相同
基本单元C3STR (common2.py:367-379)C2fDMMA (block.py:475-517)结构换成 C2f,更贴合 YOLOv12
Shift WindowSwinTransformerBlock 固定交替 shift (common2.py:289-298)通过 shift 参数控制 (block.py:497-503)Backbone 传入 True,Head 目前配置为 False
Head num_heads自动 c_/32 (common2.py:375)YAML 中固定 8 (yolov12-dmma.yaml:31-39)P3/P4/P5 相同,未随通道数缩放
MLP 扩展比默认 4 (newMSA3.py:244-268)Backbone 2.0、Head 1.5 (yolov12-dmma.yaml:23-39)更轻量但与旧设定不同

训练步骤

  • Step1 配置环境

  • Step2 配置数据集信息

    image-20251128165926231.png

  • Step3 训练命令

    CUDA_VISIBLE_DEVICES=2 yolo detect train \
       model=ultralytics/cfg/models/v12/yolov12-dmma.yaml \
       data=data/masati.yaml \
       imgsz=640 \
       batch=32 \
       epochs=300 \
       device=0 \
       workers=8 \
       project=runs/detect \
       name=dmma_masati_gpu2_b24 \
       lr0=0.01 \
       scale=0.5 \
       mosaic=1.0 \
       mixup=0.1 \
       copy_paste=0.2 \
       amp=False
  • Step4 训练

    image-20251128170134426.png

    训练部分每个 epoch 大约 14 秒,验证大概 3–4 秒。

    所以一整个 epoch(训练 + val):18 秒/epoch。

    现在是 300 个 epoch,那总时间大约是:300 × 18 秒 ≈ 5400 秒 ≈ 1.5 小时

  • Step5 结果展示

    image-20251128185013700.png

    mAP50:0.758(75.8%)

    Precision ≈ 0.90

  • Step6 下一步训练

    # 用上一轮最好的权重继续训练
    yolo detect train \
       model=runs/detect/dmma_masati_gpu24/weights/best.pt \
       data=data/masati.yaml \
       imgsz=1024 \
       batch=24 \
       epochs=100 \
       device=2 \
       workers=8 \
       project=runs/detect \
       name=dmma_masati_gpu2_img1024 \
       lr0=0.01 \
       scale=0.5 \
       mosaic=1.0 \
       mixup=0.1 \
       copy_paste=0.2 \
       multi_scale=True \
       close_mosaic=20 \
       amp=True

  • 微信
  • 赶快加我聊天吧
  • QQ
  • 赶快加我聊天吧
  • weinxin
三桂

发表评论 取消回复 您未登录,登录后才能评论,前往登录

    • avatar

      终于看懂一个哈哈,跑的数据集是啥coco?

        • avatar 三桂 博主
          回复 2025年12月13日 19:09:42   1层

          @ 帅 是滴,嘿嘿