Ultralytics YOLOv5 架构

YOLOv5 (v6.0/6.1) 是一款由 Ultralytics 开发的强大目标检测算法。本文深入探讨了 YOLOv5 架构、数据增强策略、训练方法以及损失计算技术。全面了解这些内容将有助于你提升目标检测在监控、自动驾驶和图像识别等各个领域的实际应用能力。

模型结构

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

  • Backbone:这是网络的主干。对于 YOLOv5,backbone 使用 CSPDarknet53 结构进行设计,这是对先前版本中使用的 Darknet 架构的修改。
  • Neck:该部分连接 Backbone 和 Head。在 YOLOv5 中,使用了 SPPF (Spatial Pyramid Pooling - Fast) 和 PANet (Path Aggregation Network) 结构。
  • Head:该部分负责生成最终输出。YOLOv5 为此使用了 YOLOv3 Head

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

YOLOv5 显示 backbone、neck 和 head 的架构图

与前代产品相比,YOLOv5 引入了一些显著改进:

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

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

SPP vs SPPF speed profiling example (click to open)
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

数据增强技术

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

  • Mosaic Augmentation:这是一种图像处理技术,将四张训练图像组合成一张,旨在促使目标检测模型能够更好地处理各种物体尺度和位移。

    结合四张图像的 YOLOv5 mosaic 数据增强

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

    用于实例分割的 YOLOv5 copy-paste 增强

  • Random Affine Transformations:包括对图像进行随机旋转、缩放、平移和剪切。

    用于训练的 YOLOv5 随机仿射变换

  • MixUp Augmentation:一种通过取两张图像及其相关标签的线性组合来创建合成图像的方法。

    融合两张图像的 YOLOv5 MixUp 数据增强

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

  • HSV Augmentation:对图像的色调 (Hue)、饱和度 (Saturation) 和明度 (Value) 进行随机更改。

    YOLOv5 HSV 色彩空间增强示例

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

    YOLOv5 随机水平翻转增强

训练策略

YOLOv5 应用了几种先进的训练策略来增强模型性能,包括:

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

附加功能

4.1 计算损失

YOLOv5 中的损失由三个独立的损失分量组合而成:

  • Classes Loss (BCE Loss):二元交叉熵损失,用于衡量分类任务的误差。
  • Objectness Loss (BCE Loss):另一种二元交叉熵损失,计算在特定网格单元中是否存在物体的检测误差。
  • Location Loss (CIoU Loss):完全 IoU 损失,用于衡量网格单元内物体定位的误差。

整体损失函数描述为:

YOLOv5 总损失函数公式

4.2 平衡损失

三个预测层 (P3, P4, P5) 的 objectness 损失被赋予不同的权重。平衡权重分别为 [4.0, 1.0, 0.4]。这种方法确保了不同尺度的预测能够对总损失做出适当的贡献。

YOLOv5 objectness 损失平衡公式

4.3 消除网格敏感度

与 YOLO 的早期版本相比,YOLOv5 架构在框预测策略上做了一些重要的改变。在 YOLOv2 和 YOLOv3 中,框坐标是直接通过最后一层的激活值来预测的。

边界框 x 坐标预测公式 边界框 y 坐标预测公式 边界框宽度预测公式 边界框高度预测公式

YOLOv5 grid computation

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

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

YOLOv5 修订后的边界框 x 坐标公式 YOLOv5 修订后的边界框 y 坐标公式 YOLOv5 修订后的边界框宽度公式 YOLOv5 修订后的边界框高度公式

比较缩放前后的中心点偏移。中心点偏移范围从 (0, 1) 调整为 (-0.5, 1.5)。因此,偏移量可以轻松达到 0 或 1。

YOLOv5 grid scaling

比较调整前后的高度和宽度缩放比例(相对于锚框)。原始的 yolo/darknet 框方程存在严重缺陷。宽度和高度是完全无界的,因为它们只是 out=exp(in),这很危险,因为它可能导致梯度失控、不稳定、NaN 损失,最终导致训练完全失败。参考此问题了解更多详情。

YOLOv5 unbounded scaling

4.4 构建目标

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

此过程遵循以下步骤:

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

Ground truth 与锚框宽度比率公式

Ground truth 与锚框高度比率公式

最大宽度比率公式

最大高度比率公式

整体最大比率公式

锚框匹配阈值公式

YOLOv5 IoU computation
  • 如果计算出的比率在阈值内,则将 ground truth 框与相应的锚框匹配。
YOLOv5 grid overlap
  • 将匹配的锚框分配给适当的单元格,请记住,由于修订后的中心点偏移,一个 ground truth 框可以分配给多个锚框,因为中心点偏移范围从 (0, 1) 调整为 (-0.5, 1.5),使得额外的匹配成为可能。
YOLOv5 anchor selection

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

总结

YOLOv5 代表了实时目标检测演进中的重要一步。其架构选择、训练策略和工程改进相较于早期 YOLO 版本提供了强大的性能和效率。

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

评论