[ 可视化 ] 经典网络模型 —— Grad-CAM 详解与复现
🤵 Author :Horizon Max
✨ 编程技巧篇:各种操作小结
🎇 机器视觉篇:会变魔术 OpenCV
💥 深度学习篇:简单入门 PyTorch
🏆 神经网络篇:经典网络模型
💻 算法篇:再忙也别忘了 LeetCode
[ 可视化 ] 经典网络模型 —— Grad-CAM 详解与复现
- 🚀 Grad-CAM
- 🚀 Grad-CAM 详解
- 🎨 论文贡献
- 🎨 原理介绍
- 🚩 Grad-CAM 可视化流程
- 🚩 Grad-CAM 计算
- 🚩 Guided Grad-CAM
- 🎨 实例展示
- 🚩 评估 Grad-CAM 定位能力
- 🚩 Grad-CAM 图像分类
- 🚩 Grad-CAM 视觉解释和文本解释
- 🚩 Grad-CAM 图像描述
- 🚩 Grad-CAM 视觉问答
- 🚩 Grad-CAM
- 🚀 Grad-CAM 复现
🚀 Grad-CAM
随着神经网路模型的不断发展,深度模型通过使用更抽象(增加网络层数)和 更紧密(端到端训练)实现了更好的性能 ;
但随之带来的是对于神经网络的 可解释性 :为什么会出现这样的结果?网络的关注点在哪?
基于此提出的 Grad-CAM 利用热力图的方式实现网络预测过程的可视化,并帮助我们更好的理解神经网络 ;
Grad-CAM 是 CAM 的推广,不需要更改网络结构或重新训练就能实现更多 CNN 模型的可视化 ;
![[ 可视化 ] 经典网络模型 —— Grad-CAM 详解与复现](/img/07/69b902adfe414d12ab926083f5f81832.gif)
🔗 论文地址:Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization
🍳 GitHub:PyTorch-Grad-CAM

🚀 Grad-CAM 详解
🎨 论文贡献
- 提出了一种类别区分的定位技术,可以为任何基于 CNN 的网络生成可视化解释,需要更改网络结构或重新训练 ;
- 可以应用于图像分类、图像描述、视觉问答等模型,用于发现问题与解释不合理的地方 ;
- 揭示了数据集中的偏差来帮助故障诊断 ;
- 介绍了用于图像分类和视觉问答的 ResNets 可视化 ;
- 使用来自 Grad-CAM 神经元的重要性并利用神经元名称用于文本解释 ;
- 展示了 Guided Grad-CAM 的解释是有类别歧视的 ;
🎨 原理介绍

→ : 前向传播
→ : 反向传播
🚩 Grad-CAM 可视化流程
- 输入:给定的一个图像和一个感兴趣的类别( 例如:tiger cat);
- 通过模型的 CNN 部分进行向前传播,得到特定任务的各类别分数 y( softmax 层之前 );
- 将给定的类别(tiger cat)设置为 1,其他类别的梯度都设置为 0 ;
- 将给定类别分数 yc 反向传播至卷积特征图,组合计算得到粗糙的梯度CAM定位(蓝色热力图);
- 将热力图与反向传播的结果进行点乘,得到高分辨率的特定 Grad-CAM 可视化图 ;
🚩 Grad-CAM 计算
针对 类别为c、宽度u、高度为v 的类别定位图 Grad-CAM L
G
r
a
d
−
C
A
M
c
^c_{Grad-CAM}
Grad−CAMc ∈ Ru×v

- yc :前向传播得到的 类别 c 所对应的分数 (before the softmax) ;
- A
i
j
k
^k_{ij}
ijk :特征层 A 的第 k 个通道上坐标 ( i, j ) 的数据 ;
∂
y
c
∂
A
k
\frac {∂y^c} {∂A^k}
∂Ak∂yc :类别 c 在特征层 A 上反向传播得到的梯度信息 ;
- Z :宽度 i 和 高度 j 的乘积 ;
- 将计算得到的梯度在 宽度 i 和 高度 j 的维度上进行全局平均池化,得到重要性权重 α
k
c
^c_k
kc ;
- 计算关于激活函数的权重矩阵和梯度的乘积 ;
- 最后进行加权求和,并通过 ReLU 激活后输出 ;

- c:选取的类别 c ;
- k :第 k 个通道 ;
- A:需要进行可视化的特征层,一般选取最后一个卷积层的输出 ;
- α
k
c
^c_k
kc :类别 c 在特征层 A 的第 k 个通道上的权重 ;
- A k :特征层 A 的第 k 个通道上的权重矩阵 ;
- ReLU :使最后的输出结果 >0 ,抑制不感兴趣的权重部分 ;
详细可以参考下图:

🚩 Guided Grad-CAM
虽然 Grad-CAM 具有分类区分和局部化相关图像区域的能力 ;
但仍缺乏类似于 Guided Backpropagation 像素空间梯度可视化的那种突出细粒度细节的能力 ;
基于此,作者通过元素级乘法融合了Guided Backpropagation 和 Grad-CAM 可视化 ;
首先使用双线性插值将 L
G
r
a
d
−
C
A
M
c
^c_{Grad-CAM}
Grad−CAMc 上采样到输入图像分辨率 ;

🎨 实例展示
🚩 评估 Grad-CAM 定位能力

🚩 Grad-CAM 图像分类

🚩 Grad-CAM 视觉解释和文本解释

🚩 Grad-CAM 图像描述

🚩 Grad-CAM 视觉问答

🚩 Grad-CAM
- 不同层的可视化 :

- 对比展示 :

🚀 Grad-CAM 复现
# Here is the code :import osimport numpy as npimport torchfrom PIL import Imageimport matplotlib.pyplot as pltfrom torchvision import modelsfrom torchvision import transformsfrom pytorch_grad_cam import GradCAMfrom pytorch_grad_cam.utils.image import show_cam_on_imagefrom pytorch_grad_cam.utils.model_targets import ClassifierOutputTargetdef main(): model = models.resnet50(pretrained=True) target_layers = [model.layer4[-1]] data_transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # Prepare image img_path = "image.png" assert os.path.exists(img_path), "file: '{}' dose not exist.".format(img_path) img = Image.open(img_path).convert('RGB') img = np.array(img, dtype=np.uint8) img_tensor = data_transform(img) input_tensor = torch.unsqueeze(img_tensor, dim=0) # Grad CAM cam = GradCAM(model=model, target_layers=target_layers, use_cuda=True) # targets = [ClassifierOutputTarget(281)] # cat targets = [ClassifierOutputTarget(254)] # dog grayscale_cam = cam(input_tensor=input_tensor, targets=targets) grayscale_cam = grayscale_cam[0, :] visualization = show_cam_on_image(img.astype(dtype=np.float32)/255., grayscale_cam, use_rgb=True) plt.imshow(visualization) plt.show()if __name__ == '__main__': main()结果展示:
targets = [ClassifierOutputTarget(281)] # cat

targets = [ClassifierOutputTarget(254)] # dog

targets = None # 默认显示得分最高的那个类别
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/697b303acc.html
