使用YOLOv8和Grad-CAM技术生成图像热图
目录
yolov8导航
YOLOv8(附带各种任务详细说明链接)
概述
环境准备
代码解读
导入库
定义letterbox函数
调整尺寸和比例
计算填充
应用填充
yolov8_heatmap类定义和初始化
后处理函数
绘制检测结果
类的调用函数
热图生成细节
参数解释
weight
cfg
device
method
layer
backward_type
conf_threshold
ratio
热力图解读
程序源码下载地址
计算机视觉YOLOv8模型热图可视化工具
yolov8导航
如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接,我这边整理了许多其他任务的说明博文,后续也会持续更新,包括yolov8模型优化、sam等等的相关内容。
YOLOv8(附带各种任务详细说明链接)
概述
在深度学习和计算机视觉的领域,了解模型如何解读图像是至关重要的。本文将介绍如何使用YOLOv8模型结合Grad-CAM(梯度加权类激活映射)技术生成图像的热图。这种方法可以帮助我们可视化和理解模型在图像识别过程中关注的区域。后续我会把源码的下载链接附到最后。
环境准备
首先,确保您的环境中已安装以下库:torch, yaml, cv2, numpy, matplotlib, PIL, tqdm,以及ultralytics和pytorch_grad_cam。这些库对于运行和理解接下来的代码至关重要。
代码解读
导入库
import warnings
warnings.filterwarnings('ignore') # 忽略警告,保持输出清洁
# 导入必要的库
import torch, yaml, cv2, os, shutil
import numpy as np
np.random.seed(0) # 设置随机种子
import matplotlib.pyplot as plt
from tqdm import trange
from PIL import Image
# 导入YOLOv8和Grad-CAM相关的库
from ultralytics.nn.tasks import RTDETRDetectionModel as Model
from ultralytics.utils.torch_utils import intersect_dicts
from ultralytics.utils.ops import xywh2xyxy
from pytorch_grad_cam import GradCAMPlusPlus, GradCAM, XGradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
from pytorch_grad_cam.activations_and_gradients import ActivationsAndGradients
定义letterbox函数
这段代码定义了一个名为 letterbox 的函数,它主要用于调整图像大小和进行填充处理,以便使图像适配于深度学习模型的输入要求。现在我将详细解释这个函数的每一部分:
def letterbox(im, new_shape=(640, 640), color=(114, 114, 114), auto=True, scaleFill=False, scaleup=True, stride=32):
im: 输入图像。new_shape: 目标图像的新尺寸,默认为 640x640。color: 用于边缘填充的颜色,默认为灰色(114, 114, 114)。auto: 是否自动调整填充大小以满足步长约束。scaleFill: 是否拉伸图像以填充新形状。scaleup: 是否允许放大图像。stride: 模型步长,用于确保输出尺寸是该数值的倍数。
调整尺寸和比例
shape = im.shape[:2] # 当前图像的形状 [高度, 宽度]
if isinstance(new_shape, int):new_shape = (new_shape, new_shape)# 计算缩放比例 (新尺寸 / 旧尺寸)
r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])
if not scaleup: # 仅缩小图像,不放大(为了更好的验证mAP)r = min(r, 1.0)
这部分代码首先获取图像的原始尺寸,然后根据new_shape和原始尺寸计算缩放比例。
计算填充
ratio = r, r # 宽度、高度比例
new_unpad = int(round(shape[1] * r)), int(round(shape[0] * r))
dw, dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1] # 宽高填充
if auto: # 最小矩形dw, dh = np.mod(dw, stride), np.mod(dh, stride) # 宽高填充
elif scaleFill: # 拉伸填充dw, dh = 0.0, 0.0new_unpad = (new_shape[1], new_shape[0])ratio = new_shape[1] / shape[1], new_shape[0] / shape[0] # 宽度、高度比例
这段代码计算了在缩放后的图像周围需要添加多少填充,以达到目标尺寸。auto模式下,填充被调整以满足步长约束。scaleFill模式下,图像被拉伸以填充整个目标尺寸。
应用填充
dw /= 2 # 将填充分成两边
dh /= 2if shape[::-1] != new_unpad: # 如果需要调整大小im = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR)
top, bottom = int(round(dh - 0.1)), int(round(dh + 0.1))
left, right = int(round(dw - 0.1)), int(round(dw + 0.1))
im = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color) # 添加边框
最后,这部分代码将计算出的填充应用到图像上。首先,如果需要,会将图像缩放到new_unpad指定的尺寸。接着,使用cv2.copyMakeBorder函数在图像的四周添加计算出的填充。 然后直接定义返回值:return im, ratio, (dw, dh) 函数返回调整大小并填充后的图像,以及相关的缩放比例和填充维度。
letterbox函数是深度学习中常用的图像预处理手段之一。它通过调整图像的尺寸和添加填充,确保图像能够适配神经网络的输入要求,同时保持了图像的原始比例,避免了可能的形变。这在目标检测等需要精确空间定位的任务中尤为重要。
yolov8_heatmap类定义和初始化
class yolov8_heatmap:def __init__(self, weight, cfg, device, method, layer, backward_type, conf_threshold, ratio):...
- 初始化函数接收多个参数,包括模型权重(
weight)、配置文件(cfg)、运行设备(device)、Grad-CAM方法(method)、目标层(layer)、反向类型(backward_type)、置信度阈值(conf_threshold)和处理比例(ratio)。 - 加载YOLOv8模型,并根据提供的配置和权重设置模型。
- 随机生成颜色映射,用于不同类别的可视化。
- 初始化的参数被存储在类的属性中。
后处理函数
def post_process(self, result):...
post_process函数处理模型的输出。它将模型输出分离为逻辑值(logits_)和边界框(boxes_)。- 该函数还对输出进行排序,并转换边界框格式。
绘制检测结果
def draw_detections(self, box, color, name, img):...
draw_detections函数用于在图像上绘制检测到的边界框和类别名称。- 它调整边界框大小以适应原始图像尺寸,并在图像上绘制边界框和类别名称。
类的调用函数
def __call__(self, img_path, save_path):...
- 当实例被当作函数调用时,执行图像处理和热图生成的主要流程。
- 加载并预处理图像,将其转换为模型可以处理的格式。
- 使用
ActivationsAndGradients对象从指定的层中获取激活和梯度。 - 使用Grad-CAM方法生成热图,这涉及到计算重要性权重和应用它们到激活图上。
- 将生成的热图叠加到原始图像上,并保存结果。
热图生成细节
- 类的核心功能是使用Grad-CAM技术从指定层生成热图。
- 根据
backward_type,可以选择对类别、边界框或两者进行反向传播,以生成针对不同目标的热图。 - 生成的热图反映了模型在做出预测时关注图像的哪些区域。
参数解释
def get_params():params = {'weight': 'rtdetr-l.pt','cfg': 'ultralytics/cfg/models/rt-detr/rtdetr-l.yaml','device': 'cuda:0','method': 'GradCAM', # GradCAMPlusPlus, GradCAM, XGradCAM'layer': 'model.model[10]','backward_type': 'all', # class, box, all'conf_threshold': 0.3, # 0.3'ratio': 0.5 # 0.5-1.0}return params
这段代码定义了一个名为 get_params 的函数,它用于设置并返回一个字典,包含了一系列参数,这些参数是用于配置和运行 yolov8_heatmap 类的。现在我将逐个解释这些参数的含义和作用:
weight
'rtdetr-l.pt': 这个参数指定了模型的权重文件。在这种情况下,它是一个预先训练的YOLOv8模型的权重文件。这个文件包含了模型的所有训练参数,是模型运行的基础。
cfg
'ultralytics/cfg/models/rt-detr/rtdetr-l.yaml': 这是模型的配置文件路径。配置文件定义了模型的架构和其他相关设置。这里指定的是使用YOLOv8模型的具体配置。
device
'cuda:0': 这个参数指定了模型运行的设备。在这里,'cuda:0'表明模型将在第一个NVIDIA GPU上运行。如果没有GPU或希望在CPU上运行,可以将其更改为'cpu'。
method
'GradCAM': 此参数指定了用于生成热图的Grad-CAM(梯度加权类激活映射)变体。'GradCAM'是一种常用的方法,其他选项如'GradCAMPlusPlus'和'XGradCAM'提供了不同的热图生成算法。
layer
'model.model[10]': 这个参数指定了用于生成热图的网络层。'model.model[10]'指的是YOLOv8模型中的特定层。选择的层会影响热图的细节和质量。
backward_type
'all': 这个参数决定了反向传播的类型。它可以是'class'、'box'或'all'。'class'仅关注类别预测,'box'仅关注边界框预测,而'all'结合了两者。
conf_threshold
0.3: 这是一个置信度阈值,用于过滤模型的预测。仅当模型对其预测的置信度高于0.3时,这些预测才会被考虑。
ratio
0.5: 这个参数指定了在生成热图时考虑的顶部预测的比例。0.5表示只考虑置信度最高的50%的预测。
热力图解读

-
颜色解释:
- 热图中的颜色通常代表一个量级的标量,其中热色调(如红色、黄色)表示高活跃度或高重要性区域,冷色调(如蓝色、绿色)表示低活跃度或低重要性区域。
-
区域关注:
- 热图上明亮的区域表明了模型在做出预测或决策时,这些区域对模型的输出贡献度较高。例如,在目标检测任务中,如果热图中某个物体的轮廓区域亮度很高,这可能意味着模型正将注意力集中在这个物体上。
-
模型解释性:
- 热图可以用来理解和解释模型的行为。例如,在图像分类任务中,热图可以显示模型认为图像的哪些部分对于识别特定类别最重要。
程序源码下载地址
计算机视觉YOLOv8模型热图可视化工具
如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。另外这个程序并非我的原创,如有侵权告知必删。
相关文章:
使用YOLOv8和Grad-CAM技术生成图像热图
目录 yolov8导航 YOLOv8(附带各种任务详细说明链接) 概述 环境准备 代码解读 导入库 定义letterbox函数 调整尺寸和比例 计算填充 应用填充 yolov8_heatmap类定义和初始化 后处理函数 绘制检测结果 类的调用函数 热图生成细节 参数解释 we…...
Vue: 多个el-select不能重复选择相同属性
一、场景 1.需求: 用户可自由选择需要修改的对象并同时修改多个属性,需要校验修改对象不能重复选择,但是可供修改属性是固定的 2.目标效果: 二、实现 1.主要代码: <template><el-selectv-model"se…...
金色麦芒的2023
2023年即将过去,回首这一年,我深感自己在技术和职业生涯中取得了巨大的进步。这一年里,我不仅在技术层面有了更深入的掌握,也在个人成长和职业规划上有了更明确的方向。 首先,在技术层面,我今年最大的收获是…...
java设计模式学习之【策略模式】
文章目录 引言策略模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用计算示例代码地址 引言 设想你正在玩一个策略游戏,每一个决策都会导致不同的游戏结局。同样地,在软件开发中,我们常常需要根据不同的场景或条件选择不同…...
Mybatis SQL构建器类 - SqlBuilder and SelectBuilder (已经废弃)
在3.2版本之前,我们采用了一种略有不同的方法,通过利用ThreadLocal变量来掩盖一些使Java DSL有点繁琐的语言限制。然而,这种方法现在已被弃用,因为现代框架已经普及了使用构建器模式和匿名内部类的概念。因此,SelectBu…...
【Linux】不常用命令记录
查看开启的网络端口 1、使用netstat命令“netstat -tuln”,该命令将显示所有当前监听的TCP和UDP端口; 2、使用ss命令“ss -tuln”,用于显示当前监听的TCP和UDP端口; 3、使用lsof命令“lsof -i”,将显示当前打开的网络…...
【docker】安装docker环境并启动容器
一、安装docker 这里以centos系统为例安装docker环境 # 删除已有安装包 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils # 设置源 y…...
AIOps探索 | 基于大模型构建高效的运维知识及智能问答平台(2)案例分享
原作者:擎创科技产品专家 布博士 案例分享 所需要的软件列表 本次案例的实现,全部采用开源或SAAS的产品来提供,并不涉及到私有化部署的软件产品。软件列表如下所示,如何申请apikey请自行研究,在这里不再详细说明&…...
【ESP32接入国产大模型之文心一言】
1. 怎样接入文心一言 随着人工智能技术的不断发展,自然语言处理领域也得到了广泛的关注和应用。在这个领域中,文心一言作为一款强大的自然语言处理工具,具有许多重要的应用价值。本文将重点介绍如何通过ESP32接入国产大模型之文心一言api&am…...
保湿剂,预计2026年市场规模将达到约230亿美元
全球市场分析 从全球市场来看,保湿剂市场规模正在快速增长。主要集中在欧美和亚太地区的市场,据市场调研机构的数据显示,预计2026年,全球保湿剂市场规模将达到约230亿美元。保湿剂的应用领域不断拓展,包括从化妆品到个…...
CodeWhisperer:编码世界中的声音启迪者
人烟 导语: 在数字化时代,编码已经成为了一种不可或缺的技能。而 CodeWhisperer(编码世界中的声音启迪者)则以其卓越的技术和深厚的知识为人们带来了独特的启发和指导。本文将介绍 CodeWhisperer 的背景和成就,探讨他是…...
golang学习专栏
GOLANG专栏 Golang基础教程 Golang基础教程 Golang练手算法 Golang练手算法 Golang设计模式 Golang设计模式 Golang数据结构和算法 Golang数据结构和算法 Golang并发编程 Golang并发编程 ORM框架Gorm Golang ORM框架gorm Golang源码分析 Golang源码分析 MySQL教程 MySQ…...
el-table表格动态添加列。多组数据拼接和多层级数据的处理
提示:el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中,为避免闪屏,可以表格数据统一渲染总结 前言 需求:富文本编辑器 一、多组数据拼接 <template><div class"test">…...
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现
ThinkPHP6.0任意文件上传 PHPSESSION 已亲自复现 漏洞名称漏洞描述影响版本 漏洞复现环境搭建安装thinkphp6漏洞信息配置 漏洞利用 修复建议 漏洞名称 漏洞描述 2020年1月10日,ThinkPHP团队发布一个补丁更新,修复了一处由不安全的SessionId导致的任意文…...
短说社区运营的使用工具分享(一)
本文是一篇针对短说社区运营的使用工具分享帖,是小编结合日常使用,总结的一些可以帮助网站管理员和运营人员进行日常操作和管理的工具。 1. 想天工作台之运营面板 想天工作台可以将桌面划分不同的类型来辅助办公,我分享下我当前的桌面情况&…...
关于.gitignore文件
.gitignore文件用于忽略git同步文件。 git上创建项目时,默认的.gitignore文件配置比较少,不太适合于windows下vs的开发设置。 下面是vs中.gitignore条目样例: # Prerequisites *.d# Compiled Object files *.slo *.lo *.o *.obj*.iobj *.V…...
Cell 文章图复现
多组差异火山图复现 参考文章: A Spatiotemporal Organ-Wide Gene Expression and Cell Atlas of the Developing Human Heart Figure 2. H 图里主要是单细胞数据不同cluster之间的差异火山图, 所以说白了就是散点图和柱状图的结合, 散点图用差异基因绘制, 柱状图利用logFC最…...
只需一招彻底解决SOLIDWORKS不显示缩略图预览
SOLIDWORKS缩略图能够让工程师便于识别想要打开的模型,但经常会有用户遇到在资源管理器中查看SOLIDWORKS文件时,仅显示SOLIDWORKS的图标,而没有相关文件的预览缩略图。 Windows文件夹选项设置 首先确保Windows文件夹选项设置,显…...
nccl 源码分析 从 ncclAllReduce 的执行开始认识nccl源代码
文字没有提及的代码内容,不需要太在意,当然也可以瞟两眼; 首先,总体而言函数 ncclAllReduce 的功能在于将携带了一个操作的info结构体,放入了队列中,待后面执行; 排队的函数调用是 ncclEnqueue…...
仿照AirDrop(隔空投送)优雅地在局域网中传输文件
基于WebRTC的局域网文件传输 在前一段时间,我想在手机上向电脑发送文件,因为要发送的文件比较多,所以我想直接通过USB连到电脑上传输,等我将手机连到电脑上之后,我发现手机竟然无法被电脑识别,能够充电但是…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
