MAP理解和计算

背景

在二分类中,常常使用Precision, Recall, ROC 曲线,AUC来评价一个模型的性能,然而这些指标很难对多分类模型进行准确的评价,详见 http://sfau.lt/b5bhMsv
那么在多分类中,我们该怎么评价一个模型对于所有的类别的性能哪,如何才能保证每一个类别都被同等的重视,而不失偏颇,这就是MAP(Mean Average Precision)要做的事情。
MAP,即Mean Average Precision,从名字上看,它是Average Precision(AP)的平均值,那么我们首先来计算AP

MAP的计算

回顾Precision的计算

对于一个二分类问题,对于分类结果,我们根据Groundtruth和Predicted来讲结果分为TP(True Postive), FP(False Postive), TN(True Negative), FN(False Negative)
那么Precision 和 Recall的计算方式如下:
$$Precision=TP/(TP + FP)$$
$$Recall=TP/(TP + FN)$$

计算AP

什么是AP?

AP是指的在所有Recall的可能取值情况下,得到的所有的Precision的平均值。即假设某一类的GroundTruth中有100个正样本,那么根据分类阈值的划分,Recall将会有100个取值,即[0.01, 0.02, … 1.0], 我们可以使用$$[R_{0.01}, R_{0.02}, … ,R_{1.0}]$$,对应于Precision, 则有$$[P_{0.01}, P_{0.02}, …, P_{1.0}]$$,那么$$AP = \sum_{\alpha=0.01}^{1.0}{P_\alpha}$$
以Recall为横轴,Precision为纵轴画出来一条曲线,即PR曲线,
《MAP理解和计算》

我们可以看到该曲线是单调递减的,随着Recall逐渐增大,Precision逐渐减小。
详细计算过程如下:

  1. 对于任意一个二分类的分类结果,我们对其分类结果将依照分类得分进行从大到小的排序,此时,我们可以取当TP=1时,TP=2时,计算响应的FP,FN,然后计算Precision;
  2. 然后对于所有类别我们都可以按照上面这样计算,可以得到所有类别的AP;
  3. 再将所有类别的AP求均值,那么得到的就是MAP;

AP衡量的是我们训练得到的模型在每个类别上的好坏,MAP衡量的是该模型在所有类别上的好坏,
得到AP后,MAP的计算就变得很简单了,就是取所有AP的平均值。

其实AP可以看由(R,P)点组成的P-R曲线下的面积,即
$$AP = \int_{0}^{1}PdR $$
但是有一个细节很重要,因为我们实际计算AP的时候,并不严格的是P-R曲线下面的面积,因为我们通常会对P-R曲线做修正,将P修正为当R>R_0时(R_0为该点对应的R),最大的P值,即:
$$AP = \int_{0}^{1}max(\{P(r)|r >= R\})dR $$
如下图所示:其中蓝色的曲线为原始的P-R曲线,橙色为修正之后的P-R曲线。
《MAP理解和计算》

MAP 的应用

信息检索中的应用

在信息检索中,给定一个query,返回N个answer,假设N个answer中有M个是正相关的,那么可以计算Recall=1/M, Recall=2/M,…,Recall=1时所对应的Precision, 将这些Precision进行平均,那么就得到的对于这一个特定的query的AP,那么多个query的AP的均值,就是MAP

目标检测中的应用

在计算机视觉(CV)中,评价一个目标检测系统的性能常常使用MAP,例如在PASCAL VOC 竞赛, MS COCO竞赛中,都是使用MAP来衡量模型的性能。
在目标检测中预测得到的bbox往往数目是不固定的,但是Groundtruth bbox是固定的,那么什么是TP, 什么是FP, 什么是FN哪?
对于预测的所有框,记为DTs(Detection Target), 每一个DT包含它的位置坐标和分类得分,我们按照上面所述的,对DTs按照分类得分由大到小进行排序,为了表示方便,仍旧记为DTs, 对于真实的Ground Truth, 我们记为GTs, 按照顺序,对于DTs中的每一个DT,都计算它和GTs的IOU值,如果最大的IOU值大于阈值,那么就认为检测成功,算作TP,并且最大IOU值的GT被认为是匹配成功,需要将其从GTs中移除;如果该最大的IOU值小于阈值,那么就意味着该DT与所有的GTs都匹配失败,是一个误检,自然就算作FP了;会出现多个检测结果DT同一个GT相匹配,那么分数最高(不是IOU值最高,而是该DT的分类得分)的被认为是TP,其余的检测结果被认为是FP,那么遍历完所有的DTs, 我们就知道哪些是TP,哪些是FP,而此时,如果GTs中仍然还有剩下的(因为匹配上的都被移走了)被认为是FN。
下面是一个简单但是低效的代码来表明TP, FP, FN 是怎么计算的

def get_TP_FP_FN(dts, gts, thresh):
    # dts: [x1, y1, x2, y2, score]的数组
    # gts: [x1, y1, x2, y2]
    # thresh: iou 阈值
    TPS = []
    FPS = []
    FNS = []
    dts = sorted(dts, lambda x: x[-1], reverse=True)
    while dts.shape[0] > 0:
        values = iou(dts[0], gts)  # iou计算一个bbox和N个bboxes的iou值
        if max(values) > thresh:
            TPS.append(dts[0])
            gts.remove(gts[np.argmax(values)])
        else:
            FPS.append(dts[0])

        dts = dts[1:]

    FNS = gts
    return TPS, FPS, FNS

在目标检测的论文中,我们常常看到mAP@0.5, mAP@0.75,那么这些符号表示什么意思哪?
以mAP@0.5为例,假设在COCO数据集(一共需要检测80类目标),mAP@0.5表示在阈值0.5的时候,所有类(即80个类)的AP,然后再将其平均之后,就是mAP@0.5
有的时候,会看到mmAP,那它又是表示什么哪?
mmAP表示在所有阈值情况下的mAP的均值,即[mAP@0.5, mAP@0.6, mAP@0.7, …, mAP@0.9]的均值。

参考

  1. https://zhuanlan.zhihu.com/p/…
  2. https://zhuanlan.zhihu.com/p/…
    原文作者:wangwang
    原文地址: https://segmentfault.com/a/1190000020110427
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