想象你带着一队探险家去群岛寻宝。要让每座岛都出图,请专业测绘师把一草一木都量成精确地图——这就像医学影像的像素级标注,一张 CT 勾完病灶轮廓要耗掉医生半小时甚至更久。可如果换一种方式:你只需要知道“哪几座岛上有宝藏”(图像级标签),或者让向导在地图上随手画两道歪歪扭扭的 X(涂鸦标注),探险队立刻就能出发,省下巨额测绘费。弱监督医学分割做的正是这件事:它让 AI 学会“你给个大概,细节我自己描”。系统会先用图像级标签或涂鸦这种廉价信号当作“藏宝线索”,再靠 CAM 热力图反推病灶位置,用伪标签迭代越挖越准,最终把分割结果逼近全监督模型。本文会用这个“寻宝地图”的故事,带你完整走一遍从弱标注到精准分割的实战路线。

岗位关联

掌握弱监督分割,你就能在标注稀缺的医学场景里把数据成本砍掉大半,同时交付临床可用的分割模型——这是医学影像 AI 落地最值钱的核心技能之一。

目录
  1. 可视化演示
  2. 弱监督原理:少标注的底气从哪来
  3. CAM类方法:从“有没有”到“在哪里”
  4. 涂鸦式监督:随手两笔也能当标杆
  5. 伪标签迭代:自己教自己的循环
  6. 性能差距分析:差多少、补多少
  7. 标注成本优化:把好钢用在刀刃上
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

CAM类激活图 GAP加权特征图生成热力图 高激活区域定位病灶 CAM = Σ w_k · F_k(x,y) 图像级标签→像素级定位

弱监督原理:少标注的底气从哪来

探险队要出海寻宝,如果每座岛都要请测绘师画精确地图,三年也出不了航。但只要你肯换个思路——只标记“哪座岛有宝藏”,或者在地图上画个歪歪的 X——第二天就能扬帆。医学影像分割面临一模一样的抉择:像素级标注一个 CT 病灶轮廓,熟练医生也要 30 分钟起步,而图像级标签只需勾选“有无病灶”,1 秒搞定;涂鸦标注随手画两笔,10 秒收工。巨大的成本差,就是弱监督分割存在的理由。

那问题来了:这么粗糙的信号,模型凭什么能学会分割?底气来自两类先验。第一类是模型自己的结构先验:病灶在图像里往往是连续区域、边界相对光滑、与周围组织有纹理差异,这些规律不需要像素标注也能被网络学到。第二类是弱监督信号的“空间投影”能力:图像级标签虽然不说“在哪里”,但分类网络在判断“有病灶”时,内部特征图会不自觉地对病灶区域产生高响应,这响应稍加转化就成了位置线索;涂鸦标注则更直接,它等于告诉模型“这些像素确定是病灶”。

用一个统一视角看待弱监督学习:我们希望找到一组网络参数,使得模型在给定弱标注(图像级标签或涂鸦)上,预测结果与标注保持一致的期望风险最小。因为 Y 不是完整像素图,损失函数 L_weak 必须针对弱标注形式单独设计,这正是后几节要展开的 CAM、涂鸦损失和伪标签循环。

探险队带着“哪座岛有宝”的粗线索出发,模型带着“这张图有病灶”的粗标签训练——后面你会看到,这些粗线索如何一步步变成精细的藏宝图。

min⁡θ E(x,Y)∈D[Lweak(fθ(x),Y)]{\displaystyle \min_{\theta}\ \mathbb{E}_{(x,\mathcal{Y})\in\mathcal{D}}\left[\mathcal{L}_{\mathrm{weak}}\left(f_{\theta}(x),\mathcal{Y}\right)\right]}
这个式子是说:在弱监督数据分布上,让模型预测与弱标注的“落差”尽量小。弱标注越粗,损失函数越要靠技巧来“挤出”空间信息。
  1. 网络参数 θ模型的全部可学习参数,控制分割网络对图像的理解能力。
    θ\theta
  2. 输入图像 x一张医学影像,比如 CT 切片或病理图,是模型要“读”的藏宝岛照片。
    xx
  3. 弱标注 Y图像级标签(有/无病灶)或涂鸦标注,是医生给模型的“大概方向”,不是完整像素图。
    Y\mathcal{Y}
  4. 模型预测 f_θ(x)网络对每个像素输出一个概率,表示该像素属于病灶的可能性。
    fθ(x)f_{\theta}(x)
  5. 弱监督损失 L_weak根据弱标注设计的损失函数,用来把粗糙信号转成可训练的空间约束。
    Lweak\mathcal{L}_{\mathrm{weak}}

