当前位置: 首页 > news >正文

【CVPR2022】Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation

论文

标题:Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation

收录:CVPR 2022

paper: https://arxiv.org/abs/2203.00962

code: https://github.com/zhaozhengChen/ReCAM

解读:https://zhuanlan.zhihu.com/p/478133151

https://mp.weixin.qq.com/s?__biz=MjM5MjgwNzcxOA==&mid=2247486185&idx=1&sn=1af2452dc2600cde9cf782d9534c7856&chksm=a6a1e4a091d66db62bc0d1bb0fdb58b927bad5059c6b6dff7cd96858e0ee18f9393873a82796&scene=178&cur_album_id=2116789972333658114#rd

本篇文章利用分类标签训练分类网络生成CAM出发,引出了使用BCE作为损失函数对于分类网络生成CAM的缺陷,并以此为基础,提出了一种结合BCE和SCE(即softmax 交叉熵,一般用于单标签图像分类)来训练分类网络的的方法。该方法极大程度的提升了CAM的质量。以CAM为基础生成的伪标签来训练的分割模型,最终在使用Deeplab v2的情况在VOC和MS COCO测试集上分别达到了68.2%和45.0的mIoU。当然在使用更好的框架和训练技巧后,VOC测试集的mIoU可以提升至72.2%。

摘要

提取类激活图(class activation maps, CAM)可以说是为弱监督语义分割(WSSS)生成 pseudo mask 的最标准步骤。然而,论文发现,在CAM中广泛使用的二进制交叉熵损失(Binary Cross-Entrop, BCE) loss 是导致 pseudo mask 效果不佳的症结所在。具体地说,由于BCE的 sum-over-class pooling 特点,每个像素CAM可以响应于在同一感受野中共同出现的多个类别。因此,给定一个类,它所激活的CAM像素可能错误地侵入属于其他类的区域,或者非激活的CAM像素实际上可能是类的一部分。为此,论文介绍了一种简单但效果惊人的方法:通过使用softmax cross-entropy loss(SCE)来重新激活用BCE收敛的CAM,称为ReCAM。给定一幅图像,使用CAM来提取每个单独类的特征像素,并将它们与类标签一起使用来学习另一个在backbone之后的具有SCE的全连接层。一旦收敛。就可以使用CAM相同的方法提取ReCAM。由于SCE的对比性(contrastive nature),像素响应被分成不同的类别,因此预期的掩码模糊性较小。

引言

Weakly-supervised semantic segmentation (WSSS) 旨在通过使用 "weak" labels,例如:随意的画一笔, bounding box, 或者image-level的标签去减少 "strong" 的标注,image-level的标签是最经济又最具挑战性的任务,因此也是本文的重点。一个比较通用的pipeline由以下三步组成:

  1. 使用image-level的标签去训练一个多分类模型。

  1. 使用例如 erosion 或者 expansion 的 potential refinement 策略为每一类提取class activation map(CAM)生成一个0-1mask。

  1. 使用生成的mask作为伪标签去训练一个基础的全监督语义分割网络。

影响最终分割模型性能的因素各有不同,但第一步的分类模型绝对是根本。我们经常观察到两个共同的缺陷:对于种类A的一个object 的CAM,他有:

  • 为A类激活但具有B类的实际标签的假阳性像素false positive pixels,其中B通常是A的混淆类而不是背景-语义分割中的特殊类。

  • 属于A类但是却被错误的贴上背景标签的 false negative pixels。

作者指出,当用具有Sigmoid激活函数的二进制交叉熵(Binary Cross-Entrop, BCE)损失来训练模型时,这些缺陷尤其明显。具体的说,sigmoid function是 ,其中 x代表每个单个类的预测分。 输出被喂给BCE函数去计算loss。此loss表示对应于x的错误分类的惩罚强度。因此,BCE损失不是类别互斥的——一个类别的错误分类不会惩罚其他类别的激活。这对于训练多标签分类器是必不可少的。因此,当从这些分类器中提取CAM的时候,我们可以看到这些缺点:不同的类别会共同激活一个区域,结果就是CAM中的false positive pixels。由于部分激活是共享的,所以对Tota lClass的激活是有限的(导致false negative pixels)。

动机

图1说明,使用BCE时CAM质量比不过使用SCE的质量,SCE的分类能力比BCE强。作者指出这是因为BCE的Sigmoid激活函数没有强制类独占学习,混淆了相似类之间的模型。

