本文内容
引言
原理:从 CAM 到 Grad-CAM
在 MMClassification 中快速使用
CAM 工具使用详解
最后
引言
一直以来,深度神经网络的可解释性都被大家诟病,训练一个神经网络被调侃为“炼丹”。所得的模型也像一个“黑盒”一样,给它一个输入,然后得到结果,却不知道模型是如何得出结论的,究竟学习到了什么知识。如果能将其训练或者推理过程可视化,那么可以对其更加深入的理解,目前深度神经网络可视化可以分为:
- 可视化卷积核;
- 可视化特征图;
- 可视化激活热力图,也就是不同位置像素点对得出结果的影响程度
图 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) ;
上采样至原图大小;
图 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" 安装该库。
代码语言:javascript复制python tools/visualizations/vis_cam.py ${IMG_PATH} ${CFG_PATH} ${WEIGHT_PATH}
必须传入的参数有3个:
- IMG_PATH :需要可视化 CAM 的图片路径
- CFG_PATH :配置文件路径
- WEIGHT_PATH :模型权重文件路径。
比如对 ResNet50 进行 CAM 可视化:
代码语言:javascript复制# 安装 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 可视化:
代码语言:javascript复制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
图 3 不同模型所得的 CAM 对比图
!注意:
默认情况下,工具会自动采用最后一个 norm 层作为可视化 CAM 的目标层,但也可以通过可以通过--target-layers 选项指定。如何选择目标层可以参考
https://mmclassification.readthedocs.io/zh_CN/latest/tools/visualization.html#id4
CAM 工具使用详解
使用不同的 CAM 方法
--method 指定可视化 CAM 的方法。目前支持的 CAM 可视化方法有:
例如:使用不同方法对 ResNet50 网络进行 CAM 可视化:
代码语言:javascript复制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
图 4 不同 CAM 方法对比图
可视化不同类别的 CAM
默认情况下,网络会使用网络预测的类别作为可视化的目标类别,但也可以通过 --target-catgory 选项指定类别。
例如,在 ImageNet 数据集中,类别 238 为 ‘Greater Swiss Mountain dog’,类别 281 为 ‘tabby, tabby cat’,对同时包含猫狗的一张图分别进行两个类别的 CAM 可视化:
代码语言:javascript复制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
图 5 不同类别 CAM 可视化对比图
平滑可视化的效果
为了减少 CAM 中的噪声,并使其更突出对象,支持两种平滑方法:
--aug-smooth 测试时增强,测试6次,应用水平翻转的组合,并将图像乘以 [1.0, 1.1, 0.9] 。可以使热力图更加围绕着物体。
--eigen-smooth 使用主成分降低噪音,可以减少热力图的噪音。
图 6 平滑可视化对比图
最后
CAM 可视化可以帮助我们理解模型原理,分析预测错误的原因。但是需要注意的是,CAM 的可视化只能解释模型在分类时关注的区域,但是不能解释网络在训练时为什么可以定位到类别相关的区域,即可以帮助理解训练得到的模型,但仍然不知道这些知识是如何在训练时学习到的。