CAM类方法:从“有没有”到“在哪里”

藏宝图上只有一行字“东岛有宝”,探险队总不能把整座岛翻个底朝天。好在夜里起了月光,埋宝处的泥土颜色跟周围不一样,月光一照就格外显眼——CAM 类方法就是这样一束月光。它把“这张图有病灶”这个整图结论,反推成“哪里最像病灶”的空间热力图。

技术上看,分类网络在最后一层全局池化之前,保留着一组空间特征图 f_k,每一张特征图都记录了“某种图像模式出现在哪些位置”。最后分类层要为类别 c 打分,就需要给每个通道分配一个权重 w;这个权重恰好表达了“该通道对判断出 c 有多大贡献”。于是把权重乘回特征图、逐通道累加,就得到一张与输入图像空间对应的热力图。响应高的位置,就是模型眼中“这里像病灶”的证据区域。Grad-CAM 进一步用梯度近似权重,让该方法适用于任意结构的分类网络。

拿到热力图之后,设定阈值把高响应像素挑出来,就形成一块“伪区域”。这块区域可以作为初始种子,交给区域生长、条件随机场等后处理,也可以直接当作伪标签进入下一轮训练。需要注意:分类网络为了提升语义抽象能力,会反复下采样,热力图分辨率往往只有原图的十六分之一,边界相当模糊,小病灶可能弱响应消失——这是 CAM 天生的分辨率局限。

月光照亮了大致的埋宝范围,但光斑边缘始终有些朦胧。CAM 告诉我们“病灶大概在这片区域”,接下来涂鸦监督会把这束月光换成更结实的定位桩。

CAMc(x,y)=∑kwkc fk(x,y){\displaystyle \mathrm{CAM}_{c}(x,y)=\sum_{k} w_{k}^{c}\, f_{k}(x,y)}
简单说:把每个特征通道在位置 (x,y) 的响应值,用它对类别 c 的重要性加权加起来,就得到这一位置的“病灶亮度”。
  1. 位置坐标 (x,y)热力图上某个空间位置,对应原图的一块区域。
    (x,y)(x,y)
  2. 特征图响应 f_k(x,y)第 k 个通道在这个位置上的激活值,表示“模式 k 出现得多强烈”。
    fk(x,y)f_{k}(x,y)
  3. 分类权重 w_k^c第 k 个通道对判断“类别 c”的贡献大小,相当于每束月光对“照亮埋宝处”的贡献。
    wkcw_{k}^{c}
  4. 加权求和把各通道的响应按权重叠加,得到的和就是 CAM 热力值。
    ∑kwkc fk(x,y)\sum_{k} w_{k}^{c}\, f_{k}(x,y)

涂鸦式监督:随手两笔也能当标杆

向导盯着地图看了三秒,掏出炭笔“唰唰”画了两道:“宝藏就在这一片。”这两道线虽然粗糙,却瞬间把搜索范围从整座岛缩小到一小块——这就是涂鸦标注的威力:医生在病灶内部画一两笔(甚至一个十字),等于明确告诉模型“这些像素确定是病灶”。相比之下,CAM 还要靠模型自己猜,涂鸦则是直接钉下定位桩。

训练时,涂鸦监督的核心思想是“只对涂鸦覆盖的像素计算损失”。常规分割损失要求每个像素都有真值,但涂鸦场景下绝大部分像素没有标注。于是我们只求模型在医生画过的地方预测正确,剩下的像素交给平滑性正则——比如鼓励相邻像素预测一致、边界像素梯度小——让模型从“定位桩”出发,把整片病灶“织”出来。这就是区域扩散的雏形。

