5分钟搞定深度学习中间特征可视化

news2024/11/23 12:23:39

精华置顶
墙裂推荐!小白如何1个月系统学习CV核心知识:链接

今天跟大家分享一个可视化CNN/ViT中间特征的库:pytorch-grad-cam

下载地址:https://github.com/jacobgil/pytorch-grad-cam

pytorch-grad-cam支持多种可视化方法,如下表所示:

一些可视化示例

5分钟实现网络特征可视化

(1)安装pytorch-grad-cam

在安装完pytorch和torchvision库后,使用命令pip install grad-cam安装pytorch-grad-cam

(2)导入所需的库,定义model

这里直接使用torchvision中带有预训练权重的resnet18,可视化resnet18某一层的输出feature map。

import numpy as np
import cv2

import torchvision.models as models
import torchvision.transforms as transforms

import pytorch_grad_cam 
from pytorch_grad_cam.utils.image import show_cam_on_image

# 从torchvision中导入resnet16
resnet18 = models.resnet18(pretrained=True)
resnet18.eval()

(3)设置可视化哪个层的输出feature map

打印上面定义的resnet18,查看层的名字。下图为部分打印结果

可以可视化resnet18.layer4[0].conv1resnet18.layer4[1].bn2等你感兴趣的层的输出feature map。

比如想可视化resnet18.layer4[1].bn2的输出feature map,则:

traget_layers = [resnet18.layer4[0].conv1]

(4)读取输入图片,进行图片预处理,得到网络输入tensor以及用于可视化时的原始图像

# 读取图片,将图片转为RGB
origin_img = cv2.imread('./bird.jpg')
rgb_img = cv2.cvtColor(origin_img, cv2.COLOR_BGR2RGB)

# 图片预处理:resize、裁剪、归一化
trans = transforms.Compose([
    transforms.ToTensor(),
    transforms.Resize(224),
    transforms.CenterCrop(224)
])
crop_img = trans(rgb_img)
net_input = transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))(crop_img).unsqueeze(0)

# 将裁剪后的Tensor格式的图像转为numpy格式,便于可视化
canvas_img = (crop_img*255).byte().numpy().transpose(1, 2, 0)
canvas_img = cv2.cvtColor(canvas_img, cv2.COLOR_RGB2BGR)

(5)得到可视化结果

这里使用GradCAM++方法进行可视化。注意pytorch_grad_cam.GradCAMPlusPlus中要输入步骤(3)中定义的traget_layers,用于指定要可视化的feature map。

# 实例化cam,得到指定feature map的可视化数据
cam = pytorch_grad_cam.GradCAMPlusPlus(model=resnet18, target_layers=traget_layers, use_cuda=False)
grayscale_cam = cam(net_input)
grayscale_cam = grayscale_cam[0, :]

# 将feature map与原图叠加并可视化
src_img = np.float32(canvas_img) / 255
visualization_img = show_cam_on_image(src_img, grayscale_cam, use_rgb=False)
cv2.imshow('feature map', visualization_img)
cv2.waitKey(0)

可视化结果如下:

完整代码如下:

import numpy as np
import cv2

import torchvision.models as models
import torchvision.transforms as transforms

import pytorch_grad_cam 
from pytorch_grad_cam.utils.image import show_cam_on_image


# 1.定义模型结构,选取要可视化的层
resnet18 = models.resnet18(pretrained=True)
resnet18.eval()
traget_layers = [resnet18.layer4[1].bn2]

# 2.读取图片,将图片转为RGB
origin_img = cv2.imread('./bird.jpg')
rgb_img = cv2.cvtColor(origin_img, cv2.COLOR_BGR2RGB)

# 3.图片预处理:resize、裁剪、归一化
trans = transforms.Compose([
    transforms.ToTensor(),
    transforms.Resize(224),
    transforms.CenterCrop(224)
])
crop_img = trans(rgb_img)
net_input = transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))(crop_img).unsqueeze(0)

