作者:Charles | 源:知乎 https://zhuanlan.zhihu.com/p/378120529
在这篇文章,我们将解读一下我们发表在CVPR 2021的工作CPS: Semi-Supervised Semantic Segmentation with Cross Pseudo Supervision. 我们提出的半监督语义分割算法,在Cityscapes数据集中,使用额外3000张无标注的图像,可以在val set达到82.4% mIoU (单尺度测试)。
作者单位:北京大学,微软亚洲研究院
代码:https://github.com/charlesCXK/TorchSemiSeg
论文:https://arxiv.org/abs/2106.01226
在这篇论文中,我们为半监督语义分割任务设计了一种非常简洁而又性能很好的算法:cross pseudo supervision (CPS)。训练时,我们使用两个相同结构、但是不同初始化的网络,添加约束使得两个网络对同一样本的输出是相似的。具体来说,当前网络产生的one-hot pseudo label,会作为另一路网络预测的目标,这个过程可以用cross entropy loss监督,就像传统的全监督语义分割任务的监督一样。我们在两个benchmark (PASCAL VOC, Cityscapes) 都取得了SOTA的结果。
相关工作
在最开始,我们先来回顾一下半监督语义分割任务的相关工作。不同于图像分类任务,数据的标注对于语义分割任务来说是比较困难而且成本高昂的。我们需要为图像的每一个像素标注一个标签,包括一些特别细节的物体,比如下图中的电线杆 (Pole)。但是,我们可以很轻松的获得RGB数据,比如摄像头拍照。那么,如何利用大量的无标注数据去提高模型的性能,成为半监督语义分割领域研究的问题。
我们将半监督分割的工作总结为两种:self-training和consistency learning。一般来说,self-training是离线处理的过程,而consistency learning是在线处理的。
(1)Self-training
Self-training主要分为3步。第一步,我们在有标签数据上训练一个模型。第二步,我们用预训练好的模型,为无标签数据集生成伪标签。第三步,使用有标注数据集的真值标签,和无标注数据集的伪标签,重新训练一个模型。
(2)Consistency learning
Consistency learning的核心idea是:鼓励模型对经过不同变换的同一样本有相似的输出。这里“变换”包括高斯噪声、随机旋转、颜色的改变等等。
Consistency learning基于两个假设:smoothness assumption 和 cluster assumption。
- Smoothness assumption: samples close to each other are likely to have the same label.
- Cluster assumption: Decision boundary should lie in low-density regions of the data distribution.
Smoothness assumption就是说靠的近的样本通常有相同的类别标签。比如下图里,蓝色点内部距离小于蓝色点和棕色点的距离。Cluster assumption是说,模型预测的决策边界,通常处于样本分布密度低的区域。怎么理解这个“密度低”?我们知道,类别与类别之间的区域,样本是比较稀疏的,那么一个好的决策边界应该尽可能处于这种样本稀疏的区域,这样才能更好地区分不同类别的样本。例如下图中有三条黑线,代表三个决策边界,实线的分类效果明显好于另外两条虚线,这就是处于低密度区域的决策边界。
那么,consistency learning是如何提高模型效果的呢?在consistency learning中,我们通过对一个样本进行扰动(添加噪声等等),即改变了它在feature space中的位置。但我们希望模型对于改变之后的样本,预测出同样的类别。这个就会导致,在模型输出的特征空间中,同类别样本的特征靠的更近,而不同类别的特征离的更远。只有这样,扰动之后才不会让当前样本超出这个类别的覆盖范围。这也就导致学习出一个更加compact的特征编码。
当前,Consistency learning主要有三类做法:mean teacher,CPC,PseudoSeg。
Mean teacher是17年提出的模型。给定一个输入图像X,添加不同的高斯噪声后得到X1和X2。我们将X1输入网络f(θ)中,得到预测P1;我们对f(θ)计算EMA,得到另一个网络,然后将X2输入这个EMA模型,得到另一个输出P2。最后,我们用P2作为P1的目标,用MSE loss约束。
PseudoSeg是google发表在ICLR 2021的工作。他们对输入的图像X做两次不同的数据增强,一种“弱增强”(random crop/resize/flip),一种“强增强”(color jittering)。他们将两个增强后图像输入同一个网络f(θ),得到两个不同的输出。因为“弱增强”下训练更加稳定,他们用“弱增强”后的图像作为target。
CPC是发表在ECCV 2020的工作(Guided Collaborative Training for Pixel-wise Semi-Supervised Learning)的简化版本。在这里,我只保留了他们的核心结构。他们将同一图像输入两个不同网络,然后约束两个网络的输出是相似的。这种方法虽然简单,但是效果很不错。
Motivation
从上面的介绍我们可以简单总结一下:
- Self-training可以通过pseudo labelling扩充数据集。
- CPC可以通过consistcency learning,鼓励网络学习到一个更加compact的特征编码。
大家近年来都focus在consistency learning上,而忽略了self-training。实际上,我们实验发现,self-training在数据量不那么小的时候,性能非常的强。那么我们很自然的就想到,为什么不把这两种方法结合起来呢?于是就有了我们提出的CPS:cross pseudo supervision。
Cross Pseudo Supervision (CPS)
我们可以看到,CPS的设计非常的简洁。训练时,我们使用两个网络f(θ1) 和 f(θ2)。这样对于同一个输入图像X,我们可以有两个不同的输出P1和P2。我们通过argmax操作得到对应的one-hot标签Y1和Y2。类似于self-training中的操作,我们将这两个伪标签作为监督信号。举例来说,我们用Y2作为P1的监督,Y1作为P2的监督,并用cross entropy loss约束。
对于这两个网络,我们使用相同的结构,但是不同的初始化。我们用PyTorch框架中的kaiming_normal进行两次随机初始化,而没有对初始化的分布做特定的约束。当然了,如果设计特定的初始化,没准CPS的效果会更好~
在测试的时候,我们只使用其中一个网络进行inference,所以不增加任何测试/部署时候的开销。
实验部分
(1)Low data setting。
首先是有标签数据比较少的情况。
我们的方法在VOC和Cityscapes两个数据集的几种不同的数据量情况下都达到了SOTA。表格中 1/16, 1/4等表示用原始训练集的 1/16, 1/4作为labeled set,剩余的 15/16, 3/4作为unlabeled set。
在跟PseudoSeg的对比中,和他们同样的数据划分list,我们也超越了他们的性能:
这是我们的方法跟self-training进行比较的结果。可以看到,我们的方法由于鼓励模型学习一个更加compact的特征编码,显著地优于self-training。
(2)High data setting。
我们还在数据量比较多的情况下进行了实验。在Cityscapes数据集,我们拿训练集的全部图片(大约3000张)作为labeled set,并从coarse set中随机采样3000张RGB图片作为unlabeled set。我们在两个模型进行了实验:DeepLabv3 和HRNet-W48。可以看到,我们的半监督算法可以在非常强的baseline上显著提高性能,最终HRNet-W48在验证集上可以达到单尺度测试下82.4%的mIoU。
可视化
(1)分割预测的定量结果。
我们在PASCAL VOC数据集上可视化了一些分割的预测结果。(c)列是仅使用labeled data进行训练的结果,(d)(e)列是我们的预测,(b)列是真值标签。可以看出,由于标注数据很少,(c)的结果不能准确识别物体的语义和边界,而我们CPS可以很好地处理这些问题。
(2)两个网络的性质分析。
我们在PASCAL VOC上可视化了双路网络的预测的标签的重合情况。我们可以看到,训练初期,overlap较小,通过约束一致性,可以防止单个网络往错误的方向去优化。随着训练迭代,overlap逐渐增大,说明两个网络的预测都变得更加准确。