【yolov5小技巧(2)】---将yolov5中的特征图以热力图的方式进行可视化

在这里插入图片描述


文章目录

  • 🚀🚀🚀前言
  • 一、1️⃣ 将特征图可视化的文章CFPNet
  • 二、2️⃣yolov5自带的特征图可视化工具
  • 三、3️⃣如何将特征图转换成热力图


在这里插入图片描述

👀🎉📜系列文章目录

【yolov5小技巧(1)】—可视化并统计目标检测中的TP、FP、FN

🚀🚀🚀前言

在论文中我们经常可以见到提取的物体特征以热力图的形式展示出来,首先我们要了解为什么要将特征图以热力图的形式进行可视化,将特征图以热力图的方式进行可视化在深度学习中有几个重要的原因:
强调激活区域 :热力图可以帮助我们直观地理解哪些区域对于模型的决策是最重要的。通过热力图,我们可以看到特征图中哪些区域具有较高的激活值,从而了解模型对于不同特征的关注程度。
可视化激活模式 :热力图可以展示模型在特定任务或数据集上学到的激活模式。例如,在图像分类任务中,热力图可以显示模型对于不同物体或区域的激活情况,从而帮助我们理解模型的决策依据。
可视化网络学习的过程 :通过在训练过程中可视化特征图的热力图,我们可以观察模型随着训练的进行而学习到的特征的变化。这有助于我们理解模型是如何逐步改进并适应数据的。
提高解释性和可解释性 :热力图可以帮助解释深度学习模型的决策过程。通过展示模型在输入数据上的激活情况,我们可以更好地理解模型是如何基于输入数据做出预测或分类的。
直观的可视化方式 :热力图是一种直观的可视化方式,易于理解和解释。通过将特征图表示为颜色密度较高的区域,我们可以更直观地理解模型对于不同区域的关注程度


一、1️⃣ 将特征图可视化的文章CFPNet

论文源码:Centralized Feature Pyramid for Object Detection
CFPNet代码链接:https://github.com/QY1994-0919/CFPNet

在特征图可视化方面可以参考CFPNet这篇文章,下图是不同的网络特征进行热力图可视化的一个结果。
在这里插入图片描述
🔥🔥🔥这幅图是视觉识别任务中图像特征演化的可视化。对于(a)中的输入图像,(b)中的CNN模型只定位那些判别性最强的区域;虽然©中的递进模型在注意机制或变压器transformer的帮助下可以看到更宽的范围,但它通常忽略了对密集预测任务很重要的角落线索;(d)中的模型通过将集中约束附加到具有高级远程依赖关系的特征上,不仅可以看到更广泛,而且更全面,更适合于密集预测任务。

二、2️⃣yolov5自带的特征图可视化工具

📌其实在yolov5中的detect.py推理代码中只需要修改一个参数,就可以将输入图片经过每一层网络的特征可视化图保存下来。该参数是visualize,只需要将visualize参数默认为True,修改如下:

parser.add_argument('--visualize', default=True, action='store_true', help='visualize features')

在这里插入图片描述
☀️☀️☀️将该参数设置默认为True之后,再对目标图片进行推理,在runs文件夹下的detect文件夹下除了会生成一个检测的图片,还会再单独生成一个文件夹,该文件保存的是每一层网络对该图片的特征可视化图。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三、3️⃣如何将特征图转换成热力图

那么如何将可视化的特征图以热力图的形式进行保存。首先找到utils文件夹下的plots.py文件,在该文件中找到feature_visualization函数,将该函数内容全部注释掉,用下面这段代码代替原代码:

def feature_visualization(x, module_type, stage, n=32, save_dir=Path('runs/detect/exp')):
    """
    x:              Features to be visualized
    module_type:    Module type
    stage:          Module stage within model
    n:              Maximum number of feature maps to plot
    save_dir:       Directory to save results
    """
    if 'Detect' not in module_type:  # 如果不是检测模块
        batch, channels, height, width = x.shape  # 获取特征张量的形状信息(批量大小、通道数、高度、宽度)
        if height > 1 and width > 1:  # 如果特征图的高度和宽度都大于1
            f = save_dir / f"stage{stage}_{module_type.split('.')[-1]}_features.png"  # 生成保存结果的文件名

            blocks = torch.chunk(x[0].cpu(), channels, dim=0)  # 将特征张量按通道数分块,选择批量索引为0的部分
            n = min(n, channels)  # 确定要绘制的特征图数量
            fig, ax = plt.subplots(math.ceil(n / 8), 8, tight_layout=True)  # 创建子图网格,以8列的形式排列绘制的特征图
            ax = ax.ravel()  # 将子图数组展平为一维
            plt.subplots_adjust(wspace=0.05, hspace=0.05)  # 设置子图之间的水平和垂直间距
            for i in range(n):  # 遍历要绘制的特征图数量
                block = blocks[i].squeeze().detach().numpy()  # 提取并转换为NumPy数组
                block = (block - np.min(block)) / (np.max(block) - np.min(block))  # 归一化处理
                temp = np.array(block * 255.0, dtype=np.uint8)  # 将数据缩放到0-255,并转换为8位无符号整数
                temp = cv2.applyColorMap(temp, cv2.COLORMAP_JET)  # 应用热力图颜色映射
                ax[i].imshow(temp, cmap=plt.cm.jet)  # 绘制热力图
                ax[i].axis('off')  # 关闭坐标轴显示

            LOGGER.info(f'Saving {f}... ({n}/{channels})')  # 记录保存结果的信息
            plt.savefig(f, dpi=300, bbox_inches='tight')  # 保存结果图像
            plt.close()  # 关闭图形
            np.save(str(f.with_suffix('.npy')), x[0].cpu().numpy())  # 将结果保存为NumPy数组

这段代码与yolov5原代码的主要区别是在for循环里面,在循环里面添加了热力图颜色映射。

🚀🚀接下来我们重新运行detect.py代码,发现经过卷积神经网络之后的特征图全部都以热力图的形式展示出来。下面第一幅图展示的是经过第一层网络之后的特征热力图;随着网络的加深,特征图所展现出来的特征就越难区分,例如第二幅图是经过最后一层网络之后的特征热力图,已经无法用肉眼去区分疵点的位置和特征。
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode二叉树刷题

给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true public boolean isSymmetric(TreeNode root) {if(rootnull)return true;return compare(root.left,root.right);}public boole…

Python学习笔记(37)——用xlwings库生成excel

