(即插即用模块-特征处理部分) 十八、(TIM 2022) TIF Transformer交互融合模块

在这里插入图片描述

文章目录

  • 1、Transformer Interactive Fusion
  • 2、代码实现

paper:DS-TransUNet: Dual Swin Transformer U-Net for Medical Image Segmentation

Code:https://github.com/TianBaoGe/DS-TransUNet


1、Transformer Interactive Fusion

对于一些传统的特征融合方法(如简单拼接),这些会导致无法有效捕捉不同尺度特征之间的长程依赖和全局上下文信息,最终会导致分割性能受限。而现有基于Transformer的分割模型主要集中在编码器部分,而解码器仍然使用CNN,无法充分利用Transformer的优势。直接拼接多尺度特征会导致特征错位和语义差距,影响分割精度。为此,这篇论文提出一种 Transformer交互融合模块(Transformer Interactive Fusion module)

TIF 模块通过利用 Transformer 的自注意力机制,在不同尺度特征之间建立长程依赖关系,并有效融合多尺度上下文信息。引入标准 Transformer块 而非 Swin Transformer块,这能使 TIF 模块能够灵活地处理不同分支的特征图,并进行有效的特征融合。

对于两个分支的特征图分别为 F 和 G,TIF 的实现过程:

  1. 全局抽象: 将 G 特征图进行全局平均池化,并将其投影到一个较低维度的向量中,作为 G 的全局抽象信息。这个向量代表 G 特征图的整体信息,可以与 F 特征图中的每个像素进行交互。
  2. 序列拼接: 将 F 特征图与 G 的全局抽象信息进行拼接,形成一个包含多个token的序列。每个token代表 F 特征图中的一个像素,并与 G 的全局抽象信息相连。
  3. 自注意力计算: 将拼接后的序列送入标准Transformer块,进行自注意力计算。在自注意力机制中,每个token会根据其与其他token之间的相似度进行加权,从而获得一个更全面的特征表示。这样,F 特征图中的每个像素都能够获得来自 G 特征图的全局信息,从而提高了分割精度。
  4. 特征图恢复: 将Transformer块的输出进行切片,得到与 F 特征图分辨率相同的融合特征图。

Transformer Interactive Fusion 结构图:
在这里插入图片描述


2、代码实现

import torch
from torch import nn, einsum
from einops.einops import rearrangeclass PreNorm(nn.Module):def __init__(self, dim, fn):super().__init__()self.norm = nn.LayerNorm(dim)self.fn = fndef forward(self, x, **kwargs):return self.fn(self.norm(x), **kwargs)class FeedForward(nn.Module):def __init__(self, dim, hidden_dim, dropout = 0.):super().__init__()self.net = nn.Sequential(nn.Linear(dim, hidden_dim),nn.GELU(),nn.Dropout(dropout),nn.Linear(hidden_dim, dim),nn.Dropout(dropout))def forward(self, x):return self.net(x)class Attention(nn.Module):def __init__(self, dim, heads = 8, dim_head = 64, dropout = 0.):super().__init__()inner_dim = dim_head *  headsproject_out = not (heads == 1 and dim_head == dim)self.heads = headsself.scale = dim_head ** -0.5self.to_qkv = nn.Linear(dim, inner_dim * 3, bias = False)self.to_out = nn.Sequential(nn.Linear(inner_dim, dim),nn.Dropout(dropout)) if project_out else nn.Identity()def forward(self, x):b, n, _, h = *x.shape, self.headsqkv = self.to_qkv(x).chunk(3, dim = -1)q, k, v = map(lambda t: rearrange(t, 'b n (h d) -> b h n d', h = h), qkv)dots = einsum('b h i d, b h j d -> b h i j', q, k) * self.scaleattn = dots.softmax(dim=-1)out = einsum('b h i j, b h j d -> b h i d', attn, v)out = rearrange(out, 'b h n d -> b n (h d)')out =  self.to_out(out)return outclass Transformer(nn.Module):def __init__(self, dim, depth, heads, dim_head, mlp_dim, dropout = 0.):super().__init__()self.layers = nn.ModuleList([])for _ in range(depth):self.layers.append(nn.ModuleList([PreNorm(dim, Attention(dim, heads = heads, dim_head = dim_head, dropout = dropout)),PreNorm(dim, FeedForward(dim, mlp_dim, dropout = dropout))]))def forward(self, x):for attn, ff in self.layers:x = attn(x) + xx = ff(x) + xreturn xclass TIF(nn.Module):def __init__(self, dim_s, dim_l):super().__init__()self.transformer_s = Transformer(dim=dim_s, depth=1, heads=3, dim_head=32, mlp_dim=128)self.transformer_l = Transformer(dim=dim_l, depth=1, heads=1, dim_head=64, mlp_dim=256)self.norm_s = nn.LayerNorm(dim_s)self.norm_l = nn.LayerNorm(dim_l)self.avgpool = nn.AdaptiveAvgPool1d(1)self.linear_s = nn.Linear(dim_s, dim_l)self.linear_l = nn.Linear(dim_l, dim_s)def forward(self, e, r):b_e, c_e, h_e, w_e = e.shapee = e.reshape(b_e, c_e, -1).permute(0, 2, 1)b_r, c_r, h_r, w_r = r.shaper = r.reshape(b_r, c_r, -1).permute(0, 2, 1)e_t = torch.flatten(self.avgpool(self.norm_l(e).transpose(1,2)), 1)r_t = torch.flatten(self.avgpool(self.norm_s(r).transpose(1,2)), 1)e_t = self.linear_l(e_t).unsqueeze(1)r_t = self.linear_s(r_t).unsqueeze(1)r = self.transformer_s(torch.cat([e_t, r],dim=1))[:, 1:, :]e = self.transformer_l(torch.cat([r_t, e],dim=1))[:, 1:, :]e = e.permute(0, 2, 1).reshape(b_e, c_e, h_e, w_e)r = r.permute(0, 2, 1).reshape(b_r, c_r, h_r, w_r)return e + rif __name__ == '__main__':x = torch.randn(4, 512, 7, 7).cuda()y = torch.randn(4, 512, 7, 7).cuda()model = TIF(512, 512).cuda()out = model(x,y)print(out.shape)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/69067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

