UNETR:用于三维医学图像分割的Transformer

论文链接:https://arxiv.org/abs/2103.10504

代码链接: https://monai.io/research/unetr

机构:Vanderbilt University, NVIDIA

最近琢磨不出来怎么把3d体数据和文本在cnn中融合,因为确实存在在2d里面用的transformer用在3d里面会爆炸这回事,所以干脆去找个经典3d transformer+cnn的好了。要是有知道朋友也可以一起讨论一下。因为是两年前的文章,所以这篇博文主要集中写方法了。

*妈耶,没想到真的部分解决我的疑问了,好的洛阳铲,爱来自中国

摘要

近十年来,具有收缩和扩展路径的全卷积神经网络(fcnn)在大多数医学图像分割应用中表现出突出的特点。在fcnn中,编码器通过学习全局和局部特征以及上下文表示来发挥不可或缺的作用,这些特征和上下文表示可用于解码器的语义输出预测。尽管取得了成功,但fcnn中卷积层的局部性限制了学习远程空间依赖关系的能力。受自然语言处理(NLP)在远程序列学习中最近成功的启发,我们将体积(3D)医学图像分割任务重新制定为序列到序列的预测问题。我们引入了一种新的架构,称为UNEt-TRansformer(UNETR),它利用Transformer作为编码器来学习输入体积的序列表示并有效捕获全局多尺度信息,同时也遵循编码器和解码器的成功“u形”网络设计。Transformer 编码器通过不同分辨率的跳过连接直接连接到解码器,以计算最终的语义分割输出。我们已经在用于多器官分割的多图谱标记颅顶(BTCV)数据集和用于脑肿瘤和脾脏分割任务的医学分割十项全能(MSD)数据集上验证了我们的方法的性能。我们的基准测试在BTCV排行榜上展示了新的最先进的性能。

背景

fcnn不能有效捕捉全局信息,transformer难以有效捕捉局部信息

我们将3D分割任务重新制定为一维seq to seq 的预测问题,并使用Transformer作为编码器从嵌入的输入补丁中学习上下文信息。从Transformer编码器中提取的表示通过多个分辨率的跳过连接与基于cnn的解码器合并,以预测分割输出。在解码器中我们使用cnn,这是因为Transformer虽然具有学习全局信息的强大能力,但却无法正确捕获局部信息。

贡献

1. 提出了一种新的基于变压器的体积医学图像分割模型。

2. 为此,我们提出了一种新的架构,其中(1)Transformer编码器直接利用嵌入式3D体来有效捕获远程依赖关系;(2)skip-connected decoder结合提取的不同分辨率的表示并预测分割输出

3. 我们在两个公共数据集:BTCV[26]和MSD[38]上验证了我们提出的模型在不同体积分割任务中的有效性。UNETR在BTCV数据集的排行榜上实现了新的最先进的性能,并且在MSD数据集上优于竞争方法。

相关工作

基于cnn的分割网络

暂略

Vision Transformers

暂略

方法

UNETR架构概述。3D输入体数据(例如,MRI图像的C=4通道)被划分为一系列均匀且不重叠的patch,并使用线性层投影到嵌入空间中。该序列与位置嵌入一起添加,并用作变压器模型的输入。提取变压器中不同层的编码表示,并通过跳过连接与解码器合并,以预测最终的分割。给出了补丁分辨率P =16和嵌入尺寸ek =768时的输出大小。

网络结构

我们在上图中概述了所提出的模型。UNETR采用由一堆Transformer组成的收缩-扩展(contracting-expanding)模式作为编码器,编码器通过跳过连接连接到解码器。与NLP中常用的一样,Transformer在输入嵌入的一维序列上运行。

我本人就是在3D作为跟文本一样维度的序列输入tansformer之后会存在长宽高压到一个维度上导致做交叉注意力的时候内存会爆掉,看看本文怎么解决的↓

1)img 输入:x∈R  HxWxDxC,其中H,W是长宽,D是深度,C是channel

2)然后把它拍平成 xv∈R Nx(P^3 x C)   式中P^3表示每个patch的分辨率,N =(H*W*D)/P^3为序列长度。

3) 随后,我们使用线性层将贴片投影到K维嵌入空间中,该嵌入空间在整个Transformer层中保持恒定。

4) 为了保留提取的patch的空间信息,我们添加了一维可学习的位置嵌入 Epos ∈ R NxK 到投影的 patch embedding Epos ∈ R (P^3 x C)xK,根据公式↓

请注意,可学习的[class]令牌没有添加到嵌入序列中,因为我们的变压器主干是为语义分割而设计的。

5)在嵌入层后,我们利用由多头自注意(MSA)和多层感知器(MLP)子层组成的Transformer块堆,根据算式

其中Norm()表示层归一化[1],MLP由两个具有GELU激活函数的线性层组成,i为中间块标识符,L为变压器层数。

MSA子层