SCE鼓励改善 ground truth的分数,同时惩罚其他的。这对CAM有两个影响:

  • 减少不同类别间融合模型的假阳性像素 false positive pixels;

  • 鼓励模型探索特定于类的特征,以减少假阴性像素 false negative pixels。

图1. BCE和SCE的比较,在MS COCO 2014选single-label训练80class和5class分类器,SCE的分类能力都比BCE强。

通过观察分类网络生成的类激活图(CAM),可以发现,在CAM中通常会出现如图2所示的两种错误:

  1. False Negative(假负例):即会把一些不是背景的像素激活为背景;

  1. False Positive(假正例):即会把一些区域的像素激活为图像中存在的其他类别。

作者认为这是使用BCE作为损失函数来监督多标签分类任务的局限性。在BCE的这种多标签分类模式中,模型最终会把特征图全局平均池化得到的预测向量输入到sigmoid中,然后计算BCE损失。这种模式中,各个类别的预测是互不相关的(本质上就是多个独立二分类器集成)。就拿一个图片中存在摩托车和人两个类别而言,模型对于车的预测的错误不会影响到对于人的预测,反之亦然。因此,这导致了在进行CAM时,同一区域,两个类别的激活值都高,甚至错误类别的激活值高于正确类别的。这也是False Positive现象出现的原因。CAM只能发现目标最具判别力的部分的缘故,利用CAM作为监督信息训练出的语义分割网络始终与真正的ground truth作为监督信息的网络存在较大差距。(CAM通常只覆盖了对象中最具识别性的部分,在背景区域激活不正确,这可以分别概括为目标的激活不足背景的激活过度。)

因此,作者针对以上问题提出了在BCE的基础上加入SCE(即softmax来激活预测向量再送入交叉熵损失函数CE中,常用于单分类)来联合训练分类网络。

具体地说,当模型收敛于BCE时,对于图像中标注的每个独立类,作者通过normalized soft mask的格式提取CAM,即非hard thresholding。分别将所有 mask 应用于特征(即由backbone输出的 feature map block),每个mask “highlighting”用于特定类别分类的特征像素。这样,将多标签特征分解为一组单标签特征。因此,可以使用这些特征(和标签)来训练具有SCE的多类分类器,例如,通过在backbone之后插入另一完全连接层。SCE Loss可以惩罚任何由不良特征或不良mask引起的错误分类。然后,反向传播它的梯度也有助于这两点。一旦收敛,可以用与CAM相同的方式提取ReCAM。

图2. CAM中的两种错误以及ReCAM对其的改进。

方法

多标签的分类任务与单标签分类任务的结合。

图3. 使用ReCAM的pipeline。两个步骤:种子生成和掩码生成(4种方式)。

使用BCE进行多标签分类器的常规训练。论文使用ResNet50做BackBone提取特征f。再提取每个类的CAM,然后将其(作为归一化的软掩码)应用于特征图f,以获得类的特征。软掩码)在特征图f上,以获得特定类别的特征f_k。在下部分,使用fk和它的单一标签来学习 用SCE损失学习多类分类器。这个损失的梯度被 通过整个网络包括主干网进行反向传播。

图4. ReCAM框架图

算法流程

FC Layer-1 with BCE Loss. 在传统的CAM模型中,特征 f(x)首先通过 GAP 层,然后将结果馈送到FC层进行预测。因此,预测逻辑可以表示为:

然后,使用 z 和 image-level label y来计算BCE Loss。

Extracting CAM. 在给定特征 f(x) 和FC层的相应权重 w_k的情况下,我们提取每个单独类 k的CAM,如公式(2)所示。为简明起见,我们将记为

Single-Label Feature. 使用M_k作为soft mask 应用于 f(x) 去提取class-specific feature ,我们如下计算M_k和f(x) 的每个通道之间的逐元素乘法,

其中表示通过使用M_k 乘法之前和之后的单通道, c的范围从 1 到C ,C 代表feature map的通道数。feature map block (每个包含C个通道)对应于图3中的示例 f_1,f_2,f_3。

FC Layer-2 with SCE Loss. 每个 具有单个对象标签(即,其中第 k 个位置为 1的一个热标签)。然后,我们将其提供给FC第二层以学习多类分类器,因此我们有了新的预测逻辑x ,如下所示:

这里的 FC2和 FC1有相同的结构。通过这种方法,成功地将基于BCE的多标签图像模型转换为基于SCE的单标签特征模型。SCE loss公式为:

其中y[k]和 表示 y和 的第k 个元素,我们使用L_sce的梯度来更新包括backbone在内的模型。

其中 要在 BCE和SCE之间取得平衡。

Extracting ReCAM. 在重新激活之后,我们将图像 x 馈入其中以如下提取其每个类别 k 的 ReCAM,(消融实验见Table1)

Refining ReCAM (Optional).

分析

来源https://mp.weixin.qq.com/s?__biz=MjM5MjgwNzcxOA==&mid=2247486185&idx=1&sn=1af2452dc2600cde9cf782d9534c7856&chksm=a6a1e4a091d66db62bc0d1bb0fdb58b927bad5059c6b6dff7cd96858e0ee18f9393873a82796&scene=178&cur_album_id=2116789972333658114#rd

1)为什么加入SCE后要优于只使用BCE?

作者花了很多的篇幅来解释这一点。具体来说就是通过分析BCE的损失函数与SCE的损失函数的梯度来证明。SCE在模型预测正例与负例的的概率相近时会梯度较大,鼓励模型偏向预测正例而抑制负例的预测。而BCE则不然,此时,模型的梯度很小,模型倾向于不更新参数。这其实本质上就是sigmoid函数和softmax函数的区别。以上就解释了为什么加入SCE后能够减少图2中的False Positive现象。

2)为什么要将原始CAM与特征图相乘?

翻看实验,可以发现在MS COCO上没有使用这一操作,只在VOC上用了这一操作。MS COCO是直接将特征图 f 直接copy三份送入FC2中。这样效果更好。文中也没有给出明确的解释。

个人认为,这种相当于一种先验信息的加权,告诉分类器哪些区域的响应值应该重点关注,以此作为分类的依据。这种做法显然我觉得是能够提升分类的性能的。同时也能够降低那些False Positive现象。因为CAM中如果用错位激活成了别的类别的话,会在相乘后在SCE的监督下重点被改正。但是,我认为这样的做法会导致False Negative的现象得不到改善。因为分类器只需要依靠这些区域就能分类了,就不用再去注意其他的非判别性区域了,因此,那些非判别性区域就很有可能会被激活成背景。

综上,这种相乘的做法优势和劣势并存,需要结合具体情况使用。

实验

消融实验

比较实验

相关文章:

【CVPR2022】Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation

论文标题:Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation收录:CVPR 2022paper: https://arxiv.org/abs/2203.00962code: https://github.com/zhaozhengChen/ReCAM解读:https://zhuanlan.zhihu.com/p/478133151https:…...

PMP项目管理项目运行环境

目录1 概述2 事业环境因素和组织过程资产3 组织系统3.1 概述3.2 组织治理框架3.2.1 治理框架3.2.2 项目治理3.3 管理要素3.4 组织结构类型3.4.1 组织结构类型3.4.2 项目管理办公室1 概述 项目所处的环境可能对项目的开展产生有利或不利的影响,这些影响的两大主要来…...

Vue 3.0 渲染函数 【Vue3 从零开始】

Vue 推荐在绝大多数情况下使用模板来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用渲染函数,它比模板更接近编译器。 让我们深入一个简单的例子,这个例子里 render 函数很实用。假设我们要生成一些…...

西电软件体系结构核心考点汇总(期末真题+核心考点)

文章目录前言一、历年真题二、核心考点汇总2.1 什么是软件体系架构?(软件体系结构的定义)2.2 架构风格优缺点2.3 质量属性2.4 质量评估前言 主要针对西安电子科技大学《软件体系结构》的核心考点进行汇总。 【期末期间总结资料如下】 针对西电计科院软件工程专业大三《软件体…...

SRS源码分析-SDP内容解析

前言 在学习SRS的RTC模块之前&#xff0c;首先来分析下SRS在将rtmp推流转成rtc流&#xff0c;通过浏览器拉取webrtc流场景下产生的SDP内容 SDP格式介绍 SDP数据是文本格式&#xff0c;由多个 <key><value> 表达式构成&#xff0c;<key>的值只能是一个字符…...

HTML 颜色

