刚才看到这个标题的时候,第一反应是“又是CVPR论文笔记”,但读完这篇之后,我觉得很值得单独拿出来写一篇。因为它讨论的问题在工业界实在太常见了——多个数据集各标各的类,每个都只有单类标注,想合并起来训一个多类分割模型,却总被“背景”标签搞到怀疑人生。这篇论文恰好给出了一套很优雅的解法,而且思路可以直接迁移到很多实际项目里。
这篇笔记我会从问题背景、方法拆解、实验细节到个人思考都过一遍,重点讲清楚“背景冲突”为什么是致命问题,以及作者是如何用一个概率转移框架把脏标注变成可控建模的。不管你是做自动驾驶、遥感解译还是通用分割,这篇文章里的思路都值得反复咀嚼。
1. 这篇论文在解决什么问题
1.1 被逼到墙角的单类数据集
做过语义分割的人都有体会:像素级标注是全深度学习领域最烧钱的标注之一。画一个精细的分割掩码,一个像素都不能含糊,一小时能标完几张图就算不错的了。所以现实里绝大多数字段收集到的数据,都是“单类标注”的形式。
什么意思呢?就是某个项目只关心一个前景类别,其余的全部扔进背景。比如一个做行人的项目,标注人员只把行人逐像素画出来,其他所有东西——汽车、路面、建筑、树木、天空——全部归为背景。另一个项目做车辆检测与分割,就只标汽车。单个项目内部,这种单类标注完全够用,反正模型只输出两个类,前景和背景。
但一旦你想把多个这样的单类数据集合并起来,训练一个能够识别多种类别的统一分割模型,麻烦就来了。每个数据集里的“背景”含义完全不同:行人数据集的背景里包含汽车和道路,车辆数据集的背景里包含行人和建筑。你把它们直接混合训练,同一个像素在同一张图里叫背景,在另一张图里可能对应另一个模型要学的前景类。这种标注空间的不一致,会让模型学到非常扭曲的决策边界。
这篇论文解决的就是这个问题:给定多个只有单类标注的数据集(每个数据集标注一个不同类别),如何训练出一个能区分全部类别的多类分割模型,并且在测试时不依赖于任何数据集的特定标注协议。
1.2 背景标签背后的“暗物质”
要理解这个方法,得先理解背景标签的本质。在单类数据集里,背景不是一个语义类别,它是一个“补集”——不属于目标类的一切东西。这里的关键是,“一切东西”里可能藏着其他数据集里被精心标注过的类别。
我打个比方。你手上有一堆照片,每张照片上都只圈出一个人。A组照片只圈“戴帽子的人”,B组照片只圈“穿红衣服的人”。现在你想训练模型同时识别“戴帽子的”和“穿红衣服的”。麻烦在于:A组照片里那些没戴帽子的区域,很可能有人穿红衣服;你在A组里把它们标为背景,等于告诉模型“红衣服不是前景”。而B组又告诉你红衣服是前景。三次元空间里明明存在的人,在两个数据集的背景里互相“隐身”了。这就是论文里反复强调的核心矛盾。
更麻烦的是,这种冲突不是简单二值的,它是概率性的。某个像素在数据集A里被标为背景,它可能是类别B、类别C或者真的是背景。我们不确定,只知道它不是类别A。所以正确的建模方式不是把背景当成一个确定的“非前景”,而是当成一个“未知”的类别集合。
作者正是抓住这一点,把标注生成过程建模成了一个概率过程,用隐变量来估计真实标签。
1.3 为什么简单拼接训练行不通
有些人可能会想:我直接把所有数据集放在一起训,让模型自己学行不行?答案是会出问题,而且问题很明显。
第一种做法是直接把每个数据集的标注当作二分类标签硬训。这样背景成了一个大杂烩,模型会把各类别之间的差异磨平,最终输出的多类概率非常不稳定。尤其当两个数据集采集环境差异大的时候,模型会利用数据集本身的特性来偷懒,效果更差。
第二种做法是只取每个数据集的前景类,把其他数据集标注的前景类对应的像素忽略掉。这其实就是对不同数据集有不同的损失掩码。但这样做等于主动丢弃信息,而且背景类的定义依然互相污染,模型对“背景”的学习是错乱的。
第三种常见尝试是先用有完整多类标注的小数据集训一个老师模型,然后用这个老师模型在单类数据集上生成伪标签。这个方法的问题是:老师模型的类别空间与目标类别空间必须对齐,如果目标类别里有某个类只有单类数据,老师模型压根没见过这个类,怎么蒸馏都是白搭。
读到这里估计你也看出来了,这本质上是一个标注空间对齐问题。论文作者没有去凑一个“看起来能用的损失函数”,而是重新定义了标注生成过程,然后用EM迭代去解。下面我来拆解具体的做法。
2. 核心方案拆解:把标注差异建模成概率转移
2.1 重新理解标注是怎么来的
论文把每个数据集的标注过程想象成这样一条链路:存在一个真实的、完整的类别标签图 y(我们看不到),然后某个数据集 k 的标注者按照自己的标注协议,把 y 转换成了标注图 z_k。这个转换不是确定性的,而是服从一个概率分布 p(z_k | y)。
具体来说,如果 y 恰好等于数据集 k 标注的那个类别(记作类别 c_k),那么 z_k 一定等于 c_k,也就是说这个像素被正确地标为前景。但如果 y 是其他某个类别(或者是真正的背景,这里记为类别 0),那么 z_k 就等于背景,因为标注者根本不会管这个像素是什么,统一归入背景。
这样一来,标注过程就可以用一个条件概率表来描述。对于数据集 k,只有两类标注输出:c_k 和 背景。而隐藏的真实标签有 C 类加一个背景类。从真实标签到标注输出的映射关系,本质是一个 C+1 行 2 列的概率矩阵。
这个矩阵里,当真实标签等于 c_k 时,标注为前景的概率是 1;当真实标签是其他任何一个类别的时候,标注为背景的概率也是 1。表面上看这是一个确定性的“坍缩”过程,但它引出的逆问题才是重点:给定标注为背景,真实标签可能是什么?这就需要一个逆向推理过程,也就是后面的EM框架要做的事情。
2.2 把“背景”拆成多个真实的类别
既然每个数据集里的背景像素,对应的真实标签可能是不同的类别,那就不能把它当成一个整体来学习。论文引入了一个关键的建模选择:用数据集特定的转移概率来表达这种不确定性。
我重新用公式描述一下。假设总类别数是 M(包含真正的背景类 0,以及各类前景类别 1 到 M-1)。对于数据集 k,像素标注为背景的概率可以写成:
p(z_k = bg | x) = sum_{i != c_k} p(y = i | x) * p(z_k = bg | y = i)
这里 p(y = i | x) 就是分割网络对 x 像素的预测概率。当 i 等于 c_k 时,转移概率为 0,因为如果真实标签是这个数据集的前景类,标注者一定会标它。当 i 是其他类时,转移概率为 1,因为其他所有类都会被归入背景。
把这个式子反过来的意思是:当我们在数据集 k 里看到一个背景像素时,不能简单认为它“就是背景”,而是要把网络预测出的所有非 c_k 类别的概率,按比例分配给背景标签。网络预测哪个类别的概率高,背景里的哪种类别的“嫌疑”就大。这就是从单类标注里挖掘多类信息的核心机制。
2.3 网络输出与标注如何互相校准
前面的建模提供了一个关键的桥梁:网络输出概率 p(y = i | x),与给定数据集的标注协议,共同决定了观测到的背景标签的分布。反过来说,观测到的背景标签,也可以反过来修正网络对各类别概率的估计。
论文使用期望最大化框架来做这件事。我把流程简化成三步,方便理解:
第一步,初始化。用最简单的方式训练一个初始模型,损失只计算前景类 c_k 的交叉熵,背景梯度直接忽略或按普通二分类处理。这个初始模型虽然对背景类学习混乱,但至少对前景类已经有一定的判别能力。
第二步,E步。固定网络参数,根据当前模型输出的各类别概率,结合每个数据集的转移规则,为每个像素计算一个“软标签”——也就是一个真实类别的后验概率分布。注意,这个软标签是对 M 个类别而言的,而不是数据集原始的 2 类。
第三步,M步。用这些软标签代替原始硬标签,以标准的多类交叉熵损失更新网络参数。更新完之后再回到第二步,循环迭代。
这个流程听起来很直白,但每一步都有很多细节值得注意,尤其是E步里软标签的计算方式,直接决定了方法能不能收敛。
2.4 一个容易踩的项目设计雷区
我在读这篇论文的时候最关心的一个细节是:E步计算后验概率时,需不需要对每个数据集分别维护一套概率?
论文的答案是:需要,因为每个数据集对“背景”的定义不同。一个像素在数据集 A 里被标为背景,在数据集 B 里可能被标为前景 c_B。如果设计一个统一的背景类别,强行让所有数据集的背景共享同一套标签分布,那么冲突依然没有被解决。这就是很多弱监督方法失败的共同原因——它们把不同数据源的“不确定性”想得太简单了,以为一个背景类就能囊括所有负样本的多样性。
正确的做法是:针对每个数据集 k,把背景标签展开为 M-1 个候选类别上的概率分布。这个展开系数包括两部分:一是网络输出的各类别先验概率,二是该数据集标注协议给出的转移约束。两者相乘再归一化,就得到后验软标签。
这种“数据集感知”的建模方式,是这个方法最核心的工程判断。它没有去硬生生地统一标注空间,而是承认每个数据集的标注协议是独立且特殊的,然后把这种特殊性建模进转移矩阵里。这个思想放到今天依然不过时。
2.5 类别转移矩阵的初始化与危险信号
转移矩阵不是随便设的。论文里初始化时,对每个数据集 k,前景类 c_k 对应的转移概率是确定性的,其余类别对应的转移概率则初始化为一个均衡的先验——也就是说,假设背景区域里各类别出现的概率相等,再由网络预测数据去不断修正。
这里有个危险信号值得提醒:如果初始化时各类别概率完全均等,EM算法很容易陷入一个次优平衡——所有类别概率都被平摊,模型最后退化成一个只能区分前景和背景的二分类器。这是我在实际阅读时特别注意到的点。论文里虽然对初始化描述不多,但背后肯定有处理措施,比如对转移概率设置了最小置信度阈值,或者在前期迭代中保留一部分原始硬标签的梯度,防止软标签噪声过大导致模型漂移。
按照我的经验,这类隐式避坑设计往往比论文里写出的公式更重要。如果将来你要在自己的项目里复现这个方法,务必先在初始化阶段多跑几个配置,确保网络在早期迭代中不会坍缩成一个平凡解。
3. 训练策略与实现细节
3.1 网络架构选择与输出头设计
论文使用的基础分割网络比较常规,采用类似编码器-解码器结构的语义分割模型,骨干网络用的是带空洞卷积的残差网络。输出层是一个 M 类的 softmax 头,这一点和普通多类分割没有任何区别。
但有个细节值得注意:网络的输出类别数 M 必须事先固定,而且包含了所有数据集标注过的类别之和加背景。在E步计算软标签的时候,这个 M 类的概率向量是基础原料。如果后期想增加新的类别,就需要重新初始化整个迭代过程,没办法增量式地加入新类。这个限制在实际项目中需要注意。
关于输出头,我觉得有一个值得借鉴的点:网络的最后一层激活值可以同时作为E步先验和M步监督,这个设计让网络的两个更新来源保持了“自洽”。既不会出现网络已经被软标签说服、却还用原始硬标签来对抗的情况,也不会出现伪标签过度自信、把网络直接带偏的失控。这种一致性设计比分步训练要稳定得多。
3.2 迭代流程与收敛判断
整个训练过程可以概括为一个双层循环。外层是EM迭代——每轮重新生成软标签,内层是网络参数更新——用固定软标签训练若干轮。
具体来说,每轮EM迭代里,先用当前网络跑一遍所有训练图像的预测,再把每个数据集的标签与预测概率结合生成软标签,最后用这批软标签进行一轮完整的分割网络训练。训练轮数是个超参数,论文中提到大概每个阶段训练几十个迭代批次就切换到下一轮。
收敛判断的标准一般是:软标签的变化量降到某个阈值以下,或者验证集上的mIoU(类别平均交并比)趋于稳定。我之前在类似项目里用过一个更实用的办法:每轮EM之后稳定住网络,另外挑一个完整标注的验证集做一次评估,同时保留历史最好的模型。这样即便EM过程中有所震荡,至少不会丢失最优状态。
3.3 多数据集混合装填的工程细节
数据集的混合采样是一个容易被忽视的环节。简单地把所有数据集的图片倒进一个训练队列,会导致两个问题:一是不同数据集的样本量差异大,占比大的数据集会主导梯度方向,尤其是背景部分的梯度;二是不同数据集的采样顺序如果不够随机,网络会在不同阶段之间“漂移”。
论文里的处理思路比较稳妥:采用按数据集分组、组间交替采样的方案。每个batch内部可以来自同一个数据集,但batch之间的数据集轮换要均匀。这样每个batch的损失函数天然就带数据集特有的上下文,避免不同标注协议之间的互相干扰。
我在工程实践中的一个经验是:每个batch里都混合多个数据集的效果往往不如分组交替。因为不同数据集的图像分布差异很大(比如一个全是街道场景,一个全是室内场景),强行混在一个batch里会让网络的BN统计量乱七八糟,反而伤害精度。如果网络里用了批归一化,这个问题会更明显。论文里虽然没有详细展开这一点,但我在实际工程项目中验证过很多次,值得记下来。
3.4 关于背景类别的样本量失衡
背景像素永远是多类分割里的大头。在单类数据集里,背景像素的占比甚至能到95%以上。如果用普通交叉熵训练,模型很容易把所有像素都预测成背景,因为收益最大。
这篇论文的方法天然缓解了这个问题:背景像素会被软标签拆解成多个非目标的类别概率,梯度不再是单一的“背景方向”,而是按照后验概率分布到所有类别上。这就把一个纯粹的类别不均衡问题,转化为一个带概率先验的软分类问题。
当然,如果只用软标签仍然可能不够稳健。我建议在初始化阶段保留部分原始硬标签的监督损失,尤其是在网络对前景类判别力还不强的时候。硬标签监督可以拉住模型,不让它被过度平滑的软标签带偏。这类细节论文里写得很含蓄,但在复现时几乎一定会遇到,提前设计好能省很多调试时间。
4. 实验效果与结果解读
4.1 实验配置的整体印象
论文的实验设计很干净。训练数据是多组单类标注的数据集,每个数据集只标注一个前景类。测试数据则使用一个包含完整多类标注的数据集,这样可以直接用标准mIoU评估。
在这种配置下,评测本身就有挑战性:训练数据和测试数据的标签空间不同,而且训练数据里没有任何一张图带有多类真值。能做到从单类标注无中生有地学出多类分割,实验设计本身就很有说服力。
我记得论文里比较了几个基线方法,包括:纯二分类训练、把多个单类数据集合并后按多类交叉熵训练、以及用伪标签进行多阶段训练。这些基线方法在多类测试集上的mIoU都不理想,而论文的方法明显领先。这个结果并不意外,因为基线方法要么没有处理背景冲突,要么依赖不稳定的伪标签。
4.2 消融实验到底回答了什么问题
消融实验部分最有价值。作者主要做了四组对比:去掉EM迭代、去掉数据集特定的转移概率、使用统一的背景标签建模、以及使用完整方法。每一个消融都指向一个关键设计。
去掉EM迭代等价于只用初始化模型,结果比完整方法差很多,尤其是在同属“背景”却语义相近的类别之间,比如“公交车”和“卡车”这种。这说明EM迭代对类别的精细化分离至关重要,它让模型有机会从背景区域中重新挖掘出被忽略的类别证据。
去掉数据集特定转移概率,改成统一背景建模,结果也会有明显下降。这个结果直接验证了我在前文强调的观点:不同数据集对背景的定义差异太大,用同一个背景标签去统一建模,本质上仍然逃不开标注冲突。
我也注意到,完整的消融对比中,某些类别增益特别大,往往是那些在很多数据集中都作为背景出现的类别。这其实是一个很有意思的发现:背景区域才是信息量最大的地方。
4.3 方法边界在哪里
任何方法都有边界,这篇论文也不例外。最明显的限制是:如果某个类别在所有单类数据集的背景区域里从未出现过,那这个方法自然学不出来。比如所有数据集都在白天的城区拍摄,你很难期望模型学到夜间场景的语义。这类问题不是方法本身能解决的,而是数据覆盖面决定的。
另一个边界是类别数量。随着类别增多,背景转移矩阵的参数量也会增加,EM迭代收敛会变慢。如果类别数量超过几十个,概率估计的方差会变大,对训练数据的消耗也会陡增。论文面向的场景主要是语义类别不算特别多的情况,放到大规模开放词汇分割里还需要继续扩展。
另外要注意的是,方法假设每个数据集的背景区域与前景区域之间可能存在语义重合,但这个重合概率需要在训练过程中动态估计。如果两个数据集的拍摄场景差异极大(比如一个在室内,一个在深海),背景里根本没有相互重叠的类别,那转移矩阵的估计就会失效,方法会退化成普通的单类训练。
5. 个人学习体会与扩展思考
5.1 这篇论文真正的贡献点在哪里
读完整篇论文,我最大的感受是:它把“标注不一致”这个问题从工程陷阱提升到了数学建模的层面。过去遇到多个数据集标注空间冲突,大家的第一反应是数据清洗、类别映射表、手动调整损失函数权重。论文的做法完全不同:不去洗数据,而是直接对标注生成过程建模,然后通过隐变量来还原真实标签。这种“把消耗标注格式问题转化为概率推断问题”的思路,是值得收藏的思维模型。
可以说,这篇论文是弱监督分割和半监督分割研究里一个承上启下的节点。它降低了多数据集联合训练的门槛,让带标注的单类数据可以像积木一样组合起来,不需要担心彼此冲突。
5.2 直接用到实际项目中的两个启发
第一个启发是标签转移矩阵的复用价值。在实际项目中,我们经常需要同时利用多个历史项目积累的单类分割数据来训练新的多类模型。这篇论文提供了现成的框架,只要为每个历史项目建立一个转移矩阵,就能在EM迭代中统一建模。我建议迁移时保留一个小的完整标注测试集来评估mIoU,因为历史项目之间可能存在重叠类,需要验证。
第二个启发是对“背景类”的重新理解。很多兄弟团队做分割模型时,习惯于把背景当成一个真的类别来建模。而这篇论文提醒我们:背景不一定是同质的,尤其在多数据集联合训练中,背景其实是一个待拆解的混合体。如果你面对的项目里,不同来源数据的背景含义差异很大,不妨试着把它拆成概率分布来做,而不是强制模型学习一个统一的背景特征。
5.3 与伪标签和半监督方法的横向对比
这篇论文的方法和现在流行的自训练、半监督分割有异曲同工之处:都依赖模型自身的预测来生成额外的监督信号。区别在于,自训练方法只用无标签数据,避免使用可能错误的预测;这篇论文则用数据集特定的转移矩阵来约束预测结果,本质上相当于给伪标签加了一层“标注协议过滤器”。所以它比普通的自训练方法更稳健,因为它不会盲目相信网络输出,而是结合了每个数据集的实际标注规则。
这个“标注协议过滤”的思路,即使不做完整EM迭代,也可以单独用在你的半监督管线里。比如用老师模型生成软标签时,先剔除那些与数据集标注规则冲突的预测结果,伪标签质量会显著上升。
5.4 后续值得继续探索的方向
一个自然延伸是动态的类别发现。论文固定了类别空间,但现实中你永远会发现新类别。如果能让转移矩阵的类别维度也跟着数据扩展自动增长,就能逼近“标注一点、增量全知”的目标。类似方法在持续学习领域也有一些探索,可以和这篇结合来看。
另一个值得探索的方向是把它和多模态信息结合起来。比如文本描述给定的单类标注,可以参考图片与文本的一致性来辅助推断背景中其他类别是否出现。这类跨模态信息能提供比纯视觉更稳定的转移先验,可以缓解EM在低文本级别上的崩溃问题。
最后说点个人体会。看完这篇论文之后,我在自己负责的某个数据整合项目里把“背景类别概率化”这个思路借鉴了过来。虽然很难完全复现论文里的EM细节,但哪怕只是把背景按多个候选类别的概率拆解开,最终的mIoU都提升了好几个点。这类小而关键的思想,比一堆花哨的网络结构优化实用得多。我建议有类似项目的人在动手清洗数据之前,先花一天时间读透这篇论文,观察你的背景标签是否本身就在告诉你多类信息——读懂了背景,离读懂整个数据集就不远了。