拥抱不完美数据集:医学图像分割中深度学习解决方案综述
- 关联论文:1908.10454
- 作者:flyP
- 更新:2026-07-27
一句话结论
这是一篇专门给"数据不够干净"的医学图像分割场景做总账的综述——它把"标注稀缺"和"标注噪声/弱标注"两大现实痛点拆成可操作的解决方案库,并给出推荐组合,至今仍是医学影像从业者的入门地图。
解决什么真问题
医学影像领域的悖论:SOTA 分割网络(U-Net、DeepLab、nnU-Net)几乎都假设有"大量、干净、像素级对齐"的标注。但临床上,医生时间贵、专家一致性差、3D 体素标注动辄数小时一病例,真实数据集天然就是不完美的:标注稀疏(只标了几张)、标注噪声(边界不一致)、弱标注(只有边界框甚至只有图像级标签)。
本文把"如何在不完美数据上训练出可用分割模型"做了一次系统性归类,回答两个问题:
- 数据少:怎么用更少的标注达到接近全监督的性能?
- 标注粗:怎么用粗糙标注逼近像素级精度?
核心方法
文章把方案分成两条主线(scarce annotations / weak annotations),每条线再细分:
1. 标注稀缺(Scarce Annotations)
- 数据增强:传统几何/光度增强 + 针对性增强(弹性形变模拟组织形变);近年思路是learnable augmentation(用网络学到的变换代替人工规则)。
- Transfer learning:在自然图像(ImageNet)上预训练,在医学影像上 fine-tune;本文给出"为什么 ImageNet 预训练在小样本医学任务上仍有效"的几种解释(低层特征通用、收敛速度更快、隐式正则)。
- Few-shot learning:基于原型(prototype)、元学习(meta-learning)和 Siamese 网络,让模型在新类别/新器官上只用几张样本就能工作。
- Self-supervised learning:在无标注数据上做 pretext task(上下文预测、旋转预测、对比学习等),再用少量标注微调——是后续 SimCLR/MoCo/MAE 工作的早期医学版本。
- Active learning:让模型挑"最该被标注的样本"交回给医生标注,减少标注预算;本文指出 IOU 不确定性、熵、委员会分歧等挑样策略在医学场景的经验对比。
- Annotation-efficient architectures:把注意力、密集连接、空洞卷积等结构塞进 U-Net 家族,让单标注样本的学习效率更高。
2. 弱标注(Weak Annotations)
- 图像级标签:用 image-level classification 监督训练分割网络,靠 CAM/Grad-CAM 类方法获得伪像素监督,再迭代细化(典型流水线:classification → CAM → refine)。
- 涂鸦标注(scribble):用户画几条线作为弱监督,结合 CRF/像素级一致性损失做正则;本文把这类方法归为"graph-based / CRF-based / self-training"三种实现路线。
- 边界框标注:用 box-level 监督代替像素级——损失函数通常由 box 外 penalty + box 内 pixel-level consistency 组合构成。
- 点标注:极端弱监督,只标中心点或几个关键点;本文给出了几种"以点推面"的扩散/条件随机场方案。
- 噪声标签:把"标签本身就是错的"作为单独问题处理——本文讨论了标签清洗、置信学习、robust loss(如 Generalized Cross Entropy)以及协同训练(co-training)。
推荐组合
文末给出"具体场景 → 推荐方案"的清单,例如:
- 数据极少 + 全像素级标注预算低 → ImageNet 预训练 + 强增强 + 主动学习
- 仅有涂鸦 → scribble-supervised U-Net + CRF 后处理
- 边界框可用 → box-supervised 损失 + 自训练迭代
- 标签可信度可疑 → 置信学习 + 鲁棒损失 + 双网络协同
可以用一段伪代码描述其典型流水线:
# 不完美数据训练分割网络的通用模板
def train_segmentation(data, supervision_level):
model = build_unet_with_attention()
if supervision_level == "scarce":
model.load_pretrained_imagenet()
data = apply_learnable_augmentation(data)
if has_budget:
data = active_learning_query(data, model) # 让医生再标一批
elif supervision_level == "scribble":
loss = pixel_ce + crf_regularization
elif supervision_level == "box":
loss = box_outer_penalty + inner_consistency
elif supervision_level == "noisy":
loss = robust_xent(model, noisy_labels, clean_probs)
train(model, data, loss)
return model
关键实验与数据
综述没有跑统一实验,而是汇总各子领域在常用基准上的报告指标:
- 息肉分割(Kvasir-SEG/CVC-ClinicDB):scribble 监督 + CRF 与全监督差距通常在 1–3% Dice 之内。
- 心脏 MRI(ACDC):image-level 弱监督方案报告 Dice 多在 70–85% 区间,而全监督 U-Net 通常 >90%。
- 脑肿瘤 BraTS:在只标 10% 切片的情况下,主动学习策略能比随机采样多拿 5–10% Dice。
- CAM 类方法:在 chest X-ray / 病理切片上 CAM 伪标签通常需要 3–5 轮迭代才能收敛到可用水准。
这些数字都来自被综述的子工作,具体数值请以原论文表格为准。本文本身不报告新的对比实验,仅以"哪些工作在哪类任务上达到什么水平"做总账。
亮点与局限
亮点
- 直面真实痛点:不做"假设数据完美"的乌托邦综述,直接把所有不完美情形纳入分类。
- 决策导向:文末"推荐组合"让它具备工具书属性,新手可以照单选方案。
- 方法学新颖度盘点:把数据增强 / 主动学习 / 自监督 / 弱监督四类技术放在同一框架下,方便横向比较。
- 覆盖面跨模态:CT、MRI、X-ray、超声、内窥镜都涉及。
局限
- 时间窗有限:2019/2020 截稿,对 2020 年之后大爆发的 Vision Transformer、自监督对比学习、扩散数据增强涉猎较少;nnU-Net(Isensee 2021)等里程碑工作仅做简短引用。
- 缺乏统一实验比较:综述性质决定无法跑统一基准,子工作的指标对比天然不齐。
- 半监督边界模糊:一些方法(如 mean teacher)既属于 scarce 又属于 noisy,本文未做严格划分。
- 3D 数据特性:医学多是 3D 体素,本文对 3D vs 2D 区分不够细致。
- 临床落地维度:缺少对标注一致性(inter-rater variability)、监管合规、模型不确定性估计的工程讨论。
对工程落地的启发
- 数据预算永远不够:本文论证了"主动学习 + 预训练 + 数据增强"这条管线对医学影像性价比最高,今天仍是项目立项时的默认 baseline。
- 弱监督不是退而求其次:当标注预算锁死,scribble/box/point 监督往往能在 1–3% Dice 之内追平全监督,是工程上的实用解。
- 标签清洗必须前置:在开始训练前先跑一次置信学习/标签一致性检查,常常能把"模型训不出来"问题从模型侧转移到数据侧解决。
- 自监督预训练是今天必备:本文提出 self-supervision 时还没完全爆发,但今天做任何少样本医学项目,MAE/SimCLR 类预训练已是基线——读本文时务必把这一点当成"超纲补充"。
- 不确定性估计:建议在工程实现时给模型加 MC-Dropout 或 deep ensemble,对临床部署的可解释性/可信区间至关重要。
与同方向工作的关系
- 与 Ronneberger et al. 2015《U-Net》:本文把 U-Net 视为医学分割的"母网络",所有稀缺/弱监督方案都建立在 U-Net 变体之上。
- 与 Isensee et al. 2021《nnU-Net》:nnU-Net 通过自动化的预处理/增强/后处理流水线把"不完美数据"问题缓解到极致,是本文思路的工业化实现。
- 与 Cheplygina et al. 2019《Not-so-supervised: a survey of semi-supervised, multi-instance, and transfer learning in medical image analysis》:与本文高度互补,那篇更聚焦 transfer / semi-supervised,本文把 weak/scarce 一并归类。
- 与 Zhou et al. 2017《A Review of Deep Learning in Medical Image Processing》:比本文更广(含分类、检测、分割),而本文专攻分割。
- 与 Taleb et al. 2020《Contributions of Self-Supervised Learning in Medical Imaging》:本文提到自监督但未展开,读者可对照阅读以补足 2020 后进展。
适合谁读
- 医学影像 / 放射科 AI 团队的研发负责人:拿来当项目立项时的方法选型表。
- PhD 新生:把它当作"如何读医学分割论文"的索引目录,再按需深挖。
- 算法工程师:尤其是做少样本/弱监督/标签清洗的,可以直接抄"推荐组合"做起点。
- 不太适合做纯架构创新(如新 backbone)的研究者——本文几乎不讨论网络结构本身的创新点。
工程落地与核查(Jay)
事实核查备注
- 综述性质边界:本文不报告原始实验,所有数字来自被综述子工作。原解读已注明"具体数值请以原论文表格为准",核查无异议。
- Dice 数字的参考性:70–85% Dice(弱监督 image-level)vs >90%(全监督 U-Net)——这个差距在医学分割中是真实可感的,但在不同器官/任务间差异很大。心脏 MRI(ACDC)的 70–85% 区间相对保守;某些简单结构(肺叶分割)弱监督差距可能更小。
- "nnU-Net 仅做简短引用":nnU-Net(Isensee 2021)确实是 2019 年截稿后的工作,综述未覆盖不是疏漏,但今天读这篇综述时必须将 nnU-Net 视为 baseline 而非前沿。
- CAM 类方法"需要 3–5 轮迭代":此数字来自 2019–2020 年的 CAM 类工作;后续 CAM 方法(Score-CAM、Grad-CAM++)和 ViT-based 方法(SAM 辅助分割)在某些场景下收敛更快,不应将此数字视为普遍上限。
- inter-rater variability:原综述局限中提到但未展开。实操中,不同医生对同一张 CT 的标注 Dice 可能只有 0.8–0.85(尤其在肿瘤边界),因此即使达到"全监督 90% Dice",上限本身可能受标注差异限制。
实际系统怎么用
1. 标注预算极度受限(首选方案)
Pipeline: 自监督预训练(SimCLR/MAE on 全部无标注数据)
→ 主动学习循环(Uncertainty sampling,每次让医生标注最不确定的 10 张)
→ ImageNet 预训练权重初始化(若可用)
→ U-Net with Attention(nnU-Net 预处理/增强直接用)
→ Dice + BCE 混合损失
主动学习循环代码骨架:
# 主动学习循环示意(伪代码)
for round in range(max_rounds):
model = train_one_round(model, labeled_data)
uncertainties = compute_uncertainty(model, unlabeled_data) # 预测熵或 MC-dropout 方差
query_idx = uncertainties.top_k(batch_size) # 选不确定性最大的
new_labels = radiologist.annotate(unlabeled_data[query_idx]) # 医生标注
labeled_data = labeled_data + new_labels
if len(labeled_data) >= budget:
break
2. 仅有涂鸦标注(scribble-supervised)
# Scribble supervised loss(U-Net + CRF 正则)
# 像素级 CE 只在被标像素上计算,未标区域用 CRF 生成软标签
from torch import nn
class ScribbleLoss(nn.Module):
def __init__(self, crf_weight=0.1):
super().__init__()
self.ce = nn.CrossEntropyLoss(ignore_index=-1) # -1 = 未标注像素
self.crf_weight = crf_weight
def forward(self, pred, scribble, image):
loss_ce = self.ce(pred, scribble)
# CRF 后处理得到软标签(需要 densecrf 库)
crf_label = dense_crf(image, pred.softmax(dim=1))
loss_crf = F.kl_div(pred.softmax(dim=1), crf_label, reduction='batchmean')
return loss_ce + self.crf_weight * loss_crf
3. 噪声标签清洗(实测 pipeline)
# 置信学习(cleanlab)自动找出可疑标注
from cleanlab.classification import CleanLearning
from cleanlab.filter import find_label_issues
# Step 1: 用当前模型预测,获取每个像素的预测分布
# Step 2: find_label_issues 找出一致性低的区域
issues = find_label_issues(
labels=mask, # shape: (N, H, W) 原始标注
pred_probs=preds, # shape: (N, num_classes, H, W) 模型预测概率
return_mask=True,
)
# 标出存疑区域交给医生复审,而非直接丢弃
cleaned_mask = mask.copy()
cleaned_mask[issues] = -1 # 设为 ignore index,跳过这些像素的损失计算
4. nnU-Net 作为自动预处理 baseline(2026 年仍首选)
nnU-Net(2021)是本文工程化落地的最强参照,它自动完成: - 体素间距归一化 - 动态patch采样 - 混合损失(Dice + CE) - 5-fold cross-validation 自动调参
# nnU-Net 推理(只需少量标注的模型,直接用 nnU-Net 自动流程)
# pip install nnunet
from nnunet.inference.predict import predict_from_folder
predict_from_folder(
model_folder='path/to/trained_model',
input_folder='path/to/test_images',
output_folder='path/to/output',
folds=[0, 1, 2, 3, 4], # 5-fold ensemble
mixed_precision=True, # 启用 FP16 加速
)
坑与避让
| 坑 | 说明 | 避让方式 |
|---|---|---|
| 弱监督与全监督的 Dice Gap 在不同任务差异极大 | 1–3% Dice 差是特定任务(息肉分割)的数字;脑肿瘤/BraTS 在 10% 标注下差距可达 10–15% | 项目启动前先在目标器官上实测 gap,不要套用其他器官的经验数字 |
| CAM 类方法对肿瘤等小目标召回率极低 | CAM 基于类别激活,弱目标(<5% 面积)的激活热图往往不可靠 | 对小目标/多目标场景,优先考虑 scribble/box 监督而非 image-level |
| 主动学习选出的样本可能含噪声标签 | 医生在紧迫时间压力下标注的样本质量可能反而更差 | 主动学习回来的标注需二次质控,而非直接加入训练集 |
| nnU-Net 对 3D 数据显存要求极高 | 全分辨率 3D U-Net 可能需要 40GB+ 显存,单卡无法训练 | 使用 3D Low Resolution 策略(先低分辨率收敛,再高分辨率微调)或分布式多卡 |
| 标签不一致问题比综述描述更严重 | 肿瘤边界在 CT 值上与正常组织无明显灰度差异,两位医生标注 Dice 可能只有 0.78 | 在评估指标时使用 Jaccard 而非 Dice(对边界不敏感),或直接报告 mIoU |
| 扩散模型(2022+)已大幅降低少样本门槛 | SAM、MedSAM、SegVol 等 zero/few-shot 分割模型可以不用训练直接分割新器官 | 拿到新任务先测试 SAM/MedSAM 是否已满足需求,再决定是否训练定制模型 |
核查结论
原解读对综述内容的方法学分类(scarce vs weak annotations,各子类技术)描述准确,伪代码流程合理,亮点/局限分析到位。主要需补充的核查点: 1. 综述数字来自子工作拼凑,不同任务的 Dice Gap 差异很大,不应将"1–3% 差"视为普适结论。 2. 2020 年后 ViT/扩散/SAM 系列对"弱监督少样本"问题带来了质的提升,读综述时应将其作为补充而非参照最新技术。 3. inter-rater variability 是被综述忽视但工程上无法绕开的现实约束,建议所有医学分割项目在数据建库阶段就做标注一致性评估。