5.1 KiB
Executable File
YOLO26 / Ground3D 训练流程
Overview
本文描述当前仓库里训练主干的真实流程,并额外指出 Ground3D 分支相对通用检测训练的差异。对应代码主要在:
ultralytics/engine/trainer.pyultralytics/models/yolo/detect/train.pyultralytics/data/dataset.pyultralytics/utils/loss.pytrain_mono3d.py
通用主干流程
1. Trainer 初始化
DetectionTrainer / Ground3DDetectionTrainer 最终都会先走 BaseTrainer.__init__():
get_cfg()合并默认配置与 overrides- 处理
resume - 选择 device
- 初始化随机种子
- 创建
save_dir/weights目录 - 初始化 callbacks
- 调用
get_dataset()读取数据集元信息
2. 进入训练
trainer.train() 的逻辑是:
- 多卡且非已分布式启动时:生成 DDP 命令并拉起子进程
- 否则:直接进入
_do_train()
3. _setup_train()
训练正式开始前会做这些事:
setup_model()model.to(device)set_model_attributes()attempt_compile(),若开启compile- 冻结指定层
- 检查 AMP
- DDP 包装
check_imgsz()- 若
batch < 1且支持 AutoBatch,则估计 batch size _build_train_pipeline()get_validator()- 初始化 EMA
- 可选画 label 图
- 初始化 early stopping
resume_training()
4. _build_train_pipeline()
当前代码里的真实行为是:
- 构建 train dataloader
- 构建 val dataloader
- 大多数任务用
batch_size // 4 obb例外,沿用 train batch size
- 大多数任务用
- 根据
nbs计算梯度累积步数 build_optimizer()optimizer=auto时,iterations > 10000选MuSGD,否则选AdamW
_setup_scheduler()cos_lr=True用 cosine- 否则用 linear decay
5. 主训练循环
每个 epoch 的主流程:
scheduler.step()model.train()- 若到
close_mosaic阶段,调用_close_dataloader_mosaic() - 遍历 train loader
- warmup 阶段动态调 lr / momentum / accumulate
preprocess_batch(batch)preds = model(batch["img"])loss, loss_items = model.loss(batch, preds)- 反向传播
- 满足累积步数后
optimizer_step() - 记录进度条和 callbacks
epoch 末尾会:
- 跑 validation
- 写
results.csv - early stopping 检查
- 保存
last.pt/best.pt - 到训练结束后做
final_eval()
Ground3D 分支差异
1. 模型与 loss
Ground3D 使用的是:
- model:
Ground3DDetectionModel - trainer:
Ground3DDetectionTrainer - validator:
Ground3DDetectionValidator - loss:
end2end=True时为E2EGround3DLoss- 否则为
v8Detection3DLoss
这和通用检测的 E2ELoss / v8DetectionLoss 不是一回事。
2. 数据集
Ground3D 训练不是普通 YOLODataset,而是 YOLOGround3DDataset。
它的关键特征:
- 样本来自 GT list 文件,不是直接扫图片目录
get_image_and_label()内部显式执行 ROI crop 或 virtual-camera 变换- 训练时会携带:
labels_3dcalibcamera_modedifficulty_levels- 预计算 edge GT
3. 增强
Ground3D 当前不走标准几何增强。
YOLOGround3DDataset.build_transforms() 只追加:
RandomHSVFormat
因此:
- mosaic / mixup / random perspective / random flip / letterbox 不参与 Ground3D 训练增强
close_mosaic仍然存在于 trainer 主干里,但对 Ground3D 数据集本身基本没有实际几何增强可关闭
4. 预处理
GroundDetectionTrainer.preprocess_batch() / Ground3DDetectionTrainer.preprocess_batch() 的真实行为是:
- 先把 tensor 移到 device
- 图像做
/ 256 - 若启用
multi_scale,对 batch 图像做双线性 resize
注意这里不是 / 255。
5. batch size
Ground3D 显式禁用了 AutoBatch:
Ground3DDetectionTrainer.auto_batch()直接报错- 必须手动传
--batch
6. 2D / 3D / difficulty loss 的关系
Ground3D loss 由三块组成:
- 2D detection loss
- box
- cls
- dfl
- difficulty loss
- 3D loss
其中:
camera_mode == "virtual"的样本仍参与cls- 但会被从 2D
box/dfl中 mask 掉 difficulty loss单独相加- 3D 项受
loss_3d_weight控制
所以 loss_3d_weight=0 的 warmup 阶段并不是“只训练 2D box/cls/dfl”,而是“训练 2D + difficulty,不训练 3D 项”。
7. 3D 权重调度
Ground3DDetectionTrainer.preprocess_batch() 会在每个 batch 前更新当前 loss 权重:
epoch < loss_3d_warmup_epochs:loss_3d_weight = 0- 之后在
loss_3d_ramp_epochs内线性拉升 - 最大到
loss_3d_weight_max
8. validation
Ground3D validation 在通用 2D metrics 之外,还会:
- 从
one2one头抓取preds_3d_selected/preds_edge_selected - 用
batch["calib"]的depth_scale恢复预测深度 - 计算 3D metrics
- 若
roi_metrics_only=True,可跳过 virtual-camera 样本,只统计 ROI 样本
一句话总结
当前仓库的训练主干仍然是标准 BaseTrainer -> _setup_train -> _do_train 框架,但 Ground3D 在数据集、loss、validation 和 ROI/virtual-camera 预处理上都已经是独立分支,不能再用“普通 YOLO detect 训练流”去概括。