Clustering-Guided Class Activation for WeaklySupervised Semantic Segmentation

本文主要是介绍Clustering-Guided Class Activation for WeaklySupervised Semantic Segmentation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pdf:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=10381698

code:https://github.com/DCVL-WSSS/ClusterCAM

摘要:

基于transformer的弱监督语义分割(WSSS)方法利用其捕获全局上下文的强大能力得到了积极的研究。然而,由于激活函数在transformer的自注意机制中只突出了几个tokens,因此这些方法仍然受到稀疏注意映射的影响,从而导致生成不完整的伪标签。在本文中,我们提出了一种新的类激活方案,该方案能够均匀地突出整个目标区域。

该方法的核心思想是通过将目标相似的图像特征组合而成的聚类引导激活目标区域。具体来说,利用提出的基于聚类的注意力模块生成聚类引导类激活图(ClusterCAM),然后利用该图中的高响应区域激活编码特征空间中的目标对象。这有助于模型通过使用从同一对象提取的patch tokens之间的语义接近度来探索目标对象的整个区域。在此基础上,我们设计了一个端到端的WSSS框架,可以单阶段同时训练分类和分割网络。

在基准数据集上的实验结果表明,我们提出的方法明显优于以前的WSSS方法,包括几种多阶段方法。

1 引言

我们提出应用聚类方案[22],[23]来解决上述的稀疏注意图问题。由于语义亲和力,属于同一对象的局部区域往往会产生相似的patch tokens,这在自关注机制中是不一致的。为了解决这个限制,我们提出了一个新的ClusterCAM。本文提出的方法的关键思想是探索类和簇之间的关系,而不是以往大多数方法中使用的patch[16],[17]。具体来说,我们首先将相似的补丁压缩成单个语义感知原语,the cluster token,并进行自关注来估计类和聚类之间的相关性。

然后,将每个cluster token的关注值平均分配到属于相应簇的原始patch上。值得注意的是,这种反向映射方法有效地保留了cluetrcam中类似补丁的贡献。这样,物体就可以均匀地表示,没有任何缺失的部分,如图1所示。基于所提出的ClusterCAM生成的伪标签和区域传播方案[18],我们以单阶段的方式构建了端到端的WSSS框架。所建议的方法的主要贡献可概括如下:

  • 我们提出了一种新颖的聚类引导类激活方案。通过将聚类到类别的注意力权重平均传播到属于同一聚类的所有区域,有助于均匀激活对象的整个区域,尽管这些区域在视觉上具有相似性。这是非常理想的,可以防止由于相似区域而不必要地抑制激活。
  • 我们在两个具有代表性的基准上进行了各种实验,即PASCAL VOC 2012[24]和MS COCO 2014[25]数据集。实验结果表明,该方法明显优于以往的WSSS方法,包括几种多阶段方法。

 图一:Visualization examples of attention maps. While patch-to-class
attention weights (middle) used in MCTformer [17] sparsely emphasize
the object region, the proposed ClusterCAMs (bottom) successfully
highlight the whole region of the object.

3.PROPOSED METHOD

 图二:所提出方法的总体架构。transformer 编码器生成ClusterCAM和补丁间注意力权重(P2P Attn.weights)。然后,这些用于细化CAM,CAM是由与ClusterCAM和transformer 编码器的最后一个特征图连接形成的特征生成的,并产生伪标签。级联的特征图也被馈送到分割解码器中,以预测最终的分割掩模。

3.1 CLUSTERING-GUIDED CLASS ACTIVATION MAP

我们的目标是利用集群和类之间的关系来生成包含整个目标对象的注意力图。首先,将transformer块X∈R^(H×W+K)×C的输入标记分为类标记Xcls∈R^ K×C和补丁标记Xpat∈R ^H×W×C,其中H、W、K和C分别表示高度、宽度、类数和通道数。为了便于聚类,我们使用简单的卷积块将补丁token投影到适合计算相似性的位置,如下所示:

