介绍
今天写一下YOLOv8画改进前后的对比结果图, 画损失对比图、mAP(平均精度值)对比图、recall(召回率)对比图,precision(精确率)对比图,代码已经写好了,大家只需复制粘贴即可运行。本文提供两种画法:
1.合并画法:精度和损失的各项指标在一个图形窗口中显示多张子图。这个画法更加紧凑和直观,可以一次性对比多个指标。
2.逐个画法:逐个绘制每个指标的图
合并画法直接上效果图:
逐个画法直接上效果图(图太多了,就不展示了):
1)评价指标解释:
1.precision(精确率):用来衡量模型的精准程度,也表示为预测正确的结果数量占总预测数量的比值;一般来说,准确率越高,表示模型的预测结果越可靠。
2.recall(召回率):模型预测正确的结果数量占总预测正确数量的比值,它衡量了模型发现正确样本的能力,召回率越高,表示模型更捕获更多正确的样本,但越高的召回率可能导致误检率的增加。
3.mAP:表示所有类别的平均准确率的均值
4.mAP@50:表示将IOU分配为0.5,并对所有类别的图像进行平均。
5.mAP@50-95:基于不同的IOU阈值(范围从 0.5 到 0.95,步长为 0.05)来计算的平均mAP值。
2)损失解释:
1.box_loss(边界框回归损失):意思是边界框是用来定位物体的矩形框,box_loss 计算模型预测的边界框与真实标签之间的误差。该损失通常采用 IoU(Intersection over Union) 或 GIoU(Generalized IoU)、CIoU 等形式,来衡量预测边界框和真实边界框的重叠程度。
2.cls_loss(分类损失):用于评估模型预测物体类别的准确性。该损失通常采用交叉熵损失(Cross-Entropy Loss)或 Focal Loss 来计算,衡量模型预测的物体类别与真实类别之间的误差。
3.dfl_loss(分布焦点损失):用于帮助模型对预测的边界框进行更细粒度的学习,DFL采用离散分布的方式来表示预测的边界框的各个坐标,并通过最大化分布的正确性来优化预测。
🎓一、合并画法
# -*- coding: utf-8 -*-
"""
@Auth : 挂科边缘
@File :plot_results.py
@IDE :PyCharm
@Motto:学习新思想,争做新青年
"""
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()
# 检查 'epoch' 列是否存在
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))
🎓二·、单独画每一张图(逐个画法)
# -*- coding: utf-8 -*-
"""
@Auth : 挂科边缘
@File :plot_results.py
@IDE :PyCharm
@Motto:学习新思想,争做新青年
"""
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()
# 检查 'epoch' 列是否存在
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文件路径,你想画几个就写几个
results_files = [
‘runs/train/exp/results.csv’,
‘runs/train/exp2/results.csv’,
‘runs/train/exp3/results.csv’,
]
custom_labels是自定义标签(通常是对应的模型名称),这个标签会在绘图时用于标注不同模型的曲线
custom_labels = [
‘yolov8n-MobileNetV3’,
‘yolov8n’,
]
如图,custom_labels就是每条线的名字,这个名字可以自己定义
总结
创作不易,喜欢帮点个赞谢谢