类别激活热力图可视化工具介绍

简介: 可视化特征图 (b) 方法出自 2014 年的《Visualizing and Understanding Convolutional Networks》一文,这种方法通过反卷积和反池化对特征图进行了可视化,对于浅层网络的可视化效果良好。

引言



一直以来,深度神经网络的可解释性都被大家诟病,训练一个神经网络被调侃为“炼丹”。所得的模型也像一个“黑盒”一样,给它一个输入,然后得到结果,却不知道模型是如何得出结论的,究竟学习到了什么知识。如果能将其训练或者推理过程可视化,那么可以对其更加深入的理解,目前深度神经网络可视化可以分为:


- 可视化卷积核;

- 可视化特征图;

- 可视化激活热力图,也就是不同位置像素点对得出结果的影响程度

640.png

图 1 神经网络可视化汇总


其中,可视化卷积核 (a) 的方法最早出现,早在 2012 年的 AlexNet 就借助它来帮助解释 CNN 中卷积核的作用。


可视化特征图 (b) 方法出自 2014 年的《Visualizing and Understanding Convolutional Networks》一文,这种方法通过反卷积和反池化对特征图进行了可视化,对于浅层网络的可视化效果良好。


可视化类激活热力图(Class Activation Map, CAM),也就是本文的主角,提出自 2015 年,它能够更进一步地可视化神经网络在预测某一类别时,具体关注了图像的哪些像素。在此基础上,近年来也一直有改进的方法被提出。


从 CAM 到 Grad-CAM


CAM



论文 : Learning Deep Features for Discriminative Localization


链接: https://arxiv.org/abs/1512.04150


在原论文中,为了证明只用分类标签训练卷积神经网络同样可以学习到物体的位置信息,作者提出了 CAM 方法。在论文中,作者将卷积神经网络获取位置信息的能力归功于全局平均池化(Global Average Pooling,GAP),并结合 GAP 将特征图映射为激活值的能力提出了 CAM 方法。


在目前主流的 CNN 网络中,输入经过主干网络得到特征图,特征图的每个通道经过 GAP 可以获得一个激活值,所有通道的激活值组合成为一个特征向量。最后的分类就是对特征向量做加权平均,这里每一个类别 c 都对应着一组权重系数 Wc 。既然用 Wc 对特征向量做加权平均可以获得分类结果,那么用 Wc 对特征图做加权平均,就可以获得类别 c 对应的激活图了。具体计算步骤如下:


训练好网络后,获得 GAP 后的权重系数 Wc 点乘特征图矩阵,再对通道取平均,由 (C, H, W) 至 (H,W) ;


上采样至原图大小;

640.png

图 2 CAM 的计算示意图


Grad-CAM



论文 : Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization


链接: https://arxiv.org/abs/1610.02391


最初的 CAM 方法存在着一定的局限性,比如目标网络必须包含GAP层。虽然 GAP 已经被用于主流的卷积神经网络中,但仍有很多网络中没有使用 GAP 层,如早期的 VGGNet 、最近提出的 Transformer 结构以及非分类网络等。


Grad-CAM 方法和原始的 CAM 方法基本一致,区别在于 Grad-CAM 通过对特征图的梯度计算 GAP 来获取权重。作者经过严格的数学推导,发现 Grad-CAM 与原始 CAM 方法中的权重是等价的,因此可以将 Grad-CAM 看作对原始 CAM 方法的推广。


Grad-CAM 的计算步骤如下,预先指定类别 c :


- 进行前向推理,得到指定类别 c 所对应的网络输出值yc ,进行反向传播;


- 取指定网络层(一般取主干网最后一层)各个通道特征图的梯度 Wc ,分别 GAP 后获得各个通道的梯度权重值 ;


- 将各个通道的特征图用 Wc 求取加权平均;


- 经过 Relu 以及上采样得到 CAM 图。


除了权值的获取方式发生变化,在第4步还增加Relu计算,只保留正值。这是因为在类激活图中,我们最关心的是哪些像素对于类别 c 的预测起到了正面作用。当然你也可以只取负值,关心一下哪些像素降低了类别 c 的得分。


基于 Grad-CAM,研究者们后续又提出了一系列改进的方法,包括 Grad-CAM++,LayerCAM 等等。


在 MMClassification 中的快速使用


MMClassification 提供了一个快捷可视化 CAM 的工具,支持前文提到的大部分 CAM 可视化方法。该工具基于 pytorch-grad-cam 库,因此在使用前需要先使用 pip install "grad-cam>=1.3.6" 安装该库。

python tools/visualizations/vis_cam.py ${IMG_PATH} ${CFG_PATH} ${WEIGHT_PATH}

必须传入的参数有3个:


- IMG_PATH :需要可视化 CAM 的图片路径


- CFG_PATH :配置文件路径


- WEIGHT_PATH :模型权重文件路径。


比如对 ResNet50 进行 CAM 可视化:

# 安装 mmcv, mmcls, pytorch-grad-cam 后,在 MMClassification 目录下:
python tools/visualizations/vis_cam.py \
    demo/bird.JPEG \
    configs/resnet/resnet50_8xb32_in1k.py \
    https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_batch256_imagenet_20200708-cfb998bf.pth

