问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

手把手教你YOLOv8画对比图:精度与损失指标可视化详解

创作时间:
作者:
@小白创作中心

手把手教你YOLOv8画对比图:精度与损失指标可视化详解

引用
CSDN
1.
https://blog.csdn.net/weixin_44779079/article/details/142108605

在使用YOLOv8进行目标检测任务时,绘制训练过程中的对比图是评估模型性能的重要手段。本文将详细介绍如何绘制YOLOv8的训练结果对比图,包括精度指标(precision、recall、mAP)和损失指标(box_loss、cls_loss、dfl_loss)的对比。文章提供两种绘制方法:合并画法和逐个画法,帮助读者直观地对比不同实验结果。

评价指标解释

  1. Precision(精确率):衡量模型预测结果的准确程度,即预测正确的结果数量占总预测数量的比值。精确率越高,表示模型的预测结果越可靠。

  2. Recall(召回率):衡量模型发现正确样本的能力,即模型预测正确的结果数量占总预测正确数量的比值。召回率越高,表示模型能捕获更多正确的样本,但可能伴随较高的误检率。

  3. mAP(平均精度值):所有类别的平均准确率的均值,用于综合评估模型在不同类别上的检测性能。

  4. mAP@50:将IoU(Intersection over Union)设置为0.5,计算所有类别的平均精度值。

  5. mAP@50-95:基于不同的IoU阈值(范围从0.5到0.95,步长为0.05)来计算的平均mAP值,提供更全面的性能评估。

损失解释

  1. Box Loss(边界框回归损失):用于衡量模型预测的边界框与真实标签之间的误差。通常采用IoU、GIoU或CIoU等指标来计算重叠程度。

  2. Cls Loss(分类损失):用于评估模型预测物体类别的准确性。通常采用交叉熵损失或Focal Loss来计算预测类别与真实类别的误差。

  3. DFL Loss(分布焦点损失):用于帮助模型对预测的边界框进行更细粒度的学习。通过离散分布的方式表示边界框的坐标,并最大化分布的正确性来优化预测。

合并画法

合并画法将所有指标绘制在一个图形窗口中,通过子图的形式展示,使对比更加直观。

import pandas as pd
import matplotlib.pyplot as plt

# 训练结果列表
results_files = [
    'runs/train/exp/results.csv',
    'runs/train/exp2/results.csv',
]

# 与results_files顺序对应
custom_labels = [
    'yolov8n-MobileNetV3',
    'yolov8n',
]

def plot_comparison(metrics, labels, custom_labels, layout=(2, 2)):
    fig, axes = plt.subplots(layout[0], layout[1], figsize=(15, 10))
    axes = axes.flatten()
    for i, (metric_key, metric_label) in enumerate(zip(metrics, labels)):
        for file_path, custom_label in zip(results_files, custom_labels):
            df = pd.read_csv(file_path)
            df.columns = df.columns.str.strip()
            if 'epoch' not in df.columns:
                print(f"'epoch' column not found in {file_path}. Available columns: {df.columns}")
                continue
            if metric_key not in df.columns:
                print(f"'{metric_key}' column not found in {file_path}. Available columns: {df.columns}")
                continue
            axes[i].plot(df['epoch'], df[metric_key], label=f'{custom_label}')
        axes[i].set_title(f' {metric_label}')
        axes[i].set_xlabel('Epochs')
        axes[i].set_ylabel(metric_label)
        axes[i].legend()
    plt.tight_layout()
    plt.show()

if __name__ == '__main__':
    metrics = [
        'metrics/precision(B)', 'metrics/recall(B)', 'metrics/mAP50(B)', 'metrics/mAP50-95(B)'
    ]
    labels = [
        'Precision', 'Recall', 'mAP@50', 'mAP@50-95'
    ]
    plot_comparison(metrics, labels, custom_labels, layout=(2, 2))

    loss_metrics = [
        'train/box_loss', 'train/cls_loss', 'train/dfl_loss', 'val/box_loss', 'val/cls_loss', 'val/dfl_loss'
    ]
    loss_labels = [
        'Train Box Loss', 'Train Class Loss', 'Train DFL Loss', 'Val Box Loss', 'Val Class Loss', 'Val DFL Loss'
    ]
    plot_comparison(loss_metrics, loss_labels, custom_labels, layout=(2, 3))

合并画法的效果图如下:

逐个画法

逐个画法将每个指标单独绘制,适合详细分析每个指标的变化趋势。

import pandas as pd
import matplotlib.pyplot as plt
import os

# 训练结果列表
results_files = [
    'runs/train/exp/results.csv',
    'runs/train/exp2/results.csv',
]

# 与results_files顺序对应
custom_labels = [
    'yolov8n-MobileNetV3',
    'yolov8n',
]

def plot_metric_comparison(metric_key, metric_label, custom_labels):
    plt.figure(figsize=(10, 6))
    for file_path, custom_label in zip(results_files, custom_labels):
        exp_name = os.path.basename(os.path.dirname(file_path))
        df = pd.read_csv(file_path)
        df.columns = df.columns.str.strip()
        if 'epoch' not in df.columns:
            print(f"'epoch' column not found in {file_path}. Available columns: {df.columns}")
            continue
        if metric_key not in df.columns:
            print(f"'{metric_key}' column not found in {file_path}. Available columns: {df.columns}")
            continue
        plt.plot(df['epoch'], df[metric_key], label=f'{custom_label}')
    plt.title(f'{metric_label} ')
    plt.xlabel('Epochs')
    plt.ylabel(metric_label)
    plt.legend()
    plt.show()

if __name__ == '__main__':
    metrics = [
        ('metrics/precision(B)', 'Precision'),
        ('metrics/recall(B)', 'Recall'),
        ('metrics/mAP50(B)', 'mAP@50'),
        ('metrics/mAP50-95(B)', 'mAP@50-95')
    ]
    for metric, label in metrics:
        plot_metric_comparison(metric, label, custom_labels)

    loss_metrics = [
        ('train/box_loss', 'Train Box Loss'),
        ('train/cls_loss', 'Train Class Loss'),
        ('train/dfl_loss', 'Train DFL Loss'),
        ('val/box_loss', 'Val Box Loss'),
        ('val/cls_loss', 'Val Class Loss'),
        ('val/dfl_loss', 'Val DFL Loss')
    ]
    for metric, label in loss_metrics:
        plot_metric_comparison(metric, label, custom_labels)

逐个画法的效果图如下(部分展示):

代码修改说明

要使用上述代码绘制自己的训练结果对比图,需要根据实际情况修改以下参数:

  1. results_files:填入训练生成的results.csv文件路径,可以添加多个实验结果进行对比。
  2. custom_labels:自定义标签,通常是对应的模型名称,用于在图中标注不同模型的曲线。

例如:

results_files = [
    'runs/train/exp1/results.csv',
    'runs/train/exp2/results.csv',
    'runs/train/exp3/results.csv',
]

custom_labels = [
    'yolov8n-MobileNetV3',
    'yolov8n',
    'yolov8s',
]

这样,每条线在图中就会显示为对应的模型名称。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号