【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.pswp.cn/news/894601.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894601.shtml
英文地址,請注明出處:http://en.pswp.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…