其中F(·)和LN(·)分别表示1×1卷积运算和层归一化。遵循[23]中提出的策略,我们进行了patch聚类。然而,与之前侧重于在局部对相似token进行分组的方法不同,所提出的方法在没有空间约束的情况下聚合patch,以考虑目标对象可能占据的大面积。具体来说,我们用规则网格区域中patch token的平均值初始化集群tokenX_{clu}^{0}∈R^ N×C,其中集群token的数量为N=(H /h)×(W /w),给定网格大小为h×w。然后,我们计算关联矩阵S^ i∈R^ HW×N,它表示展平patch token \bar{X}_{pat}^{'}∈R^ HW×C和簇token之间的相似性,如下所示:

 其中i表示聚类过程中的迭代次数。σ(·)表示softmax函数。为了确保每一列中的条目都反映了每个patch token属于相应集群token的贡献,我们对关联矩阵的列进行了归一化。然后,我们根据patch token的贡献通过patch token的加权和更新集群token,如下所示:

其中\hat{S}^{i}是S i的列标准化版本。请注意,我们重复此过程10次,以产生最终的集群token Xclu。

为了估计集群到类的关系,集群token与类token Xcls连接在一起,并进行自注意力,如下所示:

其中C(x1,x2)表示x1和x2沿信道方向的级联,MHSA(·)是多头自关注操作。请注意,我们的基于聚类的注意力模块与典型transformer块内的标准MHSA层并行执行。随后,来自两个注意力操作的输出token 与transformer块的输入token 的残差相结合,并馈入MLP层。为此,我们通过对聚类标记Yclu∈R ^N×C进行反向映射来对齐输出标记的形状,这些标记与基于聚类的注意力模块中的自注意力操作的输出标记分离,即(4)中的Y。反向映射简单地通过(2)中关联矩阵S∈R HW×N的点积运算来实现,该运算用于将补丁转换为簇token,如下所示:

 随后,转换后的集群token 与(4)中的类token Ycls连接在一起,类token 也与输出token Y分离,并与MHSA层组合,以馈送到MLP层,如下所示:

其中 X′ 表示当前transformer模块的输出token。请注意,我们的transformer编码器由12个连续的transformer模块组成。transformer模块的详细过程在图3中进行了说明。 

现在,我们准备生成我们提出的ClusterCAM。生成我们提出的ClusterCAM的过程在图4中描述。首先,我们从多头自注意力(MHSA)操作(4)中的自注意力权重矩阵A∈R^(K+N)×(K+N)提取K个类别标记和N个聚类标记之间的注意力权重(即,Ac→c∈R^K×N)。类似于在(5)中将聚类标记转换为补丁级别,我们还使用关联矩阵S∈R^HW×N对提取的聚类到类别的注意力权重Ac→c进行反向映射。然后,我们通过加权和补丁到类别的注意力权重Ap→c∈R^K×HW来生成ClusterCAMAclu∈R^K×HW,如下所示:

其中α是与网络一起训练的权重参数。

 3.2伪标签生成

我们建议利用ClusterCAM中对象区域的空间信息,即Aclu,不仅用于生成伪标签,还用于预测准确的分割掩模。为了实现这一点,我们将transformer编码器F∈R^ C×HW的输出特征图与从MHSA操作的所有头和所有transformer块获得的ClusterCAM连接起来。然后将得到的级联特征图F′∈R(C+12KV)×HW馈送到卷积层以生成CAM和分割解码器。V表示用在MHSA头的数量。为了生成伪标签,我们按如下方式计算CAM:

 其中G(·)表示1×1卷积运算,它将信道数量减少到类K的数量。

然后,我们通过使用ClusterCAM Aclu∈R^ K×HW和补丁来细化CAM,并对注意力权重Ap2p∈R HW×HW进行补丁,如下所示:

我们应用最小最大归一化并进行阈值处理,以分配前景、背景和忽略的像素,如下所示:



3.3损失函数

由于我们提出的方法基于端到端框架,因此网络是通过单级方式使用分类和分段损失进行训练的。具体来说,分类损失Lcls和Lcam是通过分别从类标记和CAM获得的类分数来计算的。首先,我们通过简单地按照[17]对类标记的相应值进行平均来获得每个类别的类得分。此外,将全球平均池(GAP)应用于CAM以生成课堂分数。然后,这些类别分数用于使用二进制交叉熵损失函数计算分类损失,如下所示:

其中y表示类标签。gcls和gcam分别表示根据类标记和CAM计算的类分数。

对于分割损失Lseg,我们采用如下的交叉熵损失函数:

其中Pi,j和P*i,j分别表示预测的分割结果和位置(i,j)处的伪标签。是在(11)中不被忽略的像素位置的集合。最后,总损失函数由以下三项组成:

这篇关于Clustering-Guided Class Activation for WeaklySupervised Semantic Segmentation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109548

相关文章

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering)

Spark MLlib模型训练—聚类算法 PIC(Power Iteration Clustering) Power Iteration Clustering (PIC) 是一种基于图的聚类算法,用于在大规模数据集上进行高效的社区检测。PIC 算法的核心思想是通过迭代图的幂运算来发现数据中的潜在簇。该算法适用于处理大规模图数据,特别是在社交网络分析、推荐系统和生物信息学等领域具有广泛应用。Spa

类型信息:反射-Class

在说反射前提一个概念:RTTI(在运行时,识别一个对象的类型) public class Shapes {public static void main(String[] args) {List<Shape> shapes = Arrays.asList(new Circle(), new Square(), new Triangle());for (Shape shape : shapes

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

泛型参Class、Class、Class的对比区别

1.原文链接 泛型参Class、Class、Class的对比区别 https://blog.csdn.net/jitianxia68/article/details/73610606 <? extends T>和<? super T> https://www.cnblogs.com/drizzlewithwind/p/6100164.html   2.具体内容: 泛型参数Class、

c++通用模板类(template class)定义实现详细介绍

有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:class Compare_int { public : Compare(int a,int b) { x=a; y=b; } int max( ) { return (x>y)?x:y; } int min( ) { return (x&... 有时,有两个或多个类,其功能是相同的,仅仅是数

Python方法:__init__,__new__,__class__的使用详解

转自:https://blog.csdn.net/qq_26442553/article/details/82464682 因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际

SpringBoot启动报错Failed to determine a suitable driver class

两种解决办法 1.在Application类上加 ` @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) package com.example.demo3;import org.springframework.boot.SpringApplication;import org.springframewo

easyswoole not controller class match

not controller class match composer.json 注册 App 这个名称空间了吗?执行过 composer dump-autoload 了吗?存在 Index 控制器,但是文件大小写、路径都对了吗? task socket listen fail 注意,在部分环境下,例如 win10 的 docker 环境中,不可把虚拟机共享目录作为 EasySwoole 的 T

JavaBug系列- Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class load

JavaBug系列之Mysql驱动问题 Java医生一、关于错误信息二、如何解决问题 Java医生 本系列记录常见Bug,以及诊断过程和原因 Java/一对一零基础辅导/企业项目一对一辅导/日常Bug解决/代码讲解/毕业设计等 V:study_51ctofx 一、关于错误信息 APPLICATION FAILED TO START Description: Fai

【上】java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错

java获取requestMapping上所有注解功能实现及取匿名注释类的值及 class com.sun.proxy.$Proxy140 转换出错 1,多人相当然以为类似对象一样直接强转下就可以,结果迎来的是class com.sun.proxy.$Proxy140转换出错【想法很勇敢,现实很骨感】 //Class<A> operatorMappingAnnotationType// 错误