特征可视化技术(CAM)

news2024/11/25 12:45:33

https://zhuanlan.zhihu.com/p/269702192
在这里插入图片描述

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函数将其可视化。

请注意,这只是一个简单的示例代码,您可以根据需要进行修改来适应您的数据和可视化需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/476082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】模板进阶——非类型模板参数、模板特化、模板分离编译

目录 1.非类型模板参数array 2.模板的特化2.1概念2.2函数模板特化2.3类模板特化1.全特化2.偏特化3.类模板特化应用示例 3.模拟分离编译3.1什么是分离编译3.2模板的分离编译1.问题:2.原因3.解决方法 4.模板总结 1.非类型模板参数 模板参数分为类型形参 与 非类型形参…

重新思考无边界世界中的网络安全

©网络研究院 在一个越来越不是物理边界而是数字边界的世界里,全球网络安全事件的数量持续上升,公共部门机构面临的挑战也随之增加。 保护组成数据的利害关系比以往任何时候都更加重要。为了抵御这些数字威胁,政府机构正在采用零信任方…

sqlite基础

一.sqlite基础 1.下载与环境配置 从下载地址,点击我 这里下载适合你版本的压缩包 您需要下载 sqlite-tools-win32-*.zip 和 sqlite-dll-win32-*.zip 压缩文件。创建文件夹 C:\sqlite,并在此文件夹下解压上面两个压缩文件,将得到 sqlite3.d…

【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现

简介 模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只…

ToLua框架

ToLua 是一个用于在 Unity 中为 Lua 提供 C# 语言绑定的框架。通过 ToLua,你可以方便地将 C# 代码暴露给 Lua 脚本,并在 Lua 脚本中调用 C# 类、方法和属性。 更新流程 原理:使用AssetBundle进行资源的更新,而由于lua运行时才编…

架构设计-分布式ID

一、 分布式ID基础 1.背景 1.为什么要引用分布式主键ID? 比如单机 MySQL 数据库,前期因为业务量不大,只是使用单个数据库存数据,后期发现业务量一下子就增长,单机 MySQL 已经不能满足于现在的数据量,单机…

【实战项目开发技术分享】常用的ROS工具与命令

常用的ROS工具介绍 作为机器人领域最为流行的开源框架之一,ROS(Robot Operating System)提供了丰富的工具来支持机器人的开发和部署。下面是一些常用的ROS工具及其功能的介绍: roscore:roscore是ROS的主要进程,它启动ROS Master节点并协调ROS系统中的所有进程。所有ROS节…

NEFU数据库基本操作实验总结

前言 SQL语言集数据定义、数据操纵、数据查询、数据控制功能于一体。 数据定义:create,drop,alter 数据操纵:增(insert into … ),删(delete from …),改(update … set …) 数据查询:select 数…

如何在 Linux 环境下安装使用 pycharm?介绍一种快捷打开方式

之所以要出这个教程,是想介绍一种更快捷的打开方式。官网上的教程,每次打开都要切换到下载地址,然后输入 ./pycharm.sh 才能运行。 如图,在任意位置打开终端,敲快捷键pc就能打开 pycharm 怎么样,非常方便…

MYSQL进阶01

MYSQL进阶 存储引擎存储引擎的特性MyISAMInnoDBMEMORY 如何选择合适的引擎 存储引擎 MYSQL默认支持多种存储引擎,可以根据用户不同需求选择合适的储存引擎。MYSQL支持的存储引擎包括但不局限于以下几种(MyISAM、InnoDB、MEMORY、MERGE…,创建…

【Leetcode -142.环形链表Ⅱ -143.重排链表】

Leetcode Leetcode -142.环形链表ⅡLeetcode - 143.重排链表 Leetcode -142.环形链表Ⅱ 题目:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 …

CodeRush Ultimate Crack终极版

CodeRush Ultimate Crack终极版 CodeRush Ultimate通过提高生产力,同时消除侵蚀创造力的重复,帮助开发人员在更短的时间内提供更多高质量的功能。它可以帮助您在几秒钟内创建复杂的代码块,并立即扩展代码模板,并在您按逻辑键入、扩…

[架构之路-179]-《软考-系统分析师》-19- 系统可靠性分析与设计 - 故障模型、可靠性模型、可靠性分析

目录 前言: 1 9 . 1 系统可靠性概述 19.1.1 系统故障模型 1. 在信息系统中,故障或错误有如下儿种表现形式: 2. 故障的缘由 3. 故障模型 (1)逻辑电路级的故障 (2) 数据结构级的故障 &a…

spass modeler

课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…

Wi-Fi (-6) 知识点整理

Wi-Fi - 6 知识点整理 2019年IEEE推出IEEE 802.11ax,WiFi联盟(WFA)称其为WiFi-6 Wi-Fi (Wireless Fidelity) 无线保真,无线兼容性认证 通信技术 商标 商业认证 技术联盟 Wi-Fi 网络基本要素 接入点(Access Point&a…

前端存储二:indexedDB

indexedDB 特点:以域名纬度,浏览器大量结构化数据存储方案,运行在浏览器的非关系型数据库。 大小:不会小于 250MB,支持二进制存储。 接口:异步接口,支持事物机制 这里使用网页脚本生成&#x…

【五一创作】【Simulink】采用延时补偿的三相并网逆变器FCS-MPC

👉 【Simulink】基于FCS-MPC的三相并网逆变器控制 上一篇博客介绍了FCS-MPC的基本操作,并且以三相并网逆变器为控制对象进行了Simulink仿真。 但实际仿真中没有考虑补偿延时。本篇博客将讨论为什么要考虑延时并进行补偿,最后对此仿真验证。 …

参会记录|全国多媒体取证暨第二届多媒体智能安全学术研讨会(MAS‘2023)

前言:2023年4月8日上午,我与实验室的诸位伙伴们共聚浙江杭州西子湖畔的六通宾馆,参加了为期一天半的全国多媒体取证暨第二届多媒体智能安全学术研讨会(MAS’2023)。本届学术研讨会由浙江省自然科学基金委员会资助&…

3.2 静态随机存取存储器

学习目标: 学习静态随机存取存储器(SRAM)的基本原理、结构和工作方式,理解其与动态随机存取存储器(DRAM)的区别和优缺点,掌握SRAM的性能参数和应用领域,了解SRAM的发展历程和未来趋…