☰
基于DenseNet161与Transformer的PET/CT多模态融合模型预测肺腺癌气腔播散及预后分层
2026/10/14 6:56:26 网站建设 项目流程

1. 从一张PET/CT片子说起:为什么气腔播散值得单独建个模型

肺腺癌的术前评估里,气腔播散(Spread Through Air Spaces,STAS)这两年被讨论得越来越多。简单说,它就是肿瘤细胞突破了主病灶的边界,像撒芝麻一样飘散到周围正常的肺泡腔里。这个东西在病理切片上才看得见,术前影像上却往往没有明显的结节或实变,所以它成了很多胸外科医生心里的一根刺——你切的时候觉得切缘够了,术后病理一报STAS阳性,复发风险立刻上一个台阶。

传统做法是拿CT影像的形态学特征去猜,比如肿瘤的实性成分比例、胸膜牵拉、毛刺征、血管集束征这些。但说实话,单靠CT形态学去预测STAS,AUC大多在0.65到0.75之间晃,临床上不太敢直接拿来指导术式选择。原因也简单:STAS本质上是细胞层面的播散,CT看到的是宏观密度和形态,中间隔了好几层信息损失。

这篇发表在Advanced Science上的工作,思路就很直接:既然CT不够,那就把PET的代谢信息加进来。PET/CT融合影像同时包含了CT的解剖结构和PET的代谢活性,而代谢活性恰恰能反映肿瘤细胞的增殖状态和侵袭能力,这跟STAS的生物学行为是有关联的。更关键的是,他们用Transformer来做特征融合,而不是简单地把两个模态拼在一起。这个选择背后有讲究,后面我会详细拆。

先把这个项目的整体轮廓说清楚:输入是术前PET/CT融合影像,输出是两个东西——一个是STAS阳性的术前预测概率,另一个是基于预测结果做的预后分层。也就是说,它不只是个分类模型,还往下游走了一步,把预测结果和患者的无复发生存、总生存挂上了钩。这个设计思路在临床转化上是有意义的,因为单纯一个预测标签,医生没法直接用来做决策,但如果是"STAS高风险+预后差"这样的分层,术式选择和新辅助治疗策略就有依据了。

适合谁看这篇内容?如果你是做医学影像深度学习的,能从这里看到多模态融合的具体实现和Transformer在3D医学影像上的落地方式;如果你是临床方向的研究者,能理解为什么这个模型值得信任、它的局限在哪;如果你是想复现类似工作的研究生,DenseNet161加Transformer这套组合、放射基因组特征的提取流程、预后分层的统计方法,都是可以直接抄作业的。

2. 整体设计思路:为什么是DenseNet161加Transformer,而不是别的组合

2.1 双模态融合的三种做法,以及为什么选了最难的那种

多模态医学影像融合,业内常见三种做法。第一种是早期融合,把PET和CT在输入层就拼成多通道图像,送进一个网络。第二种是晚期融合,两个模态各跑一个网络,最后在全连接层把特征拼接或者做加权平均。第三种是中间融合,在网络中间层做跨模态的特征交互。

早期融合的问题在于,PET和CT的物理意义完全不同。CT的HU值是组织密度的线性映射,PET的SUV值是代谢活性的半定量指标,两者数值分布、噪声特性、空间分辨率都不一样。你在输入层直接拼,网络在前几层就得同时处理这两种异质信号,很容易被其中一个模态主导。晚期融合又太晚,两个模态在各自网络里已经形成了高度抽象的特征,这时候再拼,跨模态的互补信息其实已经损失得差不多了。

这篇工作选的是中间融合,而且是用Transformer来做跨模态交互。具体来说,CT和PET各自先过一个DenseNet161 backbone提取特征,然后在特征层用Transformer的交叉注意力机制让两个模态互相"看"对方。这个设计的逻辑是:让网络自己学哪些区域CT重要、哪些区域PET重要,而不是人工设定融合权重。

2.2 DenseNet161做backbone的合理性

选DenseNet161而不是ResNet或者EfficientNet,我觉得有几个实际考量。DenseNet的核心是密集连接,每一层的输入来自前面所有层的输出拼接。这个结构在医学影像上有个天然优势:病灶的边界特征、内部纹理、周围环境信息分布在不同的语义层级上,密集连接能让浅层的边缘纹理特征直接传到深层,不至于在多次下采样中丢掉。