涂鸦损失写出来很简洁:对涂鸦像素集合 S 内的每个像素,计算模型预测与涂鸦真值的交叉熵,再取平均。这里的细节在于:损失只在 S 上计算,所以 S 的质量决定上限。医生如果画在病灶边缘或画到背景,模型会被“钉”在错误的地方;画在病灶内部但分散在不同部位,扩散效果最好。

两道炭笔在岛上钉下坐标,模型顺着坐标把整片埋宝地织出来。但光靠这一个桩还不够——下一节,模型要开始“自己当向导”了。

Lscribble=1∣S∣∑i∈Sℓ(pi, yi){\displaystyle \mathcal{L}_{\mathrm{scribble}}=\frac{1}{|\mathcal{S}|}\sum_{i\in\mathcal{S}} \ell\left(p_{i},\, y_{i}\right)}
这个公式的本质是“医生画到的点必须认账,没画到的点靠模型自己推理”。涂鸦越精准,模型被钉得越正,扩散出来的区域就越可靠。
  1. 涂鸦像素集合 S医生画过的所有像素的集合,是涂鸦地图上炭笔的痕迹。
    S\mathcal{S}
  2. 预测概率 p_i模型认为第 i 个像素是病灶的概率,初始时可能错得离谱。
    pip_{i}
  3. 涂鸦真值 y_i涂鸦给出的标签,1 表示病灶、0 表示背景,是“钉桩”的锚点。
    yiy_{i}
  4. 交叉熵损失 ℓ衡量预测与真值的差距,预测越偏离真值,损失越大。
    ℓ(pi, yi)\ell\left(p_{i},\, y_{i}\right)
  5. 归一化 1/|S|除以涂鸦像素总数,让损失不受“画了几笔”影响。
    1∣S∣\frac{1}{|\mathcal{S}|}

伪标签迭代:自己教自己的循环

探险队第一次按涂鸦挖下去,只挖到一小块区域。但挖出的土质和颜色给了新线索,向导据此修正地图,标出更大的可能范围,再挖一铲——每一轮都让地图更接近真实藏宝点。伪标签迭代就是模型版本的“越挖越准”:先用涂鸦或 CAM 训练一个粗糙模型,让这个模型去预测所有训练图像,把高置信度的预测结果当作新标签(伪标签),再用这批新标签训练下一个更强的模型。

第一步要生成“初始伪标签”。把涂鸦扩散后的区域或 CAM 热力图阈值化,就能得到第一版粗分割。第二步是自训练循环:当前模型对每张图输出像素级概率图,对每个像素取最大概率对应的类别作为候选伪标签,但只有最大概率超过阈值 τ 才被采纳。这个过滤动作极其关键——它防止模型把没把握的错误预测灌进下一轮训练。第三步是迭代:新模型在更完整的伪标签上训练,通常能比上一轮更准,于是能产出更好的伪标签,循环往复。

但“自己教自己”有个陷阱:如果模型在第一轮就对一个错误区域给出了高置信预测,这个错误会被当成“正确答案”进入下一轮,越滚越大,这就是确认偏差。工程上常用三招防偏:设置信度阈值 τ 并随迭代提高;用多次随机推理或蒙特卡洛 dropout 估计不确定性,把高不确定像素丢弃;留一小块干净的真实标注做验证,一旦发现验证集 Dice 下降就回退到上一轮。

每一轮挖掘都在反馈修正地图,挖错了就及时收手,挖对了就扩大范围——伪标签迭代的精髓,正是这种有纪律的自我强化。

y^i=arg⁡max⁡c pi(c)where max⁡cpi(c)>τ{\displaystyle \hat{y}_{i}=\arg\max_{c}\, p_{i}(c)\quad \text{where}\ \max_{c} p_{i}(c)>\tau}
翻译成人话:第 i 个像素,如果模型对它最有把握的那个类别都达不到阈值 τ,就干脆不采信;只有信心十足的预测才配成为伪标签。
  1. 像素概率 p_i(c)模型认为第 i 个像素属于类别 c 的概率,所有类别的概率和为 1。
    pi(c)p_{i}(c)
  2. 取最大概率类别 argmax挑出概率最高的那个类别,作为该像素的候选伪标签。
    arg⁡max⁡c pi(c)\arg\max_{c}\, p_{i}(c)
  3. 置信度阈值 τ只有当最大概率超过 τ 时,这个候选伪标签才被采纳,否则丢弃。
    max⁡cpi(c)>τ\max_{c} p_{i}(c)>\tau

