特征可视化技术(CAM)

这篇具有很好参考价值的文章主要介绍了特征可视化技术(CAM)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

https://zhuanlan.zhihu.com/p/269702192
特征可视化技术(CAM)

CAM技术可以帮助我们理解CNN在图像中寻找目标对象的过程,并且可以用于可视化CNN的中间层特征,以及对图像分类结果的解释和可视化。CAM技术的实现比较简单,可以使用常用的深度学习框架如PyTorch和TensorFlow来实现。

CAM(Class Activation Map)是一种特征可视化技术,它可以帮助我们理解神经网络对图像分类的决策过程。CAM技术可以生成一个热力图,用来可视化输入图像中哪些区域对于神经网络的分类决策起到了重要作用。CAM技术主要适用于基于卷积神经网络的图像分类任务。

在CNN中,每个卷积层都会生成一组特征图,其中每个特征图对应一个卷积核。CAM技术利用全局平均池化(Global Average Pooling,GAP)操作来捕捉每个特征图中与目标类别相关的特征。然后,将这些特征映射到输入图像的空间位置上,从而生成对应于每个类别的类激活图(Class Activation Map)。

具体地说,CAM技术的步骤如下:

  1. 将图像输入到CNN中,并获得最后一个卷积层的输出特征图。

  2. 对于每个目标类别,计算其在卷积层输出特征图中的权重,即使用全局平均池化操作对该类别对应的特征图进行加权平均。

  3. 将这些权重与卷积层输出特征图相乘,并对结果进行求和,得到对应于该类别的类激活图(Class Activation Map)。

  4. 对类激活图进行归一化处理,从而得到可视化结果。

以下是一个简单的示例代码,它使用PyTorch和CAM技术来可视化图像中哪些区域对于神经网络的分类决策起到了重要作用:

import torch
import torch.nn as nn
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

# 加载预训练的ResNet50模型
model = torch.hub.load('pytorch/vision', 'resnet50', pretrained=True)

# 定义CAM模型
class CAM(nn.Module):
    def __init__(self, feature_extractor, classifier):
        super(CAM, self).__init__()
        self.feature_extractor = feature_extractor
        self.classifier = classifier
        self.gradient = None

    def gradients_hook(self, grad):
        self.gradient = grad

    def forward(self, x):
        x = self.feature_extractor(x)
        h = x.register_hook(self.gradients_hook)
        x = self.classifier(x)
        h.remove()
        return x

# 定义CAM可视化函数
def visualize_CAM(image, model, target_class):
    # 转换图像为张量
    transform = transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
    image = transform(image).unsqueeze(0)

    # 定义CAM模型
    feature_extractor = nn.Sequential(*list(model.children())[:-2])
    classifier = model.fc
    cam_model = CAM(feature_extractor, classifier)

    # 前向传播
    output = cam_model(image)
    target = torch.Tensor([target_class])
    loss = nn.functional.binary_cross_entropy_with_logits(output, target)

    # 反向传播
    cam_model.zero_grad()
    loss.backward()

    # 计算CAM
    features = cam_model.feature_extractor(image).detach().squeeze()
    weights = cam_model.gradient.squeeze().mean(dim=(1, 2), keepdims=True)
    cam = (weights * features).sum(dim=0)
    cam = np.maximum(cam, 0)
    cam = cam / cam.max()

    # 可视化CAM
    plt.imshow(image.squeeze().permute(1, 2, 0))
    plt.imshow(cam, cmap='jet', alpha=0.5, interpolation='nearest')
    plt.axis('off')
    plt.show()

# 加载一张测试图像
image = plt.imread('test_image.jpg')

# 可视化CAM
visualize_CAM(image, model, target_class=0)

在上述代码中,我们首先加载了一个预训练的ResNet50模型,并定义了一个CAM模型。然后,我们定义了一个可视化CAM的函数,该函数接受一张图像、一个神经网络模型和一个目标类别,然后使用CAM技术生成一个热力图来可视化输入图像中哪些区域对于神经网络的分类决策起到了重要作用。最后,我们加载一张测试图像,并使用可视化CAM函数将其可视化。

