在机器学习领域,对于大多数常见问题,一般会有多个模型可供选择。固然,每一个模型会有本身的特性,并会受到不一样因素的影响而表现不一样。算法
每一个模型的好坏是经过评价它在某个数据集上的性能来判断的,这个数据集一般被叫作“验证/测试”数据集。这个性能由不一样的统计量来度量,包括准确率( accuracy )、精确率( precision )、召回率( recall )等等。选择咱们会根据某个特定的应用场景来选择相应的统计量。而对每一个应用来讲,找到一个能够客观地比较模型好坏的度量标准相当重要。机器学习
在本文,咱们将会讨论目标检测问题中最经常使用的度量标准 --- 平均精度均值(Mean Average Precision, mAP)。性能
大多数状况下,这些度量标准都很容易理解和计算。例如,在二类分类问题中,精确率和召回率都是简单和直观的统计量。 学习
而另外一方面,目标检测则是一个相对不一样且颇有意思的问题。测试
即便你的目标检测器检测到一张图片中有猫,可是若是你找不到这只猫在图片中的具体位置,那么这个检测器也是没有任何用处的。spa
因为你如今须要预测一张图片中目标是否出现及其具体位置,那么咱们如何计算这个度量就变得至关有意思了。3d
首先,让咱们定义目标检测问题,这样咱们能够对问题有一个统一的认识。blog
对于“目标检测问题”,个人意思是,给定一张图片,找到图中的全部目标,肯定他们的位置并对他们进行分类。图片
目标检测模型一般是在给定的固定类别上进行训练的,所以模型在图中只能定位和分类这些已有的类别。ci
此外,目标的位置一般是用边界矩形/边界框的形式来肯定的。
所以,目标检测包含了两个任务,肯定图片中目标的位置,以及对目标进行分类。
图1- 几个比较有名的图像处理问题,图片来自斯坦福大学 CS231n 课程幻灯片(第8讲)
以下文所说,平均精度均值 mAP 是预测目标位置以及类别的这一类算法的性能度量标准。所以,从图1咱们能够看到, mAP 对于评估目标定位模型、目标检测模型以及实例分割模型很是有用。
为何选择 mAP?
目标检测问题中,每张图片中可能会含有不一样类别的不一样目标。如前文所说,模型的分类和定位性能都须要被评估。
所以,精确率,这个图像分类问题中使用的标准的评价度量,并不能直接用在这里。如今,是平均精度均值 mAP 发挥做用的时候了。我但愿,读完本文以后你能够理解 mAP 的含义和意义。
关于参考标准(Ground Truth)
对于任何算法来讲,度量的值老是把预测值和参考标准的信息进行比较以后计算获得的。咱们只知道训练、验证和测试数据集的参考标准信息。
在目标检测问题中,参考标准的信息包括图像,图像中目标的类别,以及每一个目标的真实边界框。
一个例子
咱们给定了真实图片(jpg, png 等格式)和其余解释性文字(边界框的坐标( x, y,宽度和高度)和类别),画在图片上的红色框和文本标签只是方便咱们本身观看。
参考标准信息的可视化
所以,对于这个特定的例子,咱们的模型在训练期间获得的实际上是这张图片:
实际图片
以及三组定义了参考标准的数字(让咱们假设这张图片的分辨率是 1000 x 800 像素,表中全部坐标的单位都是像素,坐标值大小是估计的)
让咱们实际操做一下,看看 mAP 是如何计算的。
我会在另外一篇文章介绍各类目标检测算法,包括它们的方法以及性能。如今,让咱们假设咱们手上已经有一个训练好的模型,并且咱们将在验证数据集上评估它的结果。
让咱们假设原始图片和参考标准的解释性文字如上文所述。训练数据和验证数据的全部图像以相同的方法进行了标注。
训练好的模型会返回许多预测结果,可是这些预测结果中的大多数都会有很是低的置信度分数,所以咱们只需考虑那些超过某个报告置信度分数的预测结果。
咱们用模型对原始图像进行处理,下面是目标检测模型在置信度阈值化以后返回的结果。
带有边界框的图像:
来自咱们模型的结果
咱们能够说这些检测结果是正确的,可是咱们怎么量化呢?
首先,咱们须要知道每一个检测结果的正确性。可以告诉咱们一个给定的边界框的正确性的度量标准是“交并比”(Intersection over Union, IoU)。这是一个很是简单的可视量。
就文字而言,某些人可能会说这个量的名字自己就已经解释了本身的含义,可是咱们须要更好的解释。我会简单地解释 IoU 的含义,对于那些很想深刻了解 IoU 含义的读者,Adrian Rosebrock 有一篇写得很是好的文章,能够做为该内容的补充。
(https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/)
交并比是预测边界框和参考边界框的交集和并集之间的比率。这个统计量也叫作 Jaccard 指数(Jaccard Index),是由 Paul Jaccard 在 20 世纪初首次提出的。
要得到交集和并集的值,咱们首先把预测边界框覆盖在参考边界框之上。(如图所示)
如今对于每一个类别,预测边界框和参考边界框的重叠部分叫作交集,而两个边界框跨越的全部区域叫作并集。
咱们仅以这匹马做为例子
上图中类别为马的交集和并集区域看上去就像这样:
这个例子中交集区域至关大
交集覆盖的是边界框重合区域(蓝绿色区域),并集覆盖的是橙色和蓝绿色的全部区域。
而后, IoU 能够像这样计算:
利用 IoU ,咱们如今要分辨检测结果是否正确。最经常使用的阈值是0.5:若是 IoU > 0.5,那么认为这是一个正确检测,不然认为这是一个错误检测。
如今咱们为模型生成的每个检测框计算其 IoU 值(置信度阈值化以后)。利用该 IoU 值以及咱们的 IoU 阈值(例如 0.5),咱们为图片中的每个类计算其正确检测的数量(A)。
如今对于每一张图片,咱们都有参考标准的数据,能够告诉咱们在图片中某个特定类别的真实目标数量(B)。并且咱们已经计算了正确预测的数量(A)(True Positives)。所以如今咱们能够用这条公式计算模型对该类别的精确率(A/B)。
给定的图片中类别 C 的精确率=图片中类别 C 的真正类数量/图片中类别 C 全部目标的数量
对于一个给定的类别,让咱们对验证集中的每张图片都计算它的精确率。假设咱们的验证集中有 100 张图片,而且咱们知道每张图片都包含了全部的类别(根据参考标准告诉咱们的信息)。这样对于每一个类别,咱们会有 100 个精度率的值(每张图片一个值)。让咱们对这些 100 个值进行平均。这个平均值叫作该类的平均精度(Average Precision)。
某个类别(C)的平均精度=验证集中该类(C)的全部精确率的和/含有该类别(C)目标的图像数量
如今,假设在咱们整个数据集中有 20 个类别。对每个类别,咱们都会进行相同的操做:计算 IoU -> 精确率(Precision)-> 平均精度(Average Precision)。因此咱们会有 20 个不一样的平均精度值。利用这些平均精度值,咱们能够很轻松地判断咱们的模型对任何给定的类别的性能。
为了只用一个数字来表示一个模型的性能(一个度量解决全部问题),咱们对全部类别的平均精度值计算其均值(average/mean)。这个新的值,就是咱们的平均精度均值 mAP (Mean Average Precision)!!(我得说,这个命名很是有创意)
平均精度均值=全部类别的平均精度值之和/全部类别的数目
因此,平均精度均值即数据集中全部类别的平均精度的均值。
当咱们比较 mAP 值的时候要记得几个重要的点:
mAP 老是在固定的数据集上进行计算。
mAP 并非量化模型输出的绝对度量,但它是一个不错的相对度量。当咱们在流行的公开数据集上计算这个度量时,它能够很容易地被用来比较目标检测的新老方法的性能好坏,所以咱们并不须要一个绝对度量。
根据不一样的类别在训练数据中的分布状况不一样,平均精度值可能对于某些类别(这些类别有很好的训练数据)很是高,而后对于某些类别(这些类别有更少的数据或者坏数据)可能很是低。因此,你的 mAP 值可能看上去还不错,可是你的模型可能只对某些类别较好,而对某些类别的效果很是差。所以,当分析你的模型结果时,最好单独类别的平均精度值。这些值太低的话可能意味着须要添加更多的训练样本了。