小白填坑系列(3) TP/FP/TN/FN、accuracy/precision/recall、IOU、mAP

0. 前言

  • 引入
    • 在目标检测中,mAP是常用的性能指标,但一直没有完全搞清楚。
    • 好像对于不同的数据集/任务,使用的mAP也有不同,比如Pascal VOC和COCO的就有所不同。
    • 在计算mAP的过程中会用到IOU,而IOU的计算又与TP/FP/TN/FN有关联。
    • 之前一直对 accuracy, recall, precision 没有完全透彻的搞明白。

1. TP/FP/TN/FN 与 accuracy/precision/recall

1.1. TP/FP/TN/FN

  • 混淆矩阵中的四个分量,对应下面图片。
    • True Positive, TP;False Positive, FP;True Negative, TN;False Negative, FN
    • Positive/Negative用来表示预测的结果,预测是1则就是Positive,预测是0则表示Negative。
    • True/False 用来表示预测结果是否正确,正确则为True,错误则为False。
  • image_1dr7g4lgdu9fr8a1dt216081v329.png-26.6kB

1.2. accuracy/precision/recall

  • 机器学习常用的几个性能指标。
  • accuracy,准确率,是预测正确的样本数除以所有样本数,即 $accuracy = \frac{TP+TN}{TP + FP + TN + FN}$
  • recall:
    • 召回率,在所有正样本中,预测为正的样本概率,即 $recall = \frac{TP}{TP+FN}$
    • 理解:recall越高,所有真实正样本中被预测为正样本的概率越高,即“宁可错杀一万不可放过一个”。
    • 场景:如果正样本没有被预测出来则会导致很坏结果,如判断病人有没有生病,导弹预测。
    • 召回 两字的理解:在所有正样本中,召回(预测)了多少正样本。
  • precision:
    • 即精确率,所有预测为为正的杨根本中,真正属于正样本的概率,即 $precision = \frac{TP}{TP + FP}$
    • precision越高,则所有预测为正的样本中的确为正样本的概率越高,
    • 场景:如果预测为正的样本中存在负样本会导致很坏的结果,如嫌犯定罪。
  • 下面图片帮助理解:
    • image_1dr7iqk6kkl51ght10b035g1dpnm.png-141.6kB
  • recall/precision 属于鱼和熊掌,不可兼得。

2. IOU

  • 参考资料:目标检测番外篇(1)_IoU
  • 基本理解:上面的参考文献中给出了配图
    • image_1dr7l5vqj8qqlvuj6u1kso1ln213.png-22.1kB
  • 实现思路:
    • 一般输入是两个bbox的信息,即两组 xmin, ymin, xmax, ymax
    • IOU实现的重点就是两个bbox的面积
      • 计算IOU就是要计算两个bbox的的面积。
      • bbox的面积,其实就是两个bbox的面积减去bbox的面积。
      • 所以,难点就是计算两个bbox的
    • 需要考虑的情况有很多:
      • 两个bbox没有相交部分。
      • 一个bbox在另一个bbox中。
      • 其他普通情况
  • 下面代码来自上面的参考文献,很清楚了,就不多说了。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    def get_IoU(pred_bbox, gt_bbox):
    """
    return iou score between pred / gt bboxes
    :param pred_bbox: predict bbox coordinate
    :param gt_bbox: ground truth bbox coordinate
    :return: iou score
    """

    # bbox should be valid, actually we should add more judgements, just ignore here...
    assert ((abs(pred_bbox[2] - pred_bbox[0]) > 0) and
    (abs(pred_bbox[3] - pred_bbox[1]) > 0))
    assert ((abs(gt_bbox[2] - gt_bbox[0]) > 0) and
    (abs(gt_bbox[3] - gt_bbox[1]) > 0))

    # 计算 交 的面积
    ixmin = max(pred_bbox[0], gt_bbox[0])
    iymin = max(pred_bbox[1], gt_bbox[1])
    ixmax = min(pred_bbox[2], gt_bbox[2])
    iymax = min(pred_bbox[3], gt_bbox[3])
    iw = np.maximum(ixmax - ixmin + 1., 0.)
    ih = np.maximum(iymax - iymin + 1., 0.)
    inters = iw * ih

    # 计算 并 的面积,即 S1 + S2 - inters
    uni = ((pred_bbox[2] - pred_bbox[0] + 1.) * (pred_bbox[3] - pred_bbox[1] + 1.) +
    (gt_bbox[2] - gt_bbox[0] + 1.) * (gt_bbox[3] - gt_bbox[1] + 1.) -
    inters)

    # 获得iou
    overlaps = inters / uni

    return overlaps

