【医学分割】TransUnet

概述

transunet是transformer与unet的强强联合,transformer将CNN的特征图处理成sequence,借助self-attention操作捕捉全局的信息,将这部分信息上采样之后与高分辨率特征图融合,有效的提高了分割任务的效果,实现精准定位。
为什么要强强联合?
因为unet是优秀的分割网络,但是由于卷积操作天然的一些问题,比如平移不变性和捕捉长期依赖能力的不足等等,而transformer能够很好地解决这两个问题,但是它的处理缺乏一些细粒度信息,导致定位不够精确,所以两者的结合可能能够产生更好的效果。

细节

网络结构

首先将输入图片经过resnet50进行特征提取,其中的三个stage的输出将保留,用于之后的skip-connection。接着对于resnet50输出的特征图,将其进行序列化,送入transformer中进行序列预测,输出一个序列。然后将这个序列合并、reshape成一个新的特征图。接下来的过程和unet一样,就是不断上采样并和之前的resnet50的输出做skip-connection,最后还原回全分辨率的结果。
在这里插入图片描述

transformer中的部分细节

序列化操作
一个直观的序列化操作就是,对于一个HxWxC的图片,将每个像素作为一个vector,那么就会得到长度为一个HxW的sequence,但是这样的话,长度就有点大了。因此,一个新的做法就是,对于一个HxWxC的图片,选取N个patch或者说是N个小图,得到长度为N的sequence。假设patch的长度是p,那么 N = H ∗ W p ∗ p N=\frac{H*W}{p*p} N=ppHW,每个vector中元素的个数就是 p ∗ p ∗ C p*p*C ppC
transformer encoder的输出
然后这里用的是transformer的encoder部分,所以输入和输出的一样长度的,因此输出是N个 p ∗ p ∗ C p*p*C ppC的vector,我们将输出拼接起来能够得到一个 H ∗ W p ∗ p ∗ ( p ∗ p ∗ C ) \frac{H*W}{p*p}*(p*p*C) ppHW(ppC)的矩阵,我们将它reshape成 H p ∗ W p ∗ ( p ∗ p ∗ C ) \frac{H}{p}*\frac{W}{p}*(p*p*C) pHpW(ppC)的tensor,接着使用1x1的卷积对通道数进行变换,那么就相当于得到了encoder最后一层的输出。

CNN-Transformer混合的结构

作者提了两种思路,一种是Transformer直接对原图做处理,然后将encoder的结果直接上采样到全分辨率,但是效果并不出色,可能的原因是 H p ∗ W p \frac{H}{p}*\frac{W}{p} pHpW的尺寸相对于 H ∗ W H*W HW是有点小了,那么直接上采样的话,缺少很多的细粒度信息。
因此作者提出了第二种思路,就是论文中讲的这种,一方面Transformer不直接对原图做处理,而是对特征图做处理,另一方面将一些细粒度信息通过skip-connection融合过来。

级联上采样

在对transformer encoder部分的输出做处理之后,将其不断上采样的过程中,并不是常规的上采样步骤而是级联的上采样,每个上采样块是常规的上采样、3x3卷积还有relu。

### TransUNet医学图像分割中的应用 #### 方法概述 TransUNet是一种混合模型,它结合了卷积神经网络(CNN)和变换器(Transformer),旨在提高医学图像分割的效果。CNN首先作为特征提取器工作,在此过程中生成特征图[^4]。这些特征图随后被传递给基于Transformer的模块,该模块能够更好地捕捉全局上下文信息。 #### 特征处理流程 具体来说,补丁嵌入操作不是直接作用于原始图像上的1×1像素块,而是应用于由CNN层产生的高级特征表示上。这种设计使得模型可以在保持局部细节的同时获得更广泛的感受野,从而有助于识别复杂的解剖结构并改善整体性能。 #### 实验验证与成果展示 研究表明,这种方法不仅增强了对于多器官这样需要考虑较大范围空间关系的任务的支持能力;而且当面对诸如微小病变这类特定区域内的精细对象时也表现出色。这得益于所使用的自注意力机制能够在不同尺度下灵活调整关注重点[^2]。 ```python import torch from transunet import TransUnet # 初始化模型参数 img_dim = 128 in_channels = 3 classes = 9 vit_blocks = 12 vit_heads = 12 vit_dim_linear_mhsa_block = 3072 model = TransUnet(img_dim=img_dim, in_channels=in_channels, classes=classes, vit_blocks=vit_blocks, vit_heads=vit_heads, vit_dim_linear_mhsa_block=vit_dim_linear_mhsa_block) # 假设有一个批次大小为1,通道数为3,高度宽度均为128的输入张量x x = torch.randn((1, 3, 128, 128)) output = model(x) print(output.shape) # 输出尺寸应匹配分类数量 ``` 上述代码片段展示了如何定义一个简单的TransUNet实例以及执行前向传播的过程。这里假设输入是一批单个样本组成的三维数组形式的数据集,经过一系列运算后得到最终预测结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值