使用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,以及ultralyticspytorch_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%的预测。

热力图解读

  1. 颜色解释

    • 热图中的颜色通常代表一个量级的标量,其中热色调(如红色、黄色)表示高活跃度或高重要性区域,冷色调(如蓝色、绿色)表示低活跃度或低重要性区域。
  2. 区域关注

    • 热图上明亮的区域表明了模型在做出预测或决策时,这些区域对模型的输出贡献度较高。例如,在目标检测任务中,如果热图中某个物体的轮廓区域亮度很高,这可能意味着模型正将注意力集中在这个物体上。
  3. 模型解释性

    • 热图可以用来理解和解释模型的行为。例如,在图像分类任务中,热图可以显示模型认为图像的哪些部分对于识别特定类别最重要。

程序源码下载地址

计算机视觉YOLOv8模型热图可视化工具

        如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。另外这个程序并非我的原创,如有侵权告知必删。 

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

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

相关文章

C++初阶——基础知识(函数重载与引用)

目录 1.命名冲突 2.命名空间 3.缺省参数 4.函数重载 1.函数重载的特点包括: 2.函数重载的好处包括: 3.引用 引用的特点包括 引用的主要用途包括 引用和指针 引用 指针 类域 命名空间域 局部域 全局域 第一个关键字 命名冲突 同一个项目之间冲…

sklearn 中matplotlib编制图表

代码 # 导入pandas库,并为其设置别名pd import pandas as pd import matplotlib.pyplot as plt# 使用pandas的read_csv函数读取名为iris.csv的文件,将数据存储在iris_data变量中 iris_data pd.read_csv(data/iris.txt,sep\t)# 使用groupby方法按照&quo…

期权二叉树估值与图计算

传统期权二叉树的算法都是基于数组的,对于没有编程基础的人来说非常不直观。二叉树是一种特殊的图,可以用python networkx这个图算法库实现,这个库不仅包含常用的图算法,还包含简单的绘图功能,非常适合研究分析使用。 …

【ARMv8M Cortex-M33 系列 2.1 -- Cortex-M33 使用 .hex /.srec 文件介绍】

请阅读【嵌入式开发学习必备专栏 之Cortex-M33 专栏】 文章目录 HEX 文件介绍英特尔十六进制文件格式记录类型hex 示例Cortex-M 系列hex 文件的使用 hex 文件和srec 文件生成Motorola S-Record (srec) 格式 HEX 文件介绍 .hex 文件通常用于微控制器编程,包括 ARM C…

TypeError: control character ‘delimiter‘ cannot be a newline (`\r` or `\n`)

报错 找到错误代码 这个错误是因为在使用 numpy.loadtxt() 函数时尝试将换行符(\n)作为分隔符(delimiter)。然而,换行符是用于标识文本文件中每一行的结束,而不是用于分隔数据字段。 解决 如果你的数据文…

c++ OpenCV4图像处理与视频分析实战教程 -> 自建代码库

OpenCV4图像处理与视频分析实战教程,系列视频自建代码库。C版本。 视频可B站搜索。 简介: 网上流传的“OpenCV4图像处理与视频分析实战”课程附带资料需要解压密码,无法使用,且原视频购买很贵(51CTO售价119&#xff0…

在Mac上恢复SD卡数据的 6 个有效应用程序

慌!SD卡里的照片和视频不小心删了,Mac设备上还恢复不了数据! 遇到这种情况,你需要的是一款可靠的Mac适用的SD卡恢复软件。我们为你准备了一份最佳的SD卡恢复软件列表,并且还有详细的评论。另外,我们还会给…

用通俗易懂的方式讲解大模型:LangChain Agent 原理解析

LangChain 是一个基于 LLM(大型语言模型)的编程框架,旨在帮助开发人员使用 LLM 构建端到端的应用程序。它提供了一套工具、组件和接口,可以简化创建由 LLM 和聊天模型提供支持的应用程序的过程。 LangChain 由几大组件构成&#…

k8s搭建(五、k8s可视化管理工具Dashboard配置)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【基础】【Python网络爬虫】【8.Selenium入门】selenium配置、环境安装、浏览器驱动下载(附大量案例代码)(建议收藏)

Python网络爬虫基础 Selenium 入门1. 动态网页&静态网页动态网页JavaScriptJQueryAjaxHTML 动态网页处理方法 2. Selenium 工作原理3. Selenium 配置环境安装浏览器驱动下载配置浏览器驱动 selenium 快速上手 4. Driver对象的常用方法及属性5. 元素提取6. 元素对象的方法及…

【基础】【Python网络爬虫】【5.数据解析】bs4、Xpath、Parsel模块、正则表达式(附大量案例代码)(建议收藏)

Python网络爬虫基础 数据解析1. 为何数据解析2. 常见的数据类型结构化数据半结构化数据非结构化数据 3. 爬虫项目实现步骤 数据解析模块1. Bs4环境安装bs4解析流程案例 - bs4碧血剑文本爬取 2. Xpath环境安装xpath解析的编码流程xpath表达式如何理解?案例 - 简历模板…

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下,const描述的是运行时常量性,也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性,这是const关键字无法保证的。例如&am…