原生HTML集合

一、表格 1、固定表格 <div class"tablebox"><div class"table-container"><table id"myTable" border"0" cellspacing"0" cellpadding"0"><thead><tr></tr></thead>…

CVE-2025-0411 7-zip 漏洞复现

文章目录 免责申明漏洞描述影响版本漏洞poc漏洞复现修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 此漏洞 &#xff08;CVSS SCORE 7.0&#xff09; 允许远程攻击者绕…

[操作系统] 深入进程地址空间

程序地址空间回顾 在C语言学习的时&#xff0c;对程序的函数、变量、代码等数据的存储有一个大致的轮廓。在语言层面上存储的地方叫做程序地址空间&#xff0c;不同类型的数据有着不同的存储地址。 下图为程序地址空间的存储分布和和特性&#xff1a; 使用以下代码来验证一下…

ChirpIoT技术的优势以及局限性

ChirpIoT是一种由上海磐启微电子开发的国产无线射频通讯技术&#xff0c;ChirpIoT技术基于磐启多年对雷达等线性扩频信号的深入研究&#xff0c;并在此基础上对线性扩频信号的变化进行了改进&#xff0c;实现了远距离传输的一种无线通信技术。相关产品型号有E29-400T22D、E290-…

【线上问题定位处理】及【性能优化】系列文章

目录 性能优化 性能优化 九大服务架构性能优化方式 如何进行GC调优 如何排查线上系统出现的Full GC MySQL - 性能优化 MySQL - 分库分表 大数据查询的处理方案 MySQL优化手段有哪些 服务CPU100%问题如何快速定位? 服务内存OOM问题如何快速定位? JVM调优6大步骤 线…

IGBT的损耗计算的学习【2025/1/24】

可以通过示波器实测IGBT电压电流波形&#xff0c;然后通过示波器的math功能将电压电流波形乘积后积分求损耗。 软开管&#xff1a;给了导通信号&#xff0c;但是电流并没有从此IGBT流过 IGBT&#xff08;绝缘栅双极晶体管&#xff09;的损耗主要分为 导通损耗 和 开关损耗 两部…

Jmeter使用Request URL请求接口

简介 在Jmeter调试接口时&#xff0c;有时不清楚后端服务接口的具体路径&#xff0c;可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动&#xff0c;联想电脑设置u盘启动的方法有两种&#xff0c;一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是&#xff0c;一种是uefi引导&#xff0c;一种是传统的leacy引导&#xff0c;所以需要注意制…

