语义分割中的prototype

新坑+1

全监督

Region Mutual Information Loss for Semantic Segmentation

MaskFormer

MaskFormer1

Segmenter

Segmenter2

ContrastiveSeg

ContrastiveSeg的pipeline

ContrastiveSeg3指出了CE损失老生常谈的问题,缺少像素间的信息交换(上下文建模能力不足),具体来说: 1. CE Loss惩罚每个像素上的预测错误,但是对于像素间不一致的预测没有惩罚; 2. 由于使用了softmax,loss只是表达的时logits的相对关系,而非直接监督所学习的特征表示;

先前的一些的工作的解决方案(主要针对上述问题1)包括: 1. 设计上下文聚合模块 2. 学习pixel affinity网络; 3. 设计一些额外的损失函数,增加预测像素位置与全图的信息交换。

但是,作者指出,这些方法使用的上下文信息都还是来自于一张图(本文称为local context)。

本文的核心思想是让同一语义类别的像素嵌入向量的距离近(相对于其他不同类像素嵌入而言),具体地说,理想的语义嵌入空间: 1. 能够为每个像素embedding确定语义类别; 2. 类内紧凑,类间分离。

因此,作者用InfoNCE损失作为一种像素embedding到像素embedding的对比,接着提出了两种技术该改善对比损失。

第一个技术是在整个训练集上维护一个memory bank,对于每个批次的输入图像和标注,每张图每个类别选取一定数量的pixel embedding加入pixel队列,并把每张图每个类别的所有位置的embedding均值后加入segment队列,这两个队列即全局上下文,是与先前工作不同的一个点;之后在计算对比损失的时候,与memory bank中的example进行对比;

第二个技术是采样策略,又分为以下两部分:

  1. Segmentation-Aware Hard Anchor Sampling: 从每个mini batch的embedding中采样hard-easy一半一半的anchor,这里hard的定义是pred与label不一致,否则就是easy,anchor的含义就是被选中的那些像素embedding;
  2. Semi-hard Example Sampling: 在从memory bank中采样的时候,先收集前10% hard的正例/负例,之后再从中随机采样一部分;这里hard的定义,是使得第 \(i\) 个anchor的InfoNCE损失对于其的梯度的绝对值更大的example:对于与anchor类别相同的example,更hard的example与其的语义相似度接近1,对于与anchor类别不同的example,更hard的example与其的语义相似度接近于1;

下图展示了本文方法确实使得像素embedding空间结构更加良好:

不同损失函数监督下像素embedding空间结构

笔者单独开了一篇博客作为ContrastiveSeg的源码阅读笔记;

ProtoSeg

ProtoSeg4从prototype的角度将先前的分割方法分成两类,parametric softmax projection和parametric pixel-query,揭示了这两者之间的相同与不同。

ProtoSeg的pipeline

从pipeline的组件上来看,该文相当于引入\(CK\)个“不可学习”的prototype后,设计了语义分割任务3个损失函数:

  1. 为了更好地应对同一个类别的语义有方差,首先作者提出每个类别(共 \(C\) 类)使用 \(K\) 个prototype(作为subclass的中心)而非一个prototype,并给出了第一个winner-take-all原则的交叉熵损失函数 \(\mathcal{L}_\mathrm{CE}\),将像素按照类别正确分类;

  2. 接着,为了解决像素与多个prototype的映射问题(标注本身不能直接提供类似信息),作者以最大化每个像素到prototype的相似度为目标,并施加约束避免退化到一个类别一个prototype的情况,建立了运输多面体问题,可以用非梯度下降的方式快速在前向过程中求出像素到prototype的映射;

  3. 除了映射本身需要优化,prototype也需要优化,这里作者设计了模型的第二个损失函数 \(\mathcal{L}_\mathrm{PPC}\),即拉近像素和分配到的prototype的距离,而推远该像素与其他 \(CK-1\) 个prototype的距离;这也可以看作像素和prototype的对比学习;

  4. 为了最小化prototype的类内方差,使得同类的prototype的分布足够紧致,(作者指出前面两个基于softmax构建的损失只能最小化“相对距离”,而绝对距离仍然很大,即方差大),设计了将像素和对应prototype相似度本身最小化的损失函数 \(\mathcal{L}_\mathrm{PPD}\)

为什么本文说它的prototype是不可学习的?不可学习并不意味着 \(CK\) 个prototype 是固定的,而是在一个个喂入网络的batch data提取的特征中,不断更新的,就像是在线计算的聚类中心一样;从代码角度来说,这些prototype可以注册为module的buffer而非需要梯度的parameter,在每个批量的数据完成映射后或者完成反向传播后(这需要review代码实现来判断),按照下式更新prototype:

\[ p_{c,k} \leftarrow \mu p_{c,k} + (1-\mu)\overline{i}_{c,k} \]

这篇文章作为CVPR2022的oral,笔者准备单独开一篇博客记录作者的写作方式以及对文中一些细节部分的理解,在实验效果上,笔者粗浅地认为,这种方法有提升,但不足以让之后的工作都应用这种pipeline。笔者认为,每个类别的prototype是离散的 \(K\) 个,如果能表示成均值+方差的概率分布是否更好?在模型的一次前向传播过程中,像素到prototype的映射与prototype本身相当于交替优化,并且prototype的优化是逐个batch的在线学习,并且有3个损失函数这当中就引入了很多超参,模型最后可能训练到局部最优解?理论上还是有改进空间的。

GMMSeg

GMMSeg5

半监督

参考文献