04 算法流水线
4.1 检测训练
入口:train.py::main() → train()
初始化阶段
- 解析超参数并保存
hyp.yaml、opt.yaml - 检查数据集 YAML
- 加载预训练 checkpoint,或按 YAML 从零创建
- 通过 state_dict 交集迁移可匹配权重
- 配置冻结层、AMP、图像尺寸
- 创建优化器、学习率调度器、EMA
- 创建训练/验证 DataLoader
- 非恢复训练时执行 AutoAnchor
Batch 阶段
1 | uint8 图片 → GPU → float → /255 |
Epoch 结束
- 更新 LR scheduler
- 使用 EMA 模型验证
- 用 P/R/mAP 组合计算 fitness
- EarlyStopping
- 保存
last.pt、best.pt、可选周期 checkpoint
checkpoint 不只是权重,还保存 epoch、best fitness、EMA、optimizer、运行参数、Git 信息和时间。
4.2 验证
入口:val.py::run()
验证脚本可独立运行,也可由 train.py 传入模型与 DataLoader。核心函数:
process_batch():按类别和 IoU 判断检测是否正确ConfusionMatrix.process_batch():构建混淆矩阵ap_per_class():计算 PR 曲线与 AP- 可选保存 TXT、JSON、混淆矩阵和样本图
COCO 数据可输出 JSON 并调用 pycocotools 做官方评估。
4.3 检测推理
入口:detect.py::run()
关键逻辑:
- URL 文件先下载,实时 URL 走流加载器
- 根据 stride 修正
imgsz - 模型 warmup
- 每帧预处理、前向、NMS
- 把网络坐标映射回
im0 - 输出 YOLO TXT、Crop、图片或视频
- 打印预处理、推理、NMS 的独立耗时
4.4 Letterbox 与坐标还原
Letterbox 不强行把原图拉伸成正方形:
1 | 原图 H×W |
优点是物体几何比例不变。缺点是预测框坐标处于「缩放+padding」后的坐标系,所以必须调用:
1 | det[:, :4] = scale_boxes(network_shape, det[:, :4], original_shape) |
4.5 NMS
utils/general.py::non_max_suppression():
- 用 Objectness 预筛选
- 计算
confidence = objectness × class_probability - 从 xywh 转为 xyxy
- 可筛类别、支持 multi-label
- 按类别偏移框,或执行 class-agnostic NMS
- 调用
torchvision.ops.nms - 限制
max_det
conf_thres 控制候选置信度,iou_thres 控制重叠框压制强度。
4.6 分割流水线
训练
segment/train.py 大体复用检测训练框架,但使用:
- 分割 DataLoader
ComputeLoss(utils/segment/loss.py)- mask/segment 标注
- 检测损失 + mask 损失
推理
1 | Segment head |
4.7 分类流水线
分类任务在 classify/:
1 | ImageFolder |
可从 YOLOv5 检测模型 backbone 构造分类模型。
4.8 导出流水线
入口:export.py::run()
每种导出器由 @try_export 包装:自动记录耗时、捕获异常并返回产物。dynamic、half、int8、opset、simplify 等参数只对相应格式生效。
4.9 PyTorch Hub 流程
hubconf.py 提供 yolov5n/s/m/l/x 和 custom:
1 | model = torch.hub.load("ultralytics/yolov5", "custom", "best.pt") |
Hub 默认用 AutoShape 包装,因此把预处理、NMS 和结果封装隐藏起来;追踪性能或排查坐标问题时,应回到 detect.py 的显式流程。
正在加载留言…