SEAM:给 YOLOv11 加上“深度可分离卷积+SE注意力“的组合拳

SEAM:给 YOLOv11 加上"深度可分离卷积+SE注意力"的组合拳

YOLOv11 改进系列 · 第04篇 · 网络结构改进

作者:小探

发布时间:2026年6月

关键词:注意力机制,SEAM,深度可分离卷积,YOLOv11改进

1. 改进动机

在目标检测任务中,通道注意力已经被证明是一种简单有效的特征增强手段。经典的 SE (Squeeze-and-Excitation) 模块通过全局平均池化压缩空间信息,再用两层全连接网络学习通道权重,让模型"关注"更重要的通道。

但 SE 模块只做了通道维度的"筛选",没有在空间维度上做额外的特征提取。如果我们在 SE 之前,先用深度可分离卷积对特征做一轮轻量的空间建模,会不会更好?

这就是 SEAM (Squeeze-Excitation Attention Module) 的核心思路:深度可分离卷积提取空间特征 + SE 注意力做通道重标定,两者组合形成一个轻量高效的注意力模块。

2. SEAM 的结构拆解

SEAM 的结构非常清晰,可以分为三个部分:

复制代码
输入 x (c1通道)
    │
    ├── [可选] 1×1 Conv 投影 (c1 → c2,当 c1 ≠ c2 时)
    │
    ▼
┌─────────────────────────────────────┐
│  DConvN: 堆叠 n 个残差块            │
│                                     │
│  每个块 = Residual(DWConv + BN)      │
│         + Pointwise Conv (1×1) + BN │
│                                     │
│  · DWConv: 3×3 深度卷积 (groups=c)  │
│  · 残差连接: 输入 + DWConv输出       │
│  · 1×1 Conv: 融合跨通道信息         │
└─────────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────────┐
│  SE 注意力                          │
│                                     │
│  GAP → FC(降维) → ReLU → FC(升维)   │
│  → Sigmoid → exp() → 逐通道缩放    │
└─────────────────────────────────────┘
    │
    ▼
输出 y (c2通道)

几个关键设计点:

2.1 深度可分离卷积 + 残差连接

每个 DConvN 块的核心是一个 3×3 深度卷积 (groups=channels),只在空间维度上做卷积,不混合通道。然后用残差连接把输入直接加回来,保证梯度流通。

python 复制代码
Residual(nn.Sequential(
    nn.Conv2d(c, c, 3, 1, 1, groups=c),  # 深度卷积
    nn.GELU(),
    nn.BatchNorm2d(c)
))

之后再接一个 1×1 逐点卷积 做通道融合,补上深度卷积缺失的跨通道交互。

2.2 SE 注意力 + exp() 缩放

SE 模块生成的通道权重经过 exp() 函数而不是传统的 sigmoid()。这意味着:

  • sigmoid 输出范围是 (0, 1),只能"抑制"不重要的通道
  • exp(sigmoid(...)) 的输出范围是 (1, e),既能抑制(接近1),也能放大重要通道(最高约2.7倍)

这个设计让 SEAM 不仅能"筛选"通道,还能"增强"关键特征。

2.3 输入投影适配

当输入通道 c1 和输出通道 c2 不同时(比如在不同 scale 的模型中),SEAM 会在最前面加一个 1×1 卷积做通道投影,保证模块的输出通道数与 parse_model 的通道追踪一致。

python 复制代码
self.proj = nn.Conv2d(c1, c2, 1, bias=False) if c1 != c2 else nn.Identity()

3. 怎么塞进 YOLOv11

和之前 MambaOut 的改进一样,Ultralytics 的模块注册机制只需要三步:

Step 1 --- 写模块

ultralytics/nn/modules/seam.py 中实现 SEAMMultiSEAMConvMixerSEAM 三个模块:

python 复制代码
class SEAM(nn.Module):
    def __init__(self, c1, c2, n=1, reduction=16):
        super().__init__()
        self.proj = nn.Conv2d(c1, c2, 1, bias=False) if c1 != c2 else nn.Identity()
        self.DCovN = nn.Sequential(*[
            nn.Sequential(
                Residual(nn.Sequential(
                    nn.Conv2d(c2, c2, 3, 1, 1, groups=c2),
                    nn.GELU(), nn.BatchNorm2d(c2)
                )),
                nn.Conv2d(c2, c2, 1),
                nn.GELU(), nn.BatchNorm2d(c2)
            ) for _ in range(n)
        ])
        self.se = SEBlock(c2, reduction)

    def forward(self, x):
        x = self.proj(x)
        y = self.DCovN(x)
        return self.se(y)

Step 2 --- 注册模块

ultralytics/nn/modules/__init__.py 中添加导入:

python 复制代码
from .seam import SEAM, MultiSEAM, ConvMixerSEAM

ultralytics/nn/tasks.py 中将 SEAM 加入 base_modules

python 复制代码
base_modules = frozenset({
    ...
    SEAM,
    MultiSEAM,
    ConvMixerSEAM,
})

Step 3 --- 写 YAML 配置

ultralytics/cfg/models/11/yolo11-seam.yaml 中,在三个检测头(P3/P4/P5)的 C3k2 之后各插入一个 SEAM 模块:

yaml 复制代码
# YOLO11 head with SEAM
head:
  ...
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)
  ...
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
  ...
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)

  - [16, 1, SEAM, [256, 1, 16]] # 23 - SEAM on P3
  - [19, 1, SEAM, [512, 1, 16]] # 24 - SEAM on P4
  - [22, 1, SEAM, [512, 1, 16]] # 25 - SEAM on P5

  - [[23, 24, 25], 1, Detect, [nc]]

