pytorch可视化热力图(代码片段)

谷小雨 谷小雨     2023-04-24     727

关键词:

 

可视化热力图可以有两种方式:

1)特征图可视化,将各通道特征的最大值作为热力图像素值,进行可视化——可以参考博客,一种比较灵活的特征图保存方式

2)根据梯度值结合特征图计算热力图,热力图的显示的重点是梯度高的地方,也是网络关注的重点

 

基于梯度进行热力图可视化有一些工作,如grad-cam,也有一些开发好的脚本,不过这些脚本不具有通用性,

因此此处基于torch的hook机制进行可视化,是一种基础并且通用性很好的策略,很容易在自己的模式上进行尝试。

 

代码的逻辑结构如下:

首先定义模型,加载权重,再对想要可视化的网络层进行hook注册,接下来推理模型并进行梯度反传即可,

farward_hook,backward_hook会自动获取对应的特征图和反传梯度,后面处理并保存到本地

# coding: utf-8
import cv2
import os
import torch
import numpy as np


def img_preprocess(img_in):
    pass

# get activate map
def backward_hook(module, grad_in, grad_out):
    grad_block.append(grad_out[0].detach())

# get gradient map 
def farward_hook(module, input, output):
    fmap_block.append(output)

# apply color to heatmap and save the result
def show_cam_on_image(img, mask, out_dir):
    h, w, _ = img.shape
    heatmap = cv2.resize(heatmap, (w, h))
    heatmap = cv2.applyColorMap(np.uint8(255*mask), cv2.COLORMAP_JET)
    heatmap = np.float32(heatmap) / 255
    img = np.float32(img) / 255         # make sure pixel value will not be bigger than 256 after add
    cam = heatmap + np.float32(img)     # show heatmap in original image
    cam = cam / np.max(cam)

    path_cam_img = os.path.join(out_dir, "cam.jpg")
    path_raw_img = os.path.join(out_dir, "raw.jpg")
    if not os.path.exists(out_dir):
        os.makedirs(out_dir)
    cv2.imwrite(path_cam_img, np.uint8(255 * cam))
    cv2.imwrite(path_raw_img, np.uint8(255 * img))


def gen_cam(feature_map, grads):
    """
    依据梯度和特征图,生成cam
    :param feature_map: np.array, in [C, H, W]
    :param grads: np.array, in [C, H, W]
    :return: np.array, [H, W]
    """
    cam = np.zeros(feature_map.shape[1:], dtype=np.float32)  # cam shape (H, W)

    weights = np.mean(grads, axis=(1, 2))  #

    for i, w in enumerate(weights):
        cam += w * feature_map[i, :, :]

    cam = np.maximum(cam, 0)
    cam = cv2.resize(cam, (32, 32))
    cam -= np.min(cam)
    cam /= np.max(cam)

    return cam


if __name__ == \'__main__\':

    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    path_img, path_net, output_dir = None, None, None # change to yours 

    fmap_block = list()
    grad_block = list()

    # 图片读取;网络加载
    img = cv2.imread(path_img, 1)  # H*W*C
    img_input = img_preprocess(img)
    model = ResNet50()
    model.load_state_dict(torch.load(path_net))

    # 注册 hook
    model.layer4.register_forward_hook(farward_hook)    # get activate map
    model.layer4.register_backward_hook(backward_hook)  # get gradient map

    # forward
    output = model(img_input)   # model.training is True

    # backward
    model.zero_grad()
    loss = model.get_loss(output)
    loss.backward()

    # 生成cam
    grads_val = grad_block[0].cpu().data.numpy().squeeze()
    fmap = fmap_block[0].cpu().data.numpy().squeeze()
    cam = gen_cam(fmap, grads_val)

    # 保存cam图片
    show_cam_on_image(img, cam, output_dir)

——主体参考代码

r使用热力图(heatmap)可视化数据集(代码片段)

R使用热力图(heatmap)可视化数据集R使用热力图(heatmap)可视化数据集#安装、加载包install.packages(\'RNHANES\')library(RNHANES)library(tidyverse)******************************************************************************Warningmes 查看详情

数据可视化之seaborn热力图参数详解(很多例子)(代码片段)