性能差距分析:差多少、补多少

歪歪扭扭的 X 地图和精确测绘之间到底差多远?不量不知道。医学分割最常用的尺子是 Dice 相似系数:预测区域与真实区域的像素重叠程度。全监督分割在标准数据集上通常能到 0.90 以上;涂鸦监督一般落在 0.82~0.88;纯图像级标签走 CAM+伪标签路线,大约 0.70~0.80。数字告诉我们的第一件事:少标注确实有代价,但并没有坍塌到“不能用的程度”。

差距具体长在哪里?主要是三种误差模式。一是边缘模糊:弱监督的扩散机制对边界的精确感差,预测轮廓往往比真实边界肥大或收缩;二是小病灶漏检:只有几个像素的小病灶在 CAM 热力图里响应太弱,阈值化时直接被冲掉;三是低对比度区域:病灶与周围组织灰度接近时,弱监督缺乏像素级压力,容易把正常组织误判进去。明白了误差的位置,也就知道了要补什么。

缩小差距的主流策略是混合训练:主体用大量弱标注数据,再掺入一小部分(比如 1%~5%)全监督样本。全监督像素让模型学到锐利边界,弱监督数据则提供丰富的形态多样性,两者配合往往能把 Dice 从 0.82 拉到 0.88 左右。另一种思路是模型集成:训练多个弱监督模型,对预测做投票融合,可以平滑掉单模型的边界噪声。

量出地图与真实之间的缝有多宽,探险队才知道该往哪个方向补测绘。缝合差距的方法有了,下一个问题更现实:预算有限,怎么花最值?

Dice=2∣A∩B∣∣A∣+∣B∣{\displaystyle \mathrm{Dice}=\frac{2|A\cap B|}{|A|+|B|}}
Dice 的直观含义:预测和真实两个区域的重叠度。完全重合是 1,完全错开是 0,它不关心“非病灶区域”的冗余,只关心病灶切得准不准。
  1. 预测区域 A模型输出的分割结果,也就是“模型认为的病灶范围”。
    AA
  2. 真实区域 B医生标注的病灶范围,是评估用的标准答案。
    BB
  3. 重叠像素 |A∩B|两个区域重合的像素数量,是“切中了多少”。
    ∣A∩B∣|A\cap B|
  4. 面积之和 |A|+|B|两个区域的像素总数,用来归一化,分子乘以 2 保证满分是 1。
    ∣A∣+∣B∣|A|+|B|

标注成本优化:把好钢用在刀刃上

探险队的经费不可能永远无限。与其每座岛都派测绘师,不如先让斥候——一个便宜的弱监督模型——跑遍所有岛,把“大概率埋宝”和“比较可疑”的区域圈出来;再把最贵、最难的几座岛交给专业测绘队。这就是主动学习的思路:让模型自己指出“我哪里没把握”,人工只补那些最有价值的样本。

落到医学影像工作流,一个典型的成本优化流程长这样:第一轮,用图像级标签或涂鸦把模型快速训练到“能用”;第二轮,模型对未标注数据预测,同时输出置信度或不确定性,把最难的 10% 病例挑出来交医生做像素级精标;第三轮,用混合数据重新训练,再挑更难的下一次标注。每一轮标注预算都花在“模型最薄弱”的地方,单位预算换回的精度提升远高于随机挑样。

要做这个决策,心里得有本成本账。把三种标注形式的单位成本和数量记下来,总成本是一笔线性账。像素级标注虽然贵,但只要 30 例就能让模型从“大概齐”跨过临床门槛;涂鸦便宜,适合大规模铺基础数据;图像级标签最便宜,适合撑起数据多样性。配比得当,总预算不变,Dice 最高。

把好钢用在刀刃上,探险队用最少的测绘费挖到了绝大部分宝藏。弱监督分割的工程哲学,正是这样一笔精打细算的成本账。

