CSWin Transformer核心代码逐行解析:LePEAttention、CSWinBlock与四级层级结构详解
【免费下载链接】CSWin-TransformerCSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped, CVPR 2022项目地址: https://gitcode.com/gh_mirrors/cs/CSWin-Transformer
CSWin Transformer(CVPR 2022)是一个通用的视觉 Transformer 骨干网络,用"交叉形状窗口自注意力"(Cross-Shaped Window)替代传统全局注意力,实现"有限算力下感受全场"的效果。本文带你读懂核心源码:LePEAttention如何拆出水平/垂直条带做注意力、CSWinBlock如何双分支并行计算,以及四级层级结构(Stage 1~4)如何逐级下采样——代码全在 models/cswin.py,一个文件即可看懂全貌。
图中 (a) 展示了核心思想:将特征图切成水平和垂直两种"条带"(cross-shaped window)分别做注意力;(b) 是一个 CSWinBlock 内部结构;(c) 是四级层级架构。
🧩 核心机制:LePEAttention 交叉窗口注意力
LePEAttention是整个模型的灵魂(models/cswin.py)。它和普通窗口注意力的区别在于"条带"的形状,由参数idx控制:
| idx 取值 | H_sp × W_sp(条带尺寸) | 含义 |
|---|---|---|
0 | 整行 × split_size | 水平条带,感知横向全局 |
1 | split_size × 整列 | 垂直条带,感知纵向全局 |
-1 | 整图 × 整图 | 最后一级的全局注意力 |
3×3 深度卷积 LePE 是"隐藏彩蛋"
注意第 84 行:
self.get_v = nn.Conv2d(dim, dim, kernel_size=3, stride=1, padding=1, groups=dim)这个 3×3 深度可分离卷积只作用在V(value)分支上,在注意力聚合前先给 token 注入局部上下文,论文称之为 LePE(Local Positional Encoding 的卷积版)——零额外参数、极低开销,却显著提升了精度。
前向流程(forward,第 111~137 行)
im2cswin:把 B×L×C 的 token 序列切分成条带窗口(借助 img2windows);get_lepe:对 V 做窗口切分 + 深度卷积;- 标准注意力:
attn = softmax(q @ kᵀ) @ v,再+ lepe融合局部信息; windows2img(models/cswin.py):把窗口拼回原特征图。
🧱 CSWinBlock:双分支并行 + 残差 MLP
CSWinBlock(models/cswin.py)是标准 Transformer Block 的"交叉版":
- qkv 一次投影:
self.qkv = nn.Linear(dim, dim * 3)同时算出 q、k、v(第 196 行); - 两分支各用一半通道:非末级时
branch_num = 2,qkv 按通道切成两半,分别送入 idx=0(水平)和 idx=1(垂直)的LePEAttention,结果torch.cat拼接(第 198~201 行)——一次前向 = 横向全局 + 纵向全局,这正是"交叉形状"的由来; - 末级单分支:当
patches_resolution == split_size时退化为branch_num = 1,用 idx=-1 做整图全局注意力(第 156~161 行); - 残差 + DropPath + MLP:
x = x + drop_path(attn)、x = x + drop_path(MLP),配合逐层递增的 drop_path 率稳定深层训练(第 205~206 行)。
🏛️ 四级层级结构:特征翻倍、分辨率减半
CSWinTransformer(models/cswin.py)串联了 4 个 Stage,每级由 N 个 CSWinBlock + 1 个Merge_Block组成:
| 级别 | 特征分辨率 | 通道数(base 版) | 窗口 split_size | 作用 |
|---|---|---|---|---|
| Stage 1 | H/4 × W/4 | 96 | 1 | 细粒度、局部细节 |
| Stage 2 | H/8 × W/8 | 192 | 2 | 逐步扩大感受野 |
| Stage 3 | H/16 × W/16 | 384 | 7 | 跨形状窗口主力层 |
| Stage 4 | H/32 × W/32 | 768 | 7 | 全局注意力分类/语义 |
- 输入先经stage1_conv_embed(7×7、stride=4 卷积)完成 token 化,替代了 ViT 的 16×16 patch 切块(第 258~262 行);
Merge_Block用 3×3、stride=2 卷积把分辨率减半、通道翻倍(models/cswin.py),是四个 Stage 之间唯一的"下采样器"。
📦 四个规模的模型注册
文件末尾(models/cswin.py)注册了 Tiny / Small / Base / Large:
| 模型 | embed_dim | depth | num_heads | ImageNet Top-1 |
|---|---|---|---|---|
| CSWin-T | 64 | [1,2,21,1] | [2,4,8,16] | 82.8% |
| CSWin-S | 64 | [2,4,32,2] | [2,4,8,16] | 83.6% |
| CSWin-B | 96 | [2,4,32,2] | [4,8,16,32] | 84.2% |
| CSWin-L | 144 | [2,4,32,2] | [6,12,24,24] | 86.5% (22K 预训练) |
🚀 跑起来:训练、微调与语义分割
- 分类训练:入口 main.py,一行命令即可启动 8 卡训练,脚本见 train.sh,如
bash train.sh 8 --model CSWin_64_12211_tiny_224 ...; - 高分辨率微调:finetune.py 配合 finetune.sh 支持 384×384 分辨率微调与 EMA;
- 语义分割:
segmentation/目录基于 MMSegmentation 封装,骨干实现在segmentation/backbone/cswin_transformer.py,UperNet 配置在segmentation/configs/cswin/upernet_cswin_base.py(CSWin-B 在 ADE20K 上可达 51.1 mIoU)。
📝 小结:为什么 CSWin 值得读
- 算力友好:交叉形状条带让全局注意力的复杂度从 O(N²) 降到近似线性,224 输入下 Base 版仅 15G FLOPs;
- 代码精简:分类骨干全部核心逻辑集中在一个
cswin.py,Mlp、LePEAttention、CSWinBlock、Merge_Block、CSWinTransformer 五段结构层层递进; - 通用骨干:同一套四级层级结构无缝支撑分类、检测(COCO 50.8 box mAP)与分割(ADE20K 55.7 mIoU)。
顺着forward入口 →CSWinBlock→LePEAttention→img2windows/windows2img这条主线索读一遍源码,你也能 1 小时吃透 CVPR 2022 的这套"交叉窗口"设计。
【免费下载链接】CSWin-TransformerCSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped, CVPR 2022项目地址: https://gitcode.com/gh_mirrors/cs/CSWin-Transformer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考