【目标检测】什么是mAP?如计算模型的mAP?(mAP的相关概念以及求法)

什么是mAP

mAP(mean Average Precision 平均精度),是一个经常被用来衡量目标检测模型是否具有较好性能的指标。

相关概念

计算mAP需要先计算每一类物体的AP,然后取平均值,所以下面介绍的TP,FP,FN,TN都是针对某一类物体(目标)的检测结果来讲的。

GT:Ground Truth,也就是标签,对应了真实框的大小位置以及分类。

IoU:两个框的交并比。

score或confidence:每个预测框的置信度,表示这个预测框包含某个目标的可能性,score或者confidence越高,表示模型认为其包含某种目标的可能性越大。

IoU threshold:人工设定的IoU阈值。如果预测框与GT框的IoU大于此阈值,则认为预测框与GT框非常相似,否则就认为预测框与GT差别很大。针对不同数据集,这个取值会不一样,因为针对不同数据集有不同的评价标准,比如说Pascal VOC数据集的设定是0.5,而COCO数据集设定了多个标准,从而会参考在多个IoU threshold下的mAP来评判模型的好坏。

score threshold:人工设定的score或confidence的阈值,对于某一类来讲,预测框的分类置信度大于此阈值则认为这个框检测到了这类物体,保留预测框,小于这个值则认为这个框中没有检测到这类物体,舍弃预测框。针对这一步筛选出的预测框,通常会再进行一次NMS,消除冗余的框,然后将剩下的边界框参与TP、FP、FN、TN的计算。

TP: True Positive,一个正确的检测结果,被模型检测为正的正样本。我们这步针对所有经过score threshold筛选出的预测框,针对一个预测框来讲,如果边界框位置大小与某个GT非常相似(检测框与GT的IoU ≥ IoU threshold),那么我们就认为这个框就是一个正确的检测结果,并将其与该GT配对,TP即为这类检测框的数量。注意,在实际预测中,经常出现多个预测框和同一个GT的IoU都大于阈值,这时通常只将这些预测框中score最大的算作TP,其它算作FP。

FP: False Positive,一个错误的检测结果,被模型检测为正的负样本。即边界框位置大小不达标(检测框与GT的IoU < IoU threshold)又或者这个预测框是多余的预测框(即这个框对应的GT的已经存在一个TP与之对应)的数量。在计算的时候,一般将检测出的所有边界框数量减去所有预测正确边界框的数量,也就是所有经过score threshold筛选出的预测框除去TP,剩下的边界框的数量就是FP。

FN: False Negative,没有被检测到的GT的数量。即对于所有GT,除去所有被预测正确的边界框(也就是TP)对应的GT,剩下的没有被检测到的GT的数量。又称为被模型检测为负的正样本。

TN: True Negative,被模型预测为负的负样本。但在目标检测mAP的计算过程中没有用到这类,通常在分类任务中会用到。

Precision(准确率): TP / (TP + FP),准确率是模型给出的所有预测结果中,正确预测的结果所占的比例。其中TP+FP就是根据score threshold筛选出来的候选框的数量。

Recall(召回率): TP / (TP + FN),召回率是模型预测的正确结果最多能覆盖多少GT。这也解释了为什么在计算TP时,同一个GT只对应一个正确的检测框TP,如果允许一个GT对应多个正确的预测框,假如对于每个GT都存在大于一个的正确预测框数,那么最终得到的召回率很明显会大于1,这是不符合常理的。其中TP+FN就是GT的数量。

对于多分类的目标检测任务来讲,会分别计算一张图片中每个类别的TP、FP、FN的数量,进一步计算出每个类别的Precision和Recall。

所以对于 precision和recall的含义,可以这样理解: preicision是在模型得出的正样本中, 有多大比例真的是正样本, recall则是在真正的正样本中, 有多少被你找到了。

PR曲线: Precision-Recall曲线,将所有precision-recall点连成的曲线(一般会为每个类别的预测框建立各自的PR曲线)。

AP: Average Precision ,平均精度,根据PR曲线计算得出。

mAP: mean Average Precision, 各类别AP的平均值。

如何得到PR曲线

从以上定义中可以得到,score threshold影响着每个类别中TP,FP,FN的数量,从而影响了precision和recall的计算结果。那么threshold到底是怎么影响precision和recall的呢? 我们用知乎上一个例子来理解:

1、如果score threshold太高, 模型认为是鸭子的物体基本上都是真的鸭子,precision就高了;但也因为筛选太严格, 我们也放过了一些score比较低的预测框,但是可能这个框中的物体确实是鸭子,所以recall就低了。
2、如果score threshold太低, 那么任何物体都会被当成鸭子, 比如说兔子,鸡,鹅都被当作是鸭子,那么precision就会很低, recall就会很高(recall高是因为他几乎把所有鸭子、鸡、鹅、兔子都当作鸭子,所以对于鸭子这一类别的TP值就很大)。

这样我们就明确了score threshold确实对物体的precision和recall产生影响和变化的趋势, 也就带来了思考, precision不是一个绝对的东西,而是相对score threshold而改变的东西, recall同理, 那么单个用precision来作为标准判断, 就不合适。 这是一场precision与recall之间的平衡, 用一组固定值表述不够全面, 因为我们根据不同的score threshold, 可以算出不同(也可能相同)的precision、recall值。 这样的话,对于每个score threshold,我们都有(recall,precision)的对应关系,将所有score threshold得到的(recall,precision)点按照recall值的大小从小到大依次连在一起, 也就有了recall和precision之间的curve关系,这个curve关系就是PR曲线。

以上部分内容转载自知乎陳子豪的回答,十分感谢陳子豪的分享,侵删

综上,想得到PR曲线,必须通过改变score threshold的大小,从而得到一系列(recall,precision)点。但是在实际操作中,不需要手动设置score threshold的值,因为模型输出的每个预测框(这些预测框一般都是经过NMS处理的,保证每张图片里面不会有过多的框,因为过多的框是会降低AP的)都有一个score,我们只需要将其从小到大排序,然后依次从小到大选择这些score作为score threshold即可,这样保证了随着阈值的增大,筛选出的预测框总数会一直减小。

注意,可能存在一个recall值下有多个precision值的情况。这是因为随着score threshold的增大,TP有时候会保持不变,有时候会变小。具体分析过程如下,当增大score threshold时,可能TP不变,也可能TP变小,GT数量是一直不变的,但通过score threshold筛选出的预测框数量一直在变小,当TP不变时,Recall是不变的,Precision会增大,那么就会出现同一组Recall对应了多组Precision的情况。在计算AP的时候,对于每一个recall,我们只使用这个recall对应的最大准确率(最大precision值),详细计算过程请看下文。

如何计算AP以及mAP

现在已经得到了PR曲线,
先看一下AP的计算,以2010年为界,有两种不同的计算方法,现在更常用的是第二种:
在这里插入图片描述
以上图片来自于:准确率、召回率和mAP、AP50/75,这篇文章讲的十分清楚,侵删。

这里我稍微解释一下第二种计算方法,其实这里用了微积分的知识,当这一类的GT框特别多时,即m非常大的时候,1/m就很小,根据微积分的定义,前面几项相加即为PR曲线的积分,也就是PR曲线下的面积。

这样我们对所有类别都计算出对应的AP,再求平均值,就得到了在某个固定的IoU threshold下,模型的平均精度(mAP)值。比如说IoU threshold=0.5时,这样计算出的mAP称为 m A P 50 mAP_{50} mAP50,更进一步,根据COCO数据集的规定,在COCO数据集上将 m A P x x mAP_{xx} mAPxx简称为 A P x x AP_{xx} APxx,这时候 m A P 50 mAP_{50} mAP50就等同与 A P 50 AP_{50} AP50。然后将IoU threshold分别取0.5,0.55,0.6 … ,0.9,0.95(用切片表示的话是这样:0.5:0.95:0.05)时得到的10个mAP的平均值称为 A P AP AP,这也是MS COCO数据集对模型评判的主要参考指标。
这是yolov4在COCO数据集上的检测结果:
在这里插入图片描述

详细步骤分析

1、首先选择某类物体,计算它的平均精度AP,例如计算汽车这类物体的AP。
2、从网络的原始输出中筛选出对所有分类结果是汽车的预测框,将这些预测框保存下来,记录为BBox1。
3、对BBox1中所有框进行一次非极大值抑制(NMS),剩余的所有框记录为BBox2。关于非极大值抑制的讲解链接:NMS——非极大值抑制
3、将BBox2中所有框的confidence(置信度)从小到大排序,排序过程中去除重复值,得到confidence_list,然后从confidence_list中依次从小到大选择confidence作为score threshold进行第四步和第五步。这是个循环第四步与第五步的过程,直到所有confidence值都被选择过为止。
循环开始
for score_threshold in confidence_list:
4、使用score threshold对BBox2中的所有框进行筛选,只有confidence > score threshold的框才会被保存下来,说明这个框中存在汽车的概率比较大,我们将这一步保留下来的所有框记录为BBox3。
5、根据定义,计算BBox3中TP、FP、FN的值(在这一步中会用到IoU threshold来区分出TP和FP),从而计算出Recall(TP/(TP+FN))和Precision(TP/(TP+FP))的值。将这一步计算出的Recall和Precision值记录下来,用于第六步绘制PR曲线。
循环结束
6、经过第四步和第五步的不断循环,我们已经通过改变score threshold得到多组(Recall,Precision)点,将其绘制成一条PR曲线,根据公式计算曲线积分面积,即可得到汽车这个类别的平均精度AP。
7、如果模型需要检测出多种物体,则返回第二步计算其他物体的AP,最后得到所有物体的AP,再进行平均,得到模型的mAP。

相关文章推荐:
Pascal VOC中mAP的计算
目标检测模型的评估指标mAP详解(附代码)
准确率、召回率和mAP、AP50/75

  • 6
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值