SEAM 的参数含义:[输出通道数, 残差块数量, SE降维比]

4. 模型结构对比

原始 YOLOv11m

复制代码
  Layer  From    Params   Module
  ...
  16     -1      542720   C3k2         [1024, 256, 1, True]
  19     [-1,13] 1511424  C3k2         [768, 512, 1, True]
  22     [-1,10] 1642496  C3k2         [1024, 512, 1, True]
  23     [16,19,22] 1411795 Detect     [80, [256, 512, 512]]

YOLOv11m-SEAM

复制代码
  Layer  From    Params   Module
  ...
  16     -1      542720   C3k2         [1024, 256, 1, True]
  19     [-1,13] 1511424  C3k2         [768, 512, 1, True]
  22     [-1,10] 1642496  C3k2         [1024, 512, 1, True]
  23     16      77568    SEAM         [256, 256, 1, 16]    ← 新增
  24     19      302592   SEAM         [512, 512, 1, 16]    ← 新增
  25     22      302592   SEAM         [512, 512, 1, 16]    ← 新增
  26     [23,24,25] 1472704 Detect     [80, [256, 512, 512]]
指标 YOLOv11m YOLOv11m-SEAM
层数 231 268
参数量 20.1M 20.8M
GFLOPs 68.5 70.6
新增参数 - +683K (+3.4%)

SEAM 仅增加了 3.4% 的参数量,换来的是在三个检测尺度上都多了一层"深度可分离卷积+SE注意力"的特征增强。

5. 三个变体

代码中实现了三个 SEAM 变体,适用于不同的使用场景:

5.1 SEAM(基础版)

单尺度深度可分离卷积 + SE 注意力。最轻量,适合对速度要求高的场景。

python 复制代码
SEAM(c1, c2, n=1, reduction=16)

5.2 MultiSEAM(多尺度版)

用三个不同 patch_size(3、5、7)的 DConvN 分支并行提取多尺度特征,再把它们的全局平均池化结果和原始输入的池化结果取平均,最后过 SE 注意力。

python 复制代码
MultiSEAM(c1, c2, depth=1, kernel_size=3, patch_size=[3, 5, 7], reduction=16)

多尺度设计让模块能同时捕捉小、中、大三种感受野的特征,适合目标尺度变化大的场景。

5.3 ConvMixerSEAM(ConvMixer版)

先用 patch_size 的卷积做 patch embedding(类似 ViT 的 patch 化),再堆叠深度可分离卷积,最后过 SE 注意力。结构更接近 ConvMixer 的设计哲学。

python 复制代码
ConvMixerSEAM(c1, c2, depth=1, kernel_size=3, patch_size=4, reduction=16)

6. 适用场景

6.1 推荐使用 SEAM 的场景

场景 推荐度 说明
通道特征区分度不足 ⭐⭐⭐⭐⭐ SEAM 核心优势:SE 注意力增强关键通道
小/微小目标检测 ⭐⭐⭐⭐ 深度可分离卷积的空间建模对小目标友好
工业缺陷检测 ⭐⭐⭐⭐ 腐蚀、裂纹、凹陷等细粒度缺陷需要通道级特征筛选
无人机/卫星图像 ⭐⭐⭐⭐ 多尺度目标场景,MultiSEAM 变体更合适
医学图像 ⭐⭐⭐⭐ 细胞、病灶等需要精确通道注意力的场景
通用目标检测(COCO) ⭐⭐⭐ 通用提升,参数开销小,值得一试
实时检测(速度优先) ⭐⭐⭐ SEAM 基础版仅增加 3.4% 参数,延迟影响小
大目标为主的数据集 ⭐⭐ 优势不明显,SE 注意力对大目标收益有限

6.2 三个变体怎么选?

变体 参数量 适用场景
SEAM 最少 速度优先、单尺度目标、参数预算紧张
MultiSEAM 较多 目标尺度变化大、需要多尺度感受野
ConvMixerSEAM 中等 需要 patch-level 特征建模、类似 ViT 的设计思路

6.3 判断标准

如果你的模型出现以下情况,建议尝试 SEAM:

  1. 通道注意力不够:某些类别依赖特定通道的特征,但模型没有"重点关注"这些通道
  2. 轻量级改进需求:不想大幅增加参数,但希望提升特征表达能力
  3. 检测头特征粗糙:C3k2 输出的特征直接送入 Detect 头,缺少精细化处理

7. 使用方法

bash 复制代码
# 训练 YOLOv11m-SEAM
yolo detect train data=coco.yaml model=yolo11-seam.yaml scale=m epochs=100 imgsz=640

# 预测
yolo predict model=best.pt source=image.jpg

# 验证
yolo val model=best.pt data=coco.yaml

8. 总结

SEAM 的核心思想很简单:先用深度可分离卷积做轻量空间建模,再用 SE 注意力做通道重标定。两者都是成熟的技术,但组合在一起后,在 YOLOv11 的检测头上只增加了 3.4% 的参数,就多了一层特征增强能力。

如果你的目标检测任务中,模型对某些通道特征的"关注度"不够,或者想在不大幅增加计算量的前提下提升特征表达能力,SEAM 是一个值得尝试的改进方向。


代码仓库: 本文的 SEAM 模块和 YOLOv11-SEAM 配置文件已集成到本仓库中,可直接使用。