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

手把手教你YOLOv8画对比图,支持多个实验结果可视化

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

手把手教你YOLOv8画对比图,支持多个实验结果可视化

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

本文将详细介绍如何使用Python代码绘制YOLOv8目标检测模型的训练结果对比图。通过两种不同的绘图方法,你可以直观地比较不同实验的性能指标和损失函数的变化情况。

介绍

在目标检测任务中,评估模型性能和监控训练过程是非常重要的环节。本文将介绍如何绘制YOLOv8模型的训练结果对比图,包括损失对比图、mAP(平均精度值)对比图、召回率对比图和精确率对比图。文章提供两种绘图方法:

  1. 合并画法:将所有指标显示在一个图形窗口中,便于直观对比。
  2. 逐个画法:逐个绘制每个指标的图,适合详细分析。

评价指标解释

  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)

效果图

代码需要修改的地方

在使用上述代码时,需要根据实际情况修改以下参数:

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

例如:

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

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

这样,你就可以根据自己的实验结果绘制相应的对比图了。

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