【github 使用相关】提交pr和commit message Conventional Commits 规范 代码提交的描述该写什么?

目录 Git 提交信息格式格式描述Subject&#xff08;标题&#xff09;Body&#xff08;正文&#xff09; 规范的标签&#xff08;Tag&#xff09;示例 CG Git 提交信息格式 格式描述 一般开源项目代码库根目录都会有一个 CONTRIBUTING.md 或者其他类似名字的文档来介绍如何开始…

142.WEB渗透测试-信息收集-小程序、app(13)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;141.WEB渗透测试-信息收集-小程序、app&#xff08;12&#xff09; 软件用法&#xff0c…

电路研究9.2——合宙Air780EP使用AT指令

这里正式研究AT指令的学习了&#xff0c;之前只是接触的AT指令&#xff0c;这里则是深入分析AT指令了。 软件的开发方式&#xff1a; AT&#xff1a;MCU 做主控&#xff0c;MCU 发 AT 命令给模组的开发方式&#xff0c;模组仅提供标准的 AT 固件&#xff0c; 所有的业务控制逻辑…

亚博microros小车-原生ubuntu支持系列:1 键盘控制

背景&#xff1a;电脑配置不太行&#xff0c;我在ubuntu再运行vmware&#xff0c;里面运行亚博官方的虚拟机镜像ubuntu&#xff0c;系统很卡。基本上8G内存给打满了。还是想把亚博官方的代码迁移出来&#xff0c;之前售后就说除了官方镜像虚拟机&#xff0c;需要自己摸索迁移。…

Linux中关于glibc包编译升级导致服务器死机或者linux命令无法使用的情况

服务器上编译glibc2.29版本导致命令不能用 Inconsistency detected by ld.so: dl-call-libc-early-init.c: 37: _dl_call_libc_early_init: Assertion sym ! NULL failed!下面是造成不可用的原因 1.编译完gcc 2.29版本后&#xff0c;开始做映射&#xff0c;以达到能使用最新版…

C语言进程与线程编程实战:IPC机制与线程同步详解

系列文章目录 01-C语言从零到精通&#xff1a;常用运算符完全指南&#xff0c;掌握算术、逻辑与关系运算 02-C语言控制结构全解析&#xff1a;轻松掌握条件语句与循环语句 03-C语言函数参数传递深入解析&#xff1a;传值与传地址的区别与应用实例 04-C语言数组与字符串操作全解…

ubuntu k8s 1.31

ubuntu 系统 设置 更新源 apt-get upgradeapt upgradeapt update apt-get update释放root sudo passwd root密码su - 密码设置root可以登录 cd /etc/ssh/sshd_config.d && vi ssh.confPermitRootLogin yes PasswordAuthentication yes:wq 保存退出 systemctl resta…

第4章 神经网络【1】——损失函数

4.1.从数据中学习 实际的神经网络中&#xff0c;参数的数量成千上万&#xff0c;因此&#xff0c;需要由数据自动决定权重参数的值。 4.1.1.数据驱动 数据是机器学习的核心。 我们的目标是要提取出特征量&#xff0c;特征量指的是从输入数据/图像中提取出的本质的数 …

如何获取小程序的code在uniapp开发中

如何获取小程序的code在uniapp开发中&#xff0c;也就是本地环境&#xff0c;微信开发者工具中获取code&#xff0c;这里的操作是页面一进入就获取code登录&#xff0c;没有登录页面的交互&#xff0c;所以写在了APP.vue中&#xff0c;也就是小程序一打开就获取用户的code APP.…

Blazor-选择循环语句

今天我们来说说Blazor选择语句和循环语句。 下面我们以一个简单的例子来讲解相关的语法&#xff0c;我已经创建好了一个Student类&#xff0c;以此类来进行语法的运用 因为我们需要交互性所以我们将类创建在*.client目录下 if 我们做一个学生信息的显示&#xff0c;Gender为…

科家多功能美发梳:科技赋能,重塑秀发新生

在繁忙的都市生活中,头皮健康与秀发养护成为了现代人不可忽视的日常课题。近日,科家电动按摩梳以其卓越的性能和创新设计,赢得了广大消费者的青睐。这款集科技与美学于一身的美发梳,不仅搭载了2亿负离子、6000次/分钟的声波振动等前沿技术,更融入了650nm聚能环红光与415nm强劲蓝…