yolo模型微调训练
一、训练脚本
from ultralytics import YOLO def main(): model = YOLO("yolo26n.pt") model.train( data="E:/vision_code/yolo_wt/data/data.yaml", imgsz=640, epochs=100, batch=15, device=0, workers=0, save_period=10 ) if __name__ == "__main__": main()二、训练参数含义
| 参数 | 示例 | 含义 | 建议 |
|---|---|---|---|
model | yolo26n.pt | 训练基座模型 | 310B 部署优先n或s |
data | data.yaml | 数据集配置文件 | 指向 Roboflow 导出的data.yaml |
epochs | 100 | 训练轮数 | 先用50-100 |
batch | 4 | 每批训练图片数量 | 4GB 显存建议2-4 |
imgsz | 640 | 输入图片尺寸 | 通用用640 |
device | 0 | 训练设备 | GPU 用0,CPU 用cpu |
workers | 0 | 数据加载线程数 | Windows 建议0 |
optimizer | auto | 优化器 | 新手用auto |
lr0 | 0.001 | 初始学习率 | 微调可用0.001,也可默认 |
patience | 30 | 早停等待轮数 | 20-50 |
save | True | 是否保存训练结果 | 默认保存 |
save_period | 10 | 每隔多少轮保存一次权重 | 想保留中间模型用10 |
project | runs/detect | 训练结果保存目录 | 可自定义 |
name | helmet_yolo26n | 本次训练名称 | 方便区分实验 |
exist_ok | True | 是否允许覆盖同名目录 | 不想覆盖就用False |
pretrained | True | 是否加载预训练权重 | 微调建议True |
resume | False | 是否从中断处继续训练 | 中断后可用True |
amp | True | 自动混合精度训练 | GPU 训练建议开启 |
cache | False | 是否缓存图片到内存/磁盘 | 内存够可用disk |
seed | 0 | 随机种子 | 复现实验用 |
verbose | True | 是否输出详细日志 | 默认即可 |
三、输出参数含义
| 字段 | 含义 | 怎么看 |
|---|---|---|
GPU_mem | 当前训练占用的 GPU 显存 | 越低越省显存 |
box_loss | 框的位置损失,越低说明预测框越接近真实框 | 越低越好 |
cls_loss | 类别损失,越低说明分类越准 | 越低越好 |
dfl_loss | 边框分布损失,辅助定位,越低越好 | 越低越好 |
Instances | 当前 batch 中目标框数量 | 表示这一批图片里有几个标注目标 |
Size | 输入图片尺寸 | 你设置的是640 |
71/137 | 当前 epoch 内 batch 进度 | 共 137 个 batch,当前第 71 个 |
4.1it/s | 每秒处理多少个 batch | 越高训练越快 |
20.1s<16.0s | 已用时间/预计剩余时间 | 进度条时间信息 |
四、TensorBoard 查看 YOLO 训练过程
1. 安装 TensorBoard
pip install -U tensorboard确认能启动:
tensorboard --version2. 开启 Ultralytics 的 TensorBoard 日志
查看当前设置:
yolo settings如果看到:
tensorboard: False执行:
yolo settings tensorboard=True再次确认:
yolo settings确保是:
tensorboard: True3. 开始训练
命令行训练示例:
yolo detect train model=yolo26n.pt data=E:/vision_code/yolo_wt/data/data.yaml imgsz=640 epochs=50 batch=4 device=0 workers=0 project=E:/vision_code/yolo_wt/train_wt/runs name=helmet_yolo26nPython 脚本训练示例:
from ultralytics import YOLO def main(): model = YOLO("yolo26n.pt") model.train( data="E:/vision_code/yolo_wt/data/data.yaml", imgsz=640, epochs=50, batch=4, device=0, workers=0, project="E:/vision_code/yolo_wt/train_wt/runs", name="helmet_yolo26n", plots=True, ) if __name__ == "__main__": main()4. 确认是否生成 TensorBoard 日志
训练开始后或训练结束后,执行:
Get-ChildItem -Recurse E:\vision_code\yolo_wt\train_wt\runs -Filter "events.out.tfevents*"如果能看到类似:
events.out.tfevents.171xxxx说明 TensorBoard 日志生成成功。
5. 启动 TensorBoard
推荐指向总的runs目录:
tensorboard --logdir E:\vision_code\yolo_wt\train_wt\runs如果只想看某一次训练:
tensorboard --logdir E:\vision_code\yolo_wt\train_wt\runs\helmet_yolo26n浏览器打开:
http://localhost:60066. 在 TensorBoard 里看什么
主要看Scalars页面:
| 曲线 | 含义 | 趋势 |
|---|---|---|
train/box_loss | 训练集框回归损失 | 越低越好 |
train/cls_loss | 训练集分类损失 | 越低越好 |
train/dfl_loss | 框定位细节损失 | 越低越好 |
val/box_loss | 验证集框损失 | 越低越好 |
val/cls_loss | 验证集分类损失 | 越低越好 |
metrics/precision | 准确率,误检少不少 | 越高越好 |
metrics/recall | 召回率,漏检少不少 | 越高越好 |
metrics/mAP50 | 宽松检测精度 | 越高越好 |
metrics/mAP50-95 | 严格综合检测精度 | 越高越好 |
五、相关结果图片说明
1.不同置信度阈值下,模型的综合检测效果怎么样。
F1 分数,它综合了:
Precision:预测出来的框有多少是真的,误检少不少
Recall:真实目标有没有都找出来,漏检少不
all classes 0.80 at 0.393:
当置信度阈值大约设为 0.393 时,F1 最高,大约是 0.80
2.Precision-Confidence Curve,意思是:不同置信度阈值下,模型预测结果的“准确率”变化。
横轴:Confidence,置信度阈值。阈值越高,模型越严格,只保留更有把握的框。
纵轴:Precision,精确率,可以理解为:模型预测出来的 helmet 里面,有多少是真的 helmet
all classes 1.00 at 0.987,当置信度阈值设到 0.987 左右时,Precision 可以达到 1.00
3.Precision-Recall Curve,简称PR 曲线,用来看模型在“少误检”和“少漏检”之间的整体表现。
横轴:Recall,召回率,表示真实的安全帽里,模型找出来了多少。
Recall 高 = 漏检少
纵轴:Precision,精确率,表示模型预测出来的安全帽里,有多少是真的安全帽。
Precision 高 = 误检少
all classes 0.838 mAP@0.5,意思是:这个模型在 IoU=0.5 标准下,mAP 是 0.838
IoU 是预测框和真实标注框的重叠比例
mAP=0.838 是整体检测得分
判断模型整体好不好,看的是整条 PR 曲线和 mAP
4.Recall-Confidence Curve,意思是:不同置信度阈值下,模型的召回率怎么变化。
横轴:Confidence,置信度阈值。阈值越高,模型越严格,只保留更有把握的检测框。
纵轴:Recall,召回率,表示真实存在的安全帽里,模型找出来了多少。
Recall 高 = 漏检少,Recall 低 = 漏检多
all classes 0.95 at 0.000,意思是:当 conf 接近 0 时,Recall 最高,大约 0.95,也就是在非常宽松的情况下,模型最多能找出约 95% 的真实安全帽。
5.混淆矩阵 Confusion Matrix,用来看模型“预测对了多少、漏检多少、误检多少”。
横轴 True:真实类别
纵轴 Predicted:模型预测类别
正确检测:191 个
漏检:28 个
误检:72 个
6.归一化混淆矩阵 Confusion Matrix Normalized。上图同一个意思,只是把数量换成了比例。
六、分布式训练
支持单机多卡, 多机单卡
