跳转至内容

Ultralytics YOLOv5 架构

YOLOv5 (v6.0/6.1) 是 Ultralytics 开发的强大目标检测算法。本文深入探讨了 YOLOv5 架构、数据增强策略、训练方法和损失计算技术。这种全面的理解将有助于提高您在各种领域(包括监控、自动驾驶车辆和图像识别)中目标检测的实际应用。

1. 模型结构

YOLOv5 的架构由三个主要部分组成:

  • 主干网络 (Backbone):这是网络的主体。对于 YOLOv5,backbone 的设计使用了 CSPDarknet53 结构,是对先前版本中使用的 Darknet 架构的修改。
  • Neck:这部分连接 backbone 和 head。在 YOLOv5 中, SPPF (空间金字塔池化 - 快速)和 PANet (Path Aggregation Network)结构。
  • 头部:这部分负责生成最终输出。YOLOv5 使用了 YOLOv3 Head 为此目的。

模型的结构如下图所示。模型结构的详细信息可以在以下位置找到 yolov5l.yaml.

yolov5

与之前的版本相比,YOLOv5 引入了一些显著的改进:

  1. 字段 Focus 结构,在早期版本中发现的,被替换为 6x6 Conv2d 结构。此更改提高了效率 #4825.
  2. 字段 SPP 结构被替换为 SPPF。这种改变使处理速度提高了一倍以上,同时保持了相同的输出。

要测试速度 SPPSPPF,可以使用以下代码:

SPP vs SPPF 速度分析示例(点击打开)
import time

import torch
import torch.nn as nn


class SPP(nn.Module):
    def __init__(self):
        """Initializes an SPP module with three different sizes of max pooling layers."""
        super().__init__()
        self.maxpool1 = nn.MaxPool2d(5, 1, padding=2)
        self.maxpool2 = nn.MaxPool2d(9, 1, padding=4)
        self.maxpool3 = nn.MaxPool2d(13, 1, padding=6)

    def forward(self, x):
        """Applies three max pooling layers on input `x` and concatenates results along channel dimension."""
        o1 = self.maxpool1(x)
        o2 = self.maxpool2(x)
        o3 = self.maxpool3(x)
        return torch.cat([x, o1, o2, o3], dim=1)


class SPPF(nn.Module):
    def __init__(self):
        """Initializes an SPPF module with a specific configuration of MaxPool2d layer."""
        super().__init__()
        self.maxpool = nn.MaxPool2d(5, 1, padding=2)

    def forward(self, x):
        """Applies sequential max pooling and concatenates results with input tensor."""
        o1 = self.maxpool(x)
        o2 = self.maxpool(o1)
        o3 = self.maxpool(o2)
        return torch.cat([x, o1, o2, o3], dim=1)


def main():
    """Compares outputs and performance of SPP and SPPF on a random tensor (8, 32, 16, 16)."""
    input_tensor = torch.rand(8, 32, 16, 16)
    spp = SPP()
    sppf = SPPF()
    output1 = spp(input_tensor)
    output2 = sppf(input_tensor)

    print(torch.equal(output1, output2))

    t_start = time.time()
    for _ in range(100):
        spp(input_tensor)
    print(f"SPP time: {time.time() - t_start}")

    t_start = time.time()
    for _ in range(100):
        sppf(input_tensor)
    print(f"SPPF time: {time.time() - t_start}")


if __name__ == "__main__":
    main()
结果:
True
SPP time: 0.5373051166534424
SPPF time: 0.20780706405639648

2. 数据增强技术

YOLOv5 采用了多种数据增强技术,以提高模型的泛化能力并减少过拟合。这些技术包括:

  • Mosaic 数据增强: 一种图像处理技术,它将四个训练图像合并为一个,从而鼓励 目标检测 模型更好地处理各种目标尺度和平移。

    mosaic

  • 复制粘贴增强: 一种创新的数据增强方法,它从图像中复制随机补丁并将它们粘贴到另一张随机选择的图像上,从而有效地生成新的训练样本。

    复制-粘贴

  • 随机仿射变换:包括图像的随机旋转、缩放、平移和剪切。

    随机仿射

  • MixUp 数据增强: 一种通过对两张图像及其相关标签进行线性组合来创建合成图像的方法。

    mixup

  • Albumentations:一个强大的图像增强库,支持各种增强技术。了解更多关于使用Albumentations增强的信息。

  • HSV 增强:随机更改图像的色调、饱和度和值。

    hsv

  • 随机水平翻转:一种随机水平翻转图像的增强方法。

    horizontal-flip

