CAM激活图可视化系列(代码直接可用)——GradCAM(Pytorch官方版plus+可自定义修改版)
原理
原作者论文CAM原理图
特征图关于这个类别分数的梯度(维度为[C, H, W])。最后对特征图梯度的空间维度计算平均值,得到与类别信息有关且与特征图通道数一致的权重,再根据权重将原图与热力图(激活图)叠加即可。其中叠加的热力图要与原图大小一致(所以其中可能有加入一些如插值等的图像增强操作)
官方模块安装
pip install grad-cam
注意
GradCAM代码(本人修改:直接可用——官方版PLUS)
import os
import numpy as np
import torch
from PIL import Image
import matplotlib.pyplot as plt
from torchvision import models
from torchvision import transforms
from pytorch_grad_cam import GradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget
#####torch 模块项目(官方版+进阶使用)来源:https://github.com/jacobgil/pytorch-grad-cam####
####原理参考:https://blog.youkuaiyun.com/qq_37541097/article/details/123089851
######CAM 模块化代码(黑盒)
def Grad_CAM_perBox(model, target_layers, img_path, save_path, target_category):
image = img_path
# 此部分可抽取出来做成模块,然后列表使用
data_transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
# load image
img_path = image
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)
# [N, C, H, W]
img_tensor = data_transform(img)
# expand batch dimension
input_tensor = torch.unsqueeze(img_tensor, dim=0)
cam = GradCAM(model=model, target_layers=target_layers, use_cuda=False)
#####torch官方用法
target_category = target_category
####target_category = None ####默认获取最大概率类别获得CAM图
grayscale_cam = cam(input_tensor=input_tensor, targets=target_category)
# #####按自己输入的类别编码获取CAM图
# targets = [ClassifierOutputTarget(target_category)]
#
# grayscale_cam = cam(input_tensor=inpu