Cost=cpixelNpixel+cscribbleNscribble+cimageNimage{\displaystyle \mathrm{Cost}=c_{\mathrm{pixel}}N_{\mathrm{pixel}}+c_{\mathrm{scribble}}N_{\mathrm{scribble}}+c_{\mathrm{image}}N_{\mathrm{image}}}
成本账的本质:不同标注形式有不同单价,你要决定“各买多少”。主动学习就是帮你回答“该买哪种、买多少”的智能采购员。
  1. 像素级单价 c_pixel每个像素级标注样本的成本,包括医生画轮廓的时间和核验时间。
    cpixelc_{\mathrm{pixel}}
  2. 像素级样本数 N_pixel需要使用全监督标注的样本数量,通常占比很小。
    NpixelN_{\mathrm{pixel}}
  3. 涂鸦单价与数量 c_scribble、N_scribble涂鸦标注的成本和数量,是中间层的主力。
    cscribbleNscribblec_{\mathrm{scribble}}N_{\mathrm{scribble}}
  4. 图像级标签成本 与 数量 c_image、N_image最廉价的标注形式,用来铺量撑起多样性。
    cimageNimagec_{\mathrm{image}}N_{\mathrm{image}}

AI 应用场景

肺结节低标注筛查系统

阶段:数据准备与模型训练

解决的问题:医院影像科积累了海量胸部 CT,但只有旧报告里“右肺上叶见磨玻璃结节”这类文字描述,没有像素级勾画。传统做法要么花几十万请第三方公司补标注,要么让这些宝贵数据沉睡。弱监督分割让模型直接消费“图像级标签”——把报告有无结节转为标签,就能训练出能定位结节的初筛模型。

具体案例:某三甲医院用 5000 例带报告但无勾画的 CT 训练分割模型。系统先用报告标签 + CAM 生成结节热力图,自动把“疑似区域”高亮弹出,医生只需复核高亮框并轻点确认或修正。补标注量从 5000 例降到 300 例,初筛模型 Dice 达到 0.79,配合少量精标后提升到 0.86。

病理切片涂鸦标注工作台

阶段:交互式数据标注与迭代

解决的问题:病理医生在千兆像素的全切片图像上精确勾画肿瘤区域通常要 1~2 小时,人工成本极高。涂鸦监督允许医生在放大视野里随手画两三笔,模型自动扩散出整片候选癌变区域,医生只需在扩散结果的边缘做小幅修正。

具体案例:一家病理 AI 公司为结直肠癌免疫浸润分析构建训练集。病理医生用涂鸦工具标注 200 张切片,每张平均耗时 25 秒,区域扩散算法直接生成预分割结果,医生只修正高风险边界,整体标注时间缩短到原来的 1/15,最终模型 Dice 0.84。

主动学习驱动的低成本模型迭代

阶段:模型迭代与临床上线

解决的问题:弱监督模型跑完第一轮后,哪些样本最值得花钱精标?凭感觉选会浪费预算。主动学习让模型输出预测不确定性,把“模型最没把握”的样本自动挑出来优先送人工精标,每一分标注费都花在刀刃上。

具体案例:某胰腺分割项目采用“涂鸦弱监督 + 主动学习”三轮迭代:第一轮用 100 张涂鸦图训练,Dice 0.72;模型挑出 30 张最不确定样本补像素级标注,第二轮 Dice 升到 0.82;再补 30 张,第三轮达 0.86,逼近全监督 0.88。总标注时间只有全监督方案的两成。

Python 演示

