gradcam热力图可视化
时间: 2023-06-17 15:06:21 浏览: 237
Swin-Transformer+gradcam可视化代码+Windows环境.zip
Grad-CAM(Gradient-weighted Class Activation Mapping)是一种可视化卷积神经网络(CNN)中模型对输入图像的分类决策的方法。它可以根据模型的输出和梯度信息,生成一个热力图,用来表示输入图像中哪些区域对于模型分类结果的影响较大。
以下是使用 PyTorch 实现 Grad-CAM 热力图可视化的简单步骤:
1. 加载预训练模型,设置为 evaluation 模式。
```python
import torch
import torchvision.models as models
model = models.resnet18(pretrained=True)
model.eval()
```
2. 对输入图像进行预处理,并将其送入模型中进行前向传播。
```python
from PIL import Image
import torchvision.transforms as transforms
# 加载输入图像
img_path = 'example.jpg'
img = Image.open(img_path)
# 图像预处理
preprocess = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
input_tensor = preprocess(img)
input_batch = input_tensor.unsqueeze(0)
# 模型预测
with torch.no_grad():
output = model(input_batch)
```
3. 计算模型输出关于目标类别的梯度。
```python
# 目标类别的下标
target_class = 2
# 计算目标类别的梯度
model.zero_grad()
output[:, target_class].backward()
# 获取目标类别的输出和特征图
target_output = model.features[-1].forward(input_batch)
target_grads = model.features[-1].weight.grad
# 计算特征图上每个像素点的权重
weights = target_grads.mean(dim=(2, 3)).squeeze()
```
4. 根据权重和特征图计算 Grad-CAM 热力图。
```python
import numpy as np
# 取出特征图
features = target_output.squeeze()
# 特征图上每个像素的权重乘以对应像素的值
cam = np.zeros(features.shape[1:], dtype=np.float32)
for i, w in enumerate(weights):
cam += w * features[i, :, :]
# 对热力图进行归一化处理
cam = np.maximum(cam, 0)
cam = cam / cam.max()
# 将热力图可视化到原始图像上
from matplotlib import pyplot as plt
# 加载原始图像
img = Image.open(img_path)
# 将热力图缩放到原始图像的大小
cam = np.uint8(255 * cam)
cam = np.array(Image.fromarray(cam).resize(img.size, resample=Image.BILINEAR))
# 叠加热力图和原始图像
heatmap = plt.get_cmap('jet')(cam)[:,:,:3]
heatmap = np.float32(heatmap)
heatmap = heatmap / heatmap.max()
superimposed_img = heatmap + np.float32(img)
superimposed_img = superimposed_img / superimposed_img.max()
# 可视化热力图和叠加后的图像
fig, ax = plt.subplots(nrows=1, ncols=2)
ax[0].imshow(cam, cmap='jet')
ax[0].set_title('Grad-CAM heatmap')
ax[1].imshow(superimposed_img)
ax[1].set_title('Original image with heatmap')
plt.show()
```
这样就完成了 Grad-CAM 热力图的生成和可视化。需要注意的是,在计算模型输出关于目标类别的梯度时,需要将模型设置为 eval 模式,并关闭 autograd 引擎的计算图记录功能,以避免梯度计算对模型参数的影响。
阅读全文