# 4.将裁剪后的Tensor格式的图像转为numpy格式,便于可视化
canvas_img = (crop_img*255).byte().numpy().transpose(1, 2, 0)
canvas_img = cv2.cvtColor(canvas_img, cv2.COLOR_RGB2BGR)

# 5.实例化cam
cam = pytorch_grad_cam.GradCAMPlusPlus(model=resnet18, target_layers=traget_layers, use_cuda=False)
grayscale_cam = cam(net_input)
grayscale_cam = grayscale_cam[0, :]

# 6.将feature map与原图叠加并可视化
src_img = np.float32(canvas_img) / 255
visualization_img = show_cam_on_image(src_img, grayscale_cam, use_rgb=False)
cv2.imshow('feature map', visualization_img)
cv2.waitKey(0)

推荐阅读:

图像分类任务ViT与CNN谁更胜一筹?DeepMind用实验证明

如何优雅地读取网络的中间特征?

港科大提出适用于夜间场景语义分割的无监督域自适应新方法

EViT:借鉴鹰眼视觉结构,南开大学等提出ViT新骨干架构,在多个任务上涨点

HSN:微调预训练ViT用于目标检测和语义分割,华南理工和阿里巴巴联合提出

使用目标之间的先验关系提升目标检测器性能

CV计算机视觉每日开源代码Paper with code速览-2023.10.27

CV计算机视觉每日开源代码Paper with code速览-2023.10.26

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

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

相关文章

接口测试之jmeter基本归结

一、接口测试 二、jmeter脚本开发 三、Jmeter参数化技术

云帆培训考试系统更新说明:v6.9.0

1、增加群组功能 -- 增加群组功能,一个用户可以存在于多个小组中; -- 在线考试、课程学习、活动报名、题库训练、知识竞赛增加群组权限设置; 2、增加线下考试功能 -- 增加线下考试功能,可批量导入线下成绩,管理线下…

Spring Web MVC练习

