手把手教你YOLOv8画对比图,支持多个实验结果可视化
创作时间:
作者:
@小白创作中心
手把手教你YOLOv8画对比图,支持多个实验结果可视化
引用
CSDN
1.
https://blog.csdn.net/weixin_44779079/article/details/142108605
本文将详细介绍如何使用Python代码绘制YOLOv8目标检测模型的训练结果对比图。通过两种不同的绘图方法,你可以直观地比较不同实验的性能指标和损失函数的变化情况。
介绍
在目标检测任务中,评估模型性能和监控训练过程是非常重要的环节。本文将介绍如何绘制YOLOv8模型的训练结果对比图,包括损失对比图、mAP(平均精度值)对比图、召回率对比图和精确率对比图。文章提供两种绘图方法:
- 合并画法:将所有指标显示在一个图形窗口中,便于直观对比。
- 逐个画法:逐个绘制每个指标的图,适合详细分析。
评价指标解释
- 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/exp/results.csv',
'runs/train/exp2/results.csv',
'runs/train/exp3/results.csv',
]
custom_labels = [
'yolov8n-MobileNetV3',
'yolov8n',
'yolov8s',
]
这样,你就可以根据自己的实验结果绘制相应的对比图了。
热门推荐
HIIT燃脂训练持续燃脂(HIIT燃脂和跳绳燃脂)
电脑升级全攻略:老旧电脑的选购与升级指南
双方谈事时可以录音录像吗?仲裁录音光盘需要几份?
奶奶的房子过户给孙子其他人有权参与么
用完护肤品皮肤痒怎么回事
熬夜影响肝功能检查结果
宝可梦:必定命中的专属招式,你可闪得过此一击
JVM四种常量池全方位细致讲解 这一篇就够了~
以案释法:债权转让未通知债务人,受让人能否直接起诉?
专家建议:以全面质量观推进乡镇寄宿制学校建设
1980年,被幽禁8年的开国中将郑维山看望徐帅,徐帅:我没脸见他
鬼谷八荒玄沧仙玉怎么获取:详细攻略与任务要点解析
黄力医生:心衰的5项自查从日常生活细节抓起
身份证可以当天办当天拿吗?家人代办流程详解
如何识别质量管理体系相关方的需求和期望?
金刚菩提的选购与养护指南
2024年宝宝出生身高体重标准表,你家宝宝达标了吗?
为什么一感冒就血压高
铂金(PT)是什么?一文读懂铂金首饰的选购与保值
印尼公司名称前面的pt是啥意思
《咒术回战》重磅情报!新宿决战篇是最终篇,芥见下下已写好结局
裸车价和落地价的区别,裸车价和落地价差多少
如何提升维修团队力量
红细胞偏低怎么回事
“物派”与“后物派”|用自然材料探索日本独特的时空观
雕塑原作材质分类
不是说八字好就命好:八字与命运的关系解析
“无宅”碰上“多宅”,分户很必要?农村分户调整,早准备多受益
10个反常识数据,窥见2024的隐秘真相
得了厌学症怎么治疗