ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLOv5 架构深度解析:模型结构、数据增强、训练策略与损失计算全指南

YOLOv5 架构深度解析:模型结构、数据增强、训练策略与损失计算全指南 YOLOv5 架构深度解析模型结构、数据增强、训练策略与损失计算全指南【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10导读本文以 Ultralytics 官方文档《Ultralytics YOLOv5 Architecture》为主体结合本仓库YOLOv10 代码库中完整保留的 YOLOv5 v6.0/6.1 实现的源码、配置与测试系统拆解 YOLOv5 的模型结构、数据增强手段、训练策略、损失计算与目标构建机制。读完本文你将掌握 YOLOv5 的 Backbone/Neck/Head 设计脉络、SPPF替换SPP的加速原理与实测对比、损失函数三项构成与权重平衡、消除网格敏感度的坐标解码改进以及 build targets 的锚框匹配流程从而在检测任务选型、调参与二次开发中做到心中有数。本文涉及的核心配置文件为 ultralytics/cfg/models/v5/yolov5.yaml核心模块实现位于 ultralytics/nn/modules/block.py、ultralytics/nn/modules/head.py、ultralytics/utils/loss.py、ultralytics/data/augment.py 与 ultralytics/utils/tal.py。1. 模型结构Backbone、Neck 与 HeadYOLOv5 的整体架构由三个主要部分组成Backbone骨干网络网络主体负责从输入图像中提取多尺度特征。YOLOv5 采用New CSP-Darknet53结构是对前代 YOLO 中 Darknet 架构的改进版本。Neck颈部连接 Backbone 与 Head负责特征融合。YOLOv5 采用SPPF与New CSP-PAN结构。Head检测头负责生成最终输出。YOLOv5 使用YOLOv3 Head完成目标检测解码。完整模型结构配置见 ultralytics/cfg/models/v5/yolov5.yaml该文件以[from, number, module, args]四元组逐层描述网络backbone 部分摘录如下# YOLOv5 v6.0 backbone backbone: # [from, number, module, args] - [-1, 1, Conv, [64, 6, 2, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 - [-1, 3, C3, [128]] - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8 - [-1, 6, C3, [256]] - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16 - [-1, 9, C3, [512]] - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32 - [-1, 3, C3, [1024]] - [-1, 1, SPPF, [1024, 5]] # 9其中number表示模块重复次数args中的第一个数为输出通道数末尾的P3/8、P4/16、P5/32注释表示该层特征图相对输入的下采样倍率stride 分别为 8、16、32三个尺度的特征图正是后续 Detect head 的三路输入。head 部分则通过上采样nn.Upsample、Concat与C3完成自顶向下的特征融合并最终汇聚为Detect(P3, P4, P5)三路输出head: - [-1, 1, Conv, [512, 1, 1]] - [-1, 1, nn.Upsample, [None, 2, nearest]] - [[-1, 6], 1, Concat, [1]] # cat backbone P4 - [-1, 3, C3, [512, False]] # 13 ... - [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)配置文件顶部的scales字段定义了模型复合缩放常量深度depth、宽度width、最大通道数max_channels例如l: [1.00, 1.00, 1024]对应 yolov5ln/s/m/l/x五种规格均通过缩放基础配置文件得到这正是 YOLOv5 compound scaling 的设计思想。1.1 与上一代相比的两处关键改动YOLOv5 相对早期版本引入了两处影响深远的改动Focus结构被替换为6x6 Conv2d早期版本在网络的起始位置使用Focus层对输入做通道切分重组v6.0 起直接使用 kernel6、stride2 的6x6 Conv2d代替在保证感受野的同时提升了计算效率。可以从 yolov5.yaml 第 17 行[-1, 1, Conv, [64, 6, 2, 2]]看到这一实现。SPP被替换为SPPF标准空间金字塔池化Spatial Pyramid Pooling由三个不同核尺寸5、9、13的MaxPool2d并行构成SPPFSpatial Pyramid Pooling - Fast则用单个MaxPool2d(k5)串行堆叠三次数学上等价但计算量大幅下降。两者在 block.py 中均有实现class SPP(nn.Module): def __init__(self, c1, c2, k(5, 9, 13)): ... self.m nn.ModuleList([nn.MaxPool2d(kernel_sizex, stride1, paddingx // 2) for x in k]) def forward(self, x): x self.cv1(x) return self.cv2(torch.cat([x] [m(x) for m in self.m], 1)) class SPPF(nn.Module): def __init__(self, c1, c2, k5): ... self.m nn.MaxPool2d(kernel_sizek, stride1, paddingk // 2) def forward(self, x): x self.cv1(x) y1 self.m(x) y2 self.m(y1) return self.cv2(torch.cat((x, y1, y2, self.m(y2)), 1))注意SPP的三个池化核是并行作用于输入得到 4 个分支而SPPF是串行叠加同一个核同样得到 4 个分支x, m(x), m(m(x)), m(m(m(x)))输出通道数完全一致因此两者可无缝替换但SPPF的计算量显著低于SPP。SPP vs SPPF 速度实测官方文档给出了一段可直接运行的 PyTorch 基准测试代码验证二者输出等价性与速度差异import time import torch import torch.nn as nn class SPP(nn.Module): def __init__(self): super().__init__() self.maxpool1 nn.MaxPool2d(5, 1, padding2) self.maxpool2 nn.MaxPool2d(9, 1, padding4) self.maxpool3 nn.MaxPool2d(13, 1, padding6) def forward(self, x): o1 self.maxpool1(x) o2 self.maxpool2(x) o3 self.maxpool3(x) return torch.cat([x, o1, o2, o3], dim1) class SPPF(nn.Module): def __init__(self): super().__init__() self.maxpool nn.MaxPool2d(5, 1, padding2) def forward(self, x): o1 self.maxpool(x) o2 self.maxpool(o1) o3 self.maxpool(o2) return torch.cat([x, o1, o2, o3], dim1) def main(): 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(fSPP time: {time.time() - t_start}) t_start time.time() for _ in range(100): sppf(input_tensor) print(fSPPF time: {time.time() - t_start}) if __name__ __main__: main()官方文档给出的运行结果具体耗时随硬件浮动True SPP time: 0.5373051166534424 SPPF time: 0.20780706405639648第一行输出True说明两者输出张量完全相等即SPPF与SPP在功能上严格等价后续时间对比则直观展示了SPPF超过 2 倍的提速效果。2. 数据增强技术YOLOv5 采用多种数据增强手段提升模型泛化能力、抑制过拟合。这些技术在仓库中均有对应实现类位于 ultralytics/data/augment.py且大多可通过 ultralytics/cfg/default.yaml 中的超参数开关控制Mosaic 增强将四张训练图像拼接为一张促使检测模型更好地适应各种目标尺度与平移。对应class Mosaic支持 4 或 9 图拼接默认概率mosaic: 1.0并在训练最后close_mosaic: 10个 epoch 自动关闭以稳定收敛。Copy-Paste 增强从一张图像中复制随机区域粘贴到另一张随机图像上生成新的训练样本。对应class CopyPaste默认概率copy_paste: 0.0常用于分割任务。随机仿射变换包含随机旋转、缩放、平移与错切shear对应超参数degrees、scale、translate、shear与perspective。官方文档指出多尺度训练时输入图像在 0.51.5 倍之间随机缩放。MixUp 增强将两张图像及其标签做线性组合生成合成图像。对应class MixUp默认概率mixup: 0.0。Albumentations功能强大的图像增强库覆盖多种增强技术。仓库中对应class Albumentations可选应用模糊、中值模糊、灰度化、CLAHE 等变换。HSV 增强随机扰动图像色相、饱和度与明度。默认值为hsv_h: 0.015、hsv_s: 0.7、hsv_v: 0.4均为比例。随机水平翻转以一定概率水平镜像图像。对应class RandomFlip与默认概率fliplr: 0.5。以上默认取值均可从 ultralytics/cfg/default.yaml 的hsv_h/hsv_s/hsv_v、degrees/translate/scale/shear、flipud/fliplr、mosaic/mixup/copy_paste等字段逐一验证。这意味着你可以通过修改配置或命令行参数精确控制每种增强的开合与强度。3. 训练策略YOLOv5 应用了多项成熟的训练策略以提升模型性能多尺度训练Multiscale Training训练过程中输入图像在原始尺寸的 0.51.5 倍之间随机缩放增强尺度鲁棒性。对应配置项multi_scale: False可通过 default.yaml 开启。AutoAnchor根据自定义数据集中真实框ground truth的统计特征自动优化先验锚框prior anchor boxes使锚框与数据分布更匹配。Warmup 与余弦学习率调度Cosine LR Scheduler先以较低学习率预热warmup_epochs: 3.0再按余弦曲线调整学习率对应配置cos_lr: False。从源码看仓库同时保留了one_cycle等调度函数见 ultralytics/utils/torch_utils.py 中的one_cycle用于实现周期性学习率曲线。指数移动平均EMA对过去若干训练步的参数取平均稳定训练并降低泛化误差。仓库实现为class ModelEMA见 ultralytics/utils/torch_utils.py它维护模型全部 state_dict参数与 buffer的移动平均并通过enabled属性控制开关。混合精度训练Mixed Precision / AMP以半精度执行部分运算降低显存占用并提升计算速度。对应配置amp: True。超参数进化Hyperparameter Evolution自动搜索最优超参数组合。仓库在 ultralytics/utils/tuner.py 与 ultralytics/engine/tuner.py 中实现了完整的超参数进化逻辑。4. 损失计算与优化细节4.1 三项损失的组成YOLOv5 的总体损失由三个部分加权组合而成分类损失Classes LossBCE Loss二值交叉熵损失衡量分类任务的误差目标性损失Objectness LossBCE Loss另一个 BCE 损失衡量网格单元内是否存在目标的判定误差定位损失Location LossCIoU LossComplete IoU 损失衡量目标在网格单元内的定位误差。总体损失可表示为Loss λ₁·L_cls λ₂·L_obj λ₃·L_loc其中 λ₁、λ₂、λ₃ 为各分量的权重系数即 default.yaml 中的box: 7.5、cls: 0.5、dfl: 1.5等 loss gain。从仓库源码看FocalLossultralytics/utils/loss.py在nn.BCEWithLogitsLoss基础上加入调制因子(1 - p_t)^gamma与alpha平衡因子默认gamma1.5、alpha0.25用于缓解正负样本不均衡BboxLoss则通过bbox_iou(..., CIoUTrue)计算 CIoU 定位损失并从pred_bboxes与target_bboxes的差值得出 IoU 损失。4.2 损失平衡Balance Losses三个预测层P3小目标、P4中目标、P5大目标的目标性损失被赋予不同的平衡权重[4.0, 1.0, 0.4]使不同尺度的预测对总损失做出与其重要性相匹配的贡献L_obj 4.0·L_obj^small 1.0·L_obj^medium 0.4·L_obj^large小目标层权重最高、大目标层权重最低这一设计源于小目标在特征图上更难被准确检出需要更强的梯度信号。4.3 消除网格敏感度Eliminate Grid Sensitivity这是 YOLOv5 相对 YOLOv2/v3 的重要改进。在 YOLOv2 与 YOLOv3 中边界框坐标直接由最后一层的激活值预测b_x σ(t_x) c_x b_y σ(t_y) c_y b_w p_w · e^(t_w) b_h p_h · e^(t_h)其中 c_x、c_y 为网格偏移p_w、p_h 为先验锚框宽高。该方案存在一个严重缺陷宽高完全无界out exp(in)极易引发梯度爆炸、训练不稳定、NaN 损失甚至训练完全失败。YOLOv5 对预测公式做了修正将中心点偏移范围从 (0, 1) 调整到 (-0.5, 1.5)并把宽高缩放限制在锚框的 4 倍以内b_x (2·σ(t_x) - 0.5) c_x b_y (2·σ(t_y) - 0.5) c_y b_w p_w · (2·σ(t_w))² b_h p_h · (2·σ(t_h))²改进后的公式有两个直观收益中心点偏移更容易取到 0 或 1缩放后 σ 的输出被拉伸到 (-0.5, 1.5)目标中心贴近网格边缘时也无需输出极端 sigmoid 值降低了对梯度的要求宽高有界、梯度稳定(2·σ(·))²将宽高缩放因子限制在 [0, 4] 区间从根本上消除了exp带来的无界风险。从仓库源码的make_anchorsultralytics/utils/tal.py可以看到锚点生成时显式传入grid_cell_offset0.5即锚点默认位于每个网格单元的中心sx arange(w) 0.5这与 偏移 0.5 的坐标解码设计一脉相承dist2bbox则负责将网络输出的 ltrb 距离量解码为 xywh/xyxy 边界框。4.4 构建训练目标Build TargetsBuild Targets 是训练效率与精度的关键环节其职责是把真实框GT Box分配到输出特征图上合适的网格单元并与合适的锚框匹配。流程如下第一步计算宽高比并筛选。计算真实框尺寸与每个锚模板尺寸的比值并取其倒数中的较大者与阈值比较r_w w_gt / w_at r_h h_gt / h_at r_w^max max(r_w, 1/r_w) r_h^max max(r_h, 1/r_h) r^max max(r_w^max, r_h^max) 匹配条件 r^max anchor_t其中anchor_t为锚框匹配阈值anchor threshold。若计算出的比值在阈值内则将该真实框与对应锚框匹配。第二步锚框匹配。将匹配成功的锚框指派给合适的网格单元。第三步多锚框分配。由于中心点偏移范围从 (0, 1) 扩展到了 (-0.5, 1.5)一个真实框的中心可以同时落入或接近多个网格单元因此一个 GT Box 可以被分配给多个锚框显著提升了正样本数量与召回能力。在 YOLOv8/v10 代码库中这一锚框匹配 多目标分配的思想被演进为TaskAlignedAssignerultralytics/utils/tal.py它基于分类得分与定位质量的对齐度量task-aligned metric默认topk13、alpha1.0、beta6.0先通过select_candidates_in_gts在真实框内选择候选锚点再按对齐度量挑选 top-k 候选从而完成高质量的动态标签分配。对比阅读可以看到 YOLOv5 基于静态锚框比值的匹配规则与后续基于任务对齐的动态分配在思路上的一脉相承。经过以上步骤每个真实目标在训练时都被正确分配与匹配YOLOv5 得以高效学习目标检测任务。5. 与仓库实测的对应关系与小结综合来看YOLOv5 在实时目标检测模型的发展中迈出了重要一步动态可缩放的架构n/s/m/l/x五档、丰富的数据增强体系、多样的训练策略以及对损失计算与目标构建的关键调整共同在保持 YOLO 家族高速度特质的同时显著提升了检测精度与训练稳定性。需要说明的是本文所依据的仓库以 YOLOv10 为主体但完整保留了 YOLOv5 的模型配置yolov5.yaml与经典模块C3、SPP、SPPF等见 block.py同时将训练损失演进为基于任务对齐分配TAL与 BCE/CIoU 组合的现代方案loss.py。读者可以对照本文的公式与概念直接在仓库中定位对应实现完成从理论到代码的闭环验证。核心文件索引主题仓库路径YOLOv5 网络结构定义ultralytics/cfg/models/v5/yolov5.yamlC3 / SPP / SPPF 等基础模块ultralytics/nn/modules/block.pyDetect 检测头与锚点解码ultralytics/nn/modules/head.py损失函数BCE / CIoU / Focalultralytics/utils/loss.py数据增强Mosaic / CopyPaste / MixUp 等ultralytics/data/augment.py锚点生成与标签分配ultralytics/utils/tal.py训练默认超参数ultralytics/cfg/default.yamlEMA / 学习率调度等训练工具ultralytics/utils/torch_utils.py【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表