YOLO Vision 2026:

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 architecture showing backbone, neck, and head

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

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

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

SPP vs SPPF speed profiling example (click to open)
import time

import torch
from torch import 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 增强:一种图像处理技术,将四张训练图像组合成一张,以鼓励目标检测模型更好地处理各种对象尺度和转换。

    YOLOv5 mosaic data augmentation combining four images

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

    YOLOv5 copy-paste augmentation for instance segmentation

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

    YOLOv5 random affine transformations for training

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

    YOLOv5 MixUp data augmentation blending two images

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

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

    YOLOv5 HSV color space augmentation examples

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

    YOLOv5 random horizontal flip augmentation

训练策略#

YOLOv5 应用了多种先进的训练策略来提高模型的性能。它们包括:

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

其他功能#

4.1 计算损失#

YOLOv5 中的损失由三个单独的损失分量组合而成计算得出:

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

整体损失函数如下图所示:

YOLOv5 total loss function formula

4.2 平衡损失#

三个预测层(P3P4P5)的目标性损失(objectness losses)权重不同。平衡权重分别为 [4.0, 1.0, 0.4]。这种方法确保了不同尺度的预测对总损失做出适当的贡献。

YOLOv5 objectness loss balance formula

4.3 消除网格敏感性#

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

Bounding box x-coordinate prediction formula Bounding box y-coordinate prediction formula Bounding box width prediction formula Bounding box height prediction formula

YOLOv5 grid computation

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

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

YOLOv5 revised bounding box x-coordinate formula YOLOv5 revised bounding box y-coordinate formula YOLOv5 revised bounding box width formula YOLOv5 revised bounding box height formula

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

YOLOv5 grid scaling

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

YOLOv5 unbounded scaling

4.4 构建目标#

YOLOv5 中的 build target 过程对于训练效率和模型准确率至关重要。它包括将真实边界框分配到输出图中的适当网格单元,并将其与适当的 anchor 框进行匹配。

此过程遵循以下步骤:

  • 计算真实标签框尺寸与每个锚框模板尺寸的比率。

Ground truth to anchor width ratio formula

Ground truth to anchor height ratio formula

Maximum width ratio formula

Maximum height ratio formula

Overall maximum ratio formula

Anchor matching threshold formula

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

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

结论#

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

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

评论