Press "Enter" to skip to content

CNN 可视化:从 CVPR22 的出发,聊聊CAM是如何激活我们文章的热度

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

作者丨 matrix明仔

 

卷首语

 

CAM的文章以及代码链接如下:

 

代码链接: https://github.com/jacobgil/pytorch-grad-cam

 

文章链接: https://arxiv.org/pdf/1610.02391v1.pdf

 

这个问题起源于我的对于现阶段 CAM解释网络特征变化的未来发展的 一些不确定。我自己在20年开始写文章就沉迷上使用了 CAM去解释自己的添加的网络结构模块了。 我对于 CAM的接触时间还蛮长的 ,从开始的热恋期到现在的倦怠期,我越来越不觉得 CAM 的图能给我带来眼前一亮的感觉了。加上现在一些文章的滥用,在一堆图片中选择出效果最好的几张进行所谓的CAM的解释,这样的工作会逐渐让我觉得这个东西的无用和鸡肋。

 

所以今晚就想和大家聊聊,在 CVPR2022 中三篇不同领域的文章中 CAM 的表现, 对未来的CAM发展或者是未来可解释深度模型的发展 希望得到一些启发!

 

先简单快速的回顾一遍CAM

 

首先CAM是什幺?

 

CAM全称 Class Activation Mapping ,既类别激活映射图,也被称为类热力图、显着性图等。我们可以简单的理解为是图像中信息对于预测结果的贡献排名,分数越高 (颜色越热) 的地方表示在输入图片中这块区域对网络的响应越高、贡献越大,也就是 吸引网络注意力 的地方!

 

如何生成CAM

 

CNN的操作可以看做是滤波器对图片进行特征提取,我们可以大胆直接的得出结论, 被一层层卷积核提取后,基本就是卷积核判断是重要的信息,其值越大,特征越明显,得到卷积的关注度就越高。

 

一个深层的卷积神经网络,通过层层卷积操作,提取出语义信息和空间信息,我们一直都很希望可以打破深度神经网络的黑盒,可以溯源特征提取的过程,甚至可以知道 特征 所代表的 语义内容, 通常每一层的特征图还会有很多的层,我们一般用channel表示,这些不同层(通道)特征图,我们可以认为理解为存放着卷积提取到不同的特征。随着卷积的逐层深入,该特征已经失去了原有的空间信息和特征信息,被进一步的集成压缩为具有高度抽象性的特征图。这些特征图所代表的语义信息我们不得而知,但是这些特征图的重要性我们却可以通过计算得出。所以我们的CAM主要作用就是根据不同通道的贡献情况, 融合出一张CAM图 ,那幺我们就可以更直观的了解到在图像中那些部分是在 CNN中是高响应 的重要信息,哪些信息是无关紧要的无聊信息。

 

CAM获取的步骤如下:

 

step1:选择可视化的特征层,例如尺寸为 16∗16∗1024 的特征图

 

step2:获取该特征的每个channel的权重,即长度为1024的向量;

 

step3:通过线性融合的方式,把不同channel的权重赋回原特征图中,在依次的将各个通道的特征图线性相加

 

获取尺寸为16*16的新特征图;

 

step4:对该新特征图进行归一化,并通过插值的方式还原到原图尺寸;

 

Partial Class Activation Attention for Semantic Segmentation

 

代码链接: https://github.com/lsa1997/PCAA

 

文章链接: https://openaccess.thecvf.com/content/CVPR2022/papers/Liu_Partial_Class_Activation_Attention_for_Semantic_Segmentation_CVPR_2022_paper.pdf

 

文章任务背景

 

场景分割的工作其实大致上可以主要可以分为两个任务,在局部视野下聚合同一类的像素和在全局视野下区分不同类别的像素。说得简单,但是在实际场景中,由于纹理、光照和位置的不同,属于同一类别的像素在特征响应也可能会有很大的差异 ,这样就会产生像素之间的粘连,边界区分不明显的问题。 (不同类别内的粘连问题,如下图e,CAM所展示的效果) 。对于这种问题,之前的工作会选择使用像 金字塔 、 空洞卷积 还有 自注意力机制 这些结构,通过融合不同的感受野下的特征信息,不同的分辨率下的空间信息,以及深度挖掘不同类别下的特征信息,来帮助网络解决不同物体之间边界区分,以及同一物体的像素聚合。

 

