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 模型构建链
YAML 层定义
每层格式:
1 | [from, number, module, args] |
from:输入来自前一层或指定历史层number:模块重复次数,受depth_multiple缩放module:Conv、C3、SPPF、Concat、Detect等args:输出通道、卷积核、步长等构造参数
动态解析
models/yolo.py::parse_model():
- 合并
backbone + head - 解析模块和字符串参数
- 按深度系数缩放重复数
- 按宽度系数缩放通道并对齐到 8
- 为每层附加
i/f/type/np - 建立
save列表,保留后续跳连所需输出
前向传播
BaseModel._forward_once() 顺序遍历 self.model。若 m.f != -1,就从历史输出 y 取跳连输入;只有 self.save 指定的中间层会被保留。
2.3 YOLOv5s 网络结构
- Backbone:Conv + C3 + SPPF
- Neck:FPN 自顶向下 + PAN 自底向上
- Head:P3、P4、P5 三尺度 Anchor-based Detect
对 640 输入,三层网格约为 80×80、40×40、20×20。
2.4 训练数据流
train.py::train() 是流程控制中心。Rank 0 还负责日志、验证、保存和早停。
2.5 检测推理数据流
关键点:
- 网络不是直接吃任意尺寸原图,而是先 Letterbox 到 stride 倍数。
- 检测头输出在网络输入坐标系中。
scale_boxes去掉 padding 并按比例映射回原图。
2.6 多后端架构
该类统一:
- 模型格式识别
- 设备与 FP16
- NCHW/NHWC 转换
- 元数据
stride/names - 输入输出转换为 Torch Tensor
- 动态 TensorRT binding
- 模型 warmup
2.7 训练并发模型
1 | 单 GPU/CPU: RANK=-1 |
DDP 下:
- 每个 Rank 使用分布式 sampler
- 反向损失按
WORLD_SIZE调整 - 仅 Rank 0 做完整日志、验证和 checkpoint
- 早停结果广播到所有 Rank
2.8 回调与日志
Callbacks 提供训练生命周期事件,例如:
1 | on_pretrain_routine_start/end |
Loggers 将对应方法注册为回调,使训练主循环不必绑定具体平台。TensorBoard、ClearML、Comet、W&B 等都通过该层接入。
正在加载留言…