【可视化】深度学习——热力图

1️⃣背景介绍:

在深度学习中,卷积神经网络(CNN)和多模态模型通常会生成大量的中间特征图(Feature Map)。这些特征图包含了模型对输入数据的响应信息,是理解模型行为和调试的重要工具。

传统的可视化方法包括:

  • 直接绘制灰度图

  • 使用 Matplotlib 生成热力图

但当特征图在 GPU 上时,直接使用 Matplotlib 处理可能效率低下。本文将介绍如何利用 OpenCV 在 GPU 上可视化特征图热力图,既高效又直观。


2️⃣ 功能说明

本文提供两种可视化方法:

  1. 单通道热力图可视化

    • 对每个通道生成一张热力图

    • 适合观察每个通道的响应分布

    • 支持阈值过滤、大小调整、彩色映射

  2. 通道平均热力图可视化

    • 将所有通道求平均,生成一张整体热力图

    • 适合快速查看特征整体响应区域


3️⃣ 代码解析

3.1 单通道热力图函数

def visualize_heatmap_opencv(feature_map, sample_idx, save_dir, width=16, height=16, output_size=(1000, 880), threshold=0):
    """
    使用 OpenCV 在 GPU 上可视化特征图的热力图。

    参数:
    - feature_map: 4D 张量,形状为 [batch_size, C, H, W],并在 GPU 上
    - sample_idx: 选择要可视化的样本在 batch 中的索引
    - save_dir: 保存热力图的文件目录
    - width: 子图的列数
    - height: 子图的行数
    - threshold: 用于调整热力图的显示阈值
    """
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # 选择指定样本,形状为 [C, H, W]
    feature_map = feature_map[sample_idx]

    for i in range(width * height):
        if i >= feature_map.size(0):  # 如果通道数少于子图数量,提前结束
            break

        # 在 GPU 上归一化每个特征图
        img = feature_map[i]
        img_min, img_max = img.min(), img.max()

        # 应用阈值调整
        img = torch.where(img < img_min + threshold * (img_max - img_min), img_min + threshold * (img_max - img_min), img)

        # 归一化到0-255范围
        img = ((img - img_min) / (img_max - img_min + 1e-6) * 255).to(torch.uint8)  # 归一化到0-255范围

        # 将图像转为 CPU 后使用 OpenCV 生成热力图
        img = img.cpu().numpy()  # 转到 CPU 并转成 NumPy

        # 使用高斯模糊平滑图像
        img = cv2.GaussianBlur(img, (1, 1), 1.0)

        # 调整热力图尺寸
        img_resized = cv2.resize(img, output_size)  # 调整热力图大小

        img_colormap = cv2.applyColorMap(img_resized, cv2.COLORMAP_HOT)  # 生成彩色热力图

        # 保存热力图
        cv2.imwrite(os.path.join(save_dir, f'feature_{i}.png'), img_colormap)

解析:

  • feature_map[sample_idx]:选择 batch 中的样本

  • torch.where + threshold:忽略低响应区域,提高热力图可读性

  • cv2.applyColorMap:将灰度图转换为彩色热力图

  • cv2.imwrite:保存热力图


3.2 通道平均热力图函数

def visualize_heatmap_opencv_1(feature_map, sample_idx, save_dir, output_size=(1000, 880), threshold=0):
    """
    使用 OpenCV 在 GPU 上可视化特征图的热力图(将所有通道取平均生成一张图像)。

    参数:
    - feature_map: 4D 张量,形状为 [batch_size, C, H, W],并在 GPU 上
    - sample_idx: 选择要可视化的样本在 batch 中的索引
    - save_dir: 保存热力图的文件目录
    - threshold: 用于调整热力图的显示阈值
    """
    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    # 选择指定样本,形状为 [C, H, W]
    feature_map = feature_map[sample_idx]

    # 对通道进行平均,生成 [H, W] 的单张图像
    avg_feature_map = feature_map.mean(dim=0)  # 在通道维度上求平均

    # 在 GPU 上归一化
    img_min, img_max = avg_feature_map.min(), avg_feature_map.max()

    # 应用阈值调整
    avg_feature_map = torch.where(
        avg_feature_map < img_min + threshold * (img_max - img_min),
        img_min + threshold * (img_max - img_min),
        avg_feature_map
    )

    # 归一化到0-255范围
    img = ((avg_feature_map - img_min) / (img_max - img_min + 1e-6) * 255).to(torch.uint8)

    # 将图像转为 CPU 后使用 OpenCV 生成热力图
    img = img.cpu().numpy()  # 转到 CPU 并转成 NumPy

    # 使用高斯模糊平滑图像
    img = cv2.GaussianBlur(img, (3, 3), 0)

    # 调整热力图尺寸
    img_resized = cv2.resize(img, output_size)  # 调整热力图大小

    # 生成彩色热力图
    img_colormap = cv2.applyColorMap(img_resized, cv2.COLORMAP_HOT)

    # 保存热力图
    cv2.imwrite(os.path.join(save_dir, 'average_feature_heatmap.png'), img_colormap)

