找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

656

积分

0

好友

89

主题
发表于 前天 03:45 | 查看: 6| 回复: 0

本文以YOLOv5的v6.0 P5模型为基础,详细解析其整体网络架构以及各个核心子模块的工作原理,为深入理解这一经典目标检测模型奠定坚实基础。

注:本文解析基于YOLOv5l,v6.0,P5版本。不同版本间的具体差异可参考相关资料。

主干网络Backbone

在梳理整个主干网络结构前,我们先对其中的关键子模块进行逐一剖析。

Focus与6x6卷积

在YOLOv5的早期版本中,主干网络起始部分采用了Focus结构(一种切片操作)来下采样并提取特征,其本质是将空间信息(宽和高)转换到通道维度。该操作包含三个步骤:

  • 切片操作(slice):将输入图像在宽和高方向上每隔一个像素采样,得到4个子特征图。
  • 通道拼接:将4个子特征图在通道维度拼接,使通道数变为4倍。
  • 卷积操作:对拼接后的特征图进行一次标准卷积。

以YOLOv5s为例,608x608x3的输入图像经Focus模块后,先变为304x304x12的特征图,再经过32个卷积核的1x1卷积,输出304x304x32的特征图。

其切片操作原理如下图所示(该操作与YOLOv2中的Reorg操作完全相同): 图片

Focus模块处理流程如下图所示: 图片

然而,在YOLOv5后续版本(如v6.0之后)中,Focus结构被一个标准的6x6卷积核、步长为2的卷积层所取代。 这使得网络结构更加统一和简洁,减少了自定义模块。尽管Focus理论上能减少信息丢失,但经过精心设计的6x6卷积层同样能有效捕获相似的空间信息,且在GPU等硬件上,标准卷积通常得到了极佳的优化,实际推理速度可能更具优势。

激活函数

YOLOv5的主干网络普遍采用SiLU激活函数(亦称Swish函数)替代了早期版本常用的LeakyReLU。SiLU在0点附近更为平滑,有助于提升梯度流动和模型表达能力。

其表达式为:SiLU(x) = x * Sigmoid(x)。SiLU函数的计算可分解为两步:先进行Sigmoid变换,再将结果与原始输入逐元素相乘。

图片

下图通过Netron查看YOLOv5 onnx文件,展示了主干网络起始部分卷积块中的SiLU计算流程(即act/Mul操作): 图片

需注意:YOLOv5不同版本使用的激活函数确有不同。早期版本(v1.0-v3.0)默认使用LeakyReLU,因此主干网络中多为CBL(Conv-BN-LeakyReLU)块;大约从v5.0版本开始,官方将默认激活函数全面切换为SiLU,CBL块也随之变为Conv-BN-SiLU块。这也是许多网络架构图仍显示使用CBL块的原因。

图片

CSPLayer

与YOLOv4相同,YOLOv5在主干网络中也采用了CSP结构。其核心思想是将特征图在通道维度拆分为两部分,一部分进行复杂的卷积变换,另一部分直接短路连接,最后再将两部分结果合并。YOLOv5中使用的CSP块主要有两种类型:

  • CSP1_X:用于主干网络,其卷积变换部分采用ResNet的残差块结构(即add=True的DarknetBottleneck)。
  • CSP2_X:用于颈部网络,其卷积变换部分仅为两个连续的卷积块(即add=False的DarknetBottleneck)。

图片

SPPFBottleneck

SPPF模块全称为Spatial Pyramid Pooling-Fast(快速空间金字塔池化),是传统SPP模块的优化版本。两者核心目标都是扩大感受野、融合多尺度上下文信息。

主要区别在于:传统SPP使用多个不同尺寸的大池化核(如5x5, 9x9, 13x13)对输入进行并行处理并拼接结果;而SPPF使用同一个5x5池化核进行串联、重复池化,再将各阶段结果拼接。

SPPF这种串联相同操作的方式在硬件上更易优化,计算速度更快,能在保持甚至提升模型性能的同时加速推理。

图片

综上所述,在输入分辨率为640x640的情况下,YOLOv5主干网络最终会输出下采样倍率为8倍、16倍和32倍的三路特征图,供颈部网络进一步处理。

图片

整个主干网络可总结为以下五个部分:

  1. Stem Layer:即Focus模块(新版本中为6x6, stride=2的卷积层)。输入640x640x3,输出320x320x64。
  2. Layer 1:包含1个步长为2的3x3卷积 + 3个连续的CSP1块。输出160x160x128。
  3. Layer 2:包含1个步长为2的3x3卷积 + 6个连续的CSP1块。输出80x80x256(大尺寸特征图,送入颈部网络)。
  4. Layer 3:包含1个步长为2的3x3卷积 + 9个连续的CSP1块。输出40x40x512(中尺寸特征图,送入颈部网络)。
  5. Layer 4:包含1个步长为2的3x3卷积 + 3个连续的CSP1块 + 1个SPPF模块。输出20x20x1024(小尺寸特征图,送入颈部网络)。

颈部网络Neck

颈部网络是YOLOv5实现多尺度目标检测的核心,负责高效融合主干网络提取的多级特征,使模型能够同时检测不同大小的目标。其整体架构延续了YOLOv4的FPN+PAN双向结构,但引入了CSP2模块等改进,增强了特征融合能力与计算效率。

  • FPN(自顶向下):通过上采样将深层强语义特征与对应的浅层特征进行拼接(Concat),融合语义与细节信息。
  • PAN(自底向上):通过步长为2的卷积将融合后的特征图下采样,与更高层级的特征进行再次融合,精确定位信息得以传递。

图片

检测头Head

检测头部分与前期版本变化不大。来自颈部网络的三路不同分辨率的特征图,分别经过独立的1x1卷积处理,最终输出对应尺度的检测结果张量。

图片

YOLOv5模型的整体网络架构

结合以上对各子模块的解析,理解YOLOv5的整体网络架构图就更加清晰了:

图片

参考资料

  • 深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎
  • YOLOv5 詳細解讀. 前言 | by Steven Meng | Medium
  • YOLOv5 原理和实现全解析 — MMYOLO 0.6.0 文档



上一篇:Java线程Condition深度剖析:AQS等待队列机制与实战应用
下一篇:NewBie-image-Exp0.1动漫生成模型实战:基于Next-DiT架构的高质量图像生成指南
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-11 04:56 , Processed in 0.092120 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表