目录
????????如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接,我这边整理了许多其他任务的说明博文,后续也会持续更新,包括yolov8模型优化、sam等等的相关内容。
????????在深度学习和计算机视觉的领域,了解模型如何解读图像是至关重要的。本文将介绍如何使用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
的函数,它主要用于调整图像大小和进行填充处理,以便使图像适配于深度学习模型的输入要求。现在我将详细解释这个函数的每一部分:?
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.0
new_unpad = (new_shape[1], new_shape[0])
ratio = new_shape[1] / shape[1], new_shape[0] / shape[0] # 宽度、高度比例
?????????这段代码计算了在缩放后的图像周围需要添加多少填充,以达到目标尺寸。auto
模式下,填充被调整以满足步长约束。scaleFill
模式下,图像被拉伸以填充整个目标尺寸。
dw /= 2 # 将填充分成两边
dh /= 2
if 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
函数是深度学习中常用的图像预处理手段之一。它通过调整图像的尺寸和添加填充,确保图像能够适配神经网络的输入要求,同时保持了图像的原始比例,避免了可能的形变。这在目标检测等需要精确空间定位的任务中尤为重要。
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
)。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
对象从指定的层中获取激活和梯度。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%的预测。颜色解释:
区域关注:
模型解释性:
????????如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。另外这个程序并非我的原创,如有侵权告知必删。?