【深度学习】利用python画注意力热点图(heatmap)

概述

跑完计算机视觉模型后,想要看特征图(注意力图)的激活区域对应原图的位置,则需要将激活度大于阈值的特征点标识出来,并将其上采样到原图大小,和原图按一定比例覆盖,可视化效果如下:
在这里插入图片描述

requirements

  1. 环境:
  • torch >= 1.6
  • torchvision >= 0.8
  • numpy
  • opencv
  • timm
  • 若版本不对,可参考笔者使用torch = 1.8,torchvison = 0.9
  1. 配置文件

.yaml 格式的config文件
包含内容如下,在这里插入图片描述

  1. 权重

想要验证的 .pth 模型权重,需要和选用的模型匹配

代码实现

1. 计算梯度图

def simple_grad_cam(features, classifier, target_class):
	# 得到特征图
    features = nn.Parameter(features) 
    # 计算分类结果
    logits = torch.matmul(features, classifier)
    # 回传
    logits[0, :, :, target_class].sum().backward()
    # 计算梯度
    features_grad = features.grad[0].sum(0).sum(0).unsqueeze(0).unsqueeze(0)
    # relu后归一化
    gramcam = F.relu(features_grad * features[0])
    gramcam = gramcam.sum(-1)
    gramcam = (gramcam - torch.min(gramcam)) / (torch.max(gramcam) - torch.min(gramcam))

    return gramcam

2. 计算热图

def get_heat(model, img):
    # 只需要前向传播过程
    with torch.no_grad():
        outs = model.forward_backbone(img.unsqueeze(0))
    
    # 得到特征
    features = []
    for name in outs:
        features.append(outs[name][0])
	
	# 每一层的权重
    layer_weights = [8, 4, 2, 1]
    # 初始化热图
    heatmap = np.zeros([args.data_size, args.data_size, 3])
    # 预处理每一张特征图
    for i in range(len(features)):
        f = features[i]
        f = f.cpu()
        if len(f.size()) == 2:
            S = int(f.size(0) ** 0.5)
            f = f.view(S, S, -1)
        # 调用simple_grad_cam计算梯度图
        gramcam = simple_grad_cam(f.unsqueeze(0), classifier=torch.ones(f.size(-1), 200)/f.size(-1), target_class=args.target_class)
        gramcam = gramcam.detach().numpy()
        # resize到原图大小
        gramcam = cv2.resize(gramcam, (args.data_size, args.data_size))
        # 热图颜色默认为红色
        heatmap[:, :, 2] += layer_weights[i] * gramcam
	# 按权重分配激活度
    heatmap = heatmap / sum(layer_weights)
    # 归一化
    heatmap = (heatmap - heatmap.min()) / (heatmap.max() - heatmap.min())
    heatmap[heatmap < args.threshold] = 0 # threshold
    # 从张量图变为RGB
    heatmap *= 255
    heatmap = heatmap.astype(np.uint8)

    return heatmap

3. 批量保存

if args.save_img_path != "":
	file_n = "mix" + os.path.basename(img_p)
	cv2.imwrite(os.path.join(args.save_img_path,file_n) , mix)

源代码

源代码

参考