解析:

  • feature_map.mean(dim=0):对所有通道取平均

  • 生成一张综合热力图,快速观察模型对输入的响应热点


4️⃣ 可视化效果

  • 单通道热力图:可看到每个通道的特征响应分布

  • 通道平均热力图:显示整体响应区域,突出模型重点关注的区域​​​​​​

### 如何生成热力 热力是一种常见的可视化方式,能够直观展示二维数据矩阵中的数值分布情况。以下是几种常用编程语言及其库实现热力的方法。 #### 使用 Python 和 Matplotlib 库 Python 的 `matplotlib` 是一种强大的绘工具,可以通过其子模块 `pyplot` 实现热力绘制。下面是一个简单的例子: ```python import matplotlib.pyplot as plt import numpy as np # 创建随机数据 data = np.random.rand(10, 10) # 绘制热力 plt.figure(figsize=(8, 6)) heatmap = plt.imshow(data, cmap='viridis', interpolation='nearest') # 添加颜色条 plt.colorbar(heatmap) # 设置坐标轴标签 plt.title('Heatmap Example') plt.xlabel('X-axis Label') plt.ylabel('Y-axis Label') # 显示像 plt.show() ``` 上述代码展示了如何使用 `imshow()` 函数生成热力,并通过参数指定颜色映射方案(如 `'viridis'`),这有助于增强视觉效果[^3]。 #### 使用 Seaborn 库 Seaborn 是基于 Matplotlib 构建的一个高级统计表库,提供了更简洁的接口来生成复杂的形。以下是如何用它制作带注释的热力: ```python import seaborn as sns import pandas as pd import numpy as np # 随机生成 DataFrame 数据 df = pd.DataFrame(np.random.randn(10, 10), columns=[f'Col {i}' for i in range(10)]) # 利用 seaborn.heatmap() 方法画 sns.set_theme(style="whitegrid", palette="pastel") heat_map = sns.heatmap(df, annot=True, fmt=".2f", linewidths=.5, square=True, cbar_kws={"shrink": .7}) # 调整布局并显示片 plt.title('Annotated Heatmap with Seaborn') plt.xticks(rotation=45) plt.tight_layout() plt.show() ``` 此脚本不仅实现了基本功能还加入了额外特性比如单元格内的具体数值标注以及调整了边框样式等细节设置[^4]。 #### R 语言中的 ggplot2 包 对于偏好R语言的人来说,ggplot2也是一个极佳的选择之一: ```r library(ggplot2) set.seed(123) dat <- data.frame( X = rep(c("A","B"), each=5), Y = factor(rep(letters[1:5], times=2)), Z = runif(n=10,min=-1,max=1)) ggplot(dat,aes(X,Y))+ geom_tile(aes(fill=Z))+scale_fill_gradient(low="blue",high="red")+ theme_minimal()+labs(title="Heat Map Using GGPLOT2 In R",fill="Value") ``` 这里我们构建了一个包含三列的数据框分别代表横纵坐标位置及对应强度值最后调用了 geom_tile 层次结构完成渲染过程同时设置了渐变填充规则使得不同区域间过渡更加平滑自然[^5]. ### 总结 无论是选用哪种技术栈来进行开发工作都可以很方便快捷地得到一张高质量的度分布只要掌握了相应框架下的核心API即可灵活运用到实际项目当中去解决各类需求场景下遇到的问题.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值