导入
Saliency Maps 简介——基础梯度
了解显著性图的基本概念,并实现基础梯度显著性算法。
...
显著性图
k^* = \arg \max_{i \in [1,K]} f^i(X)
G = \nabla_X f^{k^}(X) = \frac{\partial f^{k^}(X)}{\partial X}
...
基础梯度显著性图
1import torch 2import torchvision 3import torchvision.transforms as T 4from torchvision.models import mobilenet_v2 5from PIL import Image 6import json 7import matplotlib.pyplot as plt 8 9class_idx = json.load(open("imagenet_class_index.json", 'r')) # ImageNet ID 到标签的映射 10idx2label = [class_idx[str(k)][1] for k in range(len(class_idx))] 11 12image = Image.open("dog.jpg").resize((224,224)) # 原始图像 13transform = T.Compose([ 14 T.Resize((224,224)), 15 T.ToTensor(), 16 T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), 17]) 18 19image = transform(image) # 对图像进行变换和归一化 20image.requires_grad = True 21torchvision.utils.save_image(image, "./output/image.png", normalize=True) 22 23model = mobilenet_v2() # 加载 MobileNetV2 模型 24ckpt = torch.load("./mobilenet_v2-b0353104.pth", map_location="cpu") 25model.load_state_dict(ckpt) 26model.eval() 27 28logits = model(image.unsqueeze(0))[0] # 输出 logits,前向传播 29prediction = torch.argmax(logits) # 网络预测结果 30print("模型预测: ", idx2label[prediction.item()]) 31 32grad = torch.autograd.grad(logits[prediction.item()], [image])[0] # 反向传播 33grad, _ = torch.max(grad.relu(), 0) # 仅保留正值梯度 34 35plt.imshow(grad, cmap=plt.cm.hot) # 绘制显著性图 36plt.axis("off") 37plt.tight_layout() 38plt.savefig("./output/saliency.png", bbox_inches="tight")