老规矩先pip入xlwings库 STEP1:下载xlwings库 windowsr>>cmd>>pip install xlwings (如果需要不同版本可以到pypi上搜) STEP2:完成EXCEL初级创建 请打开您的编写软件~~~~~(小编的显示结果为PYCHARM编写的,因为颜色标注好看(…

113.PyQt5_QtPrintSupport_打印操作

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

光电传感器的工作原理简介

光电传感器是一种利用光电效应将光信号转换为电信号的传感器。 工作原理 光照射:光电传感器通过光源(如LED或激光)照射在其表面。 光电转换:光线与传感器材料发生光电反应,产生电信号。这种转换过程涉及到光子与电子的…

论文解读 --- 《针对PowerShell脚本的有效轻量级去混淆和语义感知攻击检测》

开篇 今天我们继续来解读安全行业优秀论文,通过学习他人的智慧成果,可以不断丰富我们的安全视野,使用它山之石来破解自身的难题。 这次要解读的论文为《Effective and Light-Weight Deobfuscation and Semantic-Aware Attack Detection for…

解决宝塔的FTP无法使用被动模式

问题:宝塔安装完ftp管理软件之后,无法使用被动模式连接 解决: 提示: 如果还是不行,那么要看看防火墙和安全组有没有放行被动模式的端口,宝塔安装的pure-ftpd软件的被动模式端口默认是39000至400…

使用稳压管和三极管射极输出器电路驱动PMOS

当电源电压大于PMOS 管的最大栅源电源时,不能直接把栅极拉到地,需要一点特殊的电路来限制栅极驱动电压。有的地方是用电阻分压器做的,比如这种: NPN 三极管导通时,MOS 管栅极电压是两个电阻中间的电压。这种设计最大的…

“华为杯“华南理工大学程序设计竞赛 L-再一道好题

题目 #include<bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second const int maxn 1e6 5; const int inf 1e9 5;using namespace std;int n, m;void solve(){int res 0;int q;string s;int k;cin …

华为ensp中nat server 公网访问内网服务器

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月15日17点30分 NAT服务器是一种在网络边界设备上配置的服务&#xff0c;它允许外部网络的用户访问内部网络中的服务或主机&#xff0c;同时隐藏了内部网络的真实IP地…

Eigen笔记2:矩阵拼接

直接贴代码吧&#xff0c;使用的MatrixXd 和<<运算符&#xff1a; int main(int argc, char *argv[]) {Eigen::MatrixXd B(2, 2);B << 1, 2,3, 4;Eigen::MatrixXd C(2, 2);C << 5, 6,7, 8;Eigen::MatrixXd D(2, 2);D << 9, 10,11, 12;Eigen::MatrixXd…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.5 年末操作:维护新财政年度会计凭证编号范围

2.6.5 年末操作&#xff1a;维护新财政年度会计凭证编号范围 财务系统的维护者要在每年年末预先设置好下一年度的会计凭证编号范围&#xff08;number range&#xff09;&#xff0c;以便下一年度会计凭证能够顺利生成。这一操作一定要在下一年度1月1日以前预先完成。 …

基于SSM项目高校在线请假与审批系统

采用技术 基于SpringBoot框架实现的web的智慧社区系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 简介 本系统实现了管理员&#xff0c;教师&#xff0c;学生三个模…

《QT实用小工具·二十五》日志重定向输出

1、概述 源码放在文章末尾 日志重定向输出&#xff0c;包含如下功能&#xff1a; 支持动态启动和停止。支持日志存储的目录。支持网络发出打印日志。支持输出日志上下文信息比如所在代码文件、行号、函数名等。支持设置日志文件大小限制&#xff0c;超过则自动分文件&#xf…

JS - 关于DOM的介绍和使用01

DOM&#xff08;Document Object Model&#xff09;是一种用于表示和操作HTML、XML等文档结构的编程接口。在JavaScript中&#xff0c;通过DOM可以访问和操作网页中的各种元素、属性和事件。 获取元素&#xff1a; 通过ID获取元素&#xff1a;使用document.getElementById(el…

4.Godot图片素材的获取和编辑

游戏开发中经常遇到图片素材的需求 1. 图片素材的准备 术语&#xff1a;Sprite 精灵&#xff0c;游戏开发中指一张图片来源不明的图片&#xff0c;切勿在商业用途使用&#xff0c;以免引起版权风险。 1. 在学习阶段&#xff0c;可以百度或者从一些资源网站获取&#xff0c;这…

面试题总结:HashMap底层原理

不仅仅是一道题&#xff0c;之后的某一天&#xff0c;它可能是破局的关键。 关于HashMap的知识点有哪些呢&#xff1f;分层次展示 1.基础知识&#xff1a; 存储键值对结构、底层数据结构、红黑树和链表 2.位运算与实现 位运算、put、get方法的实现 3.关于锁 segment锁和桶锁、线…

OpenCV基本图像处理操作(三)——图像轮廓

轮廓 cv2.findContours(img,mode,method) mode:轮廓检索模式 RETR_EXTERNAL &#xff1a;只检索最外面的轮廓&#xff1b;RETR_LIST&#xff1a;检索所有的轮廓&#xff0c;并将其保存到一条链表当中&#xff1b;RETR_CCOMP&#xff1a;检索所有的轮廓&#xff0c;并将他们组…

广东莱斯广告,6.8米UV喷印推动粤东喷绘产业升级

广东莱斯广告作为汕头市大型的广告服务运营商,近日迎来了一件值得庆祝的事情:彩神6.8米UV喷印机运行一周年,销售服务商深圳嘉豪总经理李伟特地前来回访。该设备是深圳润天智数字设备股份有限公司开发的全球首台搭载XTRA6800H柯尼卡喷头的设备,设备特点是:1.色彩艳丽;2.超宽喷印…

Suno,属于音乐的ChatGPT时刻来临

AI绘画 AI视频我们见过了&#xff0c;现如今AI都能生成一首音乐&#xff0c;包括编曲&#xff0c;演唱&#xff0c;而且仅需几秒的时间便可创作出两分钟的完整歌曲 相信关注苏音的很大一部分都是从获取编曲或者混音插件来的&#xff0c;现如今AI却能帮你几秒生成曲子 今天就带…

Postgresql源码(125)游标恢复执行的原理分析

问题 为什么每次fetch游标能从上一次的位置继续&#xff1f;后面用一个简单用例分析原理。 【速查】 恢复扫描需要知道当前页面、上一次扫描到的偏移位置、当前页面一共有几条&#xff1a; 当前页面&#xff1a;HeapScanDesc结构中记录了扫到的页面&#xff08;scan->rs_cb…