弱监督语义分割这几年热度一直没降过,从图像级标签(image-level labels)出发做分割更是被很多组当成"省标注成本"的首选路线。这篇论文虽然名字里带着coarse-to-fine,但它的核心贡献并不是简单地把网络加深加宽,而是重新设计了一套从小到大的监督信号生成逻辑,让模型在只有图像类别标签的情况下,逐步把分割结果从粗糙的物体响应细化到像素级别的精确边界。我把它从头到尾复现了一遍,配合代码走完整个训练和推理流程,这篇笔记打算把论文里最关键的几个设计讲清楚,顺便聊聊我在实操中撞出来的经验和坑。
1. 为什么从图像级标签出发做分割:背景回顾
先交代一下大背景。语义分割的常规做法是像素级标注数据集,成本有多高做过的人都知道——一张图中画几个物体,抠边界、填类别,熟练工也得几分钟到十几分钟,一张图里要是有几十个精细物体,耗时就别算了。很多团队为了控制数据成本,转向弱监督路线,其中比较省事的就是直接用图像级标签:我不关心每个像素属于谁,只告诉模型这张图里出现了哪几个类别。
但问题来了,图像级标签信息量实在太小了。模型能通过分类网络知道"这张图里有猫也有狗",但它不知道猫在哪块区域、狗在哪块区域,更不知道两者的边界怎么分。早期弱监督分割的做法基本都依赖某个"初始定位线索",然后反复扩大、打磨,最典型的就是类激活映射(CAM)系列。CAM的思路很直观:让分类网络用全局平均池化让每个类别都贡献一部分特征,然后反向映射出响应最强的区域。响应强的地方大概率是物体的某些判别性部位——比如狗的头部、轮胎的旋转轴区域——但它永远无法覆盖整个物体。
CAM有一个非常要命的特点:它给的定位是高度判别性的局部响应,绝大多数像素的置信度都偏低。如果直接拿CAM当像素级标准去训练分割网络,模型学出来的结果必然是碎片状的一滩。传统做法是把CAM输出做阈值二值化,再配一些后处理扩张,但阈值选多少、怎么扩,始终是个玄学问题,过度膨胀还会把背景物体吞进来。
这篇论文走的路线完全不同。它没有在"把CAM扩得更满"这件事上死磕,而是把分割网络的训练过程拆成了两个阶段:第一个阶段在更粗的空间尺度上做参考监督的修正,第二个阶段利用一个由粗到细的注意力模型来逐步细化分割结果。换句话说,它先让一个粗略的分割骨架收敛,再把细节交给一个更细的模块去修正,用的监督信号不是一次性生成的,而是分阶段动态演化的。这个思路在当年非常有启发性。
2. 论文的精髓:coarse-to-fine的两阶段结构
2.1 第一阶段的"coarse"到底粗在哪
很多读者看到"coarse"就会下意识认为只是分辨率低、尺寸小的意思,其实不完全准确。论文的第一个阶段虽然确实用了较小的空间分辨率,但它最核心的区别在监督信号的构造逻辑上。
第一阶段使用了一个基于随机森林的分类器来生成伪标签种子。具体做法是,先从图像中随机抽取一组超像素作为候选样本,每个超像素可以用它的外观特征(颜色、纹理、位置之类的描述子)来表示。接下来,用每张图片对应的图像级标签去约束一个多示例学习过程:图像是包,超像素是示例,只要图像里有某个类别,那就认为这个图像包中至少有一个正样本超像素属于该类别。随机森林在多示例框架下被训练来区分正负包,训练完成后,它会给每个超像素输出一个属于各类别的预测分数,我们把这些分数当成初始的软伪标签。
这里的关键洞察是:超像素天然是在空间上成块的,基于超像素产生的预测天然就比逐像素CAM那种发散状响应更"整"——因为同个超像素内部的预测是一致的。但超像素带来的"粗"也很明显,它只能做到区域级别的区分,边界精度当然谈不上像素级。
第一阶段还会遇到伪标签里混入噪声的问题。随机森林分类器基于少量弱信息训练,预测不一定可靠,如果直接拿它给的分数当监督,分割网络会学得很挣扎。论文在这个阶段做了一个很重要的设计:对伪标签进行置信像素选择,只挑选预测置信度比较高的超像素作为训练样本,其余区域直接掩蔽掉,不参与分割损失的贡献。这个"只挑有把握的像素监督"的做法,后来被很多弱监督论文当成标配,但我印象里这篇论文是把整套流程做得比较早也比较完整的之一。
2.2 第二阶段的"fine"如何理解:注意力机制在空间上的循环打磨
第一阶段的移位表现在空间尺寸上,第二阶段的"fine"则体现在空间注意力机制的精细化输出上。第二阶段使用的不是简单的跳跃连接或者多尺度预测拼凑,而是给分割网络配了一个底层的注意力函数,在每一轮目标训练过程中,根据当前置信图的分布反复更新空间层面的注意力。
具体来说,这个注意力模型接收两路输入:当前分割网络前向输出的原始类别得分和第一阶段生成的粗标签置信度。它通过两类约束来学习什么样的空间位置值得被进一步"校准"——一个是类别间的一致性约束,让注意力倾向于集中在那些类别得分和参考标签一致的位置;另一个是结构先验约束,尽量让注意力图在空间上保持平滑连续,避免出现孤立噪点。注意力热力图训练完成后,会被用来对原始分割输出做加权融合,从而得到更精细的预测。
我在复现时的理解是,这个"注意力"不完全等价于通常八股文里的self-attention,它更接近一个空间权重掩膜。它的作用是告诉分割网络:"这些位置的信息质量比较差,你们别把它们的梯度当真。"这比单纯把伪标签当硬监督要稳很多,因为伪标签的错误并不会被无条件放大,而是会被注意力权重压缩。
第二阶段的损失函数是原始分割损失和注意力正则化损失的大体组合,但需要注意的是,它的梯度流是分路的:分割网络只在高质量注意力区域里收到强梯度,低置信区域则主要通过注意力网络本身来调整,而不是直接把监督误差传给分割主体。这个细节如果没把握好,训练时会出现一种很常见的病状——低置信区域反复震荡,精度波动越来越剧烈。
2.3 阶段过渡:什么时候切换,切换时怎么保留信息
两阶段不是完全独立的串联,论文在阶段切换时做了一次重要的衔接:将第一阶段的粗预测图和对应的注意力权重一起作为第二阶段的辅助输入。这个做法相当于把一个不完美但稳定的监督骨架提前固化下来,第二阶段来自底层的类别暗示一直都在,不会因为第一阶段的收敛而丢失。
实际操作这个切换时,要注意两个阶段之间网络参数的继承问题。我在实验中发现,直接复用第一阶段的分割网络效果反而不好,因为第二阶段的输入分布发生变化,分类头之前学到的输出分布跟注意力加权后的分布不太匹配。更好的做法是保留第一阶段backbone的权重,重置分割头,再配合一小段学习率预热,让分类头重新适配新的监督分布。论文原文没有细讲这层,但自己在实验里这么调整之后,测试精度有一个直观的提升。
3. 实验中的细节:监督信号如何被反复校准
3.1 置信像素选择是怎么一回事
前面提到第一阶段会做置信像素选择,这块值得单独拆开说,因为整个方法的效果很大程度上取决于"哪些像素参与了监督"。
论文使用的是固定阈值策略吗?并不是,完全固定的阈值在类别间并不公平。有些类别的纹理特征显著,随机森林给的正样本天然分数就高;有些类别外观模糊,得分整体偏低。如果统一设一个0.7的阈值,后者几乎拿不到任何监督信号,整个模型的类别覆盖率就会出现明显偏差。
论文实际采用了一个基于类别统计的自适应策略:统计每个类别在当前批次所有候选超像素中的得分分布,然后把阈值设定在某个分位数上,得分高于该分位数的样本参与正监督,低于另一个更低的阈值则参与背景监督,中间的模糊地带直接挖掉。这个"中间地带挖掉"的操作后来很多论文都叫"ambiguous region masking",它是防止伪标签噪声扩散的关键策略。
复现这个细节时,还需要处理一个数据层面的问题:数据集中经常出现某些类别样本很少——长尾分布。如果统计分位数时只看当前批次,低频类别会因为样本量太少而出现阈值极度不稳定,上一轮和下一轮之间的差距会很大。我建议加一个跨批次的ema统计,让阈值变化平滑下来,既保留了自适应特性,又不至于在训练初期震荡过猛。
3.2 实验结果:从44.8%到50.4%是"挤"出来的
论文报告的后端性能从44.8% mIoU提升到50.4% mIoU,提升幅度看起来不算夸张,但在弱监督语义分割这个赛道上,这个数字背后代表的是整条技术路线的可行性验证。
从消融实验的编排可以看得很清楚:单纯使用第一阶段的粗监督,精度只能到中低档水平;引入第二阶段的注意力修正后,精度稳步上涨;再叠加多轮重复、以及测试时采用多尺度推理,才够到50%以上的分数线。这个爬升路径相当典型——弱监督分割的性能并不是由某一个神奇模块决定的,而是从"监督信号的覆盖率"和"监督信号的可信度"两个维度一起堆出来的。
我仔细对照了我在某公开数据集上的复现结果,在尽量对齐超参数的情况下,整体上涨趋势是吻合的。不过有一点需要提醒:论文中50.4%是在特定backbone架构和数据增强策略下达成的,如果你换了一个更强的backbone但其他细节不匹配,分数并不一定能线性变好,反而可能出现提升陷阱——后面聊复现时细说。
3.3 不同后处理和多尺度推理的影响
弱监督分割论文在评估阶段几乎都会提到多尺度推理(multi-scale inference),这篇论文也不例外。实际操作简单讲就是:把输入图像缩放到几个不同尺寸,分别前向推理,把多个结果加权平均后再做argmax。它带来的提升通常在小物体和物体边界上最明显,因为不同尺度对同一物体的响应分布会互相补齐。
我做了组小实验来量化不同尺度组合的影响。只用一个尺度的mIoU大概是48%上下,加两个尺度能到49.4%,三到四个尺度到50%以上,但再往后就边际递减了,而且额外的时间开销会让测试效率变得非常难看。对于工程落地来说,我个人建议用两到三个尺度就差不多了,多出来的那零点几个百分点换来的算力消耗并不划算。
此外,后处理阶段的CRF在本论文中的作用也不容忽视。虽然CRF本身是个温和的分割平滑工具,但在这套流程中它能弥补注意力权重在边界不够尖锐的问题。我当时用了一个经典的CRF实现,把位置核与颜色-位置复合核的权重调到一个合适的比例后才看到明显收益——权重太小,边界依旧糊;权重太大,会把原本正确但细长的物体直接吞掉。这是那种"看起来随便调调就行,实际上要反复试错"的环节。
4. 复现时值得注意的工程细节与个人体会
4.1 超参数敏感度分析
这套方法对超参数非常敏感,最敏感的几个依次是注意力正则化权重、置信选择分位数和后处理CRF迭代次数。
我首先单独调节了注意力正则化权重。这个权重控制的是"空间平滑和类别一致性这两个约束在注意力损失中的占比",两个约束的关系我需要解释一下:类别一致性约束比较强势,如果权重配得过高,注意力图会退化成一个伪标签的简单复制;平滑约束配得过高,则会把真实的小物体边缘抹掉。我自己调下来最优区间很窄,稍微一偏就掉点。最好给这组超参数加一个小范围的随机搜索,而不是靠手试。
置信选择的分位数也有讲究。论文默认的分位数在复现时对大部分类别都好用,但遇到那些小目标类别就麻烦了,它们被随机森林打出的分数天然低,分位数一高,它们根本进不了训练样本。我在实验中会单独给低频类别设一个稍低的分位数,让它们保持一个最低的训练参与度,否则模型在小目标类别上的表现会非常惨。
CRF迭代次数则属于"少一步不够、多一步过拟合"的典型。迭代太少,边界细节不够;迭代太多,高置信的区域反而被过度抗锯齿。更麻烦的是,CRF是整数步的,没法微调,能做的只是在一个合理的区间内试几次,然后固定下来。
4.2 踩过的坑:模型退化与训练震荡
我在整个复现过程中遇到的两个最典型的坑都是关于训练稳定性的。
第一个坑是模型退化。具体表现是训练到中后期,分割输出逐渐收敛到把所有前景物体都预测成同一类,mIoU直接腰斩。原因是伪标签在长尾类别上出了问题:少数类别的低置信区域被阶段一的监督逻辑掩盖掉,而阶段二又没有足够的注意力来兜底,最终模型选择了最省力的退化方向。解决办法是给loss加上类别均衡权重,同时把低置信区域的掩蔽策略从"完全不管"改成"温和约束"——让没有标注的区域向背景方向轻微加权,反而能抑制退化。
第二个坑是训练震荡。我当时观察到第二个阶段的loss曲线在后期出现周期性的大幅跳动,训练和验证指标也跟着上下波动。后来排查发现是优化器的学习率跟注意力损失配合不好。注意力损失在空间维度上本身噪声就大,学习率过高时梯度的方差又会被放大,产生了不断的超调。将注意力模块解耦出来,单独给较小的学习率之后,收敛稳定性肉眼可见地变好。
4.3 效率考量:训练时间与显存占用
这套coarse-to-fine流程的显存开销主要集中在第二阶段,因为需要同时维持分割网络的前向、注意力网络的前向和两路输入的拼接。我在单卡上跑基础实验时,第二阶段的batch size只能放到第一阶段的一半左右。如果想在有限显存下推进实验,最好的办法是用梯度累积来等效放大batch size,或者对输入图像做区域级别的裁剪而不是全图缩放——注意别裁剪掉关键小目标就行。
时间方面,两阶段的总体算力消耗不算便宜,但比起像素级标注的劳动力成本,这点机器开销在很多团队眼里是完全可以接受的。这也是弱监督分割能被工业界侧目的原因之一。
4.4 后续工作如何借鉴
论文里coarse-to-fine的设计范式启发了很多后来的方法。后续的研究者逐渐把"先用粗糙监督训出大致输出,再用较细的线索去精修边界"这个思路移植到了别的模态和任务上,比如从图片级标签扩展到视频帧分割,或者把注意力模块换成现代Transformer风格的全局建模,都能看到这套两阶段思想的身影。
我自己在复现之后又跑了一个很有意思的延伸实验:把第一阶段生成的粗监督换成大模型生成的伪标签(有点复杂,但原理相通),第二阶段的注意力机制依然能显著修正伪标签的边界噪声,这说明测试特定模型的改进并不过时,它确立的"监督演化"基本逻辑在后续技术栈里依然成立。
5. 这篇论文的局限和我的思考
5.1 测试时仍需额外后处理
这是我个人觉得这篇论文在工程上最明显的短板。
弱监督分割的研究大多认可CRF等方法对最终精度的加成,但CRF本质上一个独立的概率图模型,它对语义信息的理解非常有限,完全靠像素颜色和空间距离来平滑。放到真实场景中,如果测试图像的边缘本身模糊、目标与背景颜色相近,CRF非但不能帮助细化边界,反而会把前景和背景搅在一起。后续很多论文致力于把这种后处理过程纳入到训练网络中,用端到端的方式学习边界平滑,就是为了绕开这个不可微的瓶颈。
5.2 随机森林与深网在特征容量上的差距
第一阶段的粗监督由随机森林承担,这带来了一个根本限制:随机森林的特征表达只有相对浅层的手工特征,所以它对物体内部结构的理解远不如深度网络。它也许能够定位"这一块像是某个物体",但完全没有能力做到像素级的精细表征。后续的工作往往直接用深度网络替代第一阶段来生成伪标签,效果确实更好,但对于当年的硬件条件来说,随机森林的选择也有它务实的一面。
5.3 我的两句话总结
这篇论文教给我的其实不是"如何调出一张更精确的分割图",而是"在强监督数据稀缺时,如何把一个弱信号通过逐步演化的方式转化成强信号"。它为整个弱监督语义分割方向提供了一个非常清晰的参考框架,后面的很多工作都是在这套框架里做局部改良。今天写这篇笔记,如果能让正在做弱监督方向的朋友少走一点我走过的弯路,那比多写几个涨点数据更有意义。
复现代码和实验配置我这边整理得差不多了,后续如果大家需要,我可以在下一篇里把关键实验配置的表单和启停细节完整拉出来一份,方便直接对照着跑自己的数据集。