HTML 颜色 HTML 颜色采用的是 RGB 颜色&#xff0c;是通过对红 (R)、绿 (G)、蓝 (B) 三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的&#xff0c;RGB 即是代表红、绿、蓝三个通道的颜色。 Color Values HTML 颜色由一个十六进制符号来定义&#xff0c;这个符…...

MySQL高可用架构之InnoDB Cluster部署

MySQL高可用架构之InnoDB Cluster部署InnoDB Cluster适用场景准备工作安装MySQL Shell使用MySQL Shell搭建InnoDB Cluster初始化第一个实例创建InnoDB Cluster添加副本实例创建相关用户MySQL Router部署安装MySQL Router引导MySQL Router启动MySQL Router环境准备 主机名IPOS版…...

Linux安装minio单机版

说明&#xff1a;因为前面记录了一下minio的使用&#xff0c;这里说一下minio的安装&#xff0c;只是单机版哦 环境准备&#xff1a;Linux系统 说明图&#xff1a; 1.创建文件夹命令 我的是安装在/usr/local 文件夹下面的创建文件夹命令 #进入目标文件夹 cd /usr/local#创建…...

网络总结知识点(网络工程师必备)四

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放,树高千尺,落叶归根人生不易,人间真情 目录 前言 71.NAPT有什么特点? 72.ARP欺骗解决方法...

数据结构——第三章 栈与队列(5)

共用栈和双队列1.共用栈2.双端队列栈与队列的本章小节1.共用栈 在实际应用中&#xff0c;有时一个应用程序需要多个栈&#xff0c;但这些栈的数据元素类型相同。假设每个栈都采用顺序栈&#xff0c;由于每个栈的使用情况不尽相同&#xff0c;势必会造成存储空间的浪费。若让多…...

CSDN竞赛第33期题解

CSDN竞赛第33期题解 1、题目名称&#xff1a;奇偶排序 给定一个存放整数的数组&#xff0c;重新排列数组使得数组左边为奇数&#xff0c;右边为偶数。&#xff08;奇数和偶数的顺序根据输入的数字顺序排 列&#xff09; #include<bits/stdc.h> using namespace std; t…...

农产品销售系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;这篇文章主要描述的是农产品蔬菜在线销售系统的设计与实现。主要应用关于JSP网站开发技术&#xff0c;并联系到网站所处理的数据的结构特点和所学到的知识&#xff0c;应用的主要是Mysql数据库系统。系统实现了网站的基本功能&…...

C语言-基础了解-08-C判断

C判断 一、C判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假…...

用数组名作函数参数的详解,以及形参实参采用数组名,形参实参采用指针变量的几种情况解析

关于地址&#xff0c;指针&#xff0c;指针变量可以参考我的这篇文章&#xff1a; 地址&#xff0c;指针&#xff0c;指针变量是什么&#xff1f;他们的区别&#xff1f;符号&#xff08;*&#xff09;在不同位置的解释&#xff1f;_juechen333的博客-CSDN博客https://blog.csd…...

k8s中的PV和PVS

前言&#xff1a;容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;…...

【云原生】Gateway网关选型

网关一般分为流量网关和业务网关&#xff0c;流量网关负责接入所有的流量&#xff0c;并分发给不同的子系统&#xff0c;那在具体的业务接入之前&#xff0c;还有一层业务网关。流量网关提供全局性的、与后端业务应用无关的策略&#xff0c;例如 HTTPS证书卸载、Web防火墙、全局…...

QML Button详解

1.Button简介 Button表示用户可以按下或单击的按钮控件。按钮通常用于执行一个动作&#xff0c;或回答一个问题。典型的按钮有确定、应用、取消、关闭、是、否和帮助。 Button继承自AbstractButton&#xff0c;提供了以下几种信号。 void canceled() //当按…...

【编程实践】什么是好/坏代码?非程序员的示例

What is good/bad code? An illustrated example for non-programmers 什么是好/坏代码?非程序员的示例 目录 What is good/bad code? An illustrated example for non-programmers什么是好/坏代码?非程序员的示例 So what is ‘Bad Code’, as a layperson?那么,作为…...

一个简单的Sublime设置

问题 如果读者熟悉我&#xff0c;应该会发现我经常使用 VSCode 作为主力编辑器&#xff0c;但随着我安装的 VSCode 的插件逐渐增加&#xff0c;我发现对于部分较小的任务使用 VSCode 过于笨重&#xff0c;比如简单的 Markdown 文件编辑工作。 在经过一系列寻找后&#xff0c;…...

