YOLOv5 7.0:系统架构

02 系统架构

2.1 分层架构

flowchart TB
  subgraph Entry["任务入口"]
    TR["train.py"]
    VA["val.py"]
    DE["detect.py"]
    EX["export.py"]
    SG["segment/*"]
    CL["classify/*"]
    HUB["hubconf.py"]
  end

  subgraph Model["模型层"]
    YAML["models/*.yaml"]
    YOLO["models/yolo.py"]
    COMMON["models/common.py"]
    EXP["models/experimental.py"]
  end

  subgraph Utility["基础设施"]
    DL["utils/dataloaders.py"]
    AUG["utils/augmentations.py"]
    LOSS["utils/loss.py"]
    GEN["utils/general.py"]
    MET["utils/metrics.py"]
    TU["utils/torch_utils.py"]
    LOG["utils/loggers/ + callbacks.py"]
  end

  subgraph Runtime["运行时"]
    TORCH["PyTorch / CUDA"]
    CV["OpenCV"]
    BACK["ONNX / TRT / OpenVINO / TFLite ..."]
  end

  Entry --> Model
  Entry --> Utility
  YAML --> YOLO
  YOLO --> COMMON
  EXP --> YOLO
  Utility --> TORCH
  Utility --> CV
  COMMON --> BACK

入口脚本负责组织流程;models/ 负责网络与推理运行时;utils/ 负责数据、增强、损失、指标和工程能力。

2.2 模型构建链

yolov5s.yamlyaml.safe_loadDetectionModelparse_modelnn.Sequential + save listBaseModel._forward_onceDetect(P3,P4,P5)

YAML 层定义

每层格式:

1
[from, number, module, args]
  • from:输入来自前一层或指定历史层
  • number:模块重复次数,受 depth_multiple 缩放
  • moduleConvC3SPPFConcatDetect
  • args:输出通道、卷积核、步长等构造参数

动态解析

models/yolo.py::parse_model()

  1. 合并 backbone + head
  2. 解析模块和字符串参数
  3. 按深度系数缩放重复数
  4. 按宽度系数缩放通道并对齐到 8
  5. 为每层附加 i/f/type/np
  6. 建立 save 列表,保留后续跳连所需输出

前向传播

BaseModel._forward_once() 顺序遍历 self.model。若 m.f != -1,就从历史输出 y 取跳连输入;只有 self.save 指定的中间层会被保留。

2.3 YOLOv5s 网络结构

640×640×3Conv /2Conv+C3 /4C3 P3/8C3 P4/16C3+SPPF P5/32上采样+Concat P4上采样+Concat P3Detect P3/8下采样+ConcatDetect P4/16下采样+ConcatDetect P5/32
  • Backbone:Conv + C3 + SPPF
  • Neck:FPN 自顶向下 + PAN 自底向上
  • Head:P3、P4、P5 三尺度 Anchor-based Detect

对 640 输入,三层网格约为 80×80、40×40、20×20。

2.4 训练数据流

data/*.yamlLoadImagesAndLabelsMosaic/MixUp/透视/HSV/翻转BGR→RGB, HWC→CHWmodel(imgs)ComputeLossAMP backwardoptimizer stepModelEMAval.runlast.pt / best.pt

train.py::train() 是流程控制中心。Rank 0 还负责日志、验证、保存和早停。

2.5 检测推理数据流

图片/视频/相机/流LoadImages/LoadStreamsLetterboxBGR→RGB, CHW, /255DetectMultiBackendnon_max_suppressionscale_boxes 回原图Annotator图片/视频/TXT/Crop

关键点:

  • 网络不是直接吃任意尺寸原图,而是先 Letterbox 到 stride 倍数。
  • 检测头输出在网络输入坐标系中。
  • scale_boxes 去掉 padding 并按比例映射回原图。

2.6 多后端架构

DetectMultiBackendPyTorch .ptTorchScriptONNX Runtime / OpenCV DNNTensorRTOpenVINOCoreMLSavedModel / PB / TFLite / EdgeTPUPaddleTriton Server

该类统一:

  • 模型格式识别
  • 设备与 FP16
  • NCHW/NHWC 转换
  • 元数据 stride/names
  • 输入输出转换为 Torch Tensor
  • 动态 TensorRT binding
  • 模型 warmup

2.7 训练并发模型

1
2
3
单 GPU/CPU: RANK=-1
DataParallel: 可用但源码明确不推荐
DDP: torch.distributed.run,每 GPU 一个进程

DDP 下:

  • 每个 Rank 使用分布式 sampler
  • 反向损失按 WORLD_SIZE 调整
  • 仅 Rank 0 做完整日志、验证和 checkpoint
  • 早停结果广播到所有 Rank

2.8 回调与日志

Callbacks 提供训练生命周期事件,例如:

1
2
3
4
5
6
7
on_pretrain_routine_start/end
on_train_start
on_train_epoch_start/end
on_train_batch_start/end
on_fit_epoch_end
on_model_save
on_train_end

Loggers 将对应方法注册为回调,使训练主循环不必绑定具体平台。TensorBoard、ClearML、Comet、W&B 等都通过该层接入。

文章互动

阅读 --

留言

0 条留言

正在加载留言…