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 引入了一些显著改进:
- 早期版本中使用的
Focus结构被替换为6x6 Conv2d结构。这一更改提高了效率 #4825。 SPP结构被替换为SPPF。这一调整在保持相同输出的同时,处理速度提高了一倍以上。
若要测试 SPP 和 SPPF 的速度,可以使用以下代码:
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:这是一种图像处理技术,将四张训练图像组合成一张,旨在促使目标检测模型能够更好地处理各种物体尺度和位移。

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

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

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

-
Albumentations:一个强大的图像增强库,支持各种各样的增强技术。了解更多关于使用 Albumentations 增强的信息。
-
HSV Augmentation:对图像的色调 (Hue)、饱和度 (Saturation) 和明度 (Value) 进行随机更改。

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

训练策略
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 损失,用于衡量网格单元内物体定位的误差。
整体损失函数描述为:
4.2 平衡损失
三个预测层 (P3, P4, P5) 的 objectness 损失被赋予不同的权重。平衡权重分别为 [4.0, 1.0, 0.4]。这种方法确保了不同尺度的预测能够对总损失做出适当的贡献。
4.3 消除网格敏感度
与 YOLO 的早期版本相比,YOLOv5 架构在框预测策略上做了一些重要的改变。在 YOLOv2 和 YOLOv3 中,框坐标是直接通过最后一层的激活值来预测的。
然而,在 YOLOv5 中,预测框坐标的公式已经更新,以降低网格敏感度并防止模型预测出无界的框尺寸。
计算预测边界框的修订公式如下:
比较缩放前后的中心点偏移。中心点偏移范围从 (0, 1) 调整为 (-0.5, 1.5)。因此,偏移量可以轻松达到 0 或 1。
比较调整前后的高度和宽度缩放比例(相对于锚框)。原始的 yolo/darknet 框方程存在严重缺陷。宽度和高度是完全无界的,因为它们只是 out=exp(in),这很危险,因为它可能导致梯度失控、不稳定、NaN 损失,最终导致训练完全失败。参考此问题了解更多详情。
4.4 构建目标
YOLOv5 中的构建目标过程对于训练效率和模型准确度至关重要。它涉及将 ground truth 框分配给输出图中的适当网格单元,并将它们与适当的锚框进行匹配。
此过程遵循以下步骤:
- 计算 ground truth 框尺寸与每个锚框模板尺寸的比率。
- 如果计算出的比率在阈值内,则将 ground truth 框与相应的锚框匹配。
- 将匹配的锚框分配给适当的单元格,请记住,由于修订后的中心点偏移,一个 ground truth 框可以分配给多个锚框,因为中心点偏移范围从 (0, 1) 调整为 (-0.5, 1.5),使得额外的匹配成为可能。
通过这种方式,构建目标过程确保了每个 ground truth 对象在训练过程中得到正确的分配和匹配,从而使 YOLOv5 能够更有效地学习目标检测任务。
总结
YOLOv5 代表了实时目标检测演进中的重要一步。其架构选择、训练策略和工程改进相较于早期 YOLO 版本提供了强大的性能和效率。
YOLOv5 的主要增强功能包括动态架构的使用、广泛的数据增强技术、创新的训练策略,以及在计算损失和构建目标过程中的重要调整。所有这些创新都显著提高了目标检测的准确性和效率,同时保持了 YOLO 模型标志性的高速度。