c语言经典例题-选择结构程序设计进阶

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 快递费用计算&#xff1a; 题目&#xff1a; 代码思路&#xff1a; 代码表示&#xff1a; 计算一元二…...

NOI 2023春季测试 游记

怎么说&#xff0c;没遇到大波折即幸运。 Day 0 睡到下午三点&#xff0c;然后列了一堆复习计划&#xff0c;大概是左偏树等一些早就忘没的科技。 但是沉迷打块&#xff0c;最后基本什么计划也没完成。 白天睡多了&#xff0c;晚上睡不着&#xff0c;大概半梦半醒过了一整夜…...

【VC 7/8】vCenter Server 基于文件的备份和还原Ⅱ——使用 FTP 协议备份 VC(VAMI 英文)

目录2. 备份 vCenter Server2.1 使用 FTP 协议备份 VC&#xff08;1&#xff09;登录 vCenter Server 管理界面&#xff08;2&#xff09;进入Backup页面&#xff08;3&#xff09;配置 Backup Schedule&#xff08;4&#xff09;开始备份&#xff08;5&#xff09;备份成功&am…...

Python基础—文件操作(二)

Python基础—文件操作(二) CSV格式文件 逗号分隔值&#xff0c;以纯文本形式存储表格数据 由任意数目的记录组成&#xff0c;记录间以换行符分隔 每条记录由字段组成&#xff0c;字段间用逗号或制表符分隔 每条记录都有同样的字段序列 如有列名&#xff0c;位于文件第一行 每条…...

学校的班级个数【并查集基础应用,Java实现】

题目描述 现有一个学校&#xff0c;学校中有若干个班级&#xff0c;每个班级中有若干个学生&#xff0c;每个学生只会存在于一个班级中。如果学生A和学生B处于一个班级&#xff0c;学生B和学生C处于一个班级&#xff0c;那么我们称学生A和学生C也处于一个班级。 现已知学校中共…...

WSL2使用Nvidia-Docker实现CUDA版本自由切换

众所周知&#xff0c;深度学习的环境往往非常麻烦&#xff0c;经常不同的项目所依赖的 torch、tensorflow 包对 CUDA 的版本也有不同的要求&#xff0c;Linux 下进行 CUDA 的管理比较麻烦&#xff0c;是一个比较头疼的问题。 随着 WSL2 对物理机显卡的支持&#xff0c;Nvidia-…...

pygame9 扫雷游戏2

一、响应鼠标左键事件 pygame.MOUSEBUTTONDOWN 表示鼠标事件发生&#xff0c; pygame.mouse.get_pressed()[0] 确认是鼠标左键被按下 pygame.mouse.get_pos() 获取到鼠标按下时的坐标值。 因此&#xff0c;我们可以在事件逻辑中例用此三个函数判断鼠标事件及对应的坐标&#x…...

逻辑电路代数运算(上)

逻辑代数L是一个封闭的代数系统&#xff0c;由一个逻辑变量集K&#xff0c;常量0和1&#xff0c;以及与或非三种基本运算构成。 参与逻辑运算的变量叫逻辑变量&#xff0c;用字母A&#xff0c;B……表示。每个变量的取值非0 即1。 0、1不表示数的大小&#xff0c;而是代表两种不…...

Rabbit快速入门

入门案例 需求&#xff1a;使用简单模式完成消息传递 步骤&#xff1a; 创建工程&#xff08;生成者、消费者&#xff09; 分别添加依赖 编写生产者发送消息 编写消费者接收消息 3.1.2. 添加依赖 往heima-rabbitmq的pom.xml文件中添加如下依赖&#xff1a; <dependenc…...

【react+ts- forwardRef】

reactts- forwardRef1. 学习资料2. 普通input透传2.1 TS版本2.2 JS版本3. TS-Antd-Form组价透传引用传递&#xff08;Ref forwading&#xff09;是一种通过组件向子组件自动传递 引用ref 的技术。对于应用者的大多数组件来说没什么作用。但是对于有些重复使用的组件&#xff0c…...

计算机网络-- 网络层(day06)

文章目录网络层思维导图IPv4地址的应用规划定长的子网掩码变长的子网掩码VLSMIP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报静态路由选择动态路由选择路由选择协议概述常见的路由选择协议路由器的基本结构路由信息协议RIP的基本工作原理开放最短路径优先OSPF的基…...