AP是在目标检测任务中,尝尝被用于评估模型预测能力的指标。那AP是什么?为什么能够充当不同模型综合对比评测的公认指标呢?
在学习下文之前,混淆矩阵和ROC可以先了解下:
average_precision_score(AP)
是一种用于评估二分类模型性能的指标,用于衡量模型在不同分类阈值下的精确性和召回率之间的权衡。
关键概念:
precision_recall_curve
通过改变 decision threshold
(决策阈值),从 ground truth label
(被标记的真实数据标签) 和 score given by the classifier
(分类器给出的分数)计算绘制 precision-recall curve
(精确召回曲线)。
average_precision_score
是P-R曲线下的面积,函数根据 prediction scores (预测分数)计算出 average precision (AP)
(平均精度)。该值在 0 和 1 之间,并且越高越好。通过 random predictions
(随机预测), AP 是fraction of positive samples
(正样本的分数)。
其中:
Pn和Rn
是第n个阈值处的precision和recall
。对于随机预测,AP是正样本的比例;Rn和Rn-1
分别对应着横轴上的两个相邻但不相等的区间,乘以Pn
,也就是求得微小区间的矩形面积,近似为曲线下的面积;这里可以看出,要想计算得到AP,就需要先绘制P-R曲线
。绘制P-R曲线类似于绘制ROC曲线,计算AP也类似于计算AUC。他们都是综合全面的评估模型性能的一个指标。
还是使用sklearn
提供的函数,提供数据后,直接进行绘制,代码如下:
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve, average_precision_score
# Ground truth labels and predicted probabilities
y_true = [0, 1, 1, 1, 0, 1, 0, 0, 1, 1]
y_scores = [0.1, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99]
# Compute precision, recall, and thresholds
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)
# Compute average precision score
average_precision = average_precision_score(y_true, y_scores)
# Plot the PR curve
plt.plot(recall, precision, color='b', label=f'PR Curve (AP = {average_precision:.2f})')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc='lower left')
plt.grid(True)
plt.show()
计算方式参考链接:mAP
代码我就不贴了,代码逻辑做了整理,如下:
读取gt和detect result (dr)
的txt文件,重新整理成json文件进行存储
gt
的整理成字典形式,key分别是class_name、bbox、used
,分别表示类名、坐标框和是否匹配到预测框,一个图片的所有标注结果,存储在一起detect result
的json是按照类别记录的,一个类存储到一起,打破了不同测试图像单独记录的边界,key分别是confidence、file_id、bbox
,分别表示置信度、图片文件名和坐标框,按confidence从大到小进行排序按类进行遍历,一个类一个类的分别计算AP,最后求均值,得到mAP
在计算一个类的AP时候,就用到了detect result 的json文件,这里记录了关于这一个类的,所以图片推理后预测的结果。
多个类,求均值,得到mAP。
下面是代码过程中,读取和临时会存在文件,作参考:
有个疑问:在计算目标检测的AP值时,根据设定的IOU阈值,确定了大于IOU阈值的,和不满足的。之后由置信度阈值,进一步确定预测结果中的正例和负例,进而可以得到一系列成对出现的precision和recall,这是一种计算AP的方式;
但是,在上面这个推荐的代码仓库中,采用了另一种方式:置信度阈值划分正例和负例的操作,依照先对预测的目标根据置信度从高到低进行排序,依次累加的方式,划分正例和负例。是不是出错啦?
答案是没有出错,计算目标检测的平均精度(Average Precision, AP)的方式通常有两种:
根据IOU阈值:
根据置信度排序:
两种方式计算的AP值通常是等价的,因为它们都考虑了不同置信度阈值下的精确率和召回率。无论是根据IOU阈值还是置信度排序,最终得到的AP值反映了模型在不同置信度阈值下的检测性能。然而,需要注意的是,这两种方式在具体实现时可能存在一些微小的差异,例如:
第一种方法得到的PR曲线可以根据曲线形状来选择最佳的置信度截断阈值。通过观察PR曲线,可以选择一个合适的置信度阈值,以平衡精确率和召回率,并使得平均精度(AP)最大化。
然而,第二种方法并不是根据阈值直接提供PR曲线的(尽管这种累加截断的方式,蕴含着阈值),因为它是按照置信度排序进行计算的。它仅给出了在不同置信度阈值下的精确率和召回率,而没有明确的曲线形状。因此,无法直接从第二种方法中选择最佳的置信度截断阈值。
仔细琢磨会发现,其实两种方式在这小部分的处理,究根结底还是一样的。只是一个阈值来自预先设定,比如0-1,分1000份;另一个是根据排序后,截断数据,间接的划定了阈值。相比于第一种,就循环的次数,少了很多。
若需要选择最佳置信度截断阈值,建议使用第一种方法计算PR曲线,并根据曲线形状和需求选择最佳的置信度阈值。第二种方法更适合计算AP值,但在选择阈值方面相对有限。
在COCO数据、voc目标检测比赛中,常常使用下面这些指标,对AP进一步细分,如下:
针对在目标检测中,涉及到框与框之间的IOU等的考察中,推荐参考这个链接:mAP
上述的详细解释如下:
AP和AUC都是衡量模型的整体性能的,那他们之间有什么特点和优缺点呢?
AP(Average Precision)
和AUC(Area Under the ROC Curve)
都是用于衡量模型性能的指标,但它们有一些不同的特点和优缺点。首先明确一点:
(在阳性和阴性样本极度不平衡的情况下,一点点的假阳性率,就会产生非常多的假阳性样本;即便敏感度为1,此时的精确度也会比较的低,需要考虑这一点)
特点和优点:
AP(Average Precision):
AUC(Area Under the ROC Curve):
缺点:
AP:
AUC:
综合而言: