前言
最近很多粉丝问我,自己已经训练好了一个YOLO模型,如何对使用验证集对这个训练好的模型进行结果评估呢?
本文将以YOLOv8的目标检测为例,详细介绍如何使用其对验证集进行评估,以判断模型的好坏,并对各个参数进行详细说明;同时我们也可以用改进后的模型对验证集进行评估,以对比改进后模型的性能改变以及提升的大小。
希望对大家有所帮助,如果有什么其他相关问题,欢迎评论留言,问的多的话,我就写篇文章统一解答。
1.对验证集进行评估
具体评估代码如下:
#coding: utf-8 from ultralytics import YOLO import matplotlib matplotlib.use( "TkAgg") if __name__ == '__main__': #加载训练好的模型 model = YOLO('models/best.pt') # 对验证集进行评估 metrics = model.val(data = 'datasets/SteelData/data.yaml')
其中models/best.pt
是已经训练好的yolov8模型文件,datasets/SteelData/data.yaml
是模型训练时,使用的数据集配置文件。
model.val()
可选参数说明:
运行上述代码后,打印结果如下:
打印表格参数说明:
class:代表模型检测的类别名称;
Images:代表验证集图片总数;
Instances:代表每个类别目标所标注的总数;
P:代表精确率Precision=TP / (TP+FP), 在预测是Positive所有结果中,预测正确的比重
R:召回率recall=TP / (TP+FN), 在真实值为Positive的所有结果中,预测正确的比重
mAP50:表示IOU阈值大于0.5的平均精确度(Mean Average Precision, mAP)
mAP50-95:表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP
其中第一行all对应的参数P、R、mAP59、mAP50-95表示所有类别对应参数的平均值。其他行的数值为具体类别所对应的评估参数。
运行上述代码后,同时也会在训练结果目录下生成val
目录:
val里面的具体内容文件如下:
2.评估结果说明
confusion_matrix_normalized.png和confusion_matrix.png
confusion_matrix_normalized.png和confusion_matrix.png表示各个类别对应的混淆矩阵,其中confusion_matrix_normalized.png表示归一化后的混淆矩阵,confusion_matrix.png表示各类别数值对应的混淆矩阵。
行是预测类别(y轴),列是真实类别(x轴)
混淆矩阵以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值。
TP(True Positive): 将正类预测为正类数 即正确预测,真实为0,预测也为0
FN (False Negative):将正类预测为负类 即错误预测,真实为0,预测为1
FP(False Positive):将负类预测为正类数 即错误预测, 真实为1,预测为0
TN (True Negative):将负类预测为负类数,即正确预测,真实为1,预测也为1
混淆矩阵是对分类问题预测结果的总结。使用计数值汇总正确和不正确预测的数量,并按每个类进行细分,显示了分类模型进行预测时会对哪一部分产生混淆。通过这个矩阵可以方便地看出机器是否将两个不同的类混淆了,把一个类错认成了另一个。
P_curve.png(准确率曲线)
表示准确率precision和置信度confidence的关系图,其中细线代表每个类别的精度曲线,粗线代表所有类别平均精度曲线。当判定概率超过置信度阈值时,各个类别识别的准确率。当置信度越大时,类别检测越准确,但是这样就有可能漏掉一些判定概率较低的真实样本。
意思就是,当我设置置信度为某一数值的时候,各个类别识别的准确率。可以看到,当置信度越大的时候,类别检测的越准确。这也很好理解,只有confidence很大,才被判断是某一类别。但也很好想到,这样的话,会漏检一些置信度低的类别。
R_curve.png(召回率曲线)
表示召回率recall和置信度confidence之间的关系,其中细线代表每个类别的召回率曲线,粗线代表所有类别平均召回率曲线。
recall(召回率)表示真实为positive的准确率,即正样本有多少被找出来了(召回了多少)。
当置信度越小的时候,类别检测的越全面(不容易被漏掉,但容易误判)。
PR_curve.png(PR曲线)
PR曲线表示体现精确率和召回率的关系,其中细线代表每个类别的PR曲线,粗线代表所有类别平均PR曲线。
P代表的是precision(精准率),R代表的是recall(召回率)。一般情况下,将recall设置为横坐标,precision设置为纵坐标。PR曲线下围成的面积即AP,所有类别AP平均值即mAP.因此我们希望:在准确率很高的前提下,尽可能的检测到全部的类别。因此希望我们的曲线接近(1,1),即希望PR曲线的面积尽可能接近1。
如果PR图的其中的一个曲线A完全包住另一个学习器的曲线B,则可断言A的性能优于B,当A和B发生交叉时,可以根据曲线下方的面积大小来进行比较。一般训练结果主要观察精度和召回率波动情况(波动不是很大则训练效果较好)
Precision和Recall往往是一对矛盾的性能度量指标;及一个的值越高另一个就低一点。
F1_curve.png(F1曲线)
表示是置信度confidence与F1之间的关系曲线。一般来说,置信度阈值(该样本被判定为某一类的概率阈值)较低的时候,很多置信度低的样本被认为是真,召回率高,精确率低;置信度阈值较高的时候,置信度高的样本才能被认为是真,类别检测的越准确,即精准率较大(只有confidence很大,才被判断是某一类别),所以前后两头的F1分数比较少。
F1参数是精确率P和召回率R的调和平均数。一些多分类问题的竞赛,常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数,最大为1,其中1是最好,0是最差。
val_batch0_labels与val_batch0_pred
val_batch0_labels.png表示验证集真实的标签情况示例。
val_batch0_pred.png表示模型预测出的标签图片。可以对比查看模型预测情况。
其他
有时在使用自己的算法对数据集的精度进行提高时,发现mAP50的值已高达90以上,那对我们来说改进是很难的,就需要提高mAP75或mAP95的值来验证算法的有效性。下面介绍如何直接得到mAP75或mAP95的具体数值:
mAP的计算基于不同的IoU(交并比)阈值。常见的阈值包括0.5、0.75和0.9等。mAP50指的是使用IoU阈值为0.5时的mAP,它主要衡量了模型对目标的边界定位准确性。而mAP75和mAP90则使用更严格的IoU阈值,分别为0.75和0.9。
可以通过metrics = model.val(data = 'datasets/SteelData/data.yaml')
得到的结果,查看不同mAP的具体值,代码如下: