YOLOv5 7.0:算法流水线

04 算法流水线

4.1 检测训练

入口:train.py::main()train()

parse_optcheck_dataset加载权重/按 YAML 创建模型可选冻结层创建 train/val DataLoaderAutoAnchorEpoch/Batch 循环forwardComputeLossAMP backward + 梯度裁剪梯度累积 + optimizer.stepModelEMAval.runlast.pt / best.pt / EarlyStopping

初始化阶段

  1. 解析超参数并保存 hyp.yamlopt.yaml
  2. 检查数据集 YAML
  3. 加载预训练 checkpoint,或按 YAML 从零创建
  4. 通过 state_dict 交集迁移可匹配权重
  5. 配置冻结层、AMP、图像尺寸
  6. 创建优化器、学习率调度器、EMA
  7. 创建训练/验证 DataLoader
  8. 非恢复训练时执行 AutoAnchor

Batch 阶段

1
2
3
4
5
6
7
8
9
10
uint8 图片 → GPU → float → /255
→ Warmup 学习率和 momentum
→ 可选 Multi-scale
→ model(imgs)
→ ComputeLoss(pred, targets)
→ GradScaler.backward()
→ 累积到 nominal batch size 64
→ unscale + clip_grad_norm_(10)
→ optimizer.step()
→ EMA.update()

Epoch 结束

  • 更新 LR scheduler
  • 使用 EMA 模型验证
  • 用 P/R/mAP 组合计算 fitness
  • EarlyStopping
  • 保存 last.ptbest.pt、可选周期 checkpoint

checkpoint 不只是权重,还保存 epoch、best fitness、EMA、optimizer、运行参数、Git 信息和时间。

4.2 验证

入口:val.py::run()

加载 DetectMultiBackend 或接收训练模型create_dataloaderforwardNMSscale_boxes与 GT 按 IoU 0.50:0.95 匹配ap_per_classP / R / mAP50 / mAP50-95

验证脚本可独立运行,也可由 train.py 传入模型与 DataLoader。核心函数:

  • process_batch():按类别和 IoU 判断检测是否正确
  • ConfusionMatrix.process_batch():构建混淆矩阵
  • ap_per_class():计算 PR 曲线与 AP
  • 可选保存 TXT、JSON、混淆矩阵和样本图

COCO 数据可输出 JSON 并调用 pycocotools 做官方评估。

4.3 检测推理

入口:detect.py::run()

source判断图片/视频/流/屏幕LoadImages / LoadStreams / LoadScreenshotsLetterbox + RGB CHW + /255DetectMultiBackend.forwardNMSscale_boxes 回原图绘制框/标签/裁剪图片/MP4/TXT

关键逻辑:

  1. URL 文件先下载,实时 URL 走流加载器
  2. 根据 stride 修正 imgsz
  3. 模型 warmup
  4. 每帧预处理、前向、NMS
  5. 把网络坐标映射回 im0
  6. 输出 YOLO TXT、Crop、图片或视频
  7. 打印预处理、推理、NMS 的独立耗时

4.4 Letterbox 与坐标还原

Letterbox 不强行把原图拉伸成正方形:

1
2
3
4
原图 H×W
→ 按比例缩放
→ 两边填 114
→ 输出尺寸对齐 stride

优点是物体几何比例不变。缺点是预测框坐标处于「缩放+padding」后的坐标系,所以必须调用:

1
det[:, :4] = scale_boxes(network_shape, det[:, :4], original_shape)

4.5 NMS

utils/general.py::non_max_suppression()

  1. 用 Objectness 预筛选
  2. 计算 confidence = objectness × class_probability
  3. 从 xywh 转为 xyxy
  4. 可筛类别、支持 multi-label
  5. 按类别偏移框,或执行 class-agnostic NMS
  6. 调用 torchvision.ops.nms
  7. 限制 max_det

conf_thres 控制候选置信度,iou_thres 控制重叠框压制强度。

4.6 分割流水线

训练

segment/train.py 大体复用检测训练框架,但使用:

  • 分割 DataLoader
  • ComputeLossutils/segment/loss.py
  • mask/segment 标注
  • 检测损失 + mask 损失

推理

1
2
3
4
5
6
Segment head
→ 检测预测 + prototype masks
→ NMS
→ 候选 mask 系数 × prototype
→ 上采样/裁框
→ 绘制实例 mask 和 box

4.7 分类流水线

分类任务在 classify/

1
2
3
4
5
ImageFolder
→ 分类增强
→ ClassificationModel
→ CrossEntropy
→ top-1 / top-5

可从 YOLOv5 检测模型 backbone 构造分类模型。

4.8 导出流水线

入口:export.py::run()

.pt checkpointattempt_load + fuse构造假输入并前向TorchScriptONNXOpenVINOTensorRTCoreMLSavedModelGraphDefTFLiteEdge TPUPaddle

每种导出器由 @try_export 包装:自动记录耗时、捕获异常并返回产物。dynamichalfint8opsetsimplify 等参数只对相应格式生效。

4.9 PyTorch Hub 流程

hubconf.py 提供 yolov5n/s/m/l/xcustom

1
2
model = torch.hub.load("ultralytics/yolov5", "custom", "best.pt")
results = model(images)

Hub 默认用 AutoShape 包装,因此把预处理、NMS 和结果封装隐藏起来;追踪性能或排查坐标问题时,应回到 detect.py 的显式流程。

文章互动

阅读 --

留言

0 条留言

正在加载留言…