161这个深度也是有讲究的。太浅了(比如DenseNet121)特征表达能力不够,太深了(DenseNet201)在医学影像这种样本量通常几千例的数据集上容易过拟合。161算是个折中。而且DenseNet161在ImageNet上的预训练权重很成熟,迁移到医学影像上做fine-tune,收敛速度和最终性能都比较稳。

实际操作中,他们把DenseNet161的最后分类层去掉,取全局平均池化之前的特征图作为输出。对于3D PET/CT,通常是按切片处理或者用2.5D的方式(取相邻几层作为通道),这样能复用2D预训练权重,计算量也可控。

2.3 Transformer在这里到底干了什么

很多人一看到Transformer就想到NLP,其实在视觉任务里,Transformer的核心价值是全局依赖建模。卷积核的感受野是局部的,你要让它看到全图,得堆很多层。但STAS的播散是弥散的,它可能出现在主病灶周围任何方向的肺泡腔里,这种长距离的空间关联,卷积网络捕捉起来效率不高。

Transformer的自注意力机制,每个位置都能直接跟其他所有位置计算关联权重。放在PET/CT融合的场景里,就是CT特征图上的每个位置,都能去"查询"PET特征图上所有位置的信息,然后根据相关性做加权聚合。这个机制让模型能学到类似"CT上这个区域的毛刺征,配合PET上对应区域的高代谢,联合判断STAS风险"这样的跨模态、跨空间的推理逻辑。

具体实现上,他们用的是交叉注意力(cross-attention):一个模态做Query,另一个做Key和Value。这样CT和PET的特征在多个注意力头里反复交互,每个头关注不同的特征子空间,有的头可能关注代谢-密度的空间对应关系,有的头可能关注纹理-代谢的相关性。

3. 核心细节拆解:从影像预处理到放射基因组特征

3.1 PET/CT配准与ROI勾画的实际操作

PET和CT虽然是同一台设备扫的,但呼吸运动会导致两者在肺野区域存在空间错位,尤其是靠近膈肌的病灶。所以第一步必须做配准。常用的做法是刚性配准加形变配准两步走:先用刚性配准把整体对齐,再用基于B样条的自由形变配准做局部微调。工具上,Elastix和ANTs是学术界用得比较多的,ANTs的配准精度在肺部影像上口碑不错,但计算时间较长,一个病例可能要几分钟。

ROI勾画是另一个关键环节。STAS本身在影像上不可见,所以ROI是围绕主病灶勾画的。通常由两位有经验的放射科医生独立勾画,然后计算Dice相似系数,如果一致性不够(比如Dice低于0.8),就请第三位高年资医生仲裁。勾画范围一般包括肿瘤的实性成分和磨玻璃成分,但不包括明显的胸膜和血管结构。

注意:ROI勾画的质量直接决定模型性能的上限。我见过不少复现工作,模型结构一模一样,但因为ROI勾画标准不统一,AUC能差出0.1以上。建议在勾画前先制定详细的勾画规范文档,明确边界判定标准。

3.2 放射基因组特征的提取与筛选

放射基因组这个词听起来高大上,其实就是从影像里提取大量定量特征,然后跟基因组或临床结局做关联分析。这里他们提取的特征大概分几类:

  • 一阶统计特征:均值、方差、偏度、峰度、能量、熵等,描述ROI内SUV值和HU值的整体分布。
  • 形状特征:体积、表面积、球形度、表面体积比等,反映病灶的几何形态。
  • 纹理特征:GLCM(灰度共生矩阵)、GLRLM(灰度游程矩阵)、GLSZM(灰度区域大小矩阵)等,描述体素之间的空间排列模式。
  • 小波特征:对图像做小波分解后在各子带上提取上述特征,捕捉多尺度的纹理信息。

提取工具用PyRadiomics比较多,它支持PET和CT的标准化提取,而且有IBSI(影像生物标志物标准化倡议)的合规性认证。提取出来的特征维度通常在1000到2000之间,直接送进模型肯定过拟合,所以要做特征筛选。