请注意,这只是一个简单的示例代码,您可以根据需要进行修改来适应您的数据和可视化需求。文章来源地址https://www.toymoban.com/news/detail-433255.html

到了这里,关于特征可视化技术(CAM)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 可视化CNN和特征图

    卷积神经网络(cnn)是一种神经网络,通常用于图像分类、目标检测和其他计算机视觉任务。CNN的关键组件之一是特征图,它是通过对图像应用卷积滤波器生成的输入图像的表示。 1、卷积操作 卷积的概念是CNN操作的核心。卷积是一种数学运算,它把两个函数结合起来产生第三

    2023年04月10日
    浏览(42)
  • 【Pytorch】 特征图的可视化

    Pytroch中间层的特征图可视化,网上已经有很多教程,比如用hook钩子函数,但是代码都写得不是很清楚,所以还是自己去摸索一下。 目前这种方法有很大的缺陷,最近看一篇国外的blog时,发现了Pytorch官方文档有一个Torch FX,基于这个实现了特征提取,更新一下Pytorch官方实现

    2023年04月18日
    浏览(84)
  • # Pytorch 深度卷积模型的特征可视化

    可视化模型的特征层需要打印各层的名称: 安装torchsummary包 打印各层名称

    2024年02月16日
    浏览(31)
  • pytorch对中间特征层可视化方案

    本文主要介绍如何使用pytorch获得已经训练好的网络的中间特征层,并将其转化为热力图的简单方法 效果图 1、在原本的test代码上进行修改 2、随便写一个钩子函数(具体了解可以搜索“pytorch中的钩子(Hook)有何作用?”) 3、然后注册一下钩子函数(在你需要保存的卷积层进行

    2024年02月13日
    浏览(58)
  • 网络特征之PCA可视化-Python实现

    PCA也是对网络特征可视化的一种方法,目的是对特征进行降维,然后通过图片的形式来对网络的特征提供一种解释。 所以,本博客提供一个将网络特征进行PCA的可视化的代码,其原理为将C通道的特征降维到3通道,即图片的RGB通道,然后直接进行可视化。 关于PCA和t-SNE的差异

    2023年04月08日
    浏览(46)
  • CNNs:ZFNet之基于AlexNet特征可视化实验分析

    上一篇我们介绍了如何利用 Deconvnet 网络进行特征可视化操作,本篇我们将基于 Deconvnet 对文献中的相关实验进行分析,并验证一些结论。除此之外,我们还将针对实验现象对对 AlexNet 网络进行微调( ZFNet ),并对网络进行简单介绍。然后基于 ZFNet 进行实验分析。 实验条件:

    2024年02月07日
    浏览(28)
  • 3DSC特征描述符、对应关系可视化以及ICP配准

    pcl::NormalEstimationOMPpcl::PointXYZ, pcl::Normal n; : pcl::NormalEstimationOMP  是一个用于估计点云法线的类,它利用了 OpenMP 进行多线程加速。 pcl::PointXYZ, pcl::Normal  指定输入点云类型为  pcl::PointXYZ ,输出法线类型为  pcl::Normal 。 pcl::PointCloudpcl::Normal::Ptr normals(new pcl::PointCloudpcl::Normal);

    2024年02月19日
    浏览(33)
  • pytorch中使用TensorBoard进行可视化Loss及特征图

    安装TensorBoard 导入TensorBoard 实例化TensorBoard 训练过程中的loss,accuracy等都是标量,都可以用TensorBoard中的add_scalar来显示,add_scalar方法中第一个参数表示表的名字,第二个参数表示的是你要存的值,第三个参数可以理解为x轴坐标。 终端输入tensorboard --logdir=logs,开启TensorBoard

    2023年04月12日
    浏览(49)
  • python机器学习(七)决策树(下) 特征工程、字典特征、文本特征、决策树算法API、可视化、解决回归问题

    特征提取就是将任意数据转换为可用于机器学习的数字特征。计算机无法直接识别字符串,将字符串转换为机器可以读懂的数字特征,才能让计算机理解该字符串(特征)表达的意义。 主要分为:字典特征提取(特征离散化)、文本特征提取(文章中特征词汇出现的频次)。 字典特

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包