为了消除局部上下文方差引起的类内不一致,在原有的基于图像级分类的局部定位算法基础上, 局部类激活注意 (Partial Class Activation Attention, PCAA)算法,该算法将定位任务细分为区域级预测任务,获得了较好的定位性能。比如我们大致的锁定物体出现的区域(局部中心位置),然后计算局部中心与其他像素的相关程度再对区域内的物体进行更一步的局部聚合。它同时利用局部和全局的信息进行特征聚合,

 

本文提出了 Partial CAM ,它将 CAM 的功能从整体预测扩展到区域级别的物体预测,并实现了非常不错的定位性能。 到底有多不错呢? 我们可以看看下图的效果比较,会发现使用了Partial CAM的结构后的整体激活效果会更加的 重视目标对象的分割边缘 ,在同一物体中激活效果会 更加聚集 ,非同一物体的会激活像素点会 更加远离 。

 

这里是展示的是不同的方法同一场景下的类激活效果

文章的工作内容

 

文章希望有一种方法可以打破以往的在局部视野下聚合同一类的像素和在全局视野下区分不同类别的像素的建模思路,使用一个局部延申到全局的建模思路,完成场景分割。本文将输入的图像分割成不重叠的patch块,一个patch块相当于一个小分割区域,通过对这样的小区域进行像素的激活工作,不断的堆叠,我们可以从局部逐步的细化整目标的分割精度。具体来说,它首先根据局部CAM收集到的局部信息,并计算每个patch内部像素到类的相似度映射。对于每个类,所有的区域信息会被聚合到一起,聚合在全局中心周边。 PCAA还 通过计算区域之间像素之间的方差距离来考虑区域内容上下文的连贯性,更好的区分物体与物体之间的联系,解决边界黏连的问题完成分割任务。

 

一个小提示,其实因为CAM其实原本设计并不是实现在语义分割任务上的,在空间上信息并关注,所以我们需要一点本土化的改进。 这样文章提出的像素级别特征聚集和激活目前只能使用在语义分割场景中,因为语义分割场景会提供像素级别的GT标注,像目标检测和分类任务就暂时不能支持了。

 

我们提出了 区域类激活注意 (PCAA)。与以往的简单使用像素特征或全局中心相比,PCAA同时使用局部和全局表示。与传统的定位算法相比,局部定位算法使网络学习到更多的空间信息,能够提供更可靠的定位结果。而且它在有效的保留了全局特性之外,也考虑到了局部特殊性,更加的适配 语义分割、图像超分辨率这类型的 需要更加细致的细节信息的像素级别任务。

 

文章方法的介绍

 

文章的模型设计图

从模型的结构看,主要可以分为大整体和小局部的两个模块

 

Partial CAM(PCAM)

 

图像经过CNN进行特征提取后,得到特征图xin ,特征经过一个1×1的卷积之后,经过一个SxS的全局平均池化层希望在每个patch的区域中都能生成CAM,区域的面积就是SxS。之后我们将label转换为独热向量,然后我们把转化为独热向量后的Label通过maxpool生成每个patch的标签。

 

Sc=Sigmoid(AvgPoolxS×S(Ac))

 

ˆLc=MaxPoolS×S(Lc)

 

通过这样的方式就可以让PCAM的生成的局部激活图得到有效的监督。与分类级标签相比,像素级别的标签对网络空间信息进行更细粒度的监督,因此,PCAM比普通的CAM具有更精确的定位性能,通过这样的方式我们就可以得到有效精确的PCAM图了。

 

PCAA

 

