仙桃市网站建设_网站建设公司_H5网站_seo优化
2026/3/1 22:07:18 网站建设 项目流程

YOLO26训练监控可视化:Loss曲线绘制指南

最新 YOLO26 官方版训练与推理镜像
本镜像基于YOLO26 官方代码库构建,预装了完整的深度学习开发环境,集成了训练、推理及评估所需的所有依赖,开箱即用。

在深度学习模型的训练过程中,实时监控 Loss 变化是确保模型收敛和调参优化的关键环节。YOLO26 作为新一代目标检测框架,在训练时会自动生成详细的日志信息,但默认情况下并不直接提供可视化的 Loss 曲线图。本文将手把手教你如何利用镜像中预装的matplotlibpandas等工具,从训练日志中提取数据并绘制清晰直观的 Loss 下降曲线,帮助你更高效地分析训练过程。

1. 训练日志结构解析

YOLO26 在每次训练启动后,会在runs/train/目录下创建一个以实验名称命名的子文件夹(如exp),其中包含多个关键文件:

  • results.csv:记录每一轮训练的核心指标
  • args.yaml:保存本次训练的超参数配置
  • weights/:存放训练生成的模型权重
  • train_batch*.jpg:可视化训练时的数据增强效果

我们重点关注的是results.csv文件,它以 CSV 格式存储了每个 epoch 的各项损失值和性能指标,字段包括:

列名含义
epoch当前训练轮次
train/box_loss训练阶段边界框回归损失
train/cls_loss训练阶段分类损失
train/dfl_loss训练阶段分布焦点损失
val/box_loss验证集边界框损失
val/cls_loss验证集分类损失
val/dfl_loss验证集分布焦点损失
metrics/precision精确率
metrics/recall召回率
metrics/mAP_0.5IoU=0.5 时的平均精度

这些数据是我们绘制 Loss 曲线的基础。

2. 数据读取与预处理

2.1 进入训练输出目录

首先确认你的训练已完成,并进入对应的结果目录。假设你使用的是默认设置:

cd /root/workspace/ultralytics-8.4.2/runs/train/exp

你可以通过以下命令查看results.csv是否存在及其内容:

ls -l results.csv head results.csv

2.2 使用 Pandas 加载训练结果

接下来,我们将编写一个 Python 脚本来读取并处理该文件。新建一个plot_loss.py文件:

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import os # 设置中文字体支持(可选) plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False # 检查结果文件是否存在 results_path = 'results.csv' if not os.path.exists(results_path): raise FileNotFoundError(f"未找到训练结果文件: {results.png}") # 读取CSV数据 data = pd.read_csv(results_path) # 查看前几行数据,确认格式正确 print("数据前5行预览:") print(data.head())

这段代码完成了基础的数据加载工作。pandas会自动识别列名并将每一行解析为数值型数据,方便后续绘图。

3. 绘制 Loss 曲线

3.1 设计多子图布局

为了全面展示训练过程中的各类 Loss 变化趋势,我们采用四宫格布局,分别绘制:

  1. 总体训练损失(train/loss)
  2. 分项训练损失(box, cls, dfl)
  3. 验证损失(val/loss)
  4. 模型性能指标(mAP)
# 创建画布,设置大小和分辨率 plt.figure(figsize=(16, 12), dpi=100) # 子图1: 总体训练损失 plt.subplot(2, 2, 1) plt.plot(data['epoch'], data['train/box_loss'] + data['train/cls_loss'] + data['train/dfl_loss'], label='Total Train Loss', color='#FF6B6B', linewidth=2) plt.xlabel('Epoch') plt.ylabel('Loss') plt.title('总体训练损失变化') plt.legend() plt.grid(True, alpha=0.3) # 子图2: 分项训练损失 plt.subplot(2, 2, 2) plt.plot(data['epoch'], data['train/box_loss'], label='Box Loss', color='#4ECDC4', linewidth=2) plt.plot(data['epoch'], data['train/cls_loss'], label='Cls Loss', color='#45B7D1', linewidth=2) plt.plot(data['epoch'], data['train/dfl_loss'], label='DFL Loss', color='#96CEB4', linewidth=2) plt.xlabel('Epoch') plt.ylabel('Loss') plt.title('分项训练损失对比') plt.legend() plt.grid(True, alpha=0.3)

3.2 添加验证损失与性能指标

继续完善另外两个子图:

# 子图3: 验证损失 plt.subplot(2, 2, 3) plt.plot(data['epoch'], data['val/box_loss'] + data['val/cls_loss'] + data['val/dfl_loss'], label='Total Val Loss', color='#DDA0DD', linewidth=2) plt.xlabel('Epoch') plt.ylabel('Loss') plt.title('验证集损失变化') plt.legend() plt.grid(True, alpha=0.3) # 子图4: mAP 指标变化 plt.subplot(2, 2, 4) plt.plot(data['epoch'], data['metrics/mAP_0.5'], label='mAP@0.5', color='#FFA07A', linewidth=2) plt.axhline(y=data['metrics/mAP_0.5'].max(), color='r', linestyle='--', alpha=0.7, label=f'Best mAP: {data["metrics/mAP_0.5"].max():.3f}') plt.xlabel('Epoch') plt.ylabel('mAP') plt.title('模型精度提升趋势') plt.legend() plt.grid(True, alpha=0.3) # 调整子图间距 plt.tight_layout(pad=3.0) # 保存图像 output_dir = '../plots' os.makedirs(output_dir, exist_ok=True) save_path = os.path.join(output_dir, 'loss_curves.png') plt.savefig(save_path, bbox_inches='tight', dpi=150) print(f"\n Loss 曲线已保存至: {save_path}")

4. 执行脚本并查看结果

4.1 运行绘图脚本

将上述完整代码保存为plot_loss.py,然后在终端执行:

python plot_loss.py

如果一切正常,你会看到类似以下输出:

数据前5行预览: epoch train/box_loss train/cls_loss train/dfl_loss ... lr/pg1 lr/pg2 lr/pg3 0 0.0 0.891234 0.543210 1.234567 ... 0.001 0.001 0.001 ... Loss 曲线已保存至: ../plots/loss_curves.png

4.2 查看生成的图表

生成的loss_curves.png将位于runs/plots/目录下。你可以通过 Xftp 下载该图片进行本地查看,或直接在 Jupyter Notebook 中加载显示。

典型正常的训练曲线应具备以下特征:

  • 训练损失持续下降:表明模型正在学习
  • 验证损失先降后平缓或轻微上升:说明模型逐渐收敛
  • mAP 指标稳步上升:反映检测性能不断提升
  • 无剧烈震荡:表示学习率等超参设置合理

若发现训练损失不降、验证损失远高于训练损失等情况,则可能存在过拟合、数据质量问题或超参设置不当。

5. 高级技巧与实用建议

5.1 自动化集成到训练流程

你可以在train.py结尾添加一段代码,实现训练完成后自动绘图:

# 训练结束后自动绘制Loss曲线 from pathlib import Path import subprocess def plot_after_train(): exp_dir = Path("runs/train/exp") if (exp_dir / "results.csv").exists(): print(" 正在生成训练可视化报告...") # 调用独立的绘图脚本 subprocess.run(["python", "plot_loss.py"], cwd=exp_dir) # 在 model.train() 后调用 plot_after_train()

这样每次训练结束都会自动生成最新图表,无需手动干预。

5.2 使用 Seaborn 提升视觉效果

如果你追求更专业的图表风格,可以结合seaborn进行美化:

sns.set_style("whitegrid") sns.set_palette("husl") # 示例:使用seaborn绘制带置信区间的平滑曲线 plt.figure(figsize=(10, 6)) sns.lineplot(data=data, x='epoch', y='train/box_loss', marker='o') plt.title('Seaborn美化版Loss曲线', fontsize=16) plt.show()

5.3 多实验对比分析

当你进行了多次训练实验(如不同学习率、不同模型尺寸),可以将多个results.csv文件合并比较:

# 示例:对比两个实验 df1 = pd.read_csv('runs/train/exp1/results.csv') df2 = pd.read_csv('runs/train/exp2/results.csv') plt.plot(df1['epoch'], df1['metrics/mAP_0.5'], label='Exp1 - LR=0.01') plt.plot(df2['epoch'], df2['metrics/mAP_0.5'], label='Exp2 - LR=0.001') plt.legend() plt.title('不同学习率下的mAP对比') plt.show()

这种横向对比能帮你快速选出最优方案。

6. 常见问题与解决方案

6.1 图像中文乱码

如果图表中出现方框或问号,是因为缺少中文字体支持。解决方法如下:

# 安装中文字体(Debian/Ubuntu系统) apt-get update && apt-get install -y fonts-wqy-zenhei

然后在脚本开头加入字体设置:

plt.rcParams['font.sans-serif'] = ['WenQuanYi Zen Hei', 'SimHei']

6.2 数据未归一化导致图表重叠

某些 Loss 数值差异较大,建议对 Y 轴进行对数变换或分别绘制:

# 对Y轴使用对数刻度 plt.yscale('log')

6.3 如何判断是否过拟合?

观察train/lossval/loss的差距:

  • 若训练损失持续下降而验证损失开始上升 → 过拟合
  • 解决方案:增加数据增强、启用早停(early stopping)、降低模型复杂度

YOLO26 支持patience参数来实现早停:

model.train(..., patience=50) # 连续50轮无提升则停止

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询