【yolo】使用 Netron 可视化深度学习模型:从 YOLOv1 到 YOLOv8 的探索

发布于:2025-03-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

在深度学习领域,模型的可视化是理解和调试模型的重要工具。Netron 是一个强大的工具,能够帮助我们直观地查看和分析神经网络模型的结构、参数和层次关系。本文将从 Netron 的基本功能出发,结合 YOLO 系列模型(从 YOLOv1 到 YOLOv8)的输出设计,探讨如何使用 Netron 进行模型可视化,并深入分析 YOLO 模型的输出维度及其意义。


1. Netron 简介

Netron 是一个用于可视化神经网络模型结构的工具,支持多种深度学习框架的模型文件格式。它的主要功能包括:

  • 模型可视化:支持 ONNX、TensorFlow、PyTorch、Keras 等格式,能够以图形化的方式展示模型的网络结构。
  • 参数查看:可以查看每一层的输入输出维度、权重参数等详细信息。
  • 跨框架支持:方便在不同框架之间进行模型转换和迁移。
  • 轻量化与易用性:提供网页版和桌面版,无需复杂配置即可使用。
    官网地址:https://netron.app/

当我将一个onnx模型拖到网页时,你将得到一幅图。
在这里插入图片描述
我主要看这个输出,你知道为啥是:1 * 9 * 8400 是怎么来的吗?
在这里插入图片描述

2. YOLOv1 的输出设计

YOLOv1 是首个将目标检测建模为单阶段回归问题的算法。它的输出维度为 7×7×30,其中 30 表示每个网格单元(Grid Cell)预测的信息维度。具体来说,这 30 个维度包含以下两部分内容:

  • 边界框预测:每个网格单元预测 2 个边界框,每个边界框包含 5 个参数(中心坐标、宽高、置信度)。
  • 类别概率:每个网格单元预测 20 个类别的概率(基于 PASCAL VOC 数据集的 20 个类别)。
    所以就是 2*5+20 = 30 个维度。
    具体可以看看我之前的文章:《理解 YOLOV1 第一篇 预测阶段》

yolo1 将 一幅图 分成 7*7 = 49 个cell 每个cell 预测两个候选框,所以yolo1一共可以提供98个候选框。而 yolo8 却不是固定的候选框。


3. YOLOv8 的输出设计

YOLOv8 是 Ultralytics 公司推出的新版本 YOLO 模型,它在 YOLOv5 的基础上进行了多项改进。YOLOv8 的输出维度与 YOLOv1 有显著不同,主要体现在以下几个方面:

  • 输出张量的形状:通常为 [batch_size, num_anchors, num_classes + 4],其中 num_classes + 4 包括 4 个边界框参数、和 num_classes 个类别概率。
  • 多尺度预测:YOLOv8 使用多尺度特征图(如 80×80、40×40、20×20)进行预测,每个尺度预测 3 个边界框。
  • Anchor-Free 设计:摒弃了传统的锚框(Anchor Boxes),直接预测边界框的中心点和宽高。

以下是 YOLOv8 的核心设计、输出维度及其与 YOLOv1 的对比:


1. 核心设计

YOLOv8 延续了 YOLO 系列的单阶段检测框架,同时引入了以下改进:

  • Anchor-Free 设计:摒弃了传统的锚框(Anchor Boxes),直接预测边界框的中心点和宽高,简化了模型设计。
  • 多尺度预测:通过特征金字塔网络(FPN)和路径聚合网络(PAN)实现多尺度特征融合,提升对小目标的检测能力。
  • 动态标签分配:采用动态标签分配策略(如 Task-Aligned Assigner),优化正负样本的匹配。
  • 更高效的网络结构:基于 CSP(Cross Stage Partial)架构,结合更深的网络和更高效的卷积模块。

YOLOv8 的候选框机制

YOLOv8 是 Anchor-Free 的模型,它没有显式的锚框(Anchor Boxes)。以及 YOLOv8 与 YOLOv5 的区别:


1. YOLOv8 是 Anchor-Free 的

YOLOv8 摒弃了传统的锚框设计,采用了 Anchor-Free 的预测机制。这意味着:

  • 无需预定义锚框:YOLOv8 直接预测边界框的中心点坐标和宽高,而不是基于预定义的锚框进行调整。
  • 简化模型设计:去除了锚框相关的超参数(如锚框尺寸、比例),减少了调优的复杂性。
  • 更好的灵活性:Anchor-Free 设计能够更好地适应不同形状和尺寸的目标。

2. YOLOv5 的锚框设计

YOLOv5 是 YOLOv8 的前身,它仍然使用了传统的锚框设计。在 YOLOv5 中:

  • 锚框是预定义的:模型在训练前会基于数据集的统计信息(如目标宽高比)生成一组锚框。
  • 每个网格预测多个锚框:例如,YOLOv5 的每个网格单元会预测 3 个锚框。
  • 不同版本的锚框数量不同:YOLOv5-s、YOLOv5-m、YOLOv5-l 和 YOLOv5-x 的锚框数量可能不同,通常为 9 到 18 个。

3. YOLOv8 的候选框数量

虽然 YOLOv8 没有锚框,但它仍然会预测一定数量的候选框(Predictions)。候选框的数量取决于以下因素:

  • 输入分辨率:输入图像的分辨率越高,特征图的网格数越多。
  • 特征图尺度:YOLOv8 使用多尺度特征图(如 80×80、40×40、20×20)进行预测。
  • 每个网格的预测框数:每个网格单元预测固定数量的边界框(通常是 3 个)。

计算公式
在这里插入图片描述

其中,n 是特征图尺度的数量。


4. YOLOv8 不同版本的差异

YOLOv8 的不同版本(如 YOLOv8-s、YOLOv8-m、YOLOv8-l、YOLOv8-x)的主要区别在于:

  • 网络深度和宽度:不同版本的模型深度和宽度不同,影响模型的参数量和计算量。
  • 特征图尺度:不同版本可能使用不同的特征图尺度,影响候选框的数量。
  • 性能:YOLOv8-x 是高性能版本,通常具有更高的检测精度,但计算量也更大。

5. 总结
  • YOLOv8 是 Anchor-Free 的,没有显式的锚框设计。
  • YOLOv5 使用了锚框,不同版本的锚框数量可能不同。
  • YOLOv8 的候选框数量 取决于输入分辨率、特征图尺度和每个网格的预测框数。

2. 输出维度

YOLOv8 的输出维度与 YOLOv1 有显著不同,主要体现在以下几个方面:

2.1 输出张量的形状

YOLOv8 的输出张量形状通常为 [batch_size, num_anchors, num_classes + 5],其中:

  • batch_size:批次大小(如 1 张图片时为 1)。
  • num_anchors:每个尺度的候选框数量(即预测框的总数)。
  • num_classes + 5:每个预测框的输出维度,包括:
    • 4 个边界框参数(x_center, y_center, width, height)
    • 1 个置信度分数:表示边界框是否包含目标。
    • num_classes 个类别概率:表示每个类别的概率。
2.2 具体示例

假设:

  • 输入图片的批次大小为 1。
  • 模型输出 3 种尺度的特征图(如 80×80、40×40、20×20)。
  • 每个尺度预测 3 个边界框。
  • 类别数为 80(如 COCO 数据集)。

则输出张量的形状为:

  • 80×80 尺度[1, 80×80×3, 85]
  • 40×40 尺度[1, 40×40×3, 85]
  • 20×20 尺度[1, 20×20×3, 85]

其中,85 = 4 (边界框) + 1 (置信度) + 80 (类别概率)


2.3 与 YOLOv1 的对比

特性 YOLOv1 YOLOv8
输出维度 7×7×30(固定网格) 多尺度动态输出(如 80×80×85)
边界框预测 每个网格预测 2 个边界框 每个网格预测 3 个边界框
锚框设计 无锚框 Anchor-Free(隐式锚框)
类别概率 20 个类别(PASCAL VOC) 80 个类别(COCO)
多尺度预测 支持(FPN + PAN)
动态标签分配 支持(Task-Aligned Assigner)