https://github.com/chou141253/FGVC-PIM/

  • 5
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: 当然可以!深度学习利用Python绘制热是非常常见的。以下是一个使用Python和Matplotlib绘制热的示例代码: ```python import matplotlib.pyplot as plt import numpy as np # 创建一个随机的2D数组 data = np.random.rand(10, 10) # 绘制热 plt.imshow(data, cmap='hot', interpolation='nearest') plt.colorbar() plt.show() ``` 这将创建一个随机的2D数组,并使用Matplotlib的imshow()函数将其绘制成热,其中cmap参数指定使用的颜色映射,interpolation参数指定使用的插值方法。调用colorbar()函数将添加一个颜色刻度条。你可以根据自己的需求修改代码,以满足你的具体需求。 要将此热代码转换为PyTorch代码,你需要将数据从NumPy数组转换为Tensor。以下是一个示例代码: ```python import torch import matplotlib.pyplot as plt # 创建一个随机的2D张量 data = torch.rand(10, 10) # 绘制热 plt.imshow(data.numpy(), cmap='hot', interpolation='nearest') plt.colorbar() plt.show() ``` 这将创建一个随机的2D张量,并使用Matplotlib的imshow()函数将其绘制成热。调用colorbar()函数将添加一个颜色刻度条。请注意,我们需要使用.numpy()方法将张量转换为NumPy数组,以便在imshow()函数中使用。 ### 回答2: 深度学习是一种基于神经网络的机器学习方法,而Python是一种流行的编程语言,在深度学习领域中被广泛使用。PyTorch是一种常用的深度学习框架,提供了许多方便的功能和工具来实现深度学习模型。 在PyTorch中,可以使用`torchvision`库来加载和处理像数据。要注意力,我们需要定义一个模型,并使用训练好的模型对输入像进行预测。以下是一个简单的示例代码: ```python import torch import torch.nn as nn import torch.nn.functional as F import torchvision.transforms as transforms from PIL import Image # 加载预训练模型 model = ... # 定义和加载你的模型 # 加载像 input_image = Image.open('image.jpg') # 数据预处理 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(input_image) input_batch = input_tensor.unsqueeze(0) # 添加批次维度 # 模型推理 model.eval() with torch.no_grad(): output = model(input_batch) # 获取注意力 heatmap = output.squeeze().cpu() # 压缩批次维度并将张量移动到CPU上 heatmap = F.interpolate(heatmap, size=(224, 224), mode='bilinear') # 插值到原始输入像大小 heatmap = heatmap.numpy() # 可视化注意力 import matplotlib.pyplot as plt plt.imshow(heatmap, cmap='hot') plt.axis('off') plt.show() ``` 在这段代码中,首先加载预训练模型,并使用`torchvision.transforms`对输入像进行预处理。然后,通过模型进行推理并得到输出结果。最后,对输出结果进行处理以生成注意力,并使用Matplotlib库进行可视化。 需要注意的是,上述代码仅是一个示例,具体的细节部分(如加载预训练模型和模型定义)需要根据你使用的模型进行适当的修改。 ### 回答3: 深度学习是一种机器学习的方法,它通过构建多层网络结构,利用大量数据进行训练,提取高层次的特征表示。而注意力则是深度学习中一种可视化的技术,可以帮助我们理解神经网络在处理任务时的注意力分布。 PyTorch是一个用于科学计算的开源库,它提供了一套丰富的工具和函数,方便我们进行深度学习的开发。以下是一个利用PyTorch绘制注意力的示例代码: ```python import torch import torch.nn as nn import matplotlib.pyplot as plt # 定义一个简单的神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc = nn.Linear(10, 1) def forward(self, x): x = self.fc(x) return x # 构造一个随机的输入 input_data = torch.randn(1, 10) # 创建模型实例 model = Net() # 加载预先训练好的权重 model.load_state_dict(torch.load('model.pth')) # 开启eval模式 model.eval() # 获取模型输出和注意力分布 output = model(input_data) attention_weights = model.attention_weights # 将注意力分布矩阵可视化为热 plt.imshow(attention_weights.detach().numpy(), cmap='hot', interpolation='nearest') plt.colorbar() plt.show() ``` 在这个示例中,我们首先定义了一个简单的神经网络模型。然后使用`load_state_dict`加载预训练好的权重。之后,我们将模型设为`eval`模式,这是因为在训练和推断过程中,模型的行为不同。接下来,我们通过模型输入数据获得模型输出和注意力分布。最后,我们使用`imshow`函数将注意力分布矩阵可视化为热,并使用`colorbar`函数添加颜色条来显示对应数值的映射。最后,调用`show`函数显示热。 以上是一个使用PyTorch绘制注意力的简单示例。根据实际需求和模型结构的不同,代码可能会有所不同。希望这个示例能够帮助您理解如何利用深度学习和PyTorch绘制注意力

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

事多做话少说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值