python62 行
import numpy as np def simulate_lesion(size=64, seed=42):    """生成一个模拟病灶高斯斑块,作为真实分割目标."""    rng = np.random.RandomState(seed)    cx = rng.uniform(size * 0.3, size * 0.7)    cy = rng.uniform(size * 0.3, size * 0.7)    sigma = rng.uniform(size * 0.06, size * 0.12)    xx, yy = np.meshgrid(np.arange(size), np.arange(size))    gt = np.exp(-((xx - cx) ** 2 + (yy - cy) ** 2) / (2 * sigma ** 2))    return (gt > 0.4).astype(np.int32) def draw_scribble(gt, radius=2):    """医生随手在病灶中心画一个十字涂鸦."""    ys, xs = np.where(gt == 1)    cx = int(round(xs.mean()))    cy = int(round(ys.mean()))    s = np.zeros_like(gt)    s[cy - radius:cy + radius + 1, cx] = 1    s[cy, cx - radius:cx + radius + 1] = 1    return s def distance_to_scribble(scribble):    """计算每个像素到涂鸦的最短距离(区域扩散的雏形)."""    ys, xs = np.where(scribble == 1)    xx, yy = np.meshgrid(np.arange(scribble.shape[1]),                         np.arange(scribble.shape[0]))    best = np.full(scribble.shape, np.inf)    for sx, sy in zip(xs, ys):        best = np.minimum(best, (xx - sx) ** 2 + (yy - sy) ** 2)    return np.sqrt(best) def refine_pseudo_labels(dmap, gt, threshold=9.0):    """伪标签迭代:距离扩散->高斯拟合->二次预测,逐步逼近真实形状."""    pseudo = (dmap < threshold).astype(np.int32)    for _ in range(3):        ys, xs = np.where(pseudo == 1)        if len(xs) < 5:            break        mean = np.array([ys.mean(), xs.mean()])        cov = np.cov(np.stack([ys, xs])) + np.eye(2) * 1e-3        inv_cov = np.linalg.inv(cov)        xx, yy = np.meshgrid(np.arange(gt.shape[1]), np.arange(gt.shape[0]))        diff = np.stack([yy - mean[0], xx - mean[1]], axis=-1)        mahal = np.einsum("...i,ij,...j->...", diff, inv_cov, diff)        pseudo = (mahal < 4.5).astype(np.int32)    return pseudo def dice(a, b):    """Dice 相似系数:两区域重叠程度."""    inter = np.sum((a == 1) & (b == 1))    return 2.0 * inter / (np.sum(a == 1) + np.sum(b == 1) + 1e-8) if __name__ == "__main__":    gt = simulate_lesion()    scribble = draw_scribble(gt)    dmap = distance_to_scribble(scribble)    pseudo = refine_pseudo_labels(dmap, gt)    print("涂鸦初始 Dice: %.3f" % dice(scribble, gt))    print("迭代伪标签 Dice: %.3f" % dice(pseudo, gt))    print("需要人工修正的像素占比: %.1f%%" %          (100.0 * np.sum((scribble == 0) & (gt == 1)) / gt.size))
目的:用 64×64 模拟病灶完整走一遍“涂鸦→距离扩散→伪标签高斯拟合迭代”的弱监督分割流水线,直观看到 Dice 从涂鸦到迭代后的提升。
  1. gt = simulate_lesion()生成一个模拟病灶作为“真实藏宝图”,供后续计算 Dice 评估精度。
  2. s = np.zeros_like(gt)创建一张空白涂鸦画布,相当于医生还没下笔时的地图。
  3. best = np.minimum(best, (xx - sx) ** 2 + (yy - sy) ** 2)计算每个像素到涂鸦的最近距离,这是从涂鸦“扩散出去”的第一铲。
  4. cov = np.cov(np.stack([ys, xs])) + np.eye(2) * 1e-3对当前伪标签作二维高斯拟合,估计病灶的大致形状和朝向。
  5. mahal = np.einsum("...i,ij,...j->...", diff, inv_cov, diff)马氏距离,衡量每个像素相对当前病灶形状模型的偏离程度。
  6. pseudo = (mahal < 4.5).astype(np.int32)生成新一轮伪标签:离拟合形状中心近才认为是病灶,越迭代越接近真实形状。
  7. dice = 2.0 * inter / (np.sum(a == 1) + np.sum(b == 1) + 1e-8)直接实现 Dice 公式,评估伪标签与真实分割的重合度。

常见误区

误区图像级标签只告诉我“这张图有没有病灶”,连病灶长在哪都不知道,模型怎么可能做分割?这个方向根本行不通。

正解分类网络在输出“有病灶”这个结论时,内部特征图早已对病灶区域产生了空间响应。CAM/Grad-CAM 把分类权重投影回特征图,就能得到一张热力定位图——就像向导只说了“岛上有宝”,但月光会把埋宝处的泥土照得更亮。热力图阈值化后配合区域生长,就能变成可用的分割种子。图像级标签确实不直接给位置,但模型内部表征可以“反榨”出位置。

