【Block总结】CSAM,包含分割、关键点、切分等均适用!|即插即用

论文信息

  • 标题: CSAM: A 2.5D Cross-Slice Attention Module for Anisotropic Volumetric Medical Image Segmentation

  • 论文链接: https://arxiv.org/pdf/2311.04942

  • GitHub链接: https://github.com/aL3x-O-o-Hung/CSAM

在这里插入图片描述

创新点

CSAM(跨切片注意力模块)旨在解决传统3D和2D医学图像分割方法在处理各向异性体积数据时的不足。其主要创新包括:

  • 跨切片注意力机制: 通过在不同尺度的深度特征图上应用语义、位置和切片注意力,CSAM能够有效捕捉体积数据中不同切片之间的关系。

  • 参数优化: CSAM设计了最小可训练参数的结构,减少了模型的复杂性,同时保持了良好的性能。

  • 2.5D方法的应用: 该模块结合了2D卷积与体积信息,填补了3D和2D方法之间的空白,特别适用于MRI等各向异性数据。

方法

CSAM的实现方法包括以下几个步骤:

  1. 特征提取: 使用卷积神经网络(CNN)提取输入的体积数据特征。

  2. 注意力机制: 在提取的特征图上应用跨切片注意力机制,分别关注语义信息、位置关系和切片信息,以增强特征的表达能力。

  3. 模型训练: 通过最小化损失函数来训练模型,确保模型能够有效学习到各向异性体积数据的特征。
    在这里插入图片描述

效果

实验结果表明,CSAM在多个医学图像分割任务中表现出色,尤其是在处理各向异性数据时,其性能优于传统的3D和2D方法。具体效果包括:

  • 分割精度: CSAM在分割精度上达到了新的状态,能够更好地识别和分割复杂的医学图像结构。

  • 训练效率: 由于参数较少,CSAM的训练时间显著低于其他复杂模型。

实验结果

研究者进行了广泛的实验,以验证CSAM的有效性和通用性。实验包括:

  • 数据集: 使用多个公开的医学图像数据集进行测试,涵盖不同的医学成像技术(如MRI)。

  • 对比实验: 将CSAM与现有的3D和2D分割模型进行比较,结果显示CSAM在多个指标上均优于对比模型。

  • 泛化能力: CSAM在不同任务和数据集上的表现一致,证明了其良好的泛化能力。

总结

CSAM作为一种新颖的2.5D跨切片注意力模块,为各向异性体积医学图像分割提供了有效的解决方案。通过引入跨切片注意力机制,CSAM不仅提高了分割精度,还减少了模型的复杂性和训练时间。实验结果验证了其在医学图像处理中的广泛适用性和优越性能,为未来的研究提供了新的思路和方法。

代码

