前言
如下图是YOLOv8训练的多分类结果文件,只给出了混淆矩阵与TOP1与TOP5的准确率曲线。并没有给出最终各个类别的准确率(Accuracy)、精确率(Precision)、召回率(recall)和F1-Score等评估参数。因此我们需要额外计算每个类别的准确率(Accuracy)、精确率(Precision)、召回率(recall)和F1-Score评估参数。以及这些参数平均值
。本文的计算方式同样可以适用于其他分类模型的评估参数计算。
有了这些参数之后可以更加方便的进行不同分类模型的参数对比,或者模型改进前后的参数对比。
1.安装sklearn库
因为我们参数计算需要使用到机器学习库sklearn
,因此我们需要先安装该库,命令如下:
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
2.计算每个分类的评估参数
我的验证集目录如下,每个类别里面放置的是该类别对应的图片:
详细代码如下,其中real_labels
和pre_labels
分别代表真实标签与预测标签。
# -*- coding: utf-8 -*- from ultralytics import YOLO import matplotlib import os matplotlib.use('TkAgg') from sklearn.metrics import accuracy_score, precision_score,f1_score,recall_score from sklearn.metrics import classification_report # 验证结果 model = YOLO('runs/classify/train/weights/best.pt') # 模型标签 names = {0: 'Bacterial Blight', 1: 'Brown Streak Disease', 2: 'Green Mottle', 3: 'Healthy', 4: 'Mosaic Disease'} # 验证集路径 base_path = 'datasets/Data/val' # 将names的key与value值互换,存入dict_names中 dict_names = {v: k for k, v in names.items()} # 存储真实标签 real_labels = [] # 存储预测标签 pre_labels = [] # 遍历base_path下的所有文件夹,每个文件夹是一个分类 for i in os.listdir(base_path): label = dict_names[i] # 获取base_path下的所有文件夹下的所有图片 for j in os.listdir(os.path.join(base_path, i)): # 获取图片的路径 img_path = os.path.join(base_path, i, j) # 检测图片 res = model.predict(img_path)[0] # 图片真实标签 real_labels.append(label) # 图片预测标签 pre_labels.append(res.probs.top1) print("每个类别的精确率、召回率和F1-Score:") print(classification_report(real_labels, pre_labels, target_names=list(names.values())))
运行上述代码后,打印结果如下:
分别计算出了每个类别的准确率(Accuracy)、精确率(Precision)、召回率(recall)和F1-Score
参数,并且给出了平均参数,就是macro avg
那一行。
3. 单个平均参数计算
上面已经给出了所有的评估结果,如果我们只想单独计算的平均的准确率、精确率、F1分数和召回率
,代码如下:
# 计算并打印一系列评估指标,包括准确率、精确率、F1分数和召回率 # 参数: # real_labels: 真实标签列表,表示样本的真实类别 # pre_labels: 预测标签列表,表示模型预测的样本类别 print('单独计算的准确率、精确率、F1分数和召回率:') # 1. accuracy_score: 准确率,表示预测正确的样本占总样本的比例 print('accuracy_score:',accuracy_score(real_labels, pre_labels)) # 2. precision_score: 精确率,表示预测为正类且实际为正类的样本占预测为正类样本的比例 print('precision_score:',precision_score(real_labels, pre_labels, average='macro')) # 3. f1_score: F1分数,是精确率和召回率的调和平均值,综合评估精确度和召回率 print('f1_score:',f1_score(real_labels, pre_labels, average='macro')) # 4. recall_score: 召回率,表示预测为正类且实际为正类的样本占实际正类样本的比例 print('recall_score:',recall_score(real_labels, pre_labels, average='macro'))
运行上述代码后,打印结果如下:
计算出这些模型评估结果之后可以更加方便的进行不同分类模型的性能对比,或者模型改进前后的性能对比
。