PCAA独特地采用了部分CAM来建模像素关系,在两步注意力加权计算 (局部和全局) 中利用了不同类型的类中心。与整个图像相比,属于同一类的特征在每个部分内的方差往往更小。通过计算不同局部类中心的相似度图来缓解局部特异性的影响。同时,采用全局表示进行特征聚合,保证了最终输出的类内一致性。

 

PCAA中具体分为以下几个结构

 

我们把得到的特征图分成大小为SxS的小Patch,我们把PCAM图用SoftMax转化为类别概率对各个特征图进行加权处理

 

1、Local Class Center

 

在得到每个部分的精准PCAM图后,我们把激活图进行SoftMax的归一化之后得到一个概率得分,然后将这组概率得分加权到各个patch上,对每组的patch进行整体的激活。之后再利用 Sc 激活每个patch的局部中心点。

 

Local Class Center

 

采用图卷积的单元来建模每个Patch局部中心之间的相互作用以及特征之间的相互联系,寻找相关连的单元节点,然后将节点们聚合更新出一版新的节点。

 

2、Global Class Representation

 

由于局部中心点是在每个区域内计算的,同一类的目标物体表示也有敏感的特征不是一致的(比如部分对颜色敏感,部分对纹路敏感)但是这些特征都是聚合成完整物体不可缺失的特征信息。为了提高整个图像的类间的特征一致性,我们需要所有区域中心通过加权聚合的方式进行融合,将同一类物体的敏感的特征们进行聚合。

 

3、Feature Aggregation

 

我们将local的权重以及global的权重加权到特征图中进行线性的加权融合得到了最后的特征图输出。

 

实验结果

文章的贡献

 

1、提出部分类激活映射(Partial Class Activation Map)作为一种表示像素关系的新策略。通过将图像级分类任务细分为区域级预测,改进了CAM的生成。

 

2、设计了部分类激活注意(Partial Class Activation Attention)来增强特征表示。它同时考虑了局部特异性和全局一致性。

 

3、通过大量实验验证了所提方法的有效性。具体来说,方法在cityscape上实现了82.3%,在Pascal Context上实现了55.6%,在ADE20K上实现了46.74%。

 

看完后对于CAM的感受

 

本文首次探讨了利用类激活映射 (Class Activation Map, CAM) 建模像素关系的方法。PCAM是一种可以用于语义分割的具有空间特性的类激活映射建模方法。CAM方法可以从分类模型定位对象。这对于弱监督任务至关重要,但完全会忽略了空间关系。对于一个全监督的分割任务,像素级别的注释使我们能够引入空间信息,以更精确地生成CAM。

 

这次的CAM其实并没有像以往的工作一样,只是单纯的作为一个可视化的工具,而是挖掘了CAM的作为一个区域指导先验的这样一个可能性。通过有效的监督类激活的信息,让CAM再一次切实的参与到模型的建设当中。我觉得以CAM作为构建一个即插即用的蓝本模型,我认为是一个很可行的方向!

 

C-CAM: Causal CAM for Weakly Supervised Semantic Segmentation on Medical Image

 

代码链接: https://github.com/Tian-lab/C-CAM

 

文章链接: https://openaccess.thecvf.com/content/CVPR2022/papers/Chen_C-CAM_Causal_CAM_for_Weakly_Supervised_Semantic_Segmentation_on_Medical_CVPR_2022_paper.pdf

 

文章任务背景介绍

 