由n个并行self-attention层(SA)组成。具体来说,SA块是一个参数化函数,它学习查询(q)与序列Z∈R N*K 中相应的键(k)和值(v)表示之间的映射

通过测量z中两个元素及其键值对之间的相似性来计算注意权重(A)

其中Kh = K=n是一个比例因子,用于将参数的数量保持在一个常数上,其中键K的值不同。

6) 使用计算的注意力权重,序列z中值v的SA输出计算为

这里,v表示输入序列和中的值 Kh = K/n是一个比例因子(scaling factor.)
此外,MSA的输出被定义为

其中Wmsa ∈ R n.Kh x K表示多头可训练参数权重。

7) 受类似于U-Net[36]的架构的启发,其中编码器的多个分辨率的特征与解码器合并。我们从transformer提取了大小为 (HxWxD)/P^3 x K 的序列表示zi(i∈{3,6,9,12}),并把他们变形成一个 H/P x W/P xD/P x K的tensor

我们定义中的表示在嵌入空间中被重塑为特征大小为K的Transformer 的输出(即变压器的嵌入大小)。此外,如图2所示,在每个分辨率下,我们利用连续3x3x3的卷积层,然后是规范化层,将嵌入空间中的重塑张量投影到输入空间中。

8)在我们encoder的bottleneck(即变压器最后一层的输出)中,我们将反卷积层应用于变换后的特征映射,将其分辨率提高2倍。

9) 然后,我们将调整大小的特征图与先前变压器输出(例如z9)的特征图连接起来,并将它们馈送到连续的3x3x3的卷积层中,并使用反卷积层对输出进行上采样。这个过程在所有其他后续层中重复,直到原始输入分辨率,其中最终输出被送入带有softmax激活函数的1x1x1卷积层,以生成体素语义预测。

损失函数

soft dice loss

实验

数据集

BTCV (CT):多器官分割

MSD (MRI/CT):脑肿瘤分割

实现细节

框架:pytorch 和 monai(monai听说作为医学深度学习的框架还挺方便的,也是基于pytorch的,有机会学学)

硬件:NVIDIADGX-1服务器

所有模型都以6个批大小进行训练,使用AdamW优化器[31],初始学习率为0.0001,迭代20000次。

Transformer 模型 :VIT-B16,L=12层,嵌入尺寸k =768

结果

BTCV

MSD

评估指标

Dice(Dice score)

HD (Hausdorff Distance)

总结

本文介绍了一种新的基于Transformer的结构,称为UNETR,通过将该任务重新表述为一维序列到序列预测问题,用于体医学图像的语义分割。我们建议使用转换器编码器来增加模型学习远程依赖关系和在多个尺度上有效捕获全局上下文表示的能力。我们验证了UNETR在CT和MRI模式下不同体积分割任务中的有效性。UNETR在BTCV排行榜上的多器官分割的标准和自由竞赛中都取得了新的最先进的表现,并且在MSD数据集上优于脑肿瘤和脾脏分割的竞争方法。最后,UNETR已显示出有效学习医学图像中所表示的关键解剖关系的潜力。该方法为医学图像分析中一类新的基于变压器的分割模型奠定了基础。

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

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

相关文章

wpf使用CefSharp.OffScreen模拟网页登录,并获取身份cookie,C#后台执行js

目录 框架信息&#xff1a;MainWindow.xamlMainWindow.xaml.cs爬取逻辑模拟登录拦截请求Cookie获取 CookieVisitorHandle 框架信息&#xff1a; CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…

API自动化测试:如何构建高效的测试流程

一、引言 在当前的软件开发环境中&#xff0c;API&#xff08;Application Programming Interface&#xff09;扮演了极为重要的角色&#xff0c;连接着应用的各个部分。对API进行自动化测试能够提高测试效率&#xff0c;降低错误&#xff0c;确保软件产品的质量。本文将通过实…

SpringMVC(三)

十、拦截器 1、拦截器的配置 SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置&#xff1a; <bean class"com.atguigu.interceptor.FirstInterceptor">…

constexpt

constexpt constexpt是C11引入的新的关键字&#xff0c;它用于在编译时而非运行时计算函数或变量的值。这个特性对于提高程序效率和优化代非常有用。 编译时常量和运行时常量 编译时常量&#xff08;Compile-time Constants&#xff09;和运行时常量&#xff08;Runtime Con…

8年经验之谈 —— 如何使用自动化工具编写测试用例?

以下为作者观点&#xff0c;仅供参考&#xff1a; 在快速变化的软件开发领域&#xff0c;保证应用程序的可靠性和质量至关重要。随着应用程序复杂性和规模的不断增加&#xff0c;仅手动测试无法满足行业需求。 这就是测试自动化发挥作用的地方&#xff0c;它使软件测试人员能…

leetcode做题笔记1410. HTML 实体解析器

「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们对应的字符实体包括&#xff1a; 双引号&#xff1a;字符实体为 &quot; &#xff0c;对应的字符是 "…

