Swin Transformer
Swin Transformer 是一种分层视觉 Transformer,在移位的局部窗口中计算自注意力,因此其计算开销随图像大小线性增长。
Swin Transformer 是 Shifted Window Transformer 的简称,是一种分层视觉 Transformer,它在小型局部窗口内计算自注意力,并在相邻层之间移动这些窗口。Microsoft Research Asia 的 Ze Liu 及其同事在 2021 年的论文 Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 中介绍了它;该论文荣获 ICCV 2021 最佳论文 Marr 奖。局部窗口使注意力的计算开销随像素数量线性增长,而不是呈二次增长;逐阶段合并图像块则会产生多尺度特征图,与卷积神经网络的特征图类似。这些特性使 Transformer 成为实用的通用骨干网络,不仅适用于分类,也适用于高分辨率图像上的目标检测和分割。
移位窗口的工作原理#
Swin 首先将图像拆分为 4×4 像素的图像块,并将每个图像块投影为一个token嵌入,因此 224×224 的图像在 Tiny 模型中会变成一个包含 96 个通道的 56×56 token 网格。对全部 3,136 个 token 执行全局注意力,需要将每个 token 与其他所有 token 进行比较;Swin 则将网格划分为互不重叠的 7×7 token 窗口,只在每个窗口内部计算注意力。论文给出的全局注意力开销为 4hwC² + 2(hw)²C,其中网格尺寸为 h×w,通道数为 C;而对于 M×M token 的窗口,开销为 4hwC² + 2M²hwC,该开销随 hw 线性增长。
如果只有窗口,窗口之间就永远无法交换信息,因此每隔一个模块,窗口网格都会移动半个窗口,即 3 个 token,使新窗口跨越旧窗口的边界。为了保持窗口数量不变,实现会循环滚动特征图,并屏蔽原始图像中彼此不相邻的 token 之间的注意力。每个模块还会为注意力分数添加一个可学习的相对位置偏置。
在不同阶段之间,图像块合并层会拼接每组 2×2 相邻 token,再通过线性投影将分辨率减半、通道数加倍。四个阶段输出的特征图分辨率分别为输入的 1/4、1/8、1/16 和 1/32,与 ResNet 的步幅相同,因此 Swin 可以直接接入现有的检测和分割头,例如特征金字塔网络。torchvision 的实现展示了这两种机制:
import torch
from torchvision.models import swin_t
# Swin-T architecture; random weights are enough to inspect its structure
model = swin_t().eval()
# Each pair of blocks uses 7x7 windows, the second shifted by 3 patches
regular, shifted = model.features[1]
print(f"Window {regular.attn.window_size}, shift {regular.attn.shift_size} then {shifted.attn.shift_size}")
# features alternates stages with patch merging; stage outputs are (batch, height, width, channels)
x = torch.randn(1, 3, 224, 224)
with torch.no_grad():
for i, layer in enumerate(model.features):
x = layer(x)
if i % 2 == 1:
print(f"Stage {i // 2 + 1}: {tuple(x.shape)}")它会打印 Window [7, 7], shift [0, 0] then [3, 3],然后输出各阶段的结果:(1, 56, 56, 96)、(1, 28, 28, 192)、(1, 14, 14, 384) 和 (1, 7, 7, 768):每个阶段都会让网格减半、通道数加倍,从而生成密集预测头所需的特征金字塔。
Swin Transformer 与 ViT 和 CNN 的区别#
原始 ViT 会将图像切成 16×16 的图像块,在所有层中保持单一分辨率,并执行全局注意力;这适用于图像分类,但处理目标检测和分割所需的高分辨率输入时开销很大。Swin 重新引入了卷积网络的两项先验:局部性和特征层级,同时保留了注意力机制中依赖输入的权重。Swin 的局部窗口与滑动窗口注意力不同;后者让每个 token 都关注自身邻域,而 Swin 使用固定划分、供多个 token 共享的窗口,能够高效映射到 GPU 矩阵乘法。
发布时,最大的模型 Swin-L 使用 ImageNet-22K 预训练,在 ImageNet-1K 上达到 87.3% 的 top-1 准确率,在 COCO test-dev 上达到 58.7 box AP 和 51.1 mask AP,在 ADE20K 上达到 53.5 mIoU,创下这些目标检测和语义分割基准测试的最佳公开结果。它的成功也推动了卷积网络研究:Meta 于 2022 年推出的 ConvNeXt 从 Swin 借鉴设计选择,对 ResNet 进行了现代化改造,达到了与其相当或更高的准确率。
Swin 可以作为自定义 Ultralytics 模型的骨干网络:模型 YAML 文件中的 TorchVision 模块会加载带有预训练 ImageNet 权重的 torchvision swin_t,而 YOLO 检测头则在它返回的单个 stride-32 特征图上进行训练。










