【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 visualizedmodule_type:    Module typestage:          Module stage within modeln:              Maximum number of feature maps to plotsave_dir:       Directory to save results"""if 'Detect' not in module_type:  # 如果不是检测模块batch, channels, height, width = x.shape  # 获取特征张量的形状信息(批量大小、通道数、高度、宽度)if height > 1 and width > 1:  # 如果特征图的高度和宽度都大于1f = 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代码,发现经过卷积神经网络之后的特征图全部都以热力图的形式展示出来。下面第一幅图展示的是经过第一层网络之后的特征热力图;随着网络的加深,特征图所展现出来的特征就越难区分,例如第二幅图是经过最后一层网络之后的特征热力图,已经无法用肉眼去区分疵点的位置和特征。
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 设置类注释模板作者、日期、描述等信息(推荐标准!)

idea注释模版配置 idea作为越来越多程序员使用的开发工具,平时的代码注释也非常的关键,类上注释和方法上注释每次换电脑或者新同事入职都要统一修改,找了网上好多教程都写的乱七八糟的啥都有,为方便统一就自己写一个操作方法&…

Redis入门到通关之ZSet命令

文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素,并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…

网络安全-自学笔记

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而…

Springboot+Vue项目-基于Java+MySQL的免税商品优选购物商城系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

PCIe错误定义与分类

前言: PCI总线中定义两个边带信号(PERR#和SERR#)来处理总线错误。其中PERR#主要对应的是普通数据奇偶校检错误(Parity Error),而SERR#主要对应的是系统错误(System Error)。具体如下…

蓝桥杯备赛:考前注意事项

考前注意事项 1、DevCpp添加c11支持 点击 工具 - 编译选项 中添加&#xff1a; -stdc112、万能头文件 #include <bits/stdc.h>万能头文件的缺陷&#xff1a;y1 变量 在<cmath>中用过了y1变量。 #include <bits/stdc.h> using namespace std;// 错误示例 …

山姆·奥特曼是如何成为亿万富豪的?

2017年夏天&#xff0c;Superhuman公司首席执行官拉胡尔沃拉&#xff08;Rahul Vohra&#xff09;开始疯狂向投资者一一发消息&#xff0c;缘由是他的初创公司尝试了谷歌浏览器Chrome的一项即将推出的更新。由于一个看似无害的代码更改&#xff0c;Superhuman的智能电子邮件服务…

openstack-云主机 5

配置openstack网络&#xff08;neutron&#xff09;服务 创建neutron用户 创建服务实体并为其创建三个endpoint 公共网络的安装和配置(控制节点的配置) 配置ML2插件 配置Linuxbridge代理 配置DHCP代理 配置元数据代理 为计算节点配置网络服务 完成安装 启动并设置开机自启 计…

MSTP/RSTP的保护功能

目录 原理概述 实验目的 实验内容 实验拓扑 1.配置RSTP/MSTP 2.配置BPDU保护 3.配置根保护 4.配置环路保护 5.配置TC-BPDU保护 原理概述 在RSTP或MSTP交换网络中&#xff0c;为了防止恶意攻击或临时环路的产生&#xff0c;可配置保护功能来增强网络的健壮性和安全性。…

Unity 布局 HorizontalLayoutGroup 多行 换行

演示Gif&#xff1a; 现象: 子元素宽度不同&#xff0c;超出父元素后不会换行 GridLayout则是固定宽度也不能用&#xff0c; 需求 水平排版的同时&#xff0c;超出父级后换行 代码&#xff1a; 催更就展示[狗头]

Android 使用ping命令判断当前网络状态

一. 介绍 ping命令是用来测试和诊断网络连接问题的基本命令&#xff0c;当然我们的终端设备&#xff08;手机/平板/车机&#xff09;都可以用这个命令来判断当前网络是否有流量的状态&#xff0c;本篇文章主要介绍Linux的ping命令&#xff0c;因为Android系统也是使用了Linux内…

【浪漫 罗盘时钟 Js、css实现(附源代码) 美化版本】,前端面试必问的HashMap

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

SpringBoot整合消息中间件(ActiveMQ,RabbitMQ,RocketMQ,Kafka)

消息中间件 消息消息队列JMS AMQPMQTTKafka Spring整合消息队列模拟消息队列的工作流程Spring整合ActiveMQSpring整合RabbitMQ直连交换机模式主题交换机模式 Spring整合RocketMQSpring整合kafka 消息 消息的发送方&#xff1a;生产者 消息的接收方&#xff1a;消费者 同步消息…

从51到ARM裸机开发实验(009)LPC2138 中断实验

一、场景设计 中断的概念在《从51到ARM裸机开发实验(007) AT89C51 中断实验》中已经介绍过&#xff0c;LPC2138的Keil工程创建在《从51到ARM裸机开发实验(005)LPC2138 GPIO实验》中已经介绍过。本次使用LPC2138来实现一个这样的场景&#xff1a;四个LED依次亮灭&#xff0c;时间…

【python】python天气气候数据抓取分析可视化(源码+数据+可视化+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【Bugku】sqli-0x1

1.打开靶场&#xff0c;进入实验场景 2.按F12查看源代码&#xff0c;发现有一个/?pls_help路径&#xff0c;在url后加上查看。 3.得到的php源码 首先&#xff0c;代码通过 error_reporting(0) 和 error_log(0) 关闭了错误报告&#xff0c;这可以防止攻击者从错误信息中获取敏…

EasyImage2.0 简单图床开源 多功能 简单易用图床系统源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 支持API 支持仅登录后上传 支持设置图片质量 支持压缩图片大小 支持文字/图片水印 支持设置图片指定宽/高 支持上传图片转换为指定格式 支持限制最低宽度/高度上传 支持上传其他文件格…

hbase基础shell用法

HBase中用create命令创建表&#xff0c;具体如下&#xff1a; create student,Sname,Ssex,Sage,Sdept,course 此时&#xff0c;即创建了一个“student”表&#xff0c;属性有&#xff1a;Sname,Ssex,Sage,Sdept,course。因为HBase的表中会有一个系统默认的属性作为行键&#x…

【黑马头条】-day06自媒体文章上下架-Kafka

文章目录 今日内容1 Kafka1.1 消息中间件对比1.2 kafka介绍1.3 kafka安装及配置1.4 kafka案例1.4.1 导入kafka客户端1.4.2 编写生产者消费者1.4.3 启动测试1.4.4 多消费者启动 1.5 kafka分区机制1.5.1 topic剖析 1.6 kafka高可用设计1.7 kafka生产者详解1.7.1 同步发送1.7.2 异…

Golang | Leetcode Golang题解之第30题串联所有单词的子串

题目&#xff1a; 题解&#xff1a; func findSubstring(s string, words []string) (ans []int) {ls, m, n : len(s), len(words), len(words[0])for i : 0; i < n && im*n < ls; i {differ : map[string]int{}for j : 0; j < m; j {differ[s[ij*n:i(j1)*n]…