手把手教你YOLOv8画对比图:精度与损失指标可视化详解
手把手教你YOLOv8画对比图:精度与损失指标可视化详解
在使用YOLOv8进行目标检测任务时,绘制训练过程中的对比图是评估模型性能的重要手段。本文将详细介绍如何绘制YOLOv8的训练结果对比图,包括精度指标(precision、recall、mAP)和损失指标(box_loss、cls_loss、dfl_loss)的对比。文章提供两种绘制方法:合并画法和逐个画法,帮助读者直观地对比不同实验结果。
评价指标解释
Precision(精确率):衡量模型预测结果的准确程度,即预测正确的结果数量占总预测数量的比值。精确率越高,表示模型的预测结果越可靠。
Recall(召回率):衡量模型发现正确样本的能力,即模型预测正确的结果数量占总预测正确数量的比值。召回率越高,表示模型能捕获更多正确的样本,但可能伴随较高的误检率。
mAP(平均精度值):所有类别的平均准确率的均值,用于综合评估模型在不同类别上的检测性能。
mAP@50:将IoU(Intersection over Union)设置为0.5,计算所有类别的平均精度值。
mAP@50-95:基于不同的IoU阈值(范围从0.5到0.95,步长为0.05)来计算的平均mAP值,提供更全面的性能评估。
损失解释
Box Loss(边界框回归损失):用于衡量模型预测的边界框与真实标签之间的误差。通常采用IoU、GIoU或CIoU等指标来计算重叠程度。
Cls Loss(分类损失):用于评估模型预测物体类别的准确性。通常采用交叉熵损失或Focal Loss来计算预测类别与真实类别的误差。
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/exp1/results.csv',
'runs/train/exp2/results.csv',
'runs/train/exp3/results.csv',
]
custom_labels = [
'yolov8n-MobileNetV3',
'yolov8n',
'yolov8s',
]
这样,每条线在图中就会显示为对应的模型名称。