import torch
import torch.nn.functional
from torch import nn
import torch.distributions as td
def custom_max(x,dim,keepdim=True):temp_x=xfor i in dim:temp_x=torch.max(temp_x,dim=i,keepdim=True)[0]if not keepdim:temp_x=temp_x.squeeze()return temp_xclass PositionalAttentionModule(nn.Module):def __init__(self):super(PositionalAttentionModule,self).__init__()self.conv=nn.Conv2d(in_channels=2,out_channels=1,kernel_size=(7,7),padding=3)def forward(self,x):max_x=custom_max(x,dim=(0,1),keepdim=True)avg_x=torch.mean(x,dim=(0,1),keepdim=True)att=torch.cat((max_x,avg_x),dim=1)att=self.conv(att)att=torch.sigmoid(att)return x*attclass SemanticAttentionModule(nn.Module):def __init__(self,in_features,reduction_rate=16):super(SemanticAttentionModule,self).__init__()self.linear=[]self.linear.append(nn.Linear(in_features=in_features,out_features=in_features//reduction_rate))self.linear.append(nn.ReLU())self.linear.append(nn.Linear(in_features=in_features//reduction_rate,out_features=in_features))self.linear=nn.Sequential(*self.linear)def forward(self,x):max_x=custom_max(x,dim=(0,2,3),keepdim=False).unsqueeze(0)avg_x=torch.mean(x,dim=(0,2,3),keepdim=False).unsqueeze(0)max_x=self.linear(max_x)avg_x=self.linear(avg_x)att=max_x+avg_xatt=torch.sigmoid(att).unsqueeze(-1).unsqueeze(-1)return x*attclass SliceAttentionModule(nn.Module):def __init__(self,in_features,rate=4,uncertainty=True,rank=5):super(SliceAttentionModule,self).__init__()self.uncertainty=uncertaintyself.rank=rankself.linear=[]self.linear.append(nn.Linear(in_features=in_features,out_features=int(in_features*rate)))self.linear.append(nn.ReLU())self.linear.append(nn.Linear(in_features=int(in_features*rate),out_features=in_features))self.linear=nn.Sequential(*self.linear)if uncertainty:self.non_linear=nn.ReLU()self.mean=nn.Linear(in_features=in_features,out_features=in_features)self.log_diag=nn.Linear(in_features=in_features,out_features=in_features)self.factor=nn.Linear(in_features=in_features,out_features=in_features*rank)def forward(self,x):max_x=custom_max(x,dim=(1,2,3),keepdim=False).unsqueeze(0)avg_x=torch.mean(x,dim=(1,2,3),keepdim=False).unsqueeze(0)max_x=self.linear(max_x)avg_x=self.linear(avg_x)att=max_x+avg_xif self.uncertainty:temp=self.non_linear(att)mean=self.mean(temp)diag=self.log_diag(temp).exp()factor=self.factor(temp)factor=factor.view(1,-1,self.rank)dist=td.LowRankMultivariateNormal(loc=mean,cov_factor=factor,cov_diag=diag)att=dist.sample()att=torch.sigmoid(att).squeeze().unsqueeze(-1).unsqueeze(-1).unsqueeze(-1)return x*attclass CSAM(nn.Module):def __init__(self,num_slices,num_channels,semantic=True,positional=True,slice=True,uncertainty=True,rank=5):super(CSAM,self).__init__()self.semantic=semanticself.positional=positionalself.slice=sliceif semantic:self.semantic_att=SemanticAttentionModule(num_channels)if positional:self.positional_att=PositionalAttentionModule()if slice:self.slice_att=SliceAttentionModule(num_slices,uncertainty=uncertainty,rank=rank)def forward(self,x):if self.semantic:x=self.semantic_att(x)if self.positional:x=self.positional_att(x)if self.slice:x=self.slice_att(x)return xif __name__ == "__main__":dim=64# 如果GPU可用,将模块移动到 GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 输入张量 (batch_size, channels,height, width)x = torch.randn(2,dim,40,40).to(device)# 初始化 FullyAttentionalBlock 模块block = CSAM(2,dim,) # kernel_size为height或者widthprint(block)block = block.to(device)# 前向传播output = block(x)print("输入:", x.shape)print("输出:", output.shape)

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

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

相关文章

解决PyG安装中torch-sparse安装失败问题:详细指南

1 问题描述 最近在学习GNN,需要使用PyTorch Geometric(PyG)库。在安装PyG的过程中,遇到了torch-sparse安装失败的问题,错误提示为: ERROR: Failed building wheel for torch-sparse本文将详细记录问题的解…

鸟哥Linux私房菜笔记(三)

鸟哥Linux私房菜笔记(三) 该第三部分和第四部分主要为原书的第十一章(正则表达式与文件格式化处理),第十二章学习shell脚本,第十六章(进程管理与SElinux初探部分),第十七…

学习日记-250203

一.论文 看师兄写好的一稿。 二、计划: 继续看论文里的问题。 然后继续看promptCD相关,明天要看论文啦,今天家里有些事比较忙(碎碎念) 三. )——( 注册了 openreview,ORCID,Google scholar&…

python学opencv|读取图像(五十四)使用cv2.blur()函数实现图像像素均值处理

【1】引言 前序学习进程中,对图像的操作均基于各个像素点上的BGR值不同而展开。 对于彩色图像,每个像素点上的BGR值为三个整数,因为是三通道图像;对于灰度图像,各个像素上的BGR值是一个整数,因为这是单通…

Kafka ACL(访问控制列表)介绍

文章目录 Kafka ACL(访问控制列表)介绍1. Kafka ACL 的基本概念1.1 Kafka ACL 的目标1.2 Kafka ACL 的组成部分 2. Kafka 支持的资源类型2.1 Topic(主题)2.2 Consumer Group(消费者组)2.3 Cluster&#xff…

在 WSL2 中重启 Ubuntu 实例

在 WSL2 中重启 Ubuntu 实例,可以按照以下步骤操作: 方法 1: 使用 wsl 命令 关闭 Ubuntu 实例: 打开 PowerShell 或命令提示符,运行以下命令: wsl --shutdown这会关闭所有 WSL2 实例。 重新启动 Ubuntu: 再次打开 Ubuntu&#x…

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…

小程序设计和开发:如何研究同类型小程序的优点和不足。

一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前,首先需要明确研究的目的。是为了改进自己的小程序设计和开发,还是为了了解市场趋势和用户需求?不同的研究目的会影响研究的方法和重点。例如,如果研究目的是为了…

使用 Numpy 自定义数据集,使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

1. 导入必要的库 首先,导入我们需要的库:Numpy、Pytorch 和相关工具包。 import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import accuracy_score, recall_score, f1_score2. 自定义数据集 …

Unity-编译构建Android的问题记录

文章目录 报错:AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout报错信息解读:原因分析最终处理方法 报错:AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout 报错信息解读&#xff1…

【axios二次封装】

axios二次封装 安装封装使用 安装 pnpm add axios封装 // 进行axios二次封装:使用请求与响应拦截器 import axios from axios import { ElMessage } from element-plus//创建axios实例 const request axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,…

SQL进阶实战技巧:如何构建用户行为转移概率矩阵,深入洞察会话内活动流转?

目录 1 场景描述 1.1 用户行为转移概率矩阵概念 1.2 用户行为转移概率矩阵构建方法 (1) 数据收集

Vue3.0实战:大数据平台可视化(附完整项目源码)

文章目录 创建vue3.0项目项目初始化项目分辨率响应式设置项目顶部信息条创建页面主体创建全局引入echarts和axios后台接口创建express销售总量图实现完整项目下载项目任何问题都可在评论区,或者直接私信即可。 创建vue3.0项目 创建项目: vue create vueecharts选择第三项:…

Java自定义IO密集型和CPU密集型线程池

文章目录 前言线程池各类场景描述常见场景案例设计思路公共类自定义工厂类-MyThreadFactory自定义拒绝策略-RejectedExecutionHandlerFactory自定义阻塞队列-TaskQueue(实现 核心线程->最大线程数->队列) 场景1:CPU密集型场景思路&…

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前,请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点:https://developer.aliyun.com/mirror/ 找到如图所示位置,选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…

Pandas基础08(分箱操作/时间序列/画图)

3.8.1 Pandas分箱操作 数据分箱(Binning) 是一种数据预处理方法,用于将连续型变量的数值范围分割成若干个区间或“箱”(bins),将数据按照这些区间进行分类,从而转换为离散型变量。这种方法常用…

C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)

Made By 于子轩,2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件,或是使用Windows Script Host对象创建快捷方式,亦或是使用Shell32对象创建快捷方式,都对用户很不友好,今天小编为大家带来一种全新…

国产编辑器EverEdit - 输出窗口

1 输出窗口 1.1 应用场景 输出窗口可以显示用户执行某些操作的结果,主要包括: 查找类:查找全部,筛选等待操作,可以把查找结果打印到输出窗口中; 程序类:在执行外部程序时(如:命令窗…

Vue-data数据

目录 一、Vue中的data数据是什么?二、data支持的数据类型有哪些? 一、Vue中的data数据是什么? Vue中用到的数据定义在data中。 二、data支持的数据类型有哪些? data中可以写复杂类型的数据,渲染复杂类型数据时只要遵…

02.03 递归运算

使用递归求出 1 1/3 -1/5 1/7 - 1/9 ... 1/n的值。 1>程序代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #inc…