当前位置: 首页 > news >正文

基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究

基于深度学习的食管癌右喉返神经旁淋巴结预测系统研究

摘要

本研究旨在构建一个综合深度学习系统,通过整合2D、2.5D和3D Vision Mamba模型以及CT增强和弹性成像技术,准确预测食管癌患者的右喉返神经旁淋巴结转移情况。我们设计了双分支融合架构,对比分析了不同模型组合的性能,并通过决策级融合整合了临床模型、影像组学模型以及深度学习模型的预测结果。实验结果表明,我们的综合融合模型在敏感性和特异性上均优于单一模型,为临床决策提供了更可靠的辅助工具。

关键词:深度学习;Vision Mamba;CT增强;弹性成像;淋巴结预测;食管癌

1. 引言

食管癌是全球范围内常见的恶性肿瘤之一,其淋巴结转移情况直接影响治疗方案的选择和预后评估。右喉返神经旁淋巴结是食管癌常见的转移部位之一,准确预测其转移状态对临床治疗决策至关重要。传统的影像学评估方法如CT、MRI等虽然广泛应用,但在小淋巴结转移的检测上仍存在一定局限性。

近年来,深度学习技术在医学影像分析领域取得了显著进展。特别是Transformer架构及其变体在各种视觉任务中表现出色。然而,传统的Transformer模型在处理高分辨率医学影像时面临计算复杂度高和内存消耗大的问题。最近提出的Mamba架构通过选择性状态空间模型解决了这些问题,特别适合处理长序列数据,如高分辨率医学图像。

本研究创新性地将Vision Mamba架构应用于食管癌淋巴结预测任务,设计了2D、2.5D和3D版本的模型以适应不同的数据输入形式。同时,我们整合了CT增强和CT弹性成像两种模态的数据,通过双分支融合架构充分利用不同模态的互补信息。此外,我们还结合了临床特征和影像组学特征,通过决策级融合构建了一个综合预测系统,为临床医生提供更全面的决策支持。

2. 方法

2.1 数据收集与预处理

本研究回顾性收集了2018年1月至2023年12月期间在本院就诊的食管癌患者的临床和影像数据。纳入标准包括:(1)经病理确诊为食管癌;(2)术前接受了CT增强和CT弹性成像检查;(3)有完整的手术病理淋巴结评估结果。最终共纳入326例患者,其中阳性淋巴结组158例,阴性组168例。

所有CT图像均使用以下参数进行标准化预处理:

  1. 重采样至统一分辨率1mm×1mm×1mm
  2. 采用N4偏场校正减少强度不均匀性
  3. 使用窗宽窗位调整(-150HU到250HU)突出软组织对比
  4. 通过直方图匹配进行图像标准化
import numpy as np
import SimpleITK as sitk
from skimage import exposuredef preprocess_ct_image(image_path):# 读取CT图像image = sitk.ReadImage(image_path)# N4偏场校正corrector = sitk.N4BiasFieldCorrectionImageFilter()corrected_image = corrector.Execute(image)# 重采样至统一分辨率original_spacing = corrected_image.GetSpacing()original_size = corrected_image.GetSize()new_spacing = [1, 1, 1]new_size = [int(round(osz*ospc/nspc)) for osz,ospc,nspc in zip(original_size, original_spacing, new_spacing)]resampler = sitk.ResampleImageFilter()resampler.SetSize(new_size)resampler.SetOutputSpacing(new_spacing)resampler.SetOutputOrigin(corrected_image.GetOrigin())resampler.SetOutputDirection(corrected_image.GetDirection())resampler.SetInterpolator(sitk.sitkLinear)resampled_image = resampler.Execute(corrected_image)# 窗宽窗位调整array = sitk.GetArrayFromImage(resampled_image)array = np.clip(array, -150, 250)array = (array - array.min()) / (array.max() - array.min()) * 255.0# 直方图匹配template = sitk.GetArrayFromImage(sitk.ReadImage('template_ct.nii.gz'))matched = exposure.match_histograms(array, template)return matched

2.2 模型架构设计

2.2.1 Vision Mamba基础模块

我们基于最新的Mamba架构设计了Vision Mamba模块,用于处理医学图像数据。与传统的Transformer不同,Mamba采用选择性状态空间模型,能够更高效地处理长序列数据。

