目标检测模型的评估指标mAP详解

原文链接点我

对于机器学习中的多数问题,常有多种可用的模型。每个模型都有自己的独特之处,并随不同条件变化而表现不同。

每个模型在验证/测试数据集上来评估性能,性能衡量使用各种统计量如准确度(accuracy),精度(precision),召回率(recall)等。对于每个应用场景,选择一个能够客观比较模型的度量指标非常重要。

这篇文章将介绍目标检测(Object Detection)问题中的最常用评估指标 Mean Average Precision,即mAP。

多数时候,这些指标很容易理解和计算。例如二元分类中,精确度和召回率是一个简单直观的统计量。然而,目标检测是一个非常不同且有趣的问题。即使目标检测器在图片中检测到猫,但如果无法定位,也没有用处。由于你要预测的是图像中各个物体是否出现及其位置,如何计算mAP将非常有趣。

讲解mAP之前,先定义目标检测问题。

目标检测问题

目标检测问题中,给定一个图像,找到它所包含的物体,进行定位并分类。目标检测模型通常是在一组特定的类集合上进行训练的,所以模型只会定位和分类图像中的那些类。另外,对象的位置通常采用矩形边界框表示。因此,目标检测涉及图像中物体的定位和分类。

目标检测模型的评估指标mAP详解
图1 几个常见的计算机视觉问题

Mean Average Precision度量适用于同时预测物体位置及类别的算法。

评估目标检测模型

关于Ground Truth

对于任何算法,评估指标需要知道ground truth(真实标签)数据。 我们只知道训练、验证和测试数据集的ground truth。对于目标检测问题,ground truth包括图像中物体的类别以及该图像中每个物体的真实边界框。
目标检测模型的评估指标mAP详解

这里给出了一个实际图片,以及相应的文本注释(边界框坐标(x,y,w,h)(x,y,w,h)和类别),如图中红色框以及文本标签所示。

对于这个特殊例子,训练时需要原始图片:
目标检测模型的评估指标mAP详解
以及ground truth的4个坐标及类别(假定图片大小是1000x800px,所有的坐标值都是以像素为单位的近似值):
目标检测模型的评估指标mAP详解

下面让我们动手看如何计算mAP。这里假定已经有一个训练好的模型,现在只需要在验证集上评估其性能。

mAP含义及计算

前面展示了原始图像和以及对应的ground truth,训练集和验证集中所有图像都以此方式标注

训练好的目标检测模型会给出大量预测结果,但是大多数的预测值都会有非常低的置信度(confidence score),因此只考虑那些置信度高于某个阈值(一般0.5)的预测结果。

将原始图片送入训练好的模型,在经过置信度阈值筛选之后,目标检测算法给出带有边界框的预测结果:
目标检测模型的评估指标mAP详解

如何量化检测结果呢?首先需要判断每个检测的正确性,采用IoU(Intersection over Union)作为评价边界框正确性的度量指标。IoU是预测框与ground truth的交集和并集的比值,也被称为Jaccard指数。
目标检测模型的评估指标mAP详解

鉴别正确的检测结果并计算precision和recall

为了计算precision和recall,必须鉴别出True Positives(真正例)、False Positives(假正例)、True Negatives(真负例)和 False Negatives(假负例)。

为了获得True Positives and False Positives,需要使用IoU。计算IoU,从而确定一个检测结果(Positive)是正确的(True)还是错误的(False)。最常用的阈值是0.5,即如果IoU>0.5,则认为是True Positive,否则是False Positive。

为了计算Recall,需要Negatives的数量。图片中没有预测到物体的每个部分都视为Negative,因此计算True Negatives比较难。但是可以只计算False Negatives,即模型所漏检的物体。

另外要考虑的因素是各个检测结果的置信度。通过改变置信度阈值,可以改变一个预测框是Positive还是 Negative,即改变预测值的正负性(不是box的真实正负性,是预测正负性)。基本上,阈值以上的所有预测(Box + Class)都被认为是Positives,并且低于该值的都是Negatives。

对于每一个图片,ground truth数据会给出该图片中各个类别的实际物体数量。可以计算每个Positive预测框与ground truth的IoU值,并取最大的IoU值,认为该预测框检测到了那个IoU最大的ground truth(个人觉得这儿描述有点不准确??觉得SSD中的正负样本分类更加合适。。)。然后根据IoU阈值,可以计算出一张图片中各个类别的正确检测值(True Positives, TP)数量以及错误检测值数量(False Positives, FP)。据此,可以计算出各个类别的precision:
目标检测模型的评估指标mAP详解

既然已经得到了正确的预测值数量(True Positives),也很容易计算出漏检的物体数(False Negatives, FN)。据此可以计算出Recall(其实分母可以用ground truth总数):
目标检测模型的评估指标mAP详解

计算mAP

mAP这个术语有不同的定义,此度量指标通常用于信息检索和目标检测领域。然而这两个领域计算mAP的方式却不相同,这里只谈论目标检测中的mAP计算方法。

前面已经讲述了如何计算Precision和Recall,至少有两个变量会影响Precision和Recall,即IoU和置信度阈值。IoU是一个简单的几何度量,容易标准化。但置信度却在不同模型下差异较大,可能一个模型中置信度采用0.5却等价于在其它模型中采用0.8置信度,这会导致precision-recall曲线(PR曲线)变化。为此,PASCAL VOC组织者想到了一种方法来解决这个问题,要采用一种可以用于任何模型的评估指标。在paper中,他们推荐使用如下方式计算Average Precision(AP):

为了得到precision-recall曲线,首先要对模型预测结果进行排序(ranked output,按照各个预测值置信度降序排列)。那么给定一个rank,Recall和Precision仅在高于该rank值的预测结果中计算,改变rank值会改变recall值。这里共选择11个不同的recall([0, 0.1, …, 0.9, 1.0]),可以认为是选择了11个rank,由于按照置信度排序,实际上等于选择11个不同的置信度阈值。那么,AP就定义为在这11个recall下precision的平均值,其可以表征整个precision-recall曲线(曲线下面积)。

目标检测模型的评估指标mAP详解

另外,在计算precision时采用一种插值方法(interpolate):

对于某个recall值r,precision值取所有recall >= r中的最大值(这样保证了p-r曲线是单调递减的,避免曲线出现摇摆):
目标检测模型的评估指标mAP详解

不过这里VOC数据集在2007年提出的mAP计算方法,而2010之后却使用所有数据点,而不是仅使用11个recall值来计算AP:

对各个类别,分别按照上述方式计算AP,取所有类别的AP平均值就是mAP,这就是目标检测问题中mAP的计算方法。

当比较mAP值,记住以下要点:

  1. mAP通常是在一个数据集上计算得到的。

  2. 虽然解释模型输出的绝对量化并不容易,但mAP作为一个相对较好的度量指标可以帮助我们。 当我们在流行的公共数据集上计算这个度量时,该度量可以很容易地用来比较目标检测问题的新旧方法。

  3. 根据训练数据中各个类的分布情况,mAP值可能在某些类(具有良好的训练数据)非常高,而其他类(具有较少/不良数据)却比较低。所以你的mAP可能是中等的,但是你的模型可能对某些类非常好,对某些类非常不好。因此,建议在分析模型结果时查看各个类的AP值。这些值也许暗示你需要添加更多的训练样本