Ultralytics YOLOv5架构
YOLOv5(v6.0/6.1)是由Ultralytics开发的一种强大的目标检测算法。本文深入探讨了YOLOv5架构、数据增强策略、训练方法和损失计算技术。这种全面的理解将有助于提升您在各个领域(包括监控、自动驾驶车辆和图像识别)中目标检测的实际应用。
1. 模型结构
YOLOv5的架构由三个主要部分组成:
- Backbone:这是网络的主体。对于YOLOv5,backbone采用了
New CSP-Darknet53
结构,这是对之前版本中使用的Darknet架构的修改。 - Neck:这部分连接backbone和head。在YOLOv5中,使用了
SPPF
和New CSP-PAN
结构。 - Head:这部分负责生成最终输出。YOLOv5使用
YOLOv3 Head
来实现这一目的。
模型的结构如下图所示。模型结构的详细信息可以在yolov5l.yaml
中找到。
YOLOv5相对于其前身引入了一些小的变化:
- 早期版本中的
Focus
结构被替换为6x6 Conv2d
结构。这一变化提高了效率#4825。 SPP
结构被替换为SPPF
。这一改动使处理速度提高了两倍以上。
要测试SPP
和SPPF
的速度,可以使用以下代码:
SPP vs SPPF速度分析示例(点击打开)
import time
import torch
import torch.nn as nn
class SPP(nn.Module):
def __init__(self):
"""初始化一个包含三种不同大小最大池化层的SPP模块。"""
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):
"""在输入`x`上应用三个最大池化层,并将结果沿通道维度连接。"""
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):
"""初始化一个包含特定配置的MaxPool2d层的SPPF模块。"""
super().__init__()
self.maxpool = nn.MaxPool2d(5, 1, padding=2)
def forward(self, x):
"""应用顺序最大池化,并将结果与输入张量连接。"""
o1 = self.maxpool(x)
o2 = self.maxpool(o1)
o3 = self.maxpool(o2)
return torch.cat([x, o1, o2, o3], dim=1)
def main():
"""比较SPP和SPPF在随机张量(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()
2. 数据增强技术
YOLOv5采用了多种数据增强技术,以提高模型的泛化能力并减少过拟合。这些技术包括:
-
Mosaic增强:一种图像处理技术,将四张训练图像组合成一张,以鼓励目标检测模型更好地处理各种目标尺度和平移。
-
Copy-Paste增强:一种创新的数据增强方法,随机从一张图像中复制补丁并粘贴到另一张随机选择的图像上,从而有效地生成新的训练样本。
- 随机仿射变换:包括图像的随机旋转、缩放、平移和剪切。
-
MixUp 增强:一种通过取两张图像及其相关标签的线性组合来创建复合图像的方法。
-
Albumentations:一个强大的图像增强库,支持多种增强技术。
-
HSV 增强:对图像的色调、饱和度和亮度进行随机变化。
-
随机水平翻转:一种随机水平翻转图像的增强方法。
3. 训练策略
YOLOv5 应用了多种复杂的训练策略来提升模型的性能。包括:
- 多尺度训练:在训练过程中,输入图像在原始大小的 0.5 到 1.5 倍之间随机缩放。
- 自动锚框:该策略优化先验锚框,以匹配自定义数据中真实框的统计特征。
- 预热和余弦学习率调度器:一种调整学习率以提升模型性能的方法。
- 指数移动平均(EMA):一种使用过去步骤参数平均值的策略,以稳定训练过程并减少泛化误差。
- 混合精度训练:一种以半精度格式执行操作的方法,减少内存使用并提高计算速度。
- 超参数进化:一种自动调整超参数以达到最佳性能的策略。
4. 附加功能
4.1 计算损失
YOLOv5 中的损失是三个独立损失分量的组合:
- 类别损失(BCE 损失):二元交叉熵损失,衡量分类任务的误差。
- 目标性损失(BCE 损失):另一个二元交叉熵损失,计算特定网格单元中是否存在对象的误差。
- 定位损失(CIoU 损失):完整的 IoU 损失,衡量网格单元内对象定位的误差。
总体损失函数表示为:
4.2 平衡损失
三个预测层(P3
、P4
、P5
)的目标性损失权重不同。平衡权重分别为 [4.0, 1.0, 0.4]
。这种方法确保不同尺度的预测对总损失的贡献适当。
4.3 消除网格敏感性
YOLOv5 架构在框预测策略上与 YOLO 早期版本相比有一些重要变化。在 YOLOv2 和 YOLOv3 中,框坐标直接使用最后一层的激活进行预测。
然而,在 YOLOv5 中,预测框坐标的公式已更新,以减少网格敏感性并防止模型预测无界的框尺寸。
计算预测边界框的修订公式如下:
比较缩放前后的中心点偏移。中心点偏移范围从 (0, 1) 调整为 (-0.5, 1.5)。因此,偏移可以轻松达到 0 或 1。
比较调整前后的宽高缩放比(相对于锚点)。原始的yolo/darknet框方程存在一个严重缺陷。宽度和高度是完全无界的,因为它们只是out=exp(in),这是危险的,因为它可能导致梯度失控、不稳定、NaN损失,最终导致训练完全失败。参考此问题
4.4 构建目标
YOLOv5中的构建目标过程对于训练效率和模型准确性至关重要。它涉及将真实框分配给输出图中的适当网格单元,并将其与适当的锚框匹配。
此过程遵循以下步骤:
- 计算真实框尺寸与每个锚模板尺寸的比率。
- 如果计算的比率在阈值内,则将真实框与相应的锚匹配。
- 将匹配的锚分配给适当的单元格,考虑到由于中心点偏移的调整,一个真实框可以分配给多个锚。因为中心点偏移范围从(0, 1)调整为(-0.5, 1.5)。GT框可以分配给更多的锚。
通过这种方式,构建目标过程确保在训练过程中每个真实对象都被正确分配和匹配,使YOLOv5能够更有效地学习目标检测任务。
结论
总之,YOLOv5代表了实时目标检测模型发展中的一个重要进步。通过结合各种新功能、增强功能和训练策略,它在性能和效率上超越了YOLO家族的先前版本。
YOLOv5的主要增强功能包括使用动态架构、广泛的数据增强技术、创新的训练策略,以及在计算损失和构建目标过程中的重要调整。所有这些创新显著提高了目标检测的准确性和效率,同时保持了高速度,这是YOLO模型的标志。