Train
一、整体功能概述
该脚本是 YOLOv5 目标检测模型的训练入口,实现了从数据加载、模型初始化、训练过程控制、性能评估到模型保存的完整流程,支持单卡 / 多卡训练、预训练加载、超参数进化等功能。
二、核心模块与关键逻辑
1. 命令行参数解析(__main__函数)
通过argparse定义训练所需的所有参数,主要包括:
模型相关:--weights(预训练权重路径)、--cfg(模型配置文件)
数据相关:--data(数据配置 yaml 路径)、--img-size(训练 / 测试图像尺寸)、--batch-size(批次大小)
训练控制:--epochs(训练轮次)、--resume(续训)、--nosave(仅保存最终模型)、--notest(仅测试最后一轮)
增强与优化:--multi-scale(多尺度训练)、--single-cls(单类别训练)、--adam(使用 Adam 优化器)
分布式训练:--sync-bn(同步 BN)、--local_rank(DDP 参数)
其他:--logdir(日志目录)、--evolve(超参数进化)
参数默认值可根据需求修改(如默认数据路径--data被改为..\MaskDataSet\data.yaml)。
2. 训练初始化(train函数开头)
日志与路径设置:创建日志目录(log_dir)、权重保存目录(wdir),保存超参数(hyp.yaml)和训练配置(opt.yaml)。
数据配置加载:从data.yaml读取训练集 / 测试集路径(train_path/test_path)、类别数(nc)和类别名(names),并校验数据有效性。
随机种子初始化:通过init_seeds固定随机种子,保证实验可复现。
3. 模型初始化与加载
预训练模型加载:若指定--weights(如yolov5s.pt),则加载预训练权重,通过intersect_dicts过滤不匹配的参数(如类别数不同时的输出层)。
模型创建:基于配置文件(cfg)或预训练模型的配置,创建Model类实例(YOLOv5 模型),并转移到指定设备(device)。
冻结层设置:支持冻结部分层参数(freeze列表),用于迁移学习(默认不冻结)。
4. 优化器与学习率调度器
参数分组:将模型参数分为 3 组(偏置pg2、带权重衰减的卷积权重pg1、其他参数pg0),分别设置优化策略。
优化器选择:支持 Adam(--adam)和 SGD(默认),其中 SGD 使用动量(momentum)和 Nesterov 加速。
学习率调度:采用余弦退火调度器(LambdaLR),学习率随轮次按余弦曲线衰减,公式为:lf = lambda x: ((1 + math.cos(x * math.pi / epochs)) / 2) * (1 - hyp['lrf']) + hyp['lrf']
5. 数据加载(create_dataloader)
训练集加载:调用create_dataloader创建训练数据加载器,支持数据增强(augment=True)、缓存(cache_images)、矩形训练(rect)等。
测试集加载:单独创建测试数据加载器,关闭增强(augment=False),用于评估 mAP。
标签校验:检查标签类别是否超过数据集定义的nc,避免训练错误。
6. 训练过程(核心循环)
6.1 单轮次(epoch)流程
模型训练模式:model.train()开启训练模式(启用 Dropout、BN 更新)。
图像权重采样(可选,--image-weights):根据类别权重和 mAP 动态调整图像采样概率,侧重难样本。
批次循环:遍历训练数据加载器,处理每个 batch:
数据预处理:图像归一化(/255.0)、转移到设备。
热身训练(warmup):前nw次迭代中,学习率和动量从初始值线性过渡到目标值,避免训练初期震荡。
多尺度训练(--multi-scale):随机调整输入图像尺寸(imgsz*0.5到imgsz*1.5之间,且为最大步长gs的倍数),增强模型鲁棒性。
前向传播:通过amp.autocast启用混合精度训练(加速训练,节省显存),计算预测结果pred。
损失计算:调用compute_loss计算总损失(box_loss、obj_loss、cls_loss)。
反向传播与优化:梯度累积(accumulate)后更新参数,EMA(指数移动平均)更新模型参数(使参数更稳定)。
日志打印:实时显示当前轮次、GPU 内存、损失值等信息。
6.2 轮次结束后操作
学习率更新:调用scheduler.step()更新学习率。
性能评估:每轮次(或仅最后一轮,--notest)调用test.test()计算测试集的 Precision、Recall、mAP@0.5、mAP@0.5:0.95。
结果保存:将训练指标写入results.txt,通过 TensorBoard 记录损失、学习率等曲线。
模型保存:保存当前模型(last.pt)和最优模型(best.pt,基于fitness指标,即 mAP 等的加权组合)。
7. 分布式训练支持
DDP 模式:多卡训练时,通过DistributedDataParallel(DDP)分配任务,解决数据负载不均衡问题。
SyncBatchNorm:多卡同步 BN 层统计量(--sync-bn),提升大批次训练稳定性。
进程通信:通过dist.broadcast等函数实现多进程数据同步(如图像采样索引)。
8. 其他关键功能
混合精度训练:使用torch.cuda.amp.GradScaler自动缩放梯度,在 FP16 和 FP32 间平衡精度与速度。
超参数进化(--evolve):通过突变超参数(如学习率、数据增强强度)并评估性能,筛选最优超参数组合,支持 300 代进化。
模型权重剥离:训练结束后,通过strip_optimizer移除优化器状态,减小模型文件大小。
三、核心变量与指标
hyp:超参数字典(如lr0初始学习率、momentum动量、box框损失权重等)。
fitness:模型性能评估指标,为[P, R, mAP@0.5, mAP@0.5:0.95]的加权组合,用于筛选最优模型。
mloss:当前轮次的平均损失(box、obj、cls、total)。
maps:每个类别的 mAP 值。
四、总结
该脚本实现了 YOLOv5 训练的全流程控制,通过模块化设计支持多种训练策略(如迁移学习、多尺度训练、混合精度训练),并提供分布式训练和超参数优化功能,适合目标检测任务的快速实验与部署。
更多推荐


所有评论(0)