3. mAP

3.1. 基本思路

  • mAP的计算会用到precision/recall以及IOU。
  • 计算precision/recall:
    • 检测结束后,每张图获取若干最终结果pred bboxes。
    • 每张图片本身有gt bboxes。
    • 依次计算每张图片、每类物体的 pred bboxes 与 gt bboxes 之间的IOU。
    • IOU大于一定阈值(如0.5)且对应gt bbox未与其他pred bbox对应的记作TP。
    • IOU小于阈值,或IOU大于阈值但gt bbox与其他pred bbox,对应则记为FP。
    • 没有对应pred bbox 的 gt bbox 被看过只FN。
    • 统计数据集中所有图片的TP/FP/FN,,就可以计算 precision 和 recall。
    • 另外,检测结果(即 pred bboxes)的确认,是通过置信度大小来设置的,即可以通过置信度来控制预测bbox的Positive/Negative。
  • mAP,其实就是 mean AP,即对每一类物体计算AP,然后再求所有类的平均。
    • AP,就是 average precision,就是在若干固定recall的情况下计算precision,然后求precision的平均数。
  • 总结一下相关概念:
    • mAP:mean average precision
    • AP: average precision,PR曲线下的面积
    • Presicion = TP / (TP + FP)
    • Recall = TP/ (TP + FN)
    • TP: IOU 大于阈值的bbox数量(每个gt bbox只有一个对应的 pred bbox)
    • FP: IOU 小于阈值或同意gt bbox多余的bbox的数量。
    • FN:没有检测到的gt bbox数量。

3.2. 实例

  • 下面的例子来自 这里,不了解原始出处。
  • 对于一次物体检测任务,得到以下结果:
    • 绿色的是gt bboxes,红色的是pred bboxes。
    • image_1dr7pfr2fqt8devfbf57if721g.png-211.7kB
  • 对于所有pred bboxes,根据置信度排序(confidences)得到以下表格
    • Confidences 表示置信度,TP 表示该 pred bbox 是否与某个gt bbox对应,即IOU是否大于阈值。
    • Acc TP 表示累计 TP数量,Acc FP表示累计FP数量。
    • Precision与Recall分别代表当前点的累计准确率与召回率,可以看做是置信度阈值为X(即对应行Confidences的取值)时的recall与precision。
    • image_1dr7phgs01c1av1iefjukkufm1t.png-499.1kB
  • 根据上面的表格,可以获得以下PR曲线:
    • 注意,从上面的表格从上到下,置信度(confidences)逐渐减小,recall肯定是增加的(因为肯定会有越来越多的TP被包含其中)。
    • 从表格上看,当新增一个TP时,PR曲线会向右上方移动。当新增一个FP时,PR曲线会向正下方移动。
    • image_1dr7pls596n2mcaf5h14lge2i2a.png-170.1kB
  • Pascal VOC 2008:
    • Interpolated AP,即进行差值计算AP。
    • 具体方法:对每一个Precision值,使用其右边最大的Precision值替代。
    • 如下图,就是利用红色虚线取代蓝色曲线。
    • image_1dr7ptfaj1nln7ubq401rtummh2n.png-103.8kB
    • 实际计算方法如下图,就是对平滑后的Precision曲线进行均匀采样出11个点(每个点间隔0.1),然后计算这11个点的平均Precision。
    • image_1dr7q0jt81if7fo92eon1712v534.png-89.9kB
  • Pascal VOC 2012
    • Area under curve AUC。
    • Pascal VOC 2007 的方法由于插值点数量太少,很容易导致结果不准确。
    • 示意图如下,可以理解为算了无数个点的面积平均,所以结果要准确一些。
    • image_1dr7q751p1vvkbuv1khs4b1ds55h.png-108.7kB
  • COCO
    • 使用101个点的内插mAP(Interpolated AP)。
    • 使用了不同IOU阈值,不同尺度下的AP平均来作为评测结果,比如AP @ [.5 : .95]对应于IoU的平均AP,从0.5到0.95,步长为0.05。

3.3. TODO:源码分析