手把手教你分析深度学习目标检测模型——以YOLOv5为例

手把手教你分析深度学习目标检测模型------以YOLOv5为例

我们常常会接触各类预训练模型,但很多时候只知道"模型能做什么",却不清楚"模型内部在做什么"。今天,我们就以经典的YOLOv5目标检测模型为例,结合Netron可视化工具,一步步教你如何完整分析一个深度学习模型,从输入到输出、从宏观到微观,读懂模型的每一个细节。

一、先明确核心:模型的定位与核心功能

分析模型前,首先要明确模型的核心用途------我们本次分析的YOLOv5模型,是一款主流的目标检测模型,核心功能是:输入一张图片,通过模型内部的特征提取与计算,最终输出带有目标边界框(bbox)、目标类别和置信度的检测结果,直白地说,就是让计算机"看到"图片里有什么、在什么位置。

这也是我们分析模型的核心逻辑:从"输入什么"出发,拆解"模型做了什么",最终理解"输出什么、怎么用",形成完整的分析闭环。

二、准备工作:模型输入前的预处理

深度学习模型对输入数据有严格的格式要求,并非直接输入原始图片就能运行,这一步是模型分析的基础,也是我们容易忽略的细节。

以本次分析的YOLOv5模型为例,它要求的输入数据格式为:float32[1, 3, 640, 640],我们逐一对这个格式进行解读,这也是所有深度学习模型输入格式的通用分析方法:

  • float32:数据类型,代表输入的每个像素值都是32位浮点数,这是深度学习模型中最常用的数据类型,保证计算精度的同时兼顾效率;
  • 1:批量大小(batch size),表示一次输入1张图片进行推理,实际应用中可调整为批量输入(如[8, 3, 640, 640]表示一次输入8张图);
  • 3:输入通道数,对应RGB彩色图像的3个通道(红色R、绿色G、蓝色B),如果是灰度图,通道数则为1;3 个通道(R、G、B),每个通道都是 640×640 的 "灰度图",每个通道里的每个像素点,都用 32 位浮点数存储亮度值,3 个通道的亮度值叠加,形成彩色像素。
  • 640×640:输入图像的高度和宽度,即模型要求将原始图片缩放至640像素×640像素,确保输入尺寸统一,这是目标检测模型的常见输入分辨率。

哈哈,是不是看到这里感觉有点头晕,都不知道这些是什么,也不知道这个参数是怎么来的?且看下面分析

三、核心工具:用Netron可视化模型内部结构

分析模型内部结构,我们不需要手动拆解代码,借助Netron可视化工具就能直观看到模型的每一个节点、每一层计算------Netron是一款专门用于可视化ONNX、TensorFlow等格式模型的工具,操作简单,无需编程基础,是深度学习学生分析模型的必备工具。

使用方法非常简单:打开官网(https://netron.app/),上传模型文件(本次分析的YOLOv5模型为ONNX格式),即可自动生成模型的可视化结构图,我们可以通过这个图,从宏观到微观,逐步拆解模型。

模型分析第一步:宏观概览------读懂模型的输入、输出与规模

上传模型后,首先看到的是模型的"全局视图"(对应参考图1),这一步的核心是掌握3个关键信息:模型参数量、输入、输出,快速建立对模型的整体认知。

这里就可以看到模型的输入输出要求是什么了。

1. 模型参数量

本次分析的YOLOv5模型,总参数量为25934467(约2593万),参数量直接反映模型的复杂程度:参数量越大,模型的特征提取能力越强,但计算成本越高,部署难度也越大;参数量越小,模型越轻量化,适合边缘设备部署。对于学生而言,通过参数量可以快速判断模型的适用场景。

2. 模型输入

全局视图中明确标注了输入为images: float32[1, 3, 640, 640],与我们预处理的输入格式完全对应,这也验证了我们预处理的正确性------模型的输入必须与预处理后的输出完全匹配,否则会报错。

3. 模型输出

这是宏观概览的重点,也是目标检测模型的核心特征。本次模型共输出9个张量,分为3个尺度,每个尺度包含3个分支,这是YOLO系列模型典型的多尺度检测设计,目的是兼顾小、中、大不同尺寸的目标检测,我们用表格清晰整理(对应参考图1的输出信息):

输出名称 张量形状(float32[1, H, W, C]) 下采样倍数 分支类型 作用
output0 [1, 80, 80, 4] 8倍 坐标分支 小目标检测:预测边界框(x, y, w, h)
1011 [1, 80, 80, 1] 8倍 置信度分支 小目标置信度:判断该网格是否存在目标
1033 [1, 80, 80, 51] 8倍 分类分支 小目标分类:51个类别的概率分布
1055 [1, 40, 40, 4] 16倍 坐标分支 中目标检测:预测边界框
1095 [1, 40, 40, 1] 16倍 置信度分支 中目标置信度
1117 [1, 40, 40, 51] 16倍 分类分支 中目标分类
1139 [1, 20, 20, 4] 32倍 坐标分支 大目标检测:预测边界框
1179 [1, 20, 20, 1] 32倍 置信度分支 大目标置信度
1201 [1, 20, 20, 51] 32倍 分类分支 大目标分类

这里我们补充两个关键知识点,帮助大家理解:

  • 下采样倍数:8倍、16倍、32倍代表特征图相对于原始输入图片(640×640)的缩小比例,下采样倍数越小,特征图尺寸越大(如8倍下采样对应80×80),越适合检测小目标;下采样倍数越大,特征图尺寸越小(如32倍下采样对应20×20),越适合检测大目标。
  • 三分支设计:每个尺度的3个分支各司其职------坐标分支(4通道)预测目标位置,置信度分支(1通道)判断是否有目标,分类分支(51通道)预测目标属于哪一类(本次模型支持51个类别),三者结合才能完整描述一个目标。

总结:宏观概览的核心是"摸清模型的基本情况",知道模型的输入要求、输出形式和规模,为后续微观拆解打下基础。

五、模型分析第二步:微观拆解------读懂核心层(Conv层)的工作原理

宏观概览后,我们需要深入模型内部,拆解核心层的工作机制------对于目标检测模型而言,卷积层(Conv层)是最核心的层,负责提取图片的特征,也是我们分析的重点(对应参考图2)。一般预训练的模型是没有什么问题的,但我们可以点击进去模型内部看它的内部信息。Conv层的核心计算公式 输出 = 输入 × 权重 + 偏置,依据这个公式如果数学功底好还可以自己输入图片来计算一下

我们以模型的第一个Conv层(name: /model.0/conv/Conv)为例,拆解Conv层的输入、输出、参数和计算逻辑,这也是所有Conv层的通用分析方法。

1. Conv层的输入

该Conv层的输入是我们预处理后的图片张量1×3×640×640,同时还需要两个可学习参数:权重(W)和偏置(B),这两个参数是模型训练过程中学习到的,决定了Conv层的特征提取能力。

  • 权重(W):形状为64×3×3×3,含义是:该Conv层有64个卷积核,每个卷积核的尺寸为3×3,对应输入的3个通道(RGB);
  • 偏置(B):形状为64,含义是:每个输出通道(共64个)对应1个偏置项,用于调整激活函数的输入,避免模型输出过于集中,提升模型的表达能力。
2. Conv层的核心参数

参考图2的属性面板,我们可以看到Conv层的关键参数,这些参数决定了卷积操作的方式,每一个参数都有明确的作用:

  • dilations(扩张率):1, 1,表示普通卷积,没有扩张感受野,卷积核按正常方式滑动;
  • group(分组数):1,表示普通卷积(非分组卷积),所有输入通道共同参与计算;
  • kernel_shape(卷积核尺寸):3, 3,最常用的卷积核尺寸,兼顾特征提取能力和计算效率;
  • pads(填充):1, 1, 1, 1,表示上下左右各填充1个像素,目的是保证卷积后特征图的尺寸按步长规律变化,避免特征丢失;
  • strides(步长):2, 2,表示卷积核每滑动一步跳过2个像素,核心作用是下采样,让特征图尺寸减半。
3. Conv层的计算逻辑与输出

Conv层的核心计算逻辑非常简单,公式为:输出 = 输入 × 权重 + 偏置,结合上面的参数,我们可以计算出该Conv层的输出尺寸:

输入尺寸:640×640,填充1,卷积核3×3,步长2,代入公式:

输出尺寸 = (输入尺寸 + 2×填充 - 卷积核尺寸)÷ 步长 + 1 = (640 + 2×1 - 3)÷ 2 + 1 = 320

因此,该Conv层的输出形状为1×64×320×320,其中64是输出通道数(与权重的第一个维度一致),320×320是下采样后的特征图尺寸。

补充:该Conv层之后,还连接了Sigmoid激活层和Mul(逐元素乘法)层,形成"Conv→Sigmoid→Mul"的门控结构,目的是动态选择和增强有用的特征,抑制无用特征,这是YOLOv5模型的优化设计之一。

总结:Conv层分析要点

对于任何深度学习模型的Conv层,我们都可以按"输入→参数→计算→输出"的逻辑分析:明确输入的形状和参数,理解每个参数的作用,计算输出尺寸,就能读懂Conv层的核心功能------提取特征、下采样,这是模型完成目标检测的基础。

四、模型分析第三步:输出后处理------从张量到可视化检测框

模型输出的9个张量([out0, out1, out2, out3, out4, out5, out6, out7, out8]),并不是我们最终看到的"带框图片",而是一堆数字,需要经过后处理,才能将这些数字转换成我们能直观理解的检测结果。我们需要明确这个模型的作用就是检测,它的输出就是检测的结果。那么后处理就是把检测结果输出到原始图片上就可以

后处理的流程非常固定,适合所有YOLO系列模型,记住这5个步骤即可:

步骤1:分组

将9个输出张量按"尺度"分成3组,每组对应一个尺度的3个分支(坐标+置信度+分类):

  • 第一组(80×80,小目标):out0(坐标)、out1(置信度)、out2(分类);
  • 第二组(40×40,中目标):out3(坐标)、out4(置信度)、out5(分类);
  • 第三组(20×20,大目标):out6(坐标)、out7(置信度)、out8(分类)。

步骤2:拼接

对每组的3个张量进行拼接,将"坐标(4通道)+ 置信度(1通道)+ 分类(51通道)"合并为一个56通道的张量,每组的形状变为:

  • 第一组:[1, 80, 80, 56];
  • 第二组:[1, 40, 40, 56];
  • 第三组:[1, 20, 20, 56]。

步骤3:展平

将3组拼接后的张量全部展平,变成一维列表,合并所有预测框:

  • 80×80 = 6400个预测框;
  • 40×40 = 1600个预测框;
  • 20×20 = 400个预测框;
  • 总计:6400+1600+400 = 8400个预测框,展平后形状为(8400, 56)。

步骤4:过滤低分框

设定一个置信度阈值(通常为0.25),过滤掉置信度低于阈值的预测框------这些框的可信度太低,大概率是误检,过滤后通常只剩下几百个有效框。

步骤5:NMS非极大值抑制

同一个目标可能会被多个预测框检测到,NMS的作用是保留置信度最高的那个框,删除重复的框,最终得到干净、准确的检测结果。

最终结果

经过以上5个步骤,我们会得到一个简洁的数组,每一行代表一个检测到的目标,格式为:[x1, y1, x2, y2, 置信度, 类别ID],例如:

100, 200, 300, 400, 0.92, 0\] → 表示在图片(100,200)到(300,400)的位置,有一个置信度为92%的目标,类别ID为0(假设0对应"人")。 最后,我们将这些坐标绘制在原始图片上,就能得到一张带有边界框、类别和置信度的可视化检测图,这就是模型的最终输出。 ![image-20260504213830467](https://i-blog.csdnimg.cn/img_convert/12aea6915d84225efc97da0fc4b0eed6.png) ### 五、总结:深度学习模型分析的通用流程 通过本次YOLOv5模型的分析,我们可以总结出一套适用于所有深度学习模型的分析流程,无论是目标检测、图像分类还是其他任务,都可以按这个逻辑逐步拆解: 1. 明确模型定位:知道模型的核心功能(做什么); 2. 分析输入预处理:明确模型的输入格式、尺寸和数据类型; 3. 宏观概览模型:用Netron查看模型的参数量、输入和输出,建立整体认知;重点分析Conv层等核心层的输入、参数、计算逻辑和输出; 4. 解读输出与后处理:理解模型输出的含义,掌握后处理流程,将模型输出转换成直观结果。 学会分析模型不仅能帮助我们理解模型的工作原理,更能为后续的模型改进、优化和部署打下基础。建议大家多找几个不同的模型(如ResNet、YOLOv7等),按照这个流程反复练习,逐步提升自己的模型分析能力。

相关推荐
郭菁菁1 小时前
职业深度解析:Prompt Engineer——与AI对话的艺术
大数据·人工智能·深度学习·机器学习·prompt
cici158746 小时前
卡尔曼滤波器实现RBF神经网络训练
人工智能·深度学习·神经网络
郝学胜-神的一滴10 小时前
深度学习优化核心:梯度下降与网络训练全解析
数据结构·人工智能·python·深度学习·算法·机器学习
拓朗工控12 小时前
深度学习工控机部署实战:从硬件选型到稳定运行的避坑指南
人工智能·深度学习·智能电视·工控机
NorburyL13 小时前
DPO笔记
深度学习·算法
EnCi Zheng15 小时前
01d-前馈神经网络代码实现 [特殊字符]
人工智能·深度学习·神经网络
hixiong12315 小时前
C# TensorRT部署RF-DETR目标检测&分割模型
人工智能·目标检测·计算机视觉·ai·c#
deephub16 小时前
为什么 MCP 在协议层会有 prompt injection的问题:工具描述如何劫持 agent 上下文
人工智能·深度学习·大语言模型·ai-agent·mcp
配奇18 小时前
RNN及其变体
人工智能·rnn·深度学习