摘要
本文是ICLR2022的一篇文章,关注十分少见的无监督语义分割。无监督语义分割因为训练时没有标注,所以需要让特征具有充分的语义信息的同时,让同一类物体对应的像素的特征足够紧凑。因此本文根据这两个特点,没有采用以往端到端的方式,而是将无监督语义分割拆分为提取特征和聚类两步。作者认为,目前的特征提取模块已经能很好地将同类特征放在一起了,因此本文创新点是通过全新的损失函数,鼓励模型将特征变得更加紧凑的同时不破坏不同分类之间的关系(大白话就是不能为了聚类而聚类,不能把不同类的特征聚到一起去了)
方法
作者从经验上表明,经过预训练的特征提取backbone能够很好地将同一类的像素放在一起
如图,左图是原图,在天空,摩托车和地面三个类上分别选择了一个参考像素,然后中间和右图是特征提取之后,每个点的像素修改为其所最接近的参考像素的颜色所得到的图,如果三个都不接近,那就说明被聚集到了其他特征聚类中。
可以看到,在原图提取后的图像中,大多数像素都正确地和参考像素放在了一起,天空大部分为蓝色,摩托车为红色,地面为绿色。即使是另一幅图,也因为主要构成的语义和原图相同,所以不同区域的颜色也同样成功聚类了。这说明特征提取能成功聚类,并且知识能够跨图像保留。
基于上面例子的结论,作者将中心放在了聚类上
结构
本文只训练一个分割分类头,其余部分要么是冻结参数绝对不参加训练的特征提取backbone,要么是传统方法。
所以核心就是如何只使用原图以及特征提取器来训练分割头,而本文核心就是图左下角的损失函数
损失函数
在介绍损失函数前,先介绍相关性张量。假设f尺度为C*H*W,g为C*I*J,两者都是特征图,通道数都为C。则两者的相关性矩阵计算方法为
即两个图中,每一对像素都要计算每个通道上灰度值之积,并除以两者的向量长度。
最初的损失函数如下图所示,S的计算方式和F一摸一样,只不过F是特征提取器backbone提取出的两个张量计算得到的,而S是由分割头进一步处理得到的张量相互计算一致性的结果。b是超参数,F中的每个数都要减去这个数
可以看出,如果F中的某个数比较大,减去b后依然大于0,同时求和符号前面有符号,那么在S中,相同位置的值也应该尽可能大,才能让负数的绝对值变大,使得损失函数变小。而如果F中某个数太小,减去b后变为负数,那么S就要尽可能地小。
但这个函数存在一个问题,对于小样本区域的大部分像素,F-b总是负值,这会导致小样本的像素不会聚集反而会原理,于是作者将F替换为了FSC
所谓的SC是指Spatial Centering,是空间中心化。其实就是每个点在计算自己和另一幅图的某一个点一致性时,要减去自己相对另一幅图所有点的一致性的平均值,让不同尺寸的类所对应的F值平均值之差别太大。
考虑到S内部出现负值会让负值对应的像素严重分离,作者还加上了一个0-clamp操作
最终损失函数如上所示。通过这个损失函数,即可无监督地让不同像素根据提取出的特征值更好地聚类。
训练
根据F的计算公式可知,每次迭代模型至少需要两幅图,因此作者用三种不同的策略选择图像
在确定f后,第一种方法,令g=f,即自身对自身计算F和S,第二种方法,根据backbone提取的特征和KNN方法,找出附近的一张图作为g,第三种,在所有图像中随机选择一张。前两种策略训练模型应该如何将同类聚集,最后一种策略让模型学习如何让不同类的特征分离。
实验
毕竟顶会文章,SOTA就完事了
更值得关注的是消融实验
0-clamp和SC在介绍损失函数时说过了,5-crop是传统的数据增强方法,即从图像的四个角和中间截取一个小一些的图像拿来训练,CRF是一种传统方法,名为条件随机场,巨难懂,建议看这篇博客自行感受:CRF
总结
个人理解,本文基于特征提取backbone已经很牛逼了的前提下,将提取出的特征图一方面当作GT加以学习模仿,另一方面又微调特征图的结果,使不同类的特征在特征空间里更加分离。