defheatmap(data,vmin=None,vmax=None,cmap=None,center=None,robust=False,annot=None,fmt=".2g",annot_kws=None,linewidths=0,linecolor="white",cbar&# 查看详情

数据可视化之seaborn热力图参数详解(很多例子)(代码片段)

defheatmap(data,vmin=None,vmax=None,cmap=None,center=None,robust=False,annot=None,fmt=".2g",annot_kws=None,linewidths=0,linecolor="white",cbar&# 查看详情

.可视化数据分析图表—常用图表的绘制3—散点图,面积图,热力图(代码片段)

第五章.可视化数据分析图5.3常用图表的绘制3—散点图,面积图,热力图本节主要介绍常用图表的绘制,主要包括散点图,面积图,热力图。1.散点图(matplotlib.pyplot.scatter)·散点图主要用来查看数据的... 查看详情

可视化神器plotly绘制热力图(代码片段)

公众号:尤而小屋作者:Peter编辑:Peter大家好,我是Peter~之前更新了很多关于Plotly绘图的文章。今天带来的文章是基于官网和实际案例来讲解如何绘制不同需求下的热力图。Plotly中绘制热力图有3种方式:heatma... 查看详情

在arcgis地图上绘制echarts热力图(heatmap)(代码片段)

...www.cnblogs.com/qiaoge0923/p/9562304.html  现如今,Echarts在数据可视化方面早已升入化境,已经不再拘泥于简单的饼图柱状图,已然从平面直角坐标系,扩展到了极坐标系和地理坐标系等等。  随着地图的使用越来越 查看详情

yolov8-gradcam热力图可视化即插即用不需要对源码做任何修改!(代码片段)

YOLOV8GradCam热力图可视化.本文给大家带来yolov8-gradcam热力图可视化,这个可视化是即插即用,不需要对源码做任何修改喔!给您剩下的不少麻烦!代码链接:yolo-gradcam里面还有yolov5和v7的热力图可视化代码,... 查看详情

空间数据可视化:3.空间热力图

1.powermap 对于热力图它跟空间柱状图是差不多的,也是空间位置+value值;如果只有空间位置,可能求的是密度图,就是我们之前用python中的seaborn做的两个维度的密度图,其实就是热力图的意思;两个维度的密度图就是热力图&... 查看详情

r语言ggplot2可视化热力图(heatmap)自定义配置图例标签为百分比进行热力图颜色渐变显示(legendtodisplaypercentagesign)

R语言ggplot2可视化热力图(heatmap)、自定义配置图例标签为百分比进行热力图颜色渐变显示(legendtodisplaypercentagesign)目录 查看详情

#openlayer热力图显示(代码片段)

openlayer热力图显示相关库类importmomentfrom\'moment\'importProjectionfrom\'ol/proj/Projection\'importStaticfrom\'ol/source/ImageStatic\'importMapfrom\'ol/Map\'importImageLayerfrom\'ol/layer/Image\'importViewfr 查看详情

r可视化使用ggplot2创建样本数据热力图(heatmap)

R可视化使用ggplot2创建样本数据热力图(heatmap)目录R可视化使用ggplot2创建样本数据热力图(heatmap)数据加载及变形 查看详情

学习打卡05可解释机器学习笔记之cam+captum代码实战(代码片段)

...习笔记之CAM+Captum代码实战代码实战介绍torch-cam工具包可视化CAM类激活热力图预训练ImageNet-1000图像分类-单张图像视频以及摄像头预测pytorch-grad-cam工具包Grad-CAM热力图可解释性分析基于GuidedGrad-CAM的高分辨率细粒度可解释性分析... 查看详情

数据可视化:pandas透视图、seaborn热力图

参考技术A输出:ref: 查看详情

python可视化lassocv特征筛选之后的特征的相关性分析热力图

python可视化lassocv特征筛选之后的特征的相关性分析热力图目录python可视化lassocv特征筛选之后的特征的相关性分析热力图#lassocv模型 查看详情

openlayers6热力图(附源码下载)(代码片段)

前言之前写过一篇openlayers4版本的地图热力图文章,但是由于是封装一层js代码写的,很多初学者看起来比较有点吃力,所以本篇文章重新写一篇地图热力图文章,直接基于最新版本openlayers6写的,纯粹html+js+css形式,没有任何封... 查看详情

textarcgisforjs4.x集成热力图(代码片段)

查看详情

r语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战

R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战目录R语言相关性计算及使用ggcorrplot包相关性分析热力图可视化分析实战 查看详情

r语言ggplot2可视化相关性分析热力图heatmap使用ggcorrplot函数可视化相关性热力图(correllogram)自定义设置显示上三角形或者下三角形设置显示相关性数值颜色尺度条

R语言ggplot2可视化相关性分析热力图heatmap、使用ggcorrplot函数可视化相关性热力图(Correllogram)、自定义设置显示上三角形或者下三角形、设置显示相关性数值、颜色尺度条目录 查看详情