
最近在整理CT影像AI检测相关的工作时我一直在想一个问题为什么很多模型在训练集和验证集上指标都很漂亮一旦换到另一台CT机器、另一家医院的扫描协议立刻掉点尤其是肺结节、肝病灶、腹腔淋巴结这类小目标假阳性率经常会翻倍。我见过不少研发团队把精力全部放在“换更大的backbone”“堆更强的FPN”上却忽略了一个更隐蔽的问题特征提取器其实已经学到了东西真正出问题的是下游决策层的置信度估计。于是当我看到“Lesion Detection in CT with Frozen Self-Distilled Features: SALT, a Spatially Adaptive Label-Guided Temperature”这个标题时第一反应是它没有提新的检测头也没有提新的损失函数而是把矛头指向了“温度”——一个在分类任务里很简单、在检测里却很少被讨论的概念。这个方向值得展开聊。因为SALT要解决的不是“让网络更深”而是“如何把已经训练好的特征用得更准”。它背后牵引出来的是一整套关于特征冻结、后处理校准和空间自适应决策的工程思路。即便你暂时没有复现这个方法的计划理解它也会让你对CT病灶检测里的“假阳性控制”和“少样本适配”有新的认识。1. 先把SALT要解决的问题说清楚不是特征不够而是决策边界歪了1.1 CT病灶检测里常见的一个尴尬现象在实际项目中一个典型流程是用一批已经标注好的CT影像训练一个检测器输入是CT volume或切片输出是病灶的位置、类别和置信度。训练时用的可能是一个在自然图像上预训练过的ResNet或Swin然后在医学影像上做微调。评估时你会看FROC曲线、敏感性和假阳性率。这时候经常出现一种情况模型能够“看到”病灶区域因为类激活图或特征可视化确实在病灶位置有响应但最终分类分数偏低或者把病灶边缘的切片判成非病灶通过降低阈值来提高敏感性假阳性却大量涌向血管断面、肠壁增厚、炎症区域如果做多中心验证不同扫描仪之间差异会让分数分布进一步漂移。换句话说模型的特征表达没有完全崩溃但决策层对“这个位置到底像不像病灶”的判定不够稳定。你可以把它理解为卷子上的题大部分是会做的但判卷标准忽松忽紧导致得分不稳定。1.2 温度这个概念的来源“温度”来自softmax概率估计里的一个缩放系数。在分类任务里很多人在知识蒸馏或置信度校准中见过它。普通softmax的计算可以写成[ p_i \frac{e^{z_i / T}}{\sum_j e^{z_j / T}} ]T大于1时概率分布变平滑相当于模型对各类别之间的差异不那么激进T小于1时分布变尖锐模型更倾向于给出高置信度预测。T等于1就是原始logits。这本来是一个全局标量。但在图像检测任务里不同空间位置的“校准需求”是完全不一样的。背景区域可能只需要一个比较低的置信度阈值而病灶边缘、小病灶、低对比度病灶可能就需要更温和的缩放否则会被阈值一票否决。更关键的是这种空间差异是可以通过特征和标签学习到的。所以SALT这个名字里最吸引我的不是“Self-Distilled Features”虽然这个词也很重要而是“Spatially Adaptive Temperature”。它意味着温度不再是全局一个数而是一个随空间位置变化的张量。每一个像素或anchor位置模型都有自己的温度调节器。这比简单调一个全局阈值要精细得多。1.3 为什么说这是一种“决策修正”而非“特征增强”很多检测改进工作都在改特征金字塔结构、注意力模块、上下文聚合、Transformer encoder。这些改法确实有用但它们只解决“特征能不能涵盖目标信息”的问题不解决“拿到特征之后模型敢不敢下判断”的问题。SALT的思路更接近“决策修正”。假设我们已经有一个冻结的特征提取器不管它是自监督学出来的还是通过蒸馏得到的它提供了一块相对稳定的表征空间。检测头或者分割头在这块表征上做分类和回归。问题是分类置信度经常和空间位置、上下文、噪声水平强相关。SALT用一个额外的分支或后处理模块根据特征和标签信息预测一个空间温度场再用这个温度场修正最终的分类概率。这样做的直接收益是不需要重训整个检测模型可以冻结大部分权重针对病灶边界、微弱信号可以自适应地放松或收紧置信度可以用标签信息引导温度场的学习让模型知道哪些区域更容易混淆。所以SALT解决的不是“检测不到”而是“检测到了却不敢信”。在医学场景里很多假阴性恰恰是模型“不敢信”造成的。2. 拆开SALT自蒸馏特征、标签引导和空间自适应温度到底是什么关系2.1 Frozen Self-Distilled Features先得到一个“不用再动”的表征底座“Frozen Self-Distilled Features”可以拆成两层第一层是自蒸馏Self-Distillation。常规知识蒸馏是让一个student模型学习teacher模型的输出。自蒸馏则是让同一个架构或同一个模型的不同分支之间互相学习或者让模型从自身的强增强视图里学习一致性表征。自蒸馏的特征往往比直接用分类loss训练出来的特征更平滑、更少过拟合也更适合迁移。第二层是冻结Frozen。训练检测头时backbone固定不动只训练后续的任务相关层。冻结的好处是明显的可以复用大规模预训练特征减少小规模数据上的灾难性遗忘还能节省显存和训练时间。在SALT这个方向里冻结特征的意义还在于它提供了一个稳定的输入分布。温度场学习的是“在当前特征空间下如何修正置信度”。如果特征一直在变温度场学出来也没法稳定使用。所以这个设计的潜台词是不要一上来就微调backbone先在冻结特征上把决策校准问题解决掉。如果解决不掉再考虑解冻部分层。2.2 Label-Guided标签不是用来做反向传播而是用来做“空间引导”很多人看到Label-Guided会担心检测任务在测试时根本没有标签怎么用标签引导这其实取决于方法具体怎么落地。合理的理解是在训练阶段标签图比如病灶mask或边界框生成的高斯热图会参与温度场的学习作为一个空间先验告诉模型哪些区域应该更谨慎、哪些区域可以直接压下去。具体来说常见的做法可能是把冻结特征图送进一个小网络预测出初始温度图计算这个温度图与真值标签之间的对齐关系比如病灶区域内外的温差温度图的优化目标不是直接最小化分类损失而是让经过温度缩放后的分类概率在病灶区域更尖锐在背景区域更平坦推理时模型不再使用真值标签而是直接利用训练好的温度预测网络输出空间温度场。如果标签是分割mask那引导非常直接病灶区域对应的温度应该更小让概率更尖锐背景区域温度可以更大抑制那些本来就是噪声的响应。如果标签是检测框也可以用高斯核把框的约束放松成一个概率图作为温度图的学习目标。从工程角度看这种“标签引导”并不是开挂而是一种辅助监督。它没有给检测器注入测试时才能拿到的信息只是在训练时帮温度场学习一个合理的空间分布模式。2.3 Spatially Adaptive Temperature从“一个数”变成“一幅图”温度场可以是一个和特征图分辨率相同的二维张量甚至一个三维volume。每个空间位置都有一个温度值。这个温度值的含义是模型在这个位置做softmax归一化之前先对logits做缩放。当温度场与病灶mask对齐时可以看到病灶中心温度低置信度被放大更容易被阈值保留病灶边缘温度温和不压制也不过分放大血管断面、骨骼边缘、正常软组织温度高抑制假阳性。这就像给检测结果做了一次空间上的动态阈值。它不是简单地给所有候选框一个统一分数cutoff而是根据每个位置的局部特征决定“该信几分”。这样的设计还有一个额外好处它可以兼容不同大小的病灶。小病灶由于体素少、特征弱如果用全局高温度去压很容易被压没如果用全局低温度假阳性又会飙升。空间自适应等于给了模型一个机会让它在每个位置单独权衡敏感性和特异性。3. 为什么SALT这种思路适合CT病灶检测以及它和普通后处理有什么不同3.1 CT影像本身就需要空间差异化处理CT影像有几个特点单通道灰度、HU值范围大、病灶与周围组织对比度差异很大、而且不同部位的结构复杂度不同。肺结节检测里一个4毫米的磨玻璃结节的对比度可能只有几十HU而一个8毫米实性结节的对比度可能超过200HU。它们对应的特征强度可能差好几倍。如果模型使用一个全局温度或全局阈值几乎不可能同时兼顾这两类病灶。肝脏病灶检测里病灶边缘常常受伪影、部分容积效应影响中心区域和边缘区域的置信度表现不一致。全局温度会把边缘信息平均掉导致边界回归不稳定或者分类分数偏低。所以在医学影像检测里空间自适应不是锦上添花而是必须。SALT用温度场的方式把这种空间差异化显式建模了。它比attention在处理“置信度校准”这层上更直接因为attention改变的是特征权重温度改变的是概率输出。3.2 和传统检测后处理对比传统的检测后处理一般包括NMS、置信度阈值、类别特定阈值、以及一些基于规则的筛选。比如“结节候选框里小于3mm的直接丢弃”“钙化灶独立处理”。这些规则的优点是透明、可调试缺点是无法覆盖所有空间位置和形态。SALT这类方法的本质是“可学习的后处理”但它不是去替换NMS而是去调整进入NMS之前的置信度。你可以把它理解为在每个位置给分类logits做一次可学习的非线性缩放再交给NMS和阈值流程。这样做比单纯调阈值的好处是阈值调多了会伤害某一类病灶温度场可以按位置差异化处理规则后处理需要人工定义特征温度场是从特征和标签中自动学习出来的温度场和检测特征是联合训练的能感知到不同病灶的局部上下文。3.3 和轻量级微调的关系很多人会问那我直接把检测头在新数据上微调不就行了为什么要这么绕问题在于当目标数据集很小或者数据域差异很大时直接微调可能过拟合破坏预训练特征。SALT保留了冻结特征只在特征之上额外学习一个温度场模块。这个模块参数量通常很小所以即便数据量不大也不容易过拟合。另一方面如果要在多个医院的数据上做联邦学习或快速适配冻结公共特征、只更新温度场会是一种很实用的策略。这样既能保护数据隐私又能让每个站点有自己的校准模型。当然这里有个前提基础特征必须足够强。如果冻结特征本身包含的语义信息和病灶区分度很弱温度场怎么学都没用。温度是“调节器”不是“信息的创造者”。4. 如果要在自己的项目里复现类似思路该怎么拆流程4.1 一个最小可行的四步框架在没有官方代码的情况下可以把这个方法理解成一个可操作的技术框架拆成四个阶段第一阶段准备冻结特征提取器。可以使用ImageNet预训练模型也可以是某个已经在CT数据上训练好的模型。建议先在目标数据上做一轮无监督/自监督预训练获得domain-specific的backbone再把backbone冻结。第二阶段构建检测基础模型。检测头可以是RetinaNet、FCOS这种anchor-free结构也可以使用基于Transformer的DETR类模型。注意这里不要急着加很多复杂的trick先保证基础检测器能跑通得到特征图和初始logits。第三阶段设计温度预测分支。从检测器选中的特征层通常是最终分类头前面的特征引出一个小网络比如两层卷积加一个归一化输出一个与特征图同分辨率的温度图。温度图需要限制在正数范围通常用exp或softplus激活。第四阶段标签引导训练。训练时根据检测标签生成一个温度目标图。一个简单的想法是病灶中心区域的目标温度设为较小值比如0.8背景区域目标温度设为较大值比如1.2计算预测温度图与目标温度的损失再加上分类损失。推理时只用温度预测分支输出温度图对原始logits做缩放再走NMS和阈值。这是一个很通用的示例结构。具体数值要根据你的任务调整。比如小病灶较多的场景病灶中心的目标温度可能还要更低如果假阳性严重背景区域温度可以更高。4.2 关键参数的检查顺序复现这类方法时最怕一上来就调参。建议按照下面顺序排查第一步确认特征对齐。冻结特征来自哪个层级有没有经过可变形卷积或空间归一化不同输入CT的spacing、窗宽窗位是否统一如果输入分布不一致温度场学出来的空间模式没有意义。第二步确认温度图的空间尺寸和原特征图对齐。如果温度图分辨率比特征图低需要上采样如果比特征图高需要下采样。对齐方式不对会导致边界区域修正失效。第三步确认标签引导的监督信号。mask是像素级还是box级box是否做了高斯扩散病灶重叠时怎么处理背景区域如何采样建议用前景和背景1:1采样避免温度图退化成全局常数。第四步确认温度范围。如果预测温度全是1附近说明损失函数的权重可能太小如果温度范围过大或在0.1以下跳跃说明激活函数或训练步长有问题。第五步确认推理和训练阶段的输入一致性。训练时温度分支可能拿到了标签图或依赖标签生成的目标温度但推理时没有标签就必须保证推理时只依赖特征预测温度。如果训练时把标签concat进了温度分支推理时又不想用标签那就要改成条件生成或者蒸馏出一个无标签依赖的温度预测器。4.3 一些工程落地时的经验建议我一般会建议这么做先在20到50个病例上做一个小的验证集确认温度场确实能降低假阳性而不是把所有分数都拉低。然后可视化温度图看看它是不是在病灶区域出现了响应。如果温度图乱糟糟没有任何空间结构那大概率是标签引导信号不够强或特征不匹配。再从单层特征扩展到多层特征。检测模型通常在多个特征层上做预测每一层的语义粒度不同。SALT的温度场也可以在不同特征层上分别计算然后融合成最终的温度图。不过这样做会增复杂度。建议先在一个主要特征层上做验证收益后再扩展。最后要和全局温度做对比。很多场景下优化一个全局标量温度就能带来几个点的FROC提升。空间自适应温度必须比全局温度有明显优势才值得引入额外的模块和训练成本。如果差距不大应该选择更简单的方案。5. 这套方法真正的适用边界和最容易踩的坑5.1 适用场景从方法论角度看SALT最适合下面几类场景已经有一个收敛的检测模型但置信度分布不理想目标数据量少不适合大幅度微调backbone病灶大小变化大单一阈值难以覆盖需要快速适配新数据分布比如新医院的数据不想重新训练完整模型需要可解释的决策过程温度图可以帮助理解模型在哪些区域给出激进或保守的预测。如果你正好卡在“模型能检测到病灶但分数就是不够准”的瓶颈这个思路值得尝试。5.2 不适用场景反过来也有一些场景不适合硬套如果基础检测器准确率本身就低连病灶区域都完全没有响应温度场救不了如果训练数据和测试数据分布差异大到特征完全失效先做域适配或特征蒸馏再考虑温度校准如果你需要严格可解释的规则后处理比如医疗设备注册审核里要求“阈值必须统一”那额外引入一个空间变化的温度场会增加解释成本如果你没有稳定的标注质量温度场的标签引导信号会很嘈杂训练出来的温度图可能学到错误的空间模式。5.3 最容易踩的坑第一个坑混淆“空间自适应温度”和“不确定性图”。温度图虽然是一个空间分布但它不等于模型认知不确定性的直接估计。它只是一个用于缩放logits的修正因子。如果强行把它解释成模型哪里不确定可能会误导后续决策。第二个坑忽略了温度图的正则化。如果不加约束温度图可能出现过拟合比如在训练集病灶位置出现尖锐的低温点在测试集上稍微偏移一点就失效。可以尝试对温度图做空间平滑正则化或者让它和初始全局温度保持一个可控制的距离。第三个坑测试时使用泄漏标签。label-guided如果设计不当很容易在训练时把标签作为特征输入导致推理阶段退化。要特别注意测试时到底哪些输入可用。一个安全的原则是推理阶段任何分支都不能依赖测试时不可用的信息。第四个坑忽略CT预处理的差异。如果训练数据是1.0mm层厚重建测试数据是5.0mm层厚温度场的空间模式会发生漂移。更稳妥的做法是统一重采样到各向同性或接近的spacing再做检测。6. 从SALT看医学影像检测的一个趋势模型不再只有“深度”还有“校准”6.1 深度之后是稳定性和可复用性过去几年CT病灶检测的进展大部分来自“更强的主干网络”和“更大的模型”。AR经理和研发同学都在追SOTA但临床上真正需要的是一个在不同设备、不同参数、不同患者体质下都能稳定输出的系统。一个检测器如果上一例病人的假阳性率是0.5/scan下一例变成5/scan主治医生不会觉得它“SOTA”。SALT这类工作把注意力转向了特征利用和决策校准。它暗示一个方向骨干网络越来越难有数量级提升但如何在一个已训练好的模型上做后处理校准、域适配、置信度修正还有大量空间。冻结自蒸馏特征加空间自适应温度本质上是一种“模型复用”的思路。它承认模型训练成本高所以不轻易推翻重训而是在已有特征上做轻量级修正。6.2 对普通研发团队的建议如果你没有资源训练一个几十亿参数的医学影像大模型也不用焦虑。你可以把“自蒸馏”简化成“在公开的CT预训练模型上提取特征”把“label-guided temperature”简化成“用已有的mask或box生成空间权重图”在一个小数据集上先做一个温度修正模块。这样做的价值不一定非要复现论文的完整性能而是让你更深刻地理解检测器的输出分数不是天然的置信度它需要校准。而校准不是只能靠一个标量温度可以更精细、更空间化、更标签感知。从工程上看这种模块可以接入现有的检测pipeline。比如在测试阶段把原始分类logits和温度图相乘在训练阶段额外增加一个温度预测分支在部署阶段只增加一次轻量前向推理。6.3 一个可以留用的经验框架我最后给你留一个比较好记的框架叫“三步校准法”第一步确认特征是否冻结。能冻结就先冻结这能减少训练成本也让后续模块的输入更稳定。第二步确认置信度为什么漂移。先做全局温度分析看假阳性和假阴性的分数分布判断是整体偏激进还是偏保守。第三步再考虑空间和非空间修正。如果全局温度解决不了就尝试让温度具备空间变化并用标签引导设计目标温度图。这个框架不局限于SALT它其实适用于所有检测模型的后处理优化。下次你再遇到模型“好像检测到了但分数不给力”时可以不用先调阈值先想想你是不是还没有给它一个合适的位置感知校准器。医学影像AI的竞争最终会从“谁的模型更准”过渡到“谁的模型在复杂临床环境里更稳”。而稳定性恰恰藏在这种一个像素一个温度、一个特征一层修正的细节里。