一:开发程序常见问题 (1)学会定位前后端问题 💗通过看日志,查看到底是前端问题还是后端问题 ①前端:F12查看网页的控制台 ②后端:测试后端接口参数;查看IDEA的控制台 (测试后端接口参数,即去访…

java中包的概念

内容仅供复习 java中包是把一些类进行打包,在一个包中所有public的类可以直接使用。如果在别的包中要使用一个类就必须import这个包。friendly类型的方法在同个包中可以使用,在不同包里面不可以访问这个类型的方法。 创建一个java项目,在src…

【Http协议】 二

实际开发中,经常需要能够手动的构造出Http协议的请求 一般是通过以下几种方式: 1.通过html中的form表单 2.通过js的ajax 3.Java代码(其他各种语言) 4.借助一些第三方工具 1.通过html的form标签/表单构造http请求 >对于编写html…

SpringBoot通过注解形式实现系统操作日志

介绍 我们在日常开发工作中,肯定逃不开与日志接触,一些比较严谨的后台管理系统里面会涉及到一些比较重要的资料,有些公司为了知道有哪些人登录了系统,是谁在什么时候修改了用户信息或者资料,所以就有了操作日志这么个…

MySQL 基础学习笔记(一)

目录 1 SQL简介2 MySQL基本语法2.1 语法规则2.2 数据类型 3 DDL3.1 操作数据库3.2 操作表 4 DML4.1 添加数据4.2 修改数据4.3 删除数据 5 DQL5.1 基础查询5.2 条件查询5.3 排序查询5.4 聚合查询5.5 分组查询5.6 分页查询 1 SQL简介 SQL :Structured Query Language&…

基于 MySQL 多通道主主复制的机房容灾方案

文章中介绍了多种 MySQL 高可用技术,并介绍了根据自身需求选择多通道主主复制技术的过程和注意事项。 作者:徐良,现任中国移动智慧家庭运营中心数据库高级经理,多年数据库运维优化经验,历任华为、一线互联网公司高级 D…

使用Nokogiri和OpenURI库进行HTTP爬虫

目录 一、Nokogiri库 二、OpenURI库 三、结合Nokogiri和OpenURI进行爬虫编程 四、高级爬虫编程 1、并发爬取 2、错误处理和异常处理 3、深度爬取 总结 在当今的数字化时代,网络爬虫已经成为收集和处理大量信息的重要工具。其中,Nokogiri和OpenUR…

softmax的高效CUDA编程和oneflow实现初步解析

本文参考了添加链接描述,其中oneflow实现softmax的CUDA编程源代码参考链接添加链接描述 关于softmax的解读以及CUDA代码实现可以参考本人之前编写的几篇文章添加链接描述,添加链接描述,添加链接描述 下面这个图片是之前本人实现的softmax.cu经过接入python接口,最终和pytor…

Javascript基础-BOM

文章目录 BOM——Browser Object Model定时器--延时函数 JS执行机制具体流程 三个常见对象location对象navigator对象history对象 本地存储介绍sessionStoragesessionStorage 存储复杂数据类型字符串拼接 正则表达式元字符 BOM——Browser Object Model 浏览器对象模型&#x…

【LeetCode:26. 删除有序数组中的重复项 | 双指针】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

怎么从外面远程访问服务器设备?

怎么从外面远程访问服务器设备? “我家里有一台服务器设备,当我在学校时需要远程访问家里的服务器。请问是否可以从外网远程访问家里的服务器设备,有什么方法可以实现吗?” 远程访问服务器设备,一种典型…

20量子比特!芬兰成功研发第二台量子计算机

(图片来源:网络) 近期,芬兰国家技术研究中心(VTT)宣布,已顺利研发芬兰第二台量子计算机,该计算机具有20个超导量子比特,由芬兰国家技术研究中心(VTT&#xf…

java如何获取调用接口的ip?

获取调用者的ip 场景:想知道哪个ip访问的某个接口时,就需要打印出来看看,这时就可以使用这个方法了。 案例: //HttpServletRequest 入参加上,请求对象public ForkResponse queryXXX(RequestBody XXXX xxxx, HttpServletRequest …

Ps:快速选择工具​

对那些有清晰轮廓的对象进行抠图,在 Ps 中传统的方法是钢笔工具和快速选择工具 Quick Selection Tool。其中,快速选择工具以其使用简单快捷而受到众人喜爱。 快捷键:W ◆ ◆ ◆ 常用操作方法与技巧 1、将快速选择工具的笔刷从目标对象的内部…

用前端框架Bootstrap和Django实现用户注册页面

01-新建一个名为“mall_backend”的Project 命令如下: CD E:\Python_project\P_001\myshop-test E: django-admin startproject mall_backend02-新建应用并注册应用 执行下面条命令依次创建需要的应用: CD E:\Python_project\P_001\myshop-test\mall…

Nacos常规问题汇总

一、Nacos常规问题 Nacos是什么 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。详情可以参考Nacos官网介绍。 Nacos如何支持多环境 在日常使用中常常需要不同的环…

“破解我!“---160个CrackMe练习002-Afkayas.1.Exe

文章目录 前言题目分析程序分析Keygen 前言 系列之002,记录学习。 题目分析 一道一星的题目 惯例查壳。 32-bit的文件,用的是 VB 写的。 关于Visual Basic: Visual Basic(VB)是由微软公司开发的包含环境的事件驱动…

酒店预订订房小程序源码系统 带完整搭建教程

酒店预订订房小程序源码系统是一种基于互联网技术的线上预订平台,旨在为用户提供方便快捷的酒店预订服务。该系统通常包括前端用户界面、后端服务器和数据库三个部分,其中前端界面主要展示酒店信息、订房需求信息、订单信息等,后端服务器负责…