顶会经典论文解析:Swin Transformer 如何改变图像分类、检测和分割?

张开发
2026/4/6 6:42:44 15 分钟阅读

分享文章

顶会经典论文解析:Swin Transformer 如何改变图像分类、检测和分割?
顶级图像算法论文精读ICCV 2021《Swin Transformer》到底为什么这么火摘要如果说 Vision Transformer 让大家第一次认真思考“纯 Transformer 能不能做视觉”那么Swin Transformer真正解决的就是 Transformer 在视觉任务中“能不能更高效、更通用、更适合作为主干网络”这个问题。它通过Window-based Multi-Head Self-Attention和Shifted Window两个关键设计把原本计算代价很高的全局注意力改造成了更适合图像结构的层次化局部建模方式。这样一来Transformer 不仅能做分类还能像 ResNet 一样自然地接入检测、分割等密集预测任务。本文将从问题背景、核心思想、模型结构、公式理解、实验效果、优缺点以及简化复现代码几个方面对这篇顶级图像算法论文进行系统分析适合做视觉主干网络、目标检测、图像分割和论文复现的同学阅读。一、论文信息论文标题Swin Transformer: Hierarchical Vision Transformer using Shifted Windows会议ICCV 2021研究方向视觉 Transformer、主干网络设计、图像分类、目标检测、语义分割关键词Swin Transformer、Shifted Window、Vision Transformer、层次化建模、主干网络二、这篇论文解决了什么问题在 Swin Transformer 之前Vision Transformer 已经证明了 Transformer 可以用于图像分类但它也暴露出几个很明显的问题。1. 标准自注意力计算量太大对于一张大小为H×WH \times WH×W的特征图如果每个 token 都和所有 token 做注意力计算那么复杂度大约是Ω(MSA)4hwC22(hw)2C \Omega(\text{MSA}) 4hwC^2 2(hw)^2CΩ(MSA)4hwC22(hw)2C其中h,wh,wh,w表示特征图的高和宽CCC表示通道维度这里最麻烦的是第二项2(hw)2C 2(hw)^2C2(hw)2C它会随着图像分辨率升高而快速增大。这意味着全局注意力在高分辨率视觉任务中计算代价太高。2. ViT 不适合直接做密集预测任务早期 ViT 更偏向图像分类因为它通常把图像切成 patch 后直接送入统一尺度的 Transformer 编码器。但目标检测、实例分割、语义分割等任务都更依赖多尺度特征层次化表示局部空间结构而标准 ViT 在这些方面并不天然友好。3. 缺少像 CNN 那样的层次化主干结构CNN 主干网络之所以在检测和分割中长期占主导原因之一就是它具备天然的层次化特征表示浅层保留更多细节深层拥有更强语义不同层级可以用于 FPN 等结构而标准 ViT 的 token 处理方式更“平铺”不够像一个成熟的视觉主干网络。三、论文的核心目标是什么Swin Transformer 想解决的问题可以概括成一句话设计一个既保留 Transformer 建模能力又像 CNN 一样适合视觉多任务的通用主干网络。具体来说它希望同时做到三件事降低 Transformer 在视觉上的计算成本构建层次化特征表示让 Transformer 更自然地适配分类、检测和分割任务四、论文最核心的思想Window Attention Shifted WindowSwin Transformer 最核心的创新其实可以概括为两个关键词窗口注意力移位窗口1. Window-based Multi-Head Self-Attention作者不再让所有 token 彼此做全局注意力而是先把特征图划分成若干个不重叠的局部窗口只在每个窗口内部做自注意力。如果每个窗口大小为M×MM \times MM×M那么窗口注意力的复杂度变成Ω(W-MSA)4hwC22M2hwC \Omega(\text{W-MSA}) 4hwC^2 2M^2hwCΩ(W-MSA)4hwC22M2hwC和全局注意力相比它把原来的平方级空间复杂度变成了和图像大小近似线性相关的复杂度。这就是它能在高分辨率视觉任务中落地的重要原因。2. Shifted Window如果每一层都只在固定窗口内做注意力那么不同窗口之间的信息无法交换。这会导致模型只能在局部区域内看图感受野受限。作者为了解决这个问题引入了Shifted Window。具体做法是第一层按规则窗口划分做 Window Attention下一层把窗口整体平移半个窗口大小再做 Window Attention这样一来原本属于不同窗口的 token在下一层就有机会进入同一个窗口从而实现跨窗口信息交互。这就是 Swin Transformer 名字里Shifted的来源。五、为什么这个设计很巧妙Swin Transformer 的厉害之处不在于它提出了“局部注意力”这个想法而在于它把效率和信息交互平衡得很好。1. 先限制计算范围保证效率窗口内部做注意力大幅减少了计算量。2. 再通过移位窗口补足跨区域建模能力Shifted Window 让相邻窗口之间建立联系解决了单纯局部窗口容易信息割裂的问题。3. 既像 Transformer又保留了视觉结构感Swin 不再是简单把图像 patch 平铺送进编码器而是构建了更像 CNN 的层级式结构。这使得它不只是“能做分类”而是“能成为真正的视觉主干”。六、模型结构怎么理解Swin Transformer 是一个层次化四阶段结构整体思路和很多 CNN 主干网络比较接近。其基本流程如下输入图像 ↓ Patch Partition ↓ Linear Embedding ↓ Stage 1Swin Transformer Block × N ↓ Patch Merging ↓ Stage 2Swin Transformer Block × N ↓ Patch Merging ↓ Stage 3Swin Transformer Block × N ↓ Patch Merging ↓ Stage 4Swin Transformer Block × N ↓ 分类头 / 检测头 / 分割头七、Swin Transformer 的关键模块逐个分析1. Patch Partition输入图像先被切分成若干个小 patch。例如若 patch size 为4×44 \times 44×4那么一张图像会被划分成很多小块。每个 patch 会被拉平并映射到特征空间形成初始 token 表示。这一步和 ViT 有点像但 Swin 后续不会一直保持同一分辨率而是继续做层次化下采样。2. Swin Transformer Block每个 Swin Block 主要包含两种交替结构W-MSAWindow Multi-Head Self-AttentionSW-MSAShifted Window Multi-Head Self-Attention同时每个 Block 还包含LayerNormMLPResidual Connection其结构可以写成z^lW-MSA(LN(zl−1))zl−1 \hat{z}^{l} \text{W-MSA}(\text{LN}(z^{l-1})) z^{l-1}z^lW-MSA(LN(zl−1))zl−1zlMLP(LN(z^l))z^l z^{l} \text{MLP}(\text{LN}(\hat{z}^{l})) \hat{z}^{l}zlMLP(LN(z^l))z^l下一层则变成z^l1SW-MSA(LN(zl))zl \hat{z}^{l1} \text{SW-MSA}(\text{LN}(z^{l})) z^{l}z^l1SW-MSA(LN(zl))zlzl1MLP(LN(z^l1))z^l1 z^{l1} \text{MLP}(\text{LN}(\hat{z}^{l1})) \hat{z}^{l1}zl1MLP(LN(z^l1))z^l1也就是说一层用普通窗口注意力下一层用移位窗口注意力二者交替堆叠构成整个网络的主干。3. Patch Merging为了构建层次化特征Swin 在不同 stage 之间使用了Patch Merging。它的作用类似于 CNN 中的下采样降低空间分辨率提高通道数扩大感受野形成多层级语义表示例如把相邻的2×22 \times 22×2patch 特征拼接起来再通过线性层映射到新的通道维度。这样处理后特征图尺寸减半通道维度增加这一步对于目标检测和语义分割非常重要因为这些任务都依赖多尺度特征。八、Swin Transformer 的整体直观图可以用下面这张简化逻辑图来理解Input Image ↓ Patch Partition (4×4) ↓ Linear Embedding ↓ Stage 1 ├─ W-MSA └─ SW-MSA ↓ Patch Merging ↓ Stage 2 ├─ W-MSA └─ SW-MSA ↓ Patch Merging ↓ Stage 3 ├─ W-MSA └─ SW-MSA ↓ Patch Merging ↓ Stage 4 ├─ W-MSA └─ SW-MSA ↓ Task Head九、这篇论文的方法为什么有效我认为 Swin Transformer 有效主要有下面几个原因。1. 它抓住了视觉任务最重要的矛盾视觉任务中最难平衡的两件事是大范围建模能力高分辨率计算成本全局注意力虽然表达能力强但代价太高。局部建模虽然便宜但容易丢失全局关系。Swin 的思路不是走极端而是在两者之间找到一个结构化的折中方案。2. 它把 Transformer 改造成了层次化视觉主干标准 ViT 更像“分类模型”。而 Swin 通过 Patch Merging 构建层级特征后更像一个真正的通用视觉 backbone。这让它能更自然地接入FPNMask R-CNNUPerNetSemantic FPN这就是它能同时在分类、检测、分割中表现强势的原因。3. Shifted Window 的设计非常高效如果只做局部窗口注意力窗口之间的信息会断掉。如果直接做全局注意力成本又太高。Shifted Window 用一种非常自然的方式让跨窗口信息流动起来而且不需要显著增加计算负担。这是这篇论文最有代表性的设计之一。十、实验效果怎么看Swin Transformer 之所以能迅速火起来一个很重要的原因就是它不是只在一个任务上好而是在多个视觉任务上都表现出了很强的竞争力。1. 图像分类表现强在 ImageNet 上Swin Transformer 证明了层次化 Transformer 主干在分类任务中可以取得很强效果。2. 目标检测表现强把 Swin 作为 backbone 接入目标检测框架后它在 COCO 上取得了很有竞争力的结果。这说明它不仅能“看懂整张图”还能为检测任务提供足够强的多尺度特征支持。3. 语义分割表现强在 ADE20K 等语义分割任务中Swin 也展现了出色表现。这说明它并不是一个只适合分类的 Transformer而是真正具有通用视觉表征能力的主干网络。换句话说Swin Transformer 真正完成了这样一件事让 Transformer 从“图像分类实验品”变成“可广泛使用的视觉基础主干”。十一、这篇论文最大的创新点是什么如果只总结一句我会说Swin Transformer 让 Transformer 第一次真正拥有了像 CNN 一样适合视觉多任务的层次化结构。具体来看创新点主要有下面几个。创新点一提出 Window-based Self-Attention它把注意力限制在局部窗口中大幅降低了视觉任务中的计算负担。创新点二提出 Shifted Window 机制它解决了局部窗口信息孤立的问题让跨窗口交互变得高效可行。创新点三构建层次化视觉 Transformer通过 Patch Merging模型可以像 CNN 一样形成多尺度特征表示这对于检测和分割至关重要。创新点四证明 Transformer 可以成为通用视觉主干这篇论文不是只做了一个“分类模型”而是把 Transformer 推向了主干网络这个层面。十二、这篇论文的优点1. 结构设计很优雅窗口注意力和移位窗口都非常直观而且逻辑自洽。2. 兼顾精度与效率它不是单纯追求更强表达能力而是在计算成本可接受的前提下提升性能。3. 很适合作为通用主干网络分类、检测、分割都能用这一点非常重要。4. 对后续工作影响很大后面很多视觉 Transformer 工作都不同程度受到了 Swin 的影响包括Swin V2视频 Transformer医学图像 Transformer检测和分割领域的大量主干网络设计十三、这篇论文的局限性再经典的论文也不是没有问题Swin 也有自己的局限。1. 本质上仍然偏局部建模虽然有 Shifted Window但它的全局建模能力仍然不是“直接全局注意力”那种形式。跨很远距离的信息传播通常要依赖多层堆叠。2. 实现复杂度高于 CNN相比 ResNet 这类经典 CNNSwin 的实现和部署复杂度更高尤其是在窗口划分、移位、mask 处理这些地方。3. 对硬件优化要求更高Transformer 类模型虽然理论表达能力强但在实际部署时往往没有 CNN 那么“天然友好”。尤其在一些边缘设备和老旧推理框架下这一点会更明显。十四、从工程视角看Swin 最值得借鉴什么如果从工程角度总结我觉得这篇论文最值得借鉴的不是某一个具体公式而是三个思想。1. 不要一上来就追求全局最强表达视觉任务里很多时候更重要的是找到表达能力和计算成本之间的平衡点。2. 主干网络一定要考虑下游任务适配性一个真正有生命力的视觉 backbone不应该只在分类上表现好还要能自然服务于检测和分割。3. 结构创新最好既有理论意义也有工程合理性Shifted Window 之所以被认可不只是因为新而是因为它确实解决了实际问题。十五、简化版 PyTorch 代码下面给一个适合博客展示的Swin Transformer Block 简化实现。这不是官方完整实现但很适合理解核心思想。importtorchimporttorch.nnasnnclassMLP(nn.Module):def__init__(self,dim,hidden_dimNone,dropout0.0):super().__init__()hidden_dimhidden_dimordim*4self.fc1nn.Linear(dim,hidden_dim)self.actnn.GELU()self.fc2nn.Linear(hidden_dim,dim)self.dropnn.Dropout(dropout)defforward(self,x):xself.fc1(x)xself.act(x)xself.drop(x)xself.fc2(x)xself.drop(x)returnxclassWindowAttention(nn.Module):def__init__(self,dim,window_size7,num_heads4):super().__init__()self.dimdim self.window_sizewindow_size self.num_headsnum_heads self.scale(dim//num_heads)**-0.5self.qkvnn.Linear(dim,dim*3)self.projnn.Linear(dim,dim)defforward(self,x):# x: [B*num_windows, N, C]B_,N,Cx.shape qkvself.qkv(x).reshape(B_,N,3,self.num_heads,C//self.num_heads)qkvqkv.permute(2,0,3,1,4)# [3, B_, heads, N, head_dim]q,k,vqkv[0],qkv[1],qkv[2]attn(q k.transpose(-2,-1))*self.scale attnattn.softmax(dim-1)out(attn v).transpose(1,2).reshape(B_,N,C)outself.proj(out)returnoutclassSwinBlock(nn.Module):def__init__(self,dim,num_heads4,window_size7,mlp_ratio4.0):super().__init__()self.norm1nn.LayerNorm(dim)self.attnWindowAttention(dim,window_size,num_heads)self.norm2nn.LayerNorm(dim)self.mlpMLP(dim,int(dim*mlp_ratio))defforward(self,x):# x: [B*num_windows, N, C]shortcutx xself.norm1(x)xself.attn(x)xxshortcut shortcutx xself.norm2(x)xself.mlp(x)xxshortcutreturnxif__name____main__:xtorch.randn(8,49,96)# 8个窗口, 每个窗口7x749个token, 维度96blockSwinBlock(dim96,num_heads4,window_size7)yblock(x)print(input shape :,x.shape)print(output shape:,y.shape)十六、如果想继续深入复现可以从哪些方向入手如果你打算继续做正式复现或二次研究可以沿着下面几个方向走。1. 补全窗口划分与反划分真正的 Swin 实现中需要把特征图切成窗口再在注意力计算后恢复原布局。2. 实现 Shifted Window 和 Attention Mask这是论文真正的关键部分。想完整复现必须补上窗口平移与 mask 机制。3. 加入 Patch Merging如果没有层次化下采样模型就不再是真正意义上的 Swin 主干。4. 接入下游任务框架比如图像分类接线性分类头目标检测接 FPN Mask R-CNN语义分割接 UPerNet5. 对比 CNN 主干和其他 Transformer 主干这一步非常适合写论文复现或博客分析因为可以更清楚看到 Swin 的定位。十七、总结Swin Transformer 是视觉 Transformer 发展过程中非常关键的一篇论文。它真正厉害的地方不只是提出了一个新模块而是解决了一个更重要的问题如何让 Transformer 从“能做视觉分类”走向“能成为通用视觉主干”。它通过窗口注意力降低计算量通过移位窗口建立跨区域联系通过 Patch Merging 构建层次化特征表示最终让 Transformer 在分类、检测、分割等任务中都具备了很强的适用性。从研究角度看这篇论文代表了一次非常成功的结构设计。从工程角度看它也说明了一个现实问题真正有价值的模型创新不一定是最复杂的而往往是最能抓住核心矛盾的。如果你正在学习视觉 Transformer或者想系统理解“为什么 Transformer 能进入目标检测和图像分割主干领域”那么 Swin Transformer 绝对是一篇绕不开的经典论文。

更多文章