4. 后处理

YOLOv8 的后处理步骤与 YOLOv1 类似,但更加高效:

  1. 筛选边界框:根据置信度阈值(如 0.5)过滤低置信度的边界框。
  2. 计算类别置信度:将每个边界框的置信度与类别概率相乘,得到每个框的类别置信度。
  3. 非极大值抑制(NMS):按类别置信度排序,去除重叠的冗余框。

5. 总结

  • YOLOv8 的输出维度更加灵活,支持多尺度预测和动态标签分配,显著提升了检测性能。
  • 与 YOLOv1 相比,YOLOv8 在输出设计、网络结构和后处理方面都有显著改进,更适合现代目标检测任务。

4. 输入分辨率对预测框数量的影响

YOLOv8 的预测框数量取决于输入分辨率、特征图尺度和每个网格的预测框数。在默认输入分辨率(640×640)下,YOLOv8 的预测框数量为 8400。然而,当输入分辨率提高时,特征图的网格数会显著增加,导致预测框数量激增。


5. 使用 Netron 可视化 YOLO 模型

通过 Netron,我们可以直观地查看 YOLO 模型的输出张量及其结构。以下是具体步骤:

  1. 打开模型文件:在 Netron 中打开 YOLO 模型文件(如 .pt.onnx)。
  2. 查看输出节点:点击输出节点,查看输出张量的形状和参数。
  3. 分析输出维度:根据输出张量的形状,分析模型的预测框数量和类别概率。

例如,YOLOv8 的输出张量形状为 [1,8400,84],其中 84 包括 4 个边界框参数、80 个类别概率。

而上图中我的模型是 1 * 9 * 8400 ,也就是[1,8400,9] 这里9 其实是5个类别+4 个边界框参数(等于9)。

因为这个模型里我只分了5类:(yolo8 应该最多支持80个种类)
在这里插入图片描述
至于 为啥 顺利不对(1 * 9 * 8400 )([1,8400,9] ) 后面我会继续写一篇,关于维度顺序问题的文章。!!!


YOLOv8 去掉了候选框置信度(Objectness Score)这个维度。这是 YOLOv8 的一个重要改进之一。

背景 在早期的 YOLO 版本(如 YOLOv3、YOLOv4、YOLOv5)中,模型的输出通常包含以下几个维度:

  • 边界框坐标(x, y, w, h)
  • 候选框置信度(Objectness Score):表示该边界框是否包含目标的可能性。
  • 类别置信度(Class Confidence):表示目标属于某一类别的概率。

YOLOv8 的改进 YOLOv8 简化了输出设计,去掉了候选框置信度(Objectness Score),直接输出:

  • 边界框坐标(x, y, w, h)
  • 类别置信度(Class Confidence)

这种设计使得模型更加简洁,减少了冗余计算,同时提高了推理效率。

原因分析

  1. 简化模型输出:候选框置信度和类别置信度在功能上有一定的重叠,去掉候选框置信度可以减少模型的复杂度。
  2. 提高效率:减少输出维度可以加快后处理速度,尤其是在大规模目标检测任务中。
  3. 优化训练目标:YOLOv8 通过改进损失函数(如 InnerIoU 系列)和网络结构,直接优化边界框回归和分类任务,不再需要单独的候选框置信度来辅助训练。

6. 总结

Netron 是一个强大的工具,能够帮助我们直观地查看和分析深度学习模型的结构和参数。通过 Netron,我们可以深入理解 YOLO 系列模型的输出设计及其意义。从 YOLOv1 的 7×7×30 输出到 YOLOv8 的 8400 预测框,YOLO 系列模型在目标检测领域取得了显著的进展。希望本文能帮助你更好地理解 YOLO 模型的设计和使用 Netron 进行模型可视化。