AP是在目标检测任务中,尝尝被用于评估模型预测能力的指标。那AP是什么?为什么能够充当不同模型综合对比评测的公认指标呢?
在学习下文之前,混淆矩阵和ROC可以先了解下:
- 【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率
- 【模型评估】ROC(Receiver operating characteristic)与 AUC
一、什么是AP和P-R
average_precision_score(AP)
是一种用于评估二分类模型性能的指标,用于衡量模型在不同分类阈值下的精确性和召回率之间的权衡。
关键概念:
- 精确率(Precision):衡量模型预测为正类的样本中有多少是真正的正类样本。
- 召回率(Recall):衡量模型正确找出了多少真正的正类样本。
- 阈值(Threshold):用于分类的决策边界,决定哪些样本被预测为正类,哪些样本被预测为负类。
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值。
这里可以看出,要想计算得到AP,就需要先绘制P-R曲线
。绘制P-R曲线类似于绘制ROC曲线,计算AP也类似于计算AUC。他们都是综合全面的评估模型性能的一个指标。
二、如何简单绘制P-R曲线
还是使用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()
展示图像如下:
三、计算目标检测的AP值
计算方式参考链接: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文件,这里记录了关于这一个类的,所以图片推理后预测的结果。
- 遍历预测为该类的每一个预测结果,拿到图片文件名,进而找到对应的gt文件,计算该pd bbox与gt bbox中类别一致,且iou大于设定阈值的框;找到used置为true,tp idx置为1,否则fp idx置为1
- 对已经经过置信度排序的预测目标,采用类似于直方图均衡化中依次累加的方式,依次视为正例,其他视为负例的方式,计算recall和precision
- 根据公式计算AP
-
多个类,求均值,得到mAP。
下面是代码过程中,读取和临时会存在文件,作参考:
有个疑问:在计算目标检测的AP值时,根据设定的IOU阈值,确定了大于IOU阈值的,和不满足的。之后由置信度阈值,进一步确定预测结果中的正例和负例,进而可以得到一系列成对出现的precision和recall,这是一种计算AP的方式;
但是,在上面这个推荐的代码仓库中,采用了另一种方式:置信度阈值划分正例和负例的操作,依照先对预测的目标根据置信度从高到低进行排序,依次累加的方式,划分正例和负例。是不是出错啦?
答案是没有出错,计算目标检测的平均精度(Average Precision, AP)的方式通常有两种:
-
根据IOU阈值:
- 首先根据设定的IOU阈值,将预测框与真实框进行匹配,确定哪些预测框满足IOU阈值要求(正例),哪些不满足(负例)。
- 然后,通过设置置信度阈值,进一步确定哪些预测框被视为正例和负例。
- 根据这些正例和负例,可以计算一系列不同置信度阈值下的精确率(Precision)和召回率(Recall)。
- 最后计算平均精度AP。
-
根据置信度排序:
- 另一种方式是将所有预测框按照置信度从高到低进行排序,然后依次累加,逐步确定正例和负例。
- 从最高置信度开始,将当前预测框视为正例,其他预测框视为负例,计算相应的精确率和召回率。然后,移动到下一个预测框,将其视为正例,其他预测框视为负例,再次计算精确率和召回率。
- 依此类推,直到遍历完所有预测框,可以计算一系列不同置信度阈值下的精确率(Precision)和召回率(Recall)。
- 最后计算平均精度AP。
两种方式计算的AP值通常是等价的,因为它们都考虑了不同置信度阈值下的精确率和召回率。无论是根据IOU阈值还是置信度排序,最终得到的AP值反映了模型在不同置信度阈值下的检测性能。然而,需要注意的是,这两种方式在具体实现时可能存在一些微小的差异,例如:
-
第一种方法得到的PR曲线可以根据曲线形状来选择最佳的置信度截断阈值。通过观察PR曲线,可以选择一个合适的置信度阈值,以平衡精确率和召回率,并使得平均精度(AP)最大化。
-
然而,第二种方法并不是根据阈值直接提供PR曲线的(尽管这种累加截断的方式,蕴含着阈值),因为它是按照置信度排序进行计算的。它仅给出了在不同置信度阈值下的精确率和召回率,而没有明确的曲线形状。因此,无法直接从第二种方法中选择最佳的置信度截断阈值。
-
仔细琢磨会发现,其实两种方式在这小部分的处理,究根结底还是一样的。只是一个阈值来自预先设定,比如0-1,分1000份;另一个是根据排序后,截断数据,间接的划定了阈值。相比于第一种,就循环的次数,少了很多。
若需要选择最佳置信度截断阈值,建议使用第一种方法计算PR曲线,并根据曲线形状和需求选择最佳的置信度阈值。第二种方法更适合计算AP值,但在选择阈值方面相对有限。
四、AP、mAP、APs、APm、APl、AP50等的理解
在COCO数据、voc目标检测比赛中,常常使用下面这些指标,对AP进一步细分,如下:
针对在目标检测中,涉及到框与框之间的IOU等的考察中,推荐参考这个链接:mAP
上述的详细解释如下:
- AP (Average Precision): 平均精确率,是评估目标检测算法性能的常用指标之一。它计算了在不同的IOU下(0.5-0.95),召回率水平下的平均精确率值,用于衡量检测算法在不同阈值下的性能。
- mAP(mean AP): 它结合了不同目标类别的精确率-召回率曲线,并计算它们的平均值,从而提供了算法在整个数据集上的综合性能评估。
- AP50: 在计算AP时,通常使用IoU(Intersection over Union)来衡量预测框和真实框之间的重叠程度。AP50是指IoU阈值为50%时的平均精确率。它衡量了算法在较宽松的重叠要求下的性能。
- APs、APm、APl:是评价不同大小的目标物体的AP,可以看出模型对不同大小的目标的性能。
五、AP和AUC比较
AP和AUC都是衡量模型的整体性能的,那他们之间有什么特点和优缺点呢?
AP(Average Precision)
和AUC(Area Under the ROC Curve)
都是用于衡量模型性能的指标,但它们有一些不同的特点和优缺点。首先明确一点:
- AP 是由精确率-召回率曲线计算得到的;
- AUC 是由召回率和1-特异度曲线计算得到的;
- 召回率(敏感度)和特异度,分别只关注测试样本中的阳性数据和阴性数据,阳性和阴性样本的测试结果是独立的,互不干扰的;
- 但是精确度是衡量预测为阳性样本中,有多少是真阳性的比率;这里面就会牵扯到假阳性,阳性和阴性样本的数量,至关重要。
(在阳性和阴性样本极度不平衡的情况下,一点点的假阳性率,就会产生非常多的假阳性样本;即便敏感度为1,此时的精确度也会比较的低,需要考虑这一点)
特点和优点:
-
AP(Average Precision):
- AP更适合用于评估分类问题中的模型性能,尤其是在存在类别不平衡或关注特定类别的情况下。
- AP考虑了精确率和召回率之间的权衡,对于不同的阈值设定有较好的解释性,能够更好地评估模型在不同召回率水平下的性能。
- AP是基于精确率-召回率曲线计算的,能够反映出模型对于不同阈值设定的鲁棒性。
-
AUC(Area Under the ROC Curve):
- AUC适用于二分类问题的性能评估,尤其在类别平衡或关注整体分类能力的情况下较为常用。
- AUC提供了一个简洁的度量,衡量了模型在不同阈值设定下分类能力的整体排序,无需关注具体的阈值选择。
- AUC在处理多类别问题时,可以通过对每个类别分别计算AUC并进行平均得到mAUC(mean AUC)作为综合性能指标。
缺点:
-
AP:
- AP在计算过程中需要使用精确率-召回率曲线,因此可能对噪声和不连续性敏感,对于类别数目较多的情况下计算量较大。
- AP对于不同类别的样本数量不平衡问题较为敏感,可能导致某些类别的AP值不准确或不具有可比性。
-
AUC:
- AUC对于类别不平衡问题较为鲁棒,但对于极度不平衡的情况下可能不敏感,容易被主要类别的性能所主导。
- AUC无法提供具体的精确率和召回率值,无法提供关于特定阈值设定下的性能信息。
综合而言:
- AP更适合在类别不平衡、关注特定类别或需要对不同阈值进行权衡的情况下使用;
- 而AUC适用于整体分类能力评估和二分类问题的性能比较;
- 选择使用哪个指标应根据具体问题的需求和评估目标来确定。