基于自己编写的CNN模型,首先将训练好的模型提取全链接之前作为新的模型,然后获得新模型最后一层卷积层的Grad-CAM可视化类激活的热力图,PyTorch实现代码
时间: 2024-02-03 08:11:46 浏览: 82
以下是基于PyTorch实现的CNN模型Grad-CAM可视化类激活的热力图:
``` python
import torch
from torch.autograd import Variable
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 定义Grad-CAM算法函数
def Grad_Cam(model, image, layer_name):
# 获取模型提取全链接之前的特征图
feature_maps = model.features(image)
# 获取模型最后一层卷积层
target_layer = model._modules.get(layer_name)
# 将模型最后一层卷积层的输出结果作为反向传播的梯度
gradient = torch.zeros(feature_maps.size())
gradient[:, :, feature_maps.size()[2]//2, feature_maps.size()[3]//2] = 1
target_layer.zero_grad()
feature_maps.backward(gradient=gradient)
# 获取模型最后一层卷积层的输出结果和梯度
_, _, H, W = feature_maps.size()
output_activations = feature_maps.detach().numpy()[0]
gradients = target_layer.weight.grad.detach().numpy()
# 计算特征图中每个像素点的权重
weights = np.mean(gradients, axis=(2, 3))[0]
cam = np.zeros((H, W), dtype=np.float32)
for i, w in enumerate(weights):
cam += w * output_activations[i, :, :]
# 对权重进行归一化处理
cam = np.maximum(cam, 0)
cam = cv2.resize(cam, (224, 224))
cam = cam - np.min(cam)
cam = cam / np.max(cam)
# 将热力图叠加到原图上
heatmap = cv2.applyColorMap(np.uint8(255 * cam), cv2.COLORMAP_JET)
heatmap = np.float32(heatmap) / 255
cam_img = heatmap + np.float32(image[0])
cam_img = cam_img / np.max(cam_img)
return np.uint8(255 * cam_img)
# 加载模型和测试图像
model = torch.load('model.pth')
image = cv2.imread('test.jpg')
image = cv2.resize(image, (224, 224))
image = np.transpose(image, (2, 0, 1))
image = np.expand_dims(image, axis=0)
image = image.astype(np.float32)
image = image / 255.0
image = Variable(torch.from_numpy(image), requires_grad=True)
# 获取Grad-CAM可视化类激活的热力图
cam_img = Grad_Cam(model, image, 'conv5')
# 显示原图和热力图
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(cv2.imread('test.jpg'), cv2.COLOR_BGR2RGB))
plt.title('Original Image')
plt.axis('off')
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(cam_img, cv2.COLOR_BGR2RGB))
plt.title('Grad-CAM Image')
plt.axis('off')
plt.show()
```
需要注意的是,此代码仅适用于输入图像大小为224x224的CNN模型,并且在模型中需要指定要进行Grad-CAM可视化的卷积层名称。如果您的CNN模型和测试图像大小不同,请根据实际情况进行修改。
阅读全文