为何常见:人们容易把“标签形式”和“模型内部表征”混为一谈,忽略了深度特征图天然携带空间信息这个事实。

误区涂鸦又快又便宜,我在病灶上密密麻麻画满线,模型不就能学到更多信息吗?画在哪里应该不重要。

正解涂鸦画在病灶内部才有正收益,画在背景或边缘会把“边界=病灶”的错误信号喂给模型,扩散时整个区域都会跑偏。而且多次划过同一区域不会增加信息量。好涂鸦的策略是分散在病灶不同部位、每笔覆盖一点内部,让扩散算法有足够多的锚点。

为何常见:把标注数量等同于信息量,忽略了空间分布对扩散约束的决定性影响。

误区自训练循环不是越训越强吗?多迭代几轮,伪标签应该一轮比一轮准,Dice 一路涨到和全监督一样。

正解伪标签是模型自己生成的,一旦某个错误区域获得高置信预测,这个错误就会像“回声”一样进入下一轮训练并被放大,这叫确认偏差。工程上必须设置信度阈值并逐步提高、用不确定性估计丢弃可疑像素、保留一小块干净标注做验证集,发现 Dice 下降就回退到上一轮。迭代不是免费的午餐,而是有纪律的自我修正。

为何常见:直觉上“自己教自己”会越来越强,忘记了没有外部纠错信号时,错误会自我增强而非自我修正。

误区既然标题说“少标注也能切得准”,那干脆省掉全部像素级标注,只用涂鸦和整图标签训练,全监督可以彻底淘汰。

正解弱监督在病灶边缘、小病灶、低对比度区域仍然明显弱于全监督,纯图像级标签路线通常要低 10~15 个 Dice 点。现实中最有效的方案是金字塔式混合:大量弱标注铺多样性 + 少量像素级标注定边界 + 主动学习挑难例。弱监督是“帮你省钱逼近精度”的手段,不是“替代人”的魔法。

为何常见:宣传语天然强调“省”而弱化“代价”,让人忽略了少标注不等于零标注,弱监督的真实定位是成本优化而非精度天花板。

误区涂鸦 10 秒、像素标注 30 分钟,差了 180 倍,所以弱监督方案的总成本优势就是 180 倍。

正解画轮廓只是标注流程的一部分。医生还要打开软件、加载影像、观察判断、保存结果,后续还要质检、修正、和模型预测结果核对。弱监督省下的是“画轮廓”环节,但“读图判断”的医生时间一滴都不会少。综合算下来,涂鸦方案实际节省约 5~10 倍而非 180 倍,只有把完整工作流成本建模,才能做出正确的预算决策。

为何常见:只盯单步操作耗时,忽略了医学工作流里大量隐性的观察、判断、核验环节。

面试题

Q1. 关于 CAM 的核心思想,下列说法正确的是?

单选题 · easy

  • A.沿梯度反向传播更新所有特征图参数
  • B.分类权重加回流回特征图定位病灶区域← 正确答案
  • C.对训练图像做随机裁剪来增强数据多样性
  • D.用生成对抗网络合成额外的训练样本

答案:B。CAM 的出发点是把分类网络学到“有没有病灶”的信息,通过分类权重 w 加权回流到空间特征图上,生成热力图。它不是在更新梯度,也不是数据增强或生成模型。就像月光照亮埋宝处,权重回流指向病灶所在区域。

Q2. 弱监督分割中“图像级标签”指的是?

单选题 · easy

  • A.图像中每个像素都进行精细标注
  • B.整张图只标注存在哪些类别← 正确答案
  • C.需要画出物体的完整轮廓边界
  • D.用自然语言描述图像的详细内容

答案:B。图像级标签就是“这张图有没有病灶”这种整图层面的信息,不提供任何像素位置。它是最便宜的标注形式,需要 CAM 等手段把“有无”信号转化成空间位置线索。

Q3. 涂鸦监督相比图像级标签的主要优势是什么?

单选题 · mid

  • A.完全不需要医生做任何参与
  • B.提供局部位置先验利于学习边界← 正确答案
  • C.自动生成无限的医学训练数据
  • D.分割精度必定超过全监督方法