筛选流程一般是三步:先去掉方差接近零的特征,再用单变量统计检验(比如Mann-Whitney U检验)做初筛,最后用LASSO或者随机森林做多变量筛选。LASSO的好处是能同时做特征选择和正则化,出来的特征子集通常比较精简,可解释性也好一些。

3.3 Transformer融合模块的具体结构

融合模块的设计是这篇工作的核心创新点。整体流程是这样的:

CT特征图和PET特征图分别经过一个线性投影层,把通道数统一到相同的维度(比如512)。然后加上位置编码,因为Transformer本身没有空间感知能力,位置编码告诉它每个特征向量对应原图的哪个位置。对于3D数据,位置编码通常是可学习的或者用正弦函数生成。

接下来是N层交叉注意力块。每一层里,CT特征做Query,PET特征做Key和Value,计算注意力权重后得到CT的增强特征;反过来,PET做Query,CT做Key和Value,得到PET的增强特征。两个方向的输出再各自过一个前馈网络。这样反复几层,两个模态的特征就充分交互了。

最后把两个模态的增强特征做拼接或者加权求和,送进分类头。分类头通常就是几层全连接加Dropout,输出STAS阳性的概率。

实操心得:交叉注意力的层数不是越多越好。我试过4层、6层、8层,在几千例的数据集上,4到6层性能最好,再往上加,验证集AUC不升反降,而且显存占用明显增加。另外,注意力头的数量建议跟特征维度匹配,比如512维用8个头,每个头64维,这是比较经典的配置。

4. 实操过程:从数据准备到预后分层的完整链路

4.1 数据集的构建与划分

这类研究的数据集通常来自单中心或多中心的回顾性收集。纳入标准一般包括:病理确诊为肺腺癌、术前有完整的PET/CT影像、术后病理报告明确记录了STAS状态、有至少两年的随访数据。排除标准包括:术前接受过新辅助治疗、影像质量不合格、病灶太小(比如小于1cm,ROI勾画不稳定)。

数据划分上,不能简单随机划分,因为同一患者的多个病灶或者多次检查会有数据泄漏。正确的做法是按患者ID划分,确保同一个患者的所有数据只出现在一个集合里。通常按7:1:2或者6:2:2划分训练集、验证集、测试集。如果有多中心数据,最好做外部验证,这样结论更有说服力。

类别不平衡是常见问题。STAS阳性的比例在不同队列里差异很大,有的报道30%左右,有的能到50%以上。如果阳性比例偏低,训练时要用加权交叉熵或者focal loss,评估指标也要用AUC、F1这些对不平衡不敏感的,而不是单纯看准确率。

4.2 训练策略与超参数选择

训练用的是PyTorch框架,优化器选AdamW,初始学习率1e-4,权重衰减1e-5。学习率调度用余弦退火,训练100到150个epoch。Batch size受显存限制,通常设8或者16。如果显存不够,可以用梯度累积来模拟更大的batch size。

数据增强对医学影像很重要,但要注意增强方式不能破坏解剖结构。常用的有随机旋转(±15度)、随机缩放(0.9到1.1)、随机平移、弹性形变。颜色抖动和CutMix这类增强要慎用,因为PET的SUV值和CT的HU值都是有物理意义的,随意改变会引入噪声。

损失函数方面,主任务是STAS分类,用交叉熵。如果同时做预后分层,可以加一个Cox比例风险模型的负对数似然作为辅助损失,两个损失加权求和。这样模型学到的特征既有判别性,又有预后相关性。

4.3 预后分层的实现方式

预后分层不是简单地把预测概率分成高低两组就完事了。严谨的做法是:先用模型输出的STAS预测概率,结合其他临床变量(比如T分期、N分期、年龄、吸烟史),构建一个多变量Cox回归模型。然后用这个模型计算每个患者的风险评分,再按中位数或者最佳截断值(用X-tile或者ROC曲线确定)把患者分成高风险和低风险两组。

生存分析用Kaplan-Meier曲线可视化,组间差异用log-rank检验。多变量分析用Cox比例风险模型,报告HR值和95%置信区间。如果要做内部验证,可以用Bootstrap重采样或者交叉验证来估计C-index的置信区间。

