【深度学习】U型的Transfomer网络(Swin-Unet)和Swin-Transformer分类
这篇文章介绍了基于Transformer的医学图像分割模型Swin-Unet及其在Python框架中的实现。该模型结合了U-Net架构和Transformer机制,在编码器中使用带有偏移窗口的分层Swin Transformer提取特征,在解码器中采用补丁扩展层进行上采样以恢复空间分辨率。文章详细描述了模型的设计、实现技术(如数据加载、分布式训练)以及复杂度降低的方法(如W-MSA操作)。此外,还讨论了如何通过调整skip connections的数量来优化模型性能,并通过实验验证了不同配置对分割性能的影响。
文章目录
1 概述
2 Swin-Transformer分类源码
3 训练
4 关于复杂度降低问题
5 关于SW-MSA的操作问题
6 总结
1 概述
目前尚未公开提供该代码的开源版本

在过去几年里,在医学图像分析领域中展示了显著的进步[()(CNN)。特别是在医学图像分析领域中,基于U型架构与跳跃连接的深度神经网络已经广泛应用于各个医学图像任务当中。然而,在尽管CNN表现出卓越性能的同时由于卷积操作所具有的限制因素它无法有效地学习全局与远程语义信息之间的交互。
在本文中提出了一种名为Swin-Unet的新模型,在医学图像分割任务中展现出独特的优势。该模型是一种基于Transformer架构设计的纯模型结构,在处理图像分割问题时具有显著效果。经过分块标记后的图像特征通过跳跃连接机制被传递给一个基于Transformer架构设计的U型解码器模块,并通过这一模块实现对局部与全局语义特征的学习与融合。

具体来说, 我们采用了基于滑动窗口的分层Swin Transformer结构作为编码器, 用于捕获和表示输入信号的空间与时序特征。

开发了一种带有补丁扩展机制的基于对称Swin Transformer架构作为解码器模块,用于实现特征图的空间分辨率恢复过程。
2 Swin-Transformer分类源码
最近swin-transformer大火,代码开源两天,girhub直接飙到1.9k。估计接下来关于和swin-transformer相结合的各种网络结构paper就要出来了,哈哈,我也是其中的一员,拼手速吧各位。它的原理网上的博客已经讲的非常的细致了,甚至还有带着读源代码的。这些大佬真的很强,下面会放一些本人读过的非常有助于理解的博客。我在这里主要分享的是官方源码如何跑通,跑通它的代码还是非常不容易的,有很多的小坑。对于我们小白而言,跑通代码才能给我们继续了解原理的信心,然后也可以大胆的debug,去验证里面的代码是否与论文所述的一致。
配置环境
请将代码通过git克隆至您的服务器或本地服务器。
git pull down https://github.com/microsoft/Swin-Transformer.git 至目标位置,并执行以下操作:
cd Swin-Transformer
搭建运行环境并切换到环境中
安装需要的环境
conda install pytorch==1.7.1 torchvision==0.8.2 cudatoolkit=10.1 -c pytorch
请确保检查自己的环境设置。由于当前使用的CUDA版本为10.1,在操作过程中可以直接按照官方提供的指导步骤操作。为了更好地了解如何使用CUDA,请注意以下几种方法中选择最可靠的方式:详细说明了如何查看 CUDA 环境的具体步骤。
cat /usr/local/cuda/version.txt
别看nvidia-smi的那个,那个不准。
安装 timm==0.3.2:
pip install timm==0.3.2
cd apex
pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
3 训练
首先是训练的运行方式:
执行分布式训练作业,并将主节点设置为12345端口;指定--nproc_per_node参数为每个节点划分为四块;运行main.py脚本;配置文件选自swin_tiny_patch4_window7_224.yaml;数据加载路径设为imagenet;批量大小设置为64
–data-path对应的就是数据文件所在的位置
然后是测试的运行方式:
python -m torch.distributed.launch
--nproc_per_node=1
--master_port=12345
main.py
--eval
--cfg=configs/swin_tiny_patch4_window7_224.yaml
resume_file=/pth/swin_tiny_patch4_window7_224.pth
data_path=imagenet
介绍一个常见的bug类型。
具体包括CalledProcessError以及RuntimeError。
由于上述命令中存在书写错误或者逻辑问题。
如路径书写错误或对应文件实际不存在等情况。
从而会抛出此类错误信息。
需要注意的是……
swin-transformer文件目录

基于官方源码构建了项目,并在此基础上增加了模型相关的pth文件。这些pth文件主要包含模型参数信息。此外,在一个百度网盘中有完整的资源包下载链接,并且在其中一个预设的imagenet文件夹中存放着大量数据资源。
4 关于复杂度降低问题

Swin-transformer如何实现复杂度的降低呢?在Swin Transformer组件中存在一个独特的设计特点即W-MSA(Weighted Multi-Head Self-Attention),这正是实现计算效率提升的关键因素。
为了帮助大家更好地理解这一机制的工作原理,请容我简单地介绍其中的核心逻辑:传统的transformer架构基于全局注意力机制(MSA),其计算复杂度与图像大小呈平方关系。针对这一特性,在这里我们假设MSA的计算复杂度为O(N²),其中N代表图像像素的数量。通过这种假设关系可以进一步推导出其他相关参数的计算方式。
具体而言,在Swin Transformer的设计中采用了局部window机制(local windows),每个窗口内执行自注意力操作(self-attention)。根据上述假设条件可知,在单个红色标记区域内的自注意力计算复杂度为O(1⁴)=1。由于整个图像被划分为9个这样的区域(9 patches),因此最终的整体计算复杂度为9×1=9。
5 关于SW-MSA的操作问题
尽管W-MSA降低了计算复杂度,然而由于各不相邻的Window之间缺乏信息交互,因此为了实现Window间的相互沟通,我们可以将左图转换为右图所示的形式。但这种操作所带来的问题是:当进行这种操作时,会导致Window数量显著增加,其中一些Window的规模小于常规Window(例如从4个Window增长到9个Window),进而导致计算负担进一步加重了。同时我们需要确保两个主要目标:一是保持Window的数量不过多;二是确保各Window间能够有效通信

6 总结
Transformer并非为取代CNN而设计。尽管它具备特征提取能力,并能执行许多CNN无法完成的任务(如多模态融合),但它并非专为取代CNN而生。Swish Transformer则是一个将两者优势有效结合的重要方向。在不同降采样尺度(如1/4、1/8和1/16)中加入Skip Connection是一种趋势,在Swin-UNet模型中通过设置不同数量的Skip Connection(分别为0个、1个、2个和3个)来探究其数量对分割性能的影响。实验结果表明随着Skip Connection数量的增加模型性能显著提升(如表所示)。因此为了优化模型鲁棒性本研究将其Skip Connection数量设定为3个。
