Ultralytics YOLOv5 建筑学
YOLOv5 (v6.0/6.1) 是一种功能强大的物体检测算法,由Ultralytics 开发。本文深入探讨了YOLOv5 的架构、数据增强策略、训练方法和损失计算技术。这种全面的理解将有助于提高物体检测在监控、自动驾驶汽车和图像识别等各个领域的实际应用。
1.模型结构
YOLOv5其架构由三个主要部分组成:
- 骨干网:这是网络的主体。在YOLOv5 中,骨干网的设计使用了
New CSP-Darknet53
结构,这是对以前版本中使用的暗网结构的修改。 - 颈部:这部分连接着脊柱和头部。在YOLOv5 中、
SPPF
和New CSP-PAN
结构。 - 负责人:该部分负责生成最终输出。YOLOv5 使用
YOLOv3 Head
为此目的。
模型结构如下图所示。模型结构详情见 yolov5l.yaml
.
YOLOv5 与之前的版本相比,该版本有一些细微的变化:
- "(《世界人权宣言》)
Focus
结构取代了早期版本中的6x6 Conv2d
结构。这一变化提高了效率 #4825. - "(《世界人权宣言》)
SPP
结构改为SPPF
.这一改动使处理速度提高了一倍多。
测试 SPP
和 SPPF
可以使用以下代码:
SPP 与 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()
2.数据扩充技术
YOLOv5 采用各种数据增强技术来提高模型的泛化能力,减少过度拟合。这些技术包括
-
马赛克增强:一种图像处理技术,可将四幅训练图像合并为一幅,从而促使物体检测模型更好地处理各种物体比例和平移。
-
复制粘贴增强:这是一种创新的数据增强方法,它能从图像中复制随机片段,并将其粘贴到另一张随机选择的图像上,从而有效生成新的训练样本。
-
随机仿射变换:包括图像的随机旋转、缩放、平移和剪切。
-
混合增强:一种通过对两幅图像及其相关标签进行线性组合来创建合成图像的方法。
-
Albumentations:一个强大的图像增强库,支持多种增强技术。
-
HSV 增强:随机改变图像的色调、饱和度和值。
-
随机水平翻转一种水平随机翻转图像的增强方法。
3.培训策略
YOLOv5 该模型采用了几种复杂的训练策略来提高模型的性能。这些策略包括
- 多尺度训练:在训练过程中,输入图像会在 0.5 到 1.5 倍的范围内随机重新缩放。
- 自动锚点:该策略可优化先验锚点框,使其与自定义数据中地面实况框的统计特征相匹配。
- 热身和余弦 LR 调度器:一种调整学习率以提高模型性能的方法。
- 指数移动平均法 (EMA):一种使用过去各步参数平均值来稳定训练过程并减少泛化误差的策略。
- 混合精度训练:一种以半精度格式执行运算的方法,可减少内存使用量并提高计算速度。
- 超参数进化:一种自动调整超参数以达到最佳性能的策略。
4.附加功能
4.1 计算损失
YOLOv5 中的损失是由三个单独的损失部分组合而成的:
- 分类损失(BCE Loss):二元交叉熵损失,用于测量分类任务的误差。
- 对象损失(BCE 损失):另一种二元交叉熵损失,计算检测特定网格单元中是否存在物体时的误差。
- 定位损失(CIoU 损失):完全 IoU 损失,测量网格单元内物体定位的误差。
整体损失函数描述如下
4.2 余额损失
三个预测层的对象性损失 (P3
, P4
, P5
)的权重不同。平衡权重为 [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 中的构建目标过程对训练效率和模型准确性至关重要。它包括将地面实况框分配到输出地图中的适当网格单元,并将它们与适当的锚点框进行匹配。
这一过程遵循以下步骤:
- 计算地面实况箱尺寸与每个锚点模板尺寸的比率。
- 如果计算出的比率在阈值范围内,则将地面实况框与相应的锚点相匹配。
- 将匹配的锚点分配到相应的单元格,注意由于中心点偏移量的调整,一个地面实况框可以分配到多个锚点。因为中心点偏移范围已从 (0, 1) 调整为 (-0.5, 1.5)。地面实况方框可以分配给更多的锚点。
这样,构建目标的过程就能确保在训练过程中正确分配和匹配每个地面实况对象,从而让YOLOv5 更有效地学习对象检测任务。
结论
总之,YOLOv5 在实时物体检测模型的开发方面迈出了重要一步。通过整合各种新功能、增强功能和训练策略,它在性能和效率上都超越了YOLO 系列之前的版本。
YOLOv5 的主要改进包括使用动态架构、广泛的数据增强技术、创新的训练策略,以及对计算损耗和目标构建过程的重要调整。所有这些创新都大大提高了目标检测的准确性和效率,同时还保持了YOLO 模型所特有的高速度。