注意:预后分层的截断值选择会影响结论。用中位数简单,但可能不是最优的;用X-tile找最佳截断值,统计效力更高,但容易过拟合。建议在训练集上确定截断值,然后在测试集上验证,不要在全数据集上找截断值。

5. 常见问题与排查技巧实录

5.1 模型不收敛或者AUC卡在0.5附近

这是最常见的问题。排查顺序建议如下:

先检查数据标签有没有错位。我遇到过好几次,图像和标签的对应关系在数据加载器里搞反了,模型训练半天AUC就是0.5。用一个小批量数据手动验证输入输出对应关系,能快速定位。

再检查学习率。1e-4对AdamW来说通常没问题,但如果backbone是随机初始化而不是预训练权重,可能需要更小的学习率(比如1e-5)或者用warmup。另外,如果用了BatchNorm层,batch size太小会导致统计量估计不准,这时候可以换成GroupNorm或者SyncBN。

最后检查ROI区域。如果ROI勾画得太小或者位置偏了,模型看到的全是背景,自然学不到东西。可视化几个样本的ROI叠加图,确认病灶在ROI内。

5.2 训练集AUC很高但验证集AUC很低

典型的过拟合。医学影像数据集通常几千例就算大了,但相比ImageNet还是小很多。对策包括:增强数据增强、加Dropout、加权重衰减、早停。如果用了Transformer,还要注意位置编码是否可学习,可学习的位置编码在小数据集上容易过拟合,可以换成固定的正弦编码。

另外,检查一下数据划分有没有泄漏。比如同一个患者的多个切片被分到了训练集和验证集,模型实际上是在"背"患者,验证集AUC虚高。

5.3 PET和CT融合后性能反而下降

这种情况说明融合模块没有学到有效的跨模态信息,反而引入了噪声。可能的原因有:配准不准,两个模态的空间对应关系错位;某个模态的影像质量差,比如PET计数太低导致噪声大;融合权重初始化不合理,导致一个模态主导。

排查方法:分别用CT单模态和PET单模态训练模型,看各自的性能。如果单模态AUC都有0.7以上,融合后反而降到0.65,那基本可以确定是融合模块的问题。可以尝试简化融合结构,比如先用简单的特征拼接,确认能work之后再换成交叉注意力。

5.4 常见问题速查表

问题现象可能原因排查方法解决思路
训练loss不下降学习率过大/过小、标签错误检查学习率、验证标签对应调整学习率、修正标签
验证集AUC远低于训练集过拟合、数据泄漏检查数据划分、正则化强度增强正则、按患者划分
融合后性能下降配准不准、模态质量差单模态对比实验改进配准、简化融合
预后分层无统计学差异截断值选择不当、样本量不足尝试不同截断值、功效分析用X-tile、扩大样本
显存不足batch size过大、模型太深监控显存占用减小batch、梯度累积

6. 这个工作的边界在哪:我的一些实际体会

复现和落地这类工作,有几个现实问题绕不开。第一是数据标注的成本。STAS的金标准是术后病理,需要病理科医生在切片上仔细辨认,而且不同病理医生之间的一致性也不是100%。这意味着标签本身就有噪声,模型性能的天花板受限于标签质量。

第二是泛化性。单中心训练的模型,换到另一家医院的PET/CT设备上,性能往往会下降。不同厂商的PET重建算法、CT的管电压和管电流、层厚都不一样,这些都会影响影像组学特征的稳定性。要解决这个问题,要么做多中心训练,要么在预处理阶段做标准化(比如ComBat harmonization)。

第三是临床落地。一个AUC 0.85的模型,听起来不错,但放到临床场景里,假阳性和假阴性都有实际代价。假阳性可能导致不必要的扩大切除,假阴性可能让患者错过辅助治疗。所以模型输出的概率,最好结合临床决策曲线分析(DCA)来评估净获益,而不是只看AUC。

我自己在跑类似项目时,最大的体会是:模型结构固然重要,但数据质量、ROI勾画一致性、标签可靠性这些"脏活累活",才是决定最终性能的关键。Transformer再强,喂进去的是噪声,出来的也是噪声。所以如果你打算做类似的工作,建议先把数据质控做扎实,再在模型上花心思。另外,代码和预训练权重如果能开源,对整个领域的推动会比多刷0.01的AUC大得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询