背景
图像级标签的弱监督语义分割(WSSS)通常利用类激活映射(CAM)生成伪标签。受CNN局部感知的限制,CAM通常不能识别对象的整体目标区域。虽然 ViT可以弥补这一缺陷,但同时它也带来了过度平滑的问题,即最后生成的patch token有着很大的相似性。
![](https://i-blog.csdnimg.cn/blog_migrate/11f563702920d6294453537586a13fcd.png)
方法:Token Contrast (ToCo)
![](https://i-blog.csdnimg.cn/blog_migrate/e46b8964539d4395f75c14af46018c2b.png)
模型可看成上下两个部分
上面的PTC就是解决前面提到的vit存在的过度平滑问题
下面的模块是将原始图进行裁剪之后得到的局部图像输入vit,通过ctc模块促进局部非显著区域与全局对象之间的表示一致性,从而进一步强制从CAM中激活更多的对象区域。
PTC:Patch Token Contrast
![](https://i-blog.csdnimg.cn/blog_migrate/6c3d0199e81115548ca99777a33e66d7.png)
利用中间层(第十个encoder)的输出外接辅助分类层得到Mm,主要是因为中间层仍然可以保持语义多样性,由它生成的token relations Y作为global patch tokens F的监督,可以解决vit存在的过度平滑问题。
(1)将Mm下采样为 M(,
),通过阈值(
l,
h)得到M'。
看了源码,Mm先被下采样成(H/patch_size,W/patch_size),因为输入的H和W是一样大小的,所以相当于下采样成 (,
),阈值源码中设置为超参数(0.25,0.65),Mi 对应于M' 的过程如下:
![](https://i-blog.csdnimg.cn/blog_migrate/caa5fb7b08d5d4602f70d4144b186743.png)
(2)对于M' 中的每个像素,求他与其他所有像素之间的相关性,得到token relations Y —— 如果M’ 中两个像素共享相同的语义标签,则它们被标记为正对;否则,它们被标记为负对。此外,为了保证可靠性,只考虑两个都属于前景或背景区域的patch token,忽略不确定区域。
源码中得到Y的这个过程写了两三个外函数来实现,我这里简单描述稍微有点不当,因为源码不是通过遍历M'中的每个像素来求的相关性,而是先将M' 上采样成(N,N),再交换后面两个维度,交换前后值相同部分置为1,否则为0,再将不确定区域回填,得到token relations Y —— 为什么不直接遍历每个M' 中的值来得到相关性呢,为了节约计算资源?源码中的不确定区域的回填问题感兴趣的可以去深入研究一下 —— 三行非常有意思的代码!
![](https://i-blog.csdnimg.cn/blog_migrate/3eb36505d7bd5d67248fc0a20a7dea72.png)
ptc loss根据Y指定的正负对关系分别在global patch tokens的正对和负对上计算cos相似性。
CTC:ClassTokenContrast
PTC解决了vit存在的过度平滑问题,生成效果不错的辅助cam。然而,仍然存在一些识别能力较弱的难以区分的对象区域。受ViT中class token 可以聚合高级语义的特性,设计了(class Token Contrast, CTC)模块,从辅助CAM Mm指定的不确定区域和背景区域对原始图像进行随机裁剪得到局部图像,将其分配为正样本(来自不确定区域)或负样本(来自背景区域)。通过最小化全局class token P和正样本之间的差异(在不确定区域中激活出更多的前景区域),最大化全局class token P和负样本之间的差异(加大前景和背景的差异),整个ctc loss 通过最小化全局class token 和局部class token 来促进局部非显著区域与全局对象之间表示的一致性,从而进一步强制从CAM中激活更多的对象区域。
![](https://i-blog.csdnimg.cn/blog_migrate/16e6e797800965371b46b83891da5579.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3aa3d285d64c6145ee2ea9dd7eee2b46.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8d71cb9c4dbe8edbdd6b2c3cec463cea.png)
P:global class tokens q+:正样本 q-:负样本
ToCo for WSSS
通过PTC和CTC模块使vit得到全局patch token F更好的特征表示,从而得到最终的伪监督标签用于弱监督语义分割。
![](https://i-blog.csdnimg.cn/blog_migrate/68d9ebd66e8fdaf3a2ca76bed582f4ae.png)
![](https://i-blog.csdnimg.cn/blog_migrate/02322e8ea7c74b17fee017c57baa7ba4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6c690a85a7f432aee41e0c7d066decce.png)
论文没有采用训练经典的分割模型来得到分割结果,而是利用简单的分割头来得到最终的分割结果 —— 将ToCo得到的final pseudo label送入decoder(3个3*3卷积(扩张率是5)和一个1*1预测层)中即可得到分割结果。
实验
![](https://i-blog.csdnimg.cn/blog_migrate/085a9669df5f969840bb01e2a7286123.png)
![](https://i-blog.csdnimg.cn/blog_migrate/928ccec8129f7f83abe59339364cf51b.png)
总结
•提出了PTC(patch token contrast),其通过将最终的patch token和从中间层提取到的语义信息进行对比,解决了ViT的过度平滑问题。
•提出了CTC(class token contrast),其通过将全局的class token和局部不确定区域/背景的语义信息进行对比,进一步强制从CAM中激活更多的对象区域,提高了WSSS伪标签的质量。
仍然疑惑的点:
- PTC中下采样到(
,
),再上采样到(N,N),这其中的损失应该非常大,结果竟然可以work?还有这里为什么不直接遍历每个M' 中的值来得到相关性?
- 消融实验的分割结果seg比cam M的效果更差?难道就是因为用的是简单的分割头而不是经典的分割模型?既然cam M的效果更好,为什么不直接用它作分割结果?