对于 Transformer 结构的网络,需要加上 --vit-like ,如对 Swin-Transformer 进行 CAM 可视化:


python tools/visualizations/vis_cam.py \
    demo/bird.JPEG  \
    configs/swin_transformer/swin-tiny_16xb64_in1k.py \
    https://download.openmmlab.com/mmclassification/v0/swin-transformer/swin_tiny_224_b16x64_300e_imagenet_20210616_090925-66df6be6.pth \
    --vit-like

640.png

图 3 不同模型所得的 CAM 对比图


注意:

默认情况下,工具会自动采用最后一个 norm 层作为可视化 CAM 的目标层,但也可以通过可以通过--target-layers 选项指定。如何选择目标层


CAM 工具使用详解



使用不同的 CAM 方法



--method 指定可视化 CAM 的方法。目前支持的 CAM 可视化方法有:

640.png

例如:使用不同方法对 ResNet50 网络进行 CAM 可视化:

python tools/visualizations/vis_cam.py \
    demo/bird.JPEG \
    configs/resnet/resnet50_8xb32_in1k.py \
    https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_batch256_imagenet_20200708-cfb998bf.pth \
    --method GradCAM
    # GradCAM++, XGradCAM, EigenCAM, EigenGradCAM, LayerCAM

640.png

图 4 不同 CAM 方法对比图


可视化不同类别的 CAM


默认情况下,网络会使用网络预测的类别作为可视化的目标类别,但也可以通过 --target-catgory 选项指定类别。


例如,在 ImageNet 数据集中,类别 238 为 ‘Greater Swiss Mountain dog’,类别 281 为 ‘tabby, tabby cat’,对同时包含猫狗的一张图分别进行两个类别的 CAM 可视化:

python tools/visualizations/vis_cam.py \
    demo/cat-dog.png configs/resnet/resnet50_8xb32_in1k.py \
    https://download.openmmlab.com/mmclassification/v0/resnet/resnet50_batch256_imagenet_20200708-cfb998bf.pth \
    --target-layers 'backbone.layer4.2' \
    --method GradCAM \
    --target-category 238  
    # --target-category 281 

640.png


平滑可视化的效果


为了减少 CAM 中的噪声,并使其更突出对象,支持两种平滑方法:


--aug-smooth 测试时增强,测试6次,应用水平翻转的组合,并将图像乘以 [1.0, 1.1, 0.9] 。可以使热力图更加围绕着物体。


--eigen-smooth 使用主成分降低噪音,可以减少热力图的噪音。

640.png

图 6 平滑可视化对比图


最后


CAM 可视化可以帮助我们理解模型原理,分析预测错误的原因。但是需要注意的是,CAM 的可视化只能解释模型在分类时关注的区域,但是不能解释网络在训练时为什么可以定位到类别相关的区域,即可以帮助理解训练得到的模型,但仍然不知道这些知识是如何在训练时学习到的。


文章来源:公众号【OpenMMLab】

 2022-01-04 18:52



目录
相关文章
|
2天前
|
XML 存储 数据处理
python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(附代码)
python绘制热力图-数据处理-VOC数据类别标签分布及数量统计(附代码)
68 0
|
9月前
|
数据可视化
R语言绘图教程丨Nature论文都在用的多组比较箱线图,自动计算显著性并标注,附带误差线
R语言绘图教程丨Nature论文都在用的多组比较箱线图,自动计算显著性并标注,附带误差线
|
2天前
|
并行计算 前端开发 数据可视化
R语言面板平滑转换回归(PSTR)分析案例实现
R语言面板平滑转换回归(PSTR)分析案例实现
|
2天前
|
并行计算 前端开发 数据可视化
面板平滑转换回归(PSTR)分析案例实现
面板平滑转换回归(PSTR)分析案例实现
|
2天前
|
存储 机器学习/深度学习 数据可视化
Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
Python面板时间序列数据预测:格兰杰因果关系检验Granger causality test药品销售实例与可视化
|
7月前
|
存储
ArcGIS模型构建器实现批量按掩膜提取影像
ArcGIS模型构建器实现批量按掩膜提取影像
291 0
|
9月前
|
数据可视化 数据挖掘 Linux
转录组下游分析丨利用limma包进行差异表达分析,结果可视化绘制火山图和热图
转录组下游分析丨利用limma包进行差异表达分析,结果可视化绘制火山图和热图
|
9月前
|
数据可视化 数据挖掘 Linux
科研绘图丨使用R语言Pheatmap包快速绘制基因表达量热图的方法,支持聚类和配色自定义修改
科研绘图丨使用R语言Pheatmap包快速绘制基因表达量热图的方法,支持聚类和配色自定义修改
|
11月前
R语言绘制组间比较散点图并自动添加P值信息
查询ggprism包使用时候发现官网给出的一示例图比较常用,这里记录学习一下。
137 3
|
11月前
|
数据可视化 Go 数据库
DiVenn一款用于比较基因列表的交互式Venn图绘制工具
Divenn一种基于网络的基于Web的工具 Divenn 可以将来自多个RNA-seq实验中的基因列表进行比较,并显示每个基因(集)的调控水平和整合到Kegg pathway和GO term的数据信息。我们通过该工具更加方便的了解重叠基因与其相关的pathway或Go terms之间的表达模式,十分有趣。
143 0