3. 训练策略

YOLOv5 应用了几种复杂的训练策略来增强模型的性能。它们包括:

  • 多尺度训练: 在训练过程中,输入图像在其原始大小的 0.5 到 1.5 倍范围内随机缩放。
  • AutoAnchor: 此策略优化先验 anchor boxes,以匹配自定义数据中 ground truth boxes 的统计特征。
  • Warmup 和 Cosine LR 调度器: 一种调整学习率以提高模型性能的方法。
  • 指数移动平均 (EMA): 一种使用过去步骤中参数的平均值来稳定训练过程并减少泛化误差的策略。
  • 混合精度 训练:一种以半精度格式执行操作的方法,可减少内存使用并提高计算速度。
  • 超参数进化:一种自动调整超参数以实现最佳性能的策略。了解更多关于 超参数调整 的信息。

4. 附加功能

4.1 计算损失

YOLOv5 中的损失计算为三个单独的损失分量的组合:

  • 类别损失 (BCE 损失): 二元交叉熵损失,用于衡量分类任务的误差。
  • 对象性损失(BCE 损失): 另一种二元交叉熵损失,用于计算检测特定网格单元中是否存在对象的误差。
  • 位置损失 (CIoU 损失):完整的 IoU 损失,测量在网格单元内定位对象的误差。

整体 损失函数 由以下公式表示:

损失

4.2 平衡损失

三个预测层的对象性损失 (P3, P4, P5) 的权重不同。平衡权重是 [4.0, 1.0, 0.4] 分别地。这种方法确保了不同尺度的预测对总损失的适当贡献。

obj_loss

4.3 消除网格敏感性

与早期版本的 YOLO 相比,YOLOv5 架构对框预测策略进行了一些重要更改。在 YOLOv2 和 YOLOv3 中,框坐标是使用最后一层的激活直接预测的。

b_x b_y b_w b_h

YOLOv5 网格计算

然而,在 YOLOv5 中,预测框坐标的公式已更新,以降低网格敏感性并防止模型预测无界框尺寸。

用于计算预测边界框的修订公式如下:

bx by bw bh

比较缩放前后的中心点偏移。中心点偏移范围从 (0, 1) 调整到 (-0.5, 1.5)。因此,偏移很容易得到 0 或 1。

YOLOv5 网格缩放

比较调整前后高度和宽度缩放比率(相对于锚框)。原始 yolo/darknet 框方程存在严重缺陷。宽度和高度完全不受限制,因为它们只是 out=exp(in),这很危险,因为它可能导致失控梯度、不稳定性、NaN 损失,并最终完全丧失训练。请参阅此问题以获取更多详细信息。

YOLOv5 无界缩放

4.4 构建目标

YOLOv5 中的构建目标过程对于训练效率和模型准确性至关重要。它涉及将真实框分配给输出图中适当的网格单元,并将它们与适当的锚框进行匹配。

此过程遵循以下步骤:

  • 计算ground truth框的尺寸与每个anchor模板尺寸的比率。

rw

rh

rwmax

rhmax

rmax

匹配

YOLOv5 IoU 计算

  • 如果计算出的比率在阈值范围内,则将 ground truth 框与相应的 anchor 匹配。

YOLOv5 网格重叠

  • 将匹配的锚框分配到适当的单元格,请记住,由于修改后的中心点偏移,一个ground truth框可以分配给多个锚框。因为中心点偏移范围从 (0, 1) 调整到 (-0.5, 1.5),GT Box 可以分配给更多锚框。

YOLOv5 锚框选择

通过这种方式,构建目标过程确保在训练过程中正确分配和匹配每个 Ground Truth 对象,从而使 YOLOv5 能够更有效地学习对象检测任务。

结论

总之,YOLOv5 代表了实时目标检测模型开发中的一个重大进步。 通过结合各种新功能、增强功能和训练策略,它在性能和效率上超越了 YOLO 系列的先前版本。

YOLOv5 的主要增强功能包括使用动态架构、广泛的数据增强技术、创新的训练策略,以及计算损失和构建目标过程中的重要调整。所有这些创新都显着提高了目标检测的准确性和效率,同时保持了 YOLO 模型的高速度这一特点。



📅 创建于 1 年前 ✏️ 更新于 5 个月前

评论