【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl

AP是在目标检测任务中,尝尝被用于评估模型预测能力的指标。那AP是什么?为什么能够充当不同模型综合对比评测的公认指标呢?

在学习下文之前,混淆矩阵和ROC可以先了解下:

  1. 【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率
  2. 【模型评估】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(正样本的分数)。

1

其中:

  1. Pn和Rn是第n个阈值处的precision和recall。对于随机预测,AP是正样本的比例;
  2. Rn和Rn-1 分别对应着横轴上的两个相邻但不相等的区间,乘以Pn,也就是求得微小区间的矩形面积,近似为曲线下的面积;
  3. 以横轴矩形面积累加,就得到了AP值。

这里可以看出,要想计算得到AP,就需要先绘制P-R曲线。绘制P-R曲线类似于绘制ROC曲线,计算AP也类似于计算AUC。他们都是综合全面的评估模型性能的一个指标。

【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl_第1张图片

二、如何简单绘制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、AP50、APs、APm、APl_第2张图片

三、计算目标检测的AP值

计算方式参考链接:mAP

【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl_第3张图片

代码我就不贴了,代码逻辑做了整理,如下:

  1. 读取gt和detect result (dr)的txt文件,重新整理成json文件进行存储

    • gt的整理成字典形式,key分别是class_name、bbox、used,分别表示类名、坐标框和是否匹配到预测框,一个图片的所有标注结果,存储在一起
    • detect result 的json是按照类别记录的,一个类存储到一起,打破了不同测试图像单独记录的边界,key分别是confidence、file_id、bbox,分别表示置信度、图片文件名和坐标框,按confidence从大到小进行排序
  2. 按类进行遍历,一个类一个类的分别计算AP,最后求均值,得到mAP

  3. 在计算一个类的AP时候,就用到了detect result 的json文件,这里记录了关于这一个类的,所以图片推理后预测的结果。

    • 遍历预测为该类的每一个预测结果,拿到图片文件名,进而找到对应的gt文件,计算该pd bbox与gt bbox中类别一致,且iou大于设定阈值的框;找到used置为true,tp idx置为1,否则fp idx置为1
    • 对已经经过置信度排序的预测目标,采用类似于直方图均衡化中依次累加的方式,依次视为正例,其他视为负例的方式,计算recall和precision
    • 根据公式计算AP
  4. 多个类,求均值,得到mAP。

下面是代码过程中,读取和临时会存在文件,作参考:

【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl_第4张图片
有个疑问:在计算目标检测的AP值时,根据设定的IOU阈值,确定了大于IOU阈值的,和不满足的。之后由置信度阈值,进一步确定预测结果中的正例和负例,进而可以得到一系列成对出现的precision和recall,这是一种计算AP的方式;

但是,在上面这个推荐的代码仓库中,采用了另一种方式:置信度阈值划分正例和负例的操作,依照先对预测的目标根据置信度从高到低进行排序,依次累加的方式,划分正例和负例。是不是出错啦?

答案是没有出错,计算目标检测的平均精度(Average Precision, AP)的方式通常有两种:

  1. 根据IOU阈值:

    • 首先根据设定的IOU阈值,将预测框与真实框进行匹配,确定哪些预测框满足IOU阈值要求(正例),哪些不满足(负例)。
    • 然后,通过设置置信度阈值,进一步确定哪些预测框被视为正例和负例。
    • 根据这些正例和负例,可以计算一系列不同置信度阈值下的精确率(Precision)和召回率(Recall)。
    • 最后计算平均精度AP。
  2. 根据置信度排序:

    • 另一种方式是将所有预测框按照置信度从高到低进行排序,然后依次累加,逐步确定正例和负例。
    • 从最高置信度开始,将当前预测框视为正例,其他预测框视为负例,计算相应的精确率和召回率。然后,移动到下一个预测框,将其视为正例,其他预测框视为负例,再次计算精确率和召回率。
    • 依此类推,直到遍历完所有预测框,可以计算一系列不同置信度阈值下的精确率(Precision)和召回率(Recall)。
    • 最后计算平均精度AP。

两种方式计算的AP值通常是等价的,因为它们都考虑了不同置信度阈值下的精确率和召回率。无论是根据IOU阈值还是置信度排序,最终得到的AP值反映了模型在不同置信度阈值下的检测性能。然而,需要注意的是,这两种方式在具体实现时可能存在一些微小的差异,例如:

  • 第一种方法得到的PR曲线可以根据曲线形状来选择最佳的置信度截断阈值。通过观察PR曲线,可以选择一个合适的置信度阈值,以平衡精确率和召回率,并使得平均精度(AP)最大化。

  • 然而,第二种方法并不是根据阈值直接提供PR曲线的(尽管这种累加截断的方式,蕴含着阈值),因为它是按照置信度排序进行计算的。它仅给出了在不同置信度阈值下的精确率和召回率,而没有明确的曲线形状。因此,无法直接从第二种方法中选择最佳的置信度截断阈值。

  • 仔细琢磨会发现,其实两种方式在这小部分的处理,究根结底还是一样的。只是一个阈值来自预先设定,比如0-1,分1000份;另一个是根据排序后,截断数据,间接的划定了阈值。相比于第一种,就循环的次数,少了很多。

若需要选择最佳置信度截断阈值,建议使用第一种方法计算PR曲线,并根据曲线形状和需求选择最佳的置信度阈值。第二种方法更适合计算AP值,但在选择阈值方面相对有限。

四、AP、mAP、APs、APm、APl、AP50等的理解

在COCO数据、voc目标检测比赛中,常常使用下面这些指标,对AP进一步细分,如下:
【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl_第5张图片
针对在目标检测中,涉及到框与框之间的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,此时的精确度也会比较的低,需要考虑这一点)

特点和优点:

  1. AP(Average Precision):

    • AP更适合用于评估分类问题中的模型性能,尤其是在存在类别不平衡或关注特定类别的情况下。
    • AP考虑了精确率和召回率之间的权衡,对于不同的阈值设定有较好的解释性,能够更好地评估模型在不同召回率水平下的性能。
    • AP是基于精确率-召回率曲线计算的,能够反映出模型对于不同阈值设定的鲁棒性。
  2. AUC(Area Under the ROC Curve):

    • AUC适用于二分类问题的性能评估,尤其在类别平衡或关注整体分类能力的情况下较为常用。
    • AUC提供了一个简洁的度量,衡量了模型在不同阈值设定下分类能力的整体排序,无需关注具体的阈值选择。
    • AUC在处理多类别问题时,可以通过对每个类别分别计算AUC并进行平均得到mAUC(mean AUC)作为综合性能指标。

缺点:

  1. AP:

    • AP在计算过程中需要使用精确率-召回率曲线,因此可能对噪声和不连续性敏感,对于类别数目较多的情况下计算量较大。
    • AP对于不同类别的样本数量不平衡问题较为敏感,可能导致某些类别的AP值不准确或不具有可比性。
  2. AUC:

    • AUC对于类别不平衡问题较为鲁棒,但对于极度不平衡的情况下可能不敏感,容易被主要类别的性能所主导。
    • AUC无法提供具体的精确率和召回率值,无法提供关于特定阈值设定下的性能信息。

综合而言:

  • AP更适合在类别不平衡、关注特定类别或需要对不同阈值进行权衡的情况下使用;
  • 而AUC适用于整体分类能力评估二分类问题的性能比较
  • 选择使用哪个指标应根据具体问题的需求和评估目标来确定。

你可能感兴趣的:(模型评估,人工智能,深度学习,机器学习,AP)