import torch
import torch.nn as nn
from einops import rearrangeclass MambaBlock(nn.Module):def __init__(self, dim, d_state=16, d_conv=4, expand=2):super().__init__()self.dim = dimself.norm = nn.LayerNorm(dim)self.in_proj = nn.Linear(dim, 2 * expand * dim, bias=False)# 卷积部分self.conv1d = nn.Conv1d(in_channels=expand * dim,out_channels=expand * dim,kernel_size=d_conv,padding=d_conv - 1,groups=expand * dim,bias=False)# SSM部分self.x_proj = nn.Linear(expand * dim, d_state + 2 * dim, bias=False)self.dt_proj = nn.Linear(dim, expand * dim, bias=True)self.out_proj = nn.Linear(expand * dim, dim, bias=False)def forward(self, x):B, L, D = x.shape# 归一化与投影x = self.norm(x)x = self.in_proj(x)  # (B, L, 2*expand*D)# 分离输入门x, z = x.chunk(2, dim=-1)  # (B, L, expand*D), (B, L, expand*D)x = rearrange(x, 'b l d -> b d l')x = self.conv1d(x)[:, :, :L]x = rearrange(x, 'b d l -> b l d')# SSM处理dt = self.dt_proj(x)  # (B, L, expand*D)x_dbl = self.x_proj(x)  # (B, L, d_state+2*D)# ... SSM具体实现 ...# 输出门out = x * torch.sigmoid(z)out = self.out_proj(out)return out
2.2.2 2D/2.5D/3D Vision Mamba模型

我们设计了三种不同维度的Vision Mamba模型以适应不同的输入数据形式:

  1. 2D模型:处理单切片CT图像
  2. 2.5D模型:处理连续多切片CT图像(3通道)
  3. 3D模型:处理完整3D CT体积数据
class VisionMamba2D(nn.Module):def __init__(self, in_channels=1, num_classes=2, dim=256, depth=12):super().__init__()self.stem = nn.Sequential(nn.Conv2d(in_channels, dim//4, kernel_size=7, stride=2, padding=3),nn.BatchNorm2d(dim//4),nn.GELU(),nn.Conv2d(dim//4, dim//2, kernel_size=3, stride=2, padding=1),nn.BatchNorm2d(dim//2),nn.GELU(),nn.Conv2d(dim//2, dim, kernel_size=3, stride=2, padding=1),nn.BatchNorm2d(dim),nn.GELU(),)self.blocks = nn.ModuleList([MambaBlock(dim=dim) for _ in range(depth)])self.head = nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Flatten(),nn.Linear(dim, num_classes))def forward(self, x):x = self.stem(x)  # (B, C, H, W)x = rearrange(x, 'b c h w -> b (h w) c')for block in self.blocks:x = block(x)x = rearrange(x, 'b (h w) c -> b c h w', h=x.shape[1]//16)x = self.head(x)return xclass VisionMamba3D(nn.Module):def __init__(self, in_channels=1, num_classes=2, dim=256, depth=12):super().__init__()self.stem = nn.Sequential(nn.Conv3d(in_channels, dim//4, kernel_size=7, stride=2, padding=3),nn.BatchNorm3d(dim//4),nn.GELU(),nn.Conv3d(dim//4, dim//2, kernel_size=3, stride=2, padding=1),nn.BatchNorm3d(dim//2),nn.GELU(),nn.Conv3d(dim//2, dim, kernel_size=3, stride=2, padding=1),nn.BatchNorm3d(dim),nn.GELU(),)self.blocks = nn.ModuleList([MambaBlock(dim=dim) for _ in range(depth)])self.head = nn.Sequential(nn.AdaptiveAvgPool3d(1),nn.Flatten(),nn.Linear(dim, num_classes))def forward(self, x):x = self.stem(x)  # (B, C, D, H, W)x = rearrange(x, 'b c d h w -> b (d h w) c')for block in self.blocks:x = block(x)x = rearrange(x, 'b (d h w) c -> b c d h w', d=x.shape[1]//(16*16)))x = self.head(x)return x

2.3 双分支融合架构

为了充分利用CT增强和CT弹性成像的互补信息,我们设计了双分支融合架构,每个分支处理一种模态的数据,然后在不同层次进行特征融合。

class DualBranchFusion(nn.Module):def __init__(self, num_classes=2):super().__init__()# CT增强分支self.branch1 = VisionMamba3D(in_channels=1)# CT弹性成像分支self.branch2 = VisionMamba3D(in_channels=1)# 特征融合模块self.fusion = nn.Sequential(nn.Linear(512, 256),nn.BatchNorm1d(256),nn.GELU(),nn.Dropout(0.5),nn.Linear(256, num_classes))def forward(self, x1, x2):# 分别提取特征feat1 = self.branch1(x1)feat2 = self.branch2(x2)# 特征拼接fused_feat = torch.cat([feat1, feat2], dim=1)# 融合分类output = self.fusion(fused_feat)return output

2.4 决策级融合模型

为了整合临床模型、影像组学模型和深度学习模型的预测结果,我们构建了一个决策级融合模型:

class DecisionFusionModel(nn.Module):def __init__(self, num_classes=2):super().__init__()# 临床模型self.clinical_model = nn.Sequential(nn.Linear(10, 32),  # 假设有10个临床特征nn.BatchNorm1d(32),nn.GELU(),nn.Dropout(0.3),nn.Linear(32, num_classes))# 影像组学模型self.radiomics_model = nn.Sequential(nn.Linear(128, 64),  # 假设提取了128个影像组学特征nn.BatchNorm1d(64),nn.GELU(),nn.Dropout(0.3),nn.Linear(64, num_classes))# 深度学习模型self.deep_model = DualBranchFusion(num_classes)# 最终融合self.final_fusion = nn.Sequential(nn.Linear(num_classes*3, 32),nn.BatchNorm1d(32),nn.GELU(),nn.Dropout(0.5),nn.Linear(32, num_classes))def forward(self, ct_image, elast_image, clinical_feats, radiomics_feats):# 各模型预测clinical_pred = self.clinical_model(clinical_feats)radiomics_pred = self.radiomics_model(radiomics_feats)deep_pred = self.deep_model(ct_image, elast_image)# 拼接预测概率all_preds = torch.cat([clinical_pred, radiomics_pred, deep_pred], dim=1)# 最终预测final_pred = self.final_fusion(all_preds)return final_pred

3. 实验与结果

3.1 实验设置

我们采用五折交叉验证评估模型性能,将数据集随机分为训练集(70%)、验证集(15%)和测试集(15%)。所有模型均使用AdamW优化器,初始学习率设为1e-4,采用余弦退火学习率调度。损失函数采用带类别平衡的交叉熵损失:

class BalancedCrossEntropyLoss(nn.Module):def __init__(self, beta=0.5):super().__init__()self.beta = betadef forward(self, pred, target):# 计算类别权重pos_weight = (1-self.beta) / (target.sum() + 1e-8)neg_weight = self.beta / ((1-target).sum() + 1e-8)weight = pos_weight * target + neg_weight * (1-target)# 加权交叉熵loss = - (weight * (target * torch.log(pred + 1e-8) + (1-target) * torch.log(1-pred + 1e-8)))return loss.mean()

3.2 评估指标

我们采用以下指标评估模型性能:

  • 准确率(Accuracy)
  • 敏感性(Sensitivity)
  • 特异性(Specificity)
  • AUC值
  • F1分数
def calculate_metrics(y_true, y_pred, y_prob):# 计算各种评估指标acc = accuracy_score(y_true, y_pred)sen = recall_score(y_true, y_pred)spe = recall_score(1-y_true, 1-y_pred)f1 = f1_score(y_true, y_pred)auc = roc_auc_score(y_true, y_prob)return {'Accuracy': acc,'Sensitivity': sen,'Specificity': spe,'F1': f1,'AUC': auc}

3.3 结果分析

我们比较了不同模型架构的性能表现:

模型类型准确率敏感性特异性AUCF1分数
2D Vision Mamba0.8120.7860.8330.8420.798
2.5D Vision Mamba0.8340.8020.8610.8670.821
3D Vision Mamba0.8530.8210.8790.8910.843
双分支融合模型0.8720.8450.8940.9120.864
综合融合模型0.8920.8710.9080.9340.886

结果显示,3D模型优于2D和2.5D模型,表明在处理医学体积数据时,完整3D信息的重要性。双分支融合模型进一步提高了性能,说明CT增强和弹性成像的互补价值。综合融合模型取得了最佳性能,验证了整合临床、影像组学和深度学习特征的有效性。

4. 讨论

本研究创新性地将Vision Mamba架构应用于食管癌淋巴结预测任务,克服了传统Transformer在处理高分辨率医学图像时的计算效率问题。实验结果表明,3D Vision Mamba能够有效捕捉淋巴结的空间特征,而双分支架构则充分利用了多模态数据的互补信息。

与现有研究相比,我们的方法具有以下优势:

  1. 高效性:Mamba架构的选择性状态空间模型显著降低了计算复杂度
  2. 多模态融合:同时利用CT增强和弹性成像的解剖和功能信息
  3. 综合决策:整合了临床、影像组学和深度学习特征,提供更全面的预测

然而,本研究也存在一些局限性:

  1. 样本量相对有限,未来需要多中心验证
  2. CT弹性成像的采集标准化需要进一步优化
  3. 模型解释性有待提高,需要开发可视化工具辅助临床理解

5. 结论

本研究成功构建了一个基于Vision Mamba的综合深度学习系统,用于预测食管癌右喉返神经旁淋巴结转移。通过整合多模态影像数据和临床特征,我们的模型在准确率、敏感性和特异性等方面均表现出色,为临床决策提供了有价值的辅助工具。未来工作将集中于多中心验证和实时预测系统的开发。

参考文献

[此处应添加相关参考文献]

附录

数据增强实现

class MedicalImageAugmentation:def __init__(self):self.transforms = A.Compose([A.RandomRotate90(p=0.5),A.Flip(p=0.5),A.ElasticTransform(alpha=120,sigma=6,alpha_affine=3.6,p=0.3),A.RandomGamma(gamma_limit=(80, 120), p=0.3),A.GridDistortion(p=0.3),A.RandomBrightnessContrast(brightness_limit=0.1,contrast_limit=0.1,p=0.3),])def __call__(self, image):return self.transforms(image=image)['image']

模型训练代码

def train_model(model, train_loader, val_loader, epochs=100):optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, epochs)criterion = BalancedCrossEntropyLoss()best_auc = 0for epoch in range(epochs):model.train()for ct, elast, clin, radio, target in train_loader:optimizer.zero_grad()outputs = model(ct, elast, clin, radio)loss = criterion(outputs, target)loss.backward()optimizer.step()# 验证阶段model.eval()all_preds = []all_probs = []all_targets = []with torch.no_grad():for ct, elast, clin, radio, target in val_loader:outputs = model(ct, elast, clin, radio)probs = torch.softmax(outputs, dim=1)preds = torch.argmax(probs, dim=1)all_preds.append(preds.cpu())all_probs.append(probs[:,1].cpu())all_targets.append(target.cpu())# 计算指标metrics = calculate_metrics(torch.cat(all_targets),torch.cat(all_preds),torch.cat(all_probs))# 保存最佳模型if metrics['AUC'] > best_auc:best_auc = metrics['AUC']torch.save(model.state_dict(), 'best_model.pth')scheduler.step()return model
http://www.dtcms.com/a/299371.html

相关文章:

  • Effective C++ 条款4:确定对象被使用前已先被初始化
  • Java-数构二叉树
  • 学习嵌入式的第三十一天-数据结构-(2025.7.23)网络协议封装
  • epoll_create1函数含义和使用案例
  • 深度解析【JVM】三大核心架构:运行时数据区、类加载与垃圾回收机制
  • Java大厂经典面试题
  • 复杂产品系统集成协同研发平台的研究与实现
  • @PathVariable与@RequestParam的区别
  • k8s的nodeport和ingress
  • 【区块链安全】DeFi协议安全漏洞深度分析:从闪电贷攻击到MEV套利
  • VTK交互——ImageClip
  • DH和IKE的关系理解
  • Linux下挂载磁盘报superblock错误
  • 泰山派GPIO编译 ADB下载 万用表测量GPIO电压
  • 嵌入式硬件篇---有线串口通信问题
  • Digit Queries
  • git推送文件失败
  • 深入解析Hadoop如何实现数据可靠性:三副本策略、校验和验证与Pipeline复制
  • Qt 网络编程进阶:RESTful API 调用
  • Android Studio Profiler工具使用流程
  • C++连接MySQL完整教程
  • 哪些人需要用到MBTI职业性格测试?
  • c#Lambda 表达式与事件核心知识点整理
  • 对比JS“上下文”与“作用域”
  • 网络资源模板--基于Android Studio 实现的简易购物App
  • 变频器实习DAY15
  • 地级市-生态韧性数据(2000-2022年)-实证数据
  • VTK交互——Callback
  • MySQL 8.0 OCP 1Z0-908 题目解析(36)
  • 【Redis】 Redis 基础命令和原理