答案:B。涂鸦直接画在病灶内部,等于给了模型“这些像素确定是病灶”的局部先验,比图像级标签“有病灶”包含更多空间锚定信息。但它仍需要医生参与,也不会自动生成数据或超越全监督。

Q4. 伪标签迭代中置信度阈值 τ 的作用是什么?

单选题 · mid

  • A.控制模型训练时的学习率高低
  • B.过滤低置信预测避免错误积累← 正确答案
  • C.决定医学图像输入分辨率大小
  • D.调整卷积神经网络的层数多少

答案:B。阈值 τ 规定只有模型最大预测概率超过它的像素才被当作伪标签。这一步专门防止低置信、可能错误的预测进入下一轮训练自我强化。它和学习率、分辨率、网络结构无关。

Q5. CAM 热力图分辨率低、边界模糊的根本原因是?

单选题 · hard

  • A.分类网络中间层逐级下采样丢失细节← 正确答案
  • B.训练数据量太小导致模型不收敛
  • C.损失函数选择不当造成梯度消失
  • D.GPU 显存不足被迫削减模型容量

答案:A。CAM 通常作用在分类网络最后一个卷积层上,而分类网络为了语义抽象会做多次池化和步长卷积,特征图分辨率往往只有输入的 1/16 甚至更低,细节早已丢失。这与数据量、损失函数、显存无关。

Q6. 医学图像分割中最常用的评估指标是?

单选题 · easy

  • A.Dice 相似系数衡量预测与真值重合度← 正确答案
  • B.BLEU 分数用于评估文本生成质量
  • C.困惑度常用于语言模型的评估指标
  • D.均方误差适合图像重建效果评估

答案:A。Dice 通过计算两个区域的重叠像素与面积和的比值来衡量分割重合度,是医学分割论文的标配指标。BLEU 和困惑度属于 NLP,均方误差更适合重建类任务而非分割。

Q7. 主动学习在弱监督分割工作流中的核心作用是?

单选题 · mid

  • A.挑高置信样本用于扩充训练数据
  • B.挑低置信难例优先交人工标注← 正确答案
  • C.压缩模型体积以降低推理开销
  • D.加速网络推理速度减少延迟时间

答案:B。主动学习让模型输出不确定性,自动挑出“最没把握”的样本优先送人工精标,让每份标注预算换来最大精度提升。高置信样本模型已经会了,不需要人重复教;压缩模型和加速推理是另一码事。

Q8. 下列哪些标注形式属于弱监督分割的范畴?

多选题 · easy

  • A.图像级标签(整图有无病灶)← 正确答案
  • B.涂鸦标注(病灶区域随手画两笔)← 正确答案
  • C.逐像素精细描边(每个点都标注)
  • D.边界框标注(框出病灶大致范围)← 正确答案

答案:ABD。弱监督泛指不提供精确像素级标注的信号:图像级标签、涂鸦、边界框、点标注都属于。逐像素精细描边是强监督(全监督),与弱监督形成对照。

Q9. 伪标签迭代过程中可能出现的典型问题有哪些?

多选题 · mid

  • A.错误预测被当成标签进入下一轮训练← 正确答案
  • B.模型对错误的高置信预测过度自信← 正确答案
  • C.伪标签区域在病灶边界处逐渐漂移← 正确答案
  • D.迭代次数增加 Dice 必然持续提升

答案:ABC。确认偏差会导致 A,高置信不等于高准确导致 B,形状漂移导致 C。D 是错误认知——缺乏外部纠错时错误会自我增强,Dice 可能下降而不是必然上升。

Q10. 关于弱监督分割与全监督分割的性能差距,说法正确的有哪些?

多选题 · hard

  • A.弱监督分割在病灶边缘通常更粗糙← 正确答案
  • B.弱监督对小病灶检出率往往下降← 正确答案
  • C.混合少量全监督可显著缩小差距← 正确答案
  • D.弱监督在任意场景下都优于全监督

答案:ABC。弱监督缺少数百万量级的像素级压力,边缘模糊和小病灶漏检是两大典型误差;少量全监督样本能提供边界先验,显著弥合差距。D 显然不对,弱监督的目标是逼近而非超越全监督。