python appium 官网下载

找了半天吐了 https://github.com/appium/appium-desktop/releases/tag/v1.22.3-4

Hibernate批量处理数据

概念&#xff1a; 批量处理数据是指在一个事务场景中处理大量数据。 在应用程序中难以避免进行批量操作&#xff0c;Hibernate提供了以下方式进行批量处理数据&#xff1a; (1)使用HQL进行批量操作 数据库层面 executeUpdate() (2)使用JDBC API进行批量操作 数据库层面 …

Vue学习笔记-Object.defineproperty函数

文章目录 前文提要Object.defineProperty作用Object.defineProperty参数使用例图getter&#xff0c;也就是get函数setter&#xff0c;也就是set函数 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 Object.defineProperty作用 当在js中声明了一个变…

王道p150 20.将给定的表达式树转化为等价的中缀表达式(通过括号反应操作符的计算次序)

本题代码如下 void btreetoexp(tree t, char deep) {if (t NULL)return;else if (t->lchild NULL && t->rchild NULL)printf("%c", t->data);//输出操作数&#xff0c;不加括号else {if (deep > 1)printf("(");btreetoexp(t->l…

Rust语言入门教程(二) - 变量与作用域

变量与作用域 变量的声明与初始化 Rust的基本语法格式如下&#xff1a; fn main(){let bunnies 2; }语句以分号结尾&#xff0c;用花括号包含语句块。 Rust的语法其实借鉴了很多其他的语言&#xff0c;比如C语言和Python&#xff0c; 所以变量定义的格式看起来也跟很多我们…

shell 脚本的函数和数组

函数 —— 封装的一个公式&#xff1a;sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块&#xff0c;在函数中写执行的命令即可&#xff1b;使用函数可以避免代码重复&#xff0c;增加可读性&#xff0c;简化脚本&#xff0c;使用函数可以将大的工程分割为若…

Vue中动态class方法

1.方法一&#xff1a;只需要展示一个class样式&#xff0c;但是动态取值 <div :class"aaa"></div>data:{return () {aaa:colorRed} }.colorRed {color: red; } 2.方法二&#xff1a;表达式判断是否展示class里面的样式 <div :class"{colorRed…

函数与数组

一.函数 1、函数的作用 定义较为复杂的但是需要重复使用的内容&#xff0c;以便再次使用&#xff0c;可以直接调用&#xff0c;节约时间&#xff0c;提高效率。 语句块定义成函数约等于别名&#xff0c;定义函数&#xff0c;再引用函数。 封装的可重复利用的具有特定功能的…

python+django高校科研项目管理系统2u3mx

高校科研项目管理系统采用拟开发的高校科研项目管理系统通过测试,确保在最大负载的情况下稳定运转,各个模块工作正常,具有较高的可用性。系统整体界面简洁美观,用户使用简单,满足用户需要。在因特网发展迅猛的当今社会,高校科研项目管理系统必然会成为在数字信息化建设的一个重…

Linux 查看 CPU 信息相关命令

目录 lscpu top htop lscpu lscpu 命令是用于显示有关 CPU 架构的信息&#xff0c;而不是用于实时监视 CPU 负载。它提供有关 CPU 类型、核心数、线程数、架构等的详细信息。 lscpu top 命令会显示系统的实时状态&#xff0c;包括 CPU 使用率、内存使用率等。按下键盘上的…

一文详解Vue生命周期

Vue是一种流行的用于构建用户界面的渐进式JavaScript框架。Vue框架在开发过程中&#xff0c;特别强调对生命周期的理解和管理。通过使用生命周期钩子函数&#xff0c;开发者能够精确地控制Vue实例的创建、挂载、更新以及销毁过程。本文将对Vue的生命周期进行详细的介绍&#xf…

YOLOv8训练自己的目标检测数据集

YOLOv8训练自己的目标检测数据集 目录标题 源码下载环境配置安装包训练自己的数据集数据集文件格式数据集文件配置超参数文件配置训练数据集命令行训练脚本.py文件训练 进行detect显示detect的效果 源码下载 YOLOv8官方的GitHub代码&#xff0c;同时上面也有基础环境的配置要…

IntelliJ IDEA 16创建Web项目

首先要理解一个概念&#xff1a;在IntelliJ IDEA中“new Project”相当于eclipse中的工作空间&#xff08;Workspace&#xff09;&#xff0c;而“new Module”相当于eclipse中的工程&#xff08;Project&#xff09;。以下均采用Intellij的说法&#xff0c;请自行对照转换理解…

Maven仓库清除remote.repositories、lastUpdated、sha1脚本

Maven仓库清除remote.repositories、lastUpdated、sha1脚本 1. 脚本功能 清除本地maven仓库的_remote.repositories、sha1、lastUpdated的文件 2. 脚本内容 set REPOSITORY_PATH%cd% rem 搜索中... for /f "delims" %%i in (dir /b /s "%REPOSITORY_PATH%\*…