第二篇文章的故事发生在医疗图像分割case中。近年来,CAM的弱监督语义分割((Weakly supervised semantic segmentation以下简称WSSS) 研究成果被提出,用于医疗影像上作品却不多。现在阶段的医疗图像分割任务中存在着两个问题,第一个是目标前景和背景的边界不清晰,第二个是在训练阶段中, 共现的现象非常严重。(共现现象是指在训练阶段中 同一张图像中出现不同的器官 )共现的主要问题是,同一环境下A器官出现次数比B器官多,可能效果会向A倾斜,对于需要识别出的B,比较难识别出。

 

我感觉共现这个情况我需要单独拿出来说一下,再解释一下

 

共现,字面意思一样是共同出现,举个例子比如说腹部MRI图像中不同器官总是同时出现,会给AI造成了一定的干扰,可能会把这种共现作为特征信息学习进去了。然而,这种同现现象在自然图像中并没有那幺严重。例如,“人”并不总是和“马”一起出现,反之亦然。因此当人骑着马出现的时候,CAM模型可以知道图像的哪一部分是“人”,但遗憾的是,CAM模型很难在共现场景中正确激活有效的识别对象。

 

左边图为前景与背景的边界,右边图为共现

在医疗图像的热力图中我们可以更加清晰的发现这两个问题的存在。第一行中可以发现由于共现问题中导致的激活错误(黄框表示为正确的激活部分)。第二行中也可以通过类激活图发现分割过程中出现了前景和背景的黏连问题,边界分割不清。由于医疗图像与自然图像不同,图像中的区分不同器官区域与传统的自然图像中学习到的先验知识(比如亮度变化、形状、颜色)不相同,如果是分类任务识别会更加的精准,但是这种精准却无法体现在医疗图像分割的任务中。因为在分类任务中并不需要考虑空间相关性的要素,比如当在统计意义上高度相关的要素可以区分类别,但是无法区分区域。比如说我可以说雨伞和下雨在统计学意义是高度相关的,如果是场景分类的时候我们看见有人打伞,那幺我们就可以认为这个场景在下雨。如果是分类的情况,激活雨伞也是合理的。但是如果我要把雨水的区域分开,如果激活雨伞就显得毫无作用了,也显得模型的毫无逻辑可以言。

 

C

文章的方法

 

总的来说文章借助CAM以及通过因果推理链将因果关系引入了医疗图像弱监督的方向上。从图中可以发现,文章用了CAM的粗分割,结合细节调整+粗糙的区域划分(粗掩码),以及在分类头的作用下解决了上面提到的两个问题。

 

Global Sampling Module

 

CAM虽然在分割任务中不够准确。但是,它可以为医学图像提供与分类和解剖高度相关的有价值的信息。因此,我们设计了一个全局采样(GS)模块来利用这些有价值的信息。

 

GS模块如图下所示。训练图像直接输入Pure CAM (P-CAM)模型,得到粗糙的伪掩模。

 

P-CAM是一个类似CAM的模型,它由一个CNN主干、一个分类头、一个映射操作和一个上采样操作组成。

 

在训练阶段,只使用CNN主干和分类头

 

在推断阶段,通过映射操作和上采样操作生成粗糙的伪掩码,以及具有全局上下文联系的特征图。

 

Causality in medical image WSSS

 

在半监督的任务中关键是生成一个具有精确的伪掩膜,在C-CAM中我们通过因果链来进行逻辑上的细化决策。第一个链是分类任务中的因果关系控制,X→Y。说明图像内容X(原因)在具有全局上下文联系的特征图的C的影响下影响最后的分类任务进行优化。第二条因果链是分析因果Z→S,通过分析结构信息进而监督分割时形状(位置内容)的形成。最后, 伪掩模 由类别特征Y和形状特征S共同确定。

 

值的一提的是文章中出现了一个比较好玩的东西,就是上图的因果关系图。在医疗图像中利用因果关系,加强弱监督方向的工作,这篇工作是第一次。通过采用分类头+CAM的方式去控制模型的学习方向,去做这两个问题的解决方法,这是有趣的,也是令人信服的。

 

我们把上面的因果链路抽象为可以输入到模型中的模块,整理得到了下面的结构。

 

Category-Causality Chain.

 

通过 MGC 对粗分割标签图进行监督和细化,生成出更精细的类别标签。同时也会细分割标签图进行进一步的监督优化,努力的保证控制上下文联系的特征能够有效的得到关注,被顺利激活。

 

Anatomy-Causality Chain.

 

可以很好地捕捉目标的形状和边界,但不能完全确定语义,然后通过解剖结构信息来解决语义问题。特别是对于一些多器官影像,如腹部扫描,因为共现的情况,CAMcc无法区分左肾和右肾。为此,文章设计了一个分析因果链来解决这个问题。在分析-因果关系链中,文章设计了 1/0指标 来表示医学图像的位置信息。最后,按如下公式计算分析-因果关系图Ms,得到各类别的可能位置:

 

即对特征信息图进行决策,当MGC被有效激活的时候就将特征进行保留,当MGC无法为有效激活的时候就置为0,通过这种筛选的方式,弱化共现产生的影响,当共现的特征消失的时候,与共现相关的特征通道会被置为0,再出现时是因为特征值被置为0,所以无法顺利的激活与共现相关的特征信息。

 

CAM对于文章的作用

 

我对于CAM出现在医疗图像上的事情是很支持的。因为医疗图像于自然图像的信息出入还是很大的,其实如果不细说,我们根本没有办法判断出整体效果如何,所以在CAM的加持下,我觉得医疗图像的工作会更具有说服力。但是在这篇文章中CAM有更重要的角色,就是参加弱监督模型做出粗掩码,与上文的监督作用相类似,CAM的技术在文章中也是相当于一个信息提取以及监督优化的角色。因为CAM一开始被设计出来的其实主要一个期待点是希望可以强化半监督的工作效果的,所以再次回归半监督何尝不是一种不忘初心。

 

CLIMS: Cross Language Image Matching for Weakly Supervised Semantic Segmentation

 

代码链接: https://github.com/CVI-SZU/CLIMS

 

文章链接: https://openaccess.thecvf.com/content/CVPR2022/papers/Xie_CLIMS_Cross_Language_Image_Matching_for_Weakly_Supervised_Semantic_Segmentation_CVPR_2022_paper.pdf

 

文章背景

 

众所周知,CAM(类激活图)通常只激活有区别的对象区域,并且错误地包含许多与对象相关的背景。众所周知,CAM (Class Activation Map)通常只激活目标对象所在的区域,不可避免的将大量与物体无关的背景信息激活了出来。由于WSSS(弱监督语义分割)模型只有固定的图像级别的标签,因此很难抑制激活目标对象会激活出的不同背景区域。

 

文章工作内容

 

在本文中,提出了一种用于WSSS场景中的跨语言图像匹配(CLIMS)框架,基于最近引入的对比语言图像预训练(CLIP)模型。框架的核心思想是引入自然语言监督,激活更完整的对象区域,抑制密切相关的背景区域。

 

特别地,文章中还对目标对象、背景区域和文本标签专门设计了损失函数对模型进行指导,对每一类CAM激发更合理的对象区域。

 

文章基于最近引入的对比学习的预训练模型(CLIP),提出了一种新的跨模态的匹配网络。框架的核心思想是引入自然语言的信息,来辅助图像激活出更完整的目标识别区域,并抑制相关的背景区域的干扰。下图展示的图像是通过引入自然语言信息,协助图像激活的效果展示,相信大家从CAM和ADV-CAM中都不难可以看到,跨模态信息交互提升图像识别准确度方法的效果确实非常的不错。

 

文章的方法

 

一个问题是,我们如何把文本内容和图像内容进行整合,利用相互的信息监督优化。

 

Cross Language Image Matching Framework

 

传统的WSSS方法只使用一组预先设计好的固定对象进行监督,但是文章中基于CLIP模型的文本+图像的模型放弃了这思路,基于Zero-shot的特性,自由探索对象与对象之间的关系。文章通过CAM提取出激活的权重,x表示激活前景的权重,(1-x)表示背景的激活权重。我们把权重赋值进原图中,就可以初步的将目标对象,以及背景进行分离,然后通过CLIP将提取出的目标对象信息以及背景信息与文本信息进行交互,相互监督。

 

Object region and Text label Matching

 

监督的过程其实不难,主要还是CLIP的余弦相似度的计算,之后再经过loss控制优化。生成的初始CAM会在 LOTM 的监督下逐渐接近目标对象。然而,单独的LOTM并不区分背景和前景的区域,也不能抑制CAM对于背景区域的激活。

 

Background region and Text label Matching

 

为了提高被激活对象区域的完整性,设计了背景区域和文本标签匹配损失 LBTM ,以包含更多的目标对象内容。

 

Co-occurring Background Suppression

 

前面提到的两个损失函数只保证激活图完全覆盖目标对象,没有考虑到与目标对象出现的相关背景的错误激活。共现可能会显着降低生成的伪掩模的质量。但是,要想对这些背景进行像素级标记是非常耗时和昂贵的,而且WSSS的场景中也不会进行这样的操作。由于背景的种类比前景的种类要更复杂,使用ImageNet训练的分类网络,很有可能没有覆盖背景对象中出现的类,这样就没有办法对目标对象有清晰的认知了。然而,如果加入了文本信息的监督,以及预训练的CLIP就可以很好的避开这个缺陷。同时为了解决这一问题,我们设计了以下同时发生的背景抑制损失 LCBS ,在训练过程中,骨干网络会逐渐抑制背景区域的错误激活,使LCBS最小化。

 

Area Regularization

 

其实上文的损失函数的把控下,基本可以消除很大部分的错误激活,但是我们依旧也可以使用一个全局化的方式。就是对激活图中激活目标的区域面积大小进行约束,就可以,更进一步精细化激活区域。因此,设计了一个像素级的区域正则化项 LREG 来约束激活图的大小,以确保激活图中不包含无关背景。

 

最后通过对loss函数的加权组合,就能得到我们想要的结果了。

 

文章的贡献

 

提出了一个文本驱动的学习框架CLIMS,为WSSS引入基于图像-文本匹配模型的监督。

 

设计了三个损失函数和一个区域面积的约束。目标对象、背景区域和与文本标签的匹配损失保证了初始CAM的正确性和完整性。同时背景损失函数对背景抑制损失可以进一步大大降低类相关背景的影响。区域面积的正则化可以约束激活区域的大小

 

在PASCAL VOC2012数据集上的大量实验表明,提出的CLIMS显着优于以前最先进的方法。

 

CAM在CLIMS中的作用

 

这是一篇非常有趣的工作,是对于CLIP的一次拓展,文章妙就妙在了,串联起来了很多意想不到的东西,用CLIP生成CAM图。在文章中,CAM其实很大程度也和上文一样,参与到了网络中的选择当中。其实看完这幺多文章还是发现原来CAM在半监督的任务上参与度是最高的,其实除了CAM的可视化之外,CAM其实也具有选择控制的作用。可能是CAM的解释性的可视化更加的通用,以至于盖过了它在无监督上的光芒吧。但没事文章可以将CAM的生成和CLIP对比学习进行联动,这真的是一种新的尝试,打开了CAM的在半监督领域的更多可能性,其实也将可视化带到了一个信息高度。

 

结尾

 

我遇到了很多朋友,他们都在问我CAM的图到底要怎幺画才好。是不是用了CAM,就可以提高我实验效果的说服力。我这里的回答也还是那句,CAM可能确实是目前可视化模型最直观的手段,CAM的工作其实有对模型得出的过程进行溯源,这就是很多其他类型的可视化做不到的点了。但是我觉得我们不该滥用这类的可视化以及这类的控制结构,我们需要明白自己为啥用,我能不能用这样的可视化说明一些合乎逻辑的发现,真正发挥解释作用,而不是一味的可视化,却忽略了分析,连一开始自己要优化的目标都忘记得一干二净了。CAM它的功能不只有可视化模型,它还能参与模型的的任务当中,还能做弱监督,还能结合多模态的任务,真的不仅仅只有可视化这一个特点而已。所以我们应该继续发散思维,去找寻CAM更多的可能性, 更多相关的内容其实很建议大家可以后续去研究!

 

结尾++

 

其实我也尝试在MMSegmentation的一些网络中加入了 CAM,实现了部分网络的 一些可视化内容,我晚点会整代码,然后在MMSegmentation上面提一个 pr ,大家可以留意一下在MMSegmentation,如果觉得好用的话可以给MMSegmentation点一个大大的 star 。

 

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。