mAP是目标检测中的基本指标,详细理解有助于我们评估算法的有效性,并针对评测指标对算法进行调整。

1.基本概念定义

  • 在目标检测中IoU为检测框与GroundTruth重叠的比例,如果大于0.5则算作正确True,小于0.5则算作错误False;
    其中0.5是VOC比赛中设定的阈值,具体见论文"The PASCAL Visual Object Classes (VOC) Challenge"Page_11。需要说明的是,阈值的改变会影响检测结果,TP\FP\FN\TN等都会随着阈值的改变而改版。

    具体的IoU定义和计算如下图所示:

对于目标检测来说,IoU大于阈值、检测到框算作是positive;

  • 真阳性TP:正确样本预测为正,在目标检测中为IoU大于阈值记为TP;
  • 假阳性FP:错误样本预测为正,检测框的IoU小于阈值记为FP;
  • 假阴性FN:正确样本预测为负,没有检测到框;
  • 真阴性TN:错误样本预测为负;

对每个样本的检测可以通过上面TP/FP/FN的计数来计算出精度与召回率。

  • Precision精度,即TP/(TP+FP)。指所有结果中正确的检索所占比例。结果中包含了真阳性结果TP和假阳性结果FP。其含义为所有被预测为正类的结果(其中也包含了被错误预测成正类的FP)中预测正确的结果所占比例。

    Precision=TPTP+FPPrecision = \frac{TP}{TP+FP}Precision=TP+FPTP​

  • Recall召回率,即TP/(TP+FN)。指模型查找出正确对象的概率。其中包含了正确预测的正类TP,也包括了将正类错误预测成负类的FN。召回率的本质可以理解为查全率,即结果中的正样本占全部正样本的比例。

    Recall=TPTP+FNRecall = \frac{TP}{TP+FN}Recall=TP+FNTP​

  • PR:精度-召回率(Precision−RecallPrecision-RecallPrecision−Recall)曲线。这条曲线的两个变量程负相关,精度越高,召回率越低;召回率越高,精度越低。如果将所有对象都预测为正类,没有被错误预测成负类的正类(FN为0)那么召回率将为100%;如果将所有对象的预测都为负,没有被错误预测成正的样本,那么精度就将为100%,这两个指标间存在着此消彼长的关系,理想的曲线是向右上方凸出的、包围面积大的曲线。

  • AP均匀精度Average Precision:PR曲线下所围成的面积,面积越大越好;这里的average指的是针对不同recall的平均精度。

  • mAP平均均匀精度,mean Average Precision,指各类计算出AP在不同类别上的均值。这里的mean指的是对于检测算法在数据集上各类对象的表现。

  • Top-1/Top 错误率:指的是预测概率最高的类别输入目标类别的准确率。top1就是最高类别为目标类别的准确率,top5就是最高的五个中命中目标类别的准确率。

2.AP计算

要计算mAP,首先需要计算每一个类别的AP值,主要有两种方法来计算PR曲线下的均值。

  • 一种方法是选取Recall>=[0:0.1:1]Recall>=[0:0.1:1]Recall>=[0:0.1:1]等11个值时,其recall>当前recall对应精度precision的最大值,并由这11个最大精度值求取均值即为AP。这种方法也称为11-point interpolated average precision。根据论文对AP的定义:
    AP=111∑r⊂0.0.1,...,1pinterp(r)AP = \frac{1}{11}\sum \limits_{r\subset{0.0.1,...,1}}p_{interp}(r)AP=111​r⊂0.0.1,...,1∑​pinterp​(r)

    where:pinterp(r)=max⁡r~>=r(r~)p_{interp}(r)=\max \limits_{\tilde{r}>=r}(\tilde{r})pinterp​(r)=r~>=rmax​(r~)

举个栗子,如果对于待检测的图像里,我们要检测犬这个类别并计算AP,网络针对这些图片输出了bbox(如果我们取IoU>0.5为正例的话,对应groundTruth为1):

box num confidence label-GT
0 0.9 1
1 0. 85 1
2 0. 7 0
3 0. 6 0
4 0. 7 1
5 0. 7 0
6 0. 65 1
7 0. 78 1
8 0. 71 1
8 0. 7 1
9 0. 8 0
10 - 1
11 0.51 1

那么此时我们可以看到,这是十个独立的框框,其中正例为TP=7(0,1,4,6,7,8,10,11),负例FP=5(2,3,5,9,重复检测的8 也算),GT10(一共有八个GT=1)没有检测到那么FN=1.所以根据上面的计算公式我们将按照执行度排序后给出对应的精度和召回率:

box num confidence label-GT rank precision recall
0 0.9 1 *1 pr = 1/(1+0) = 1 recall = 1/8=0.13
1 0. 85 1 *2 pr =2/(2+0)=1 recall =2/8 = 0.25
9 0. 8 0 *3 pr = 2/(2+1)=0.66 recall = 2/8 =0.25
7 0. 78 1 *4 pr = 3/(3+1) = 0.75 recall =3/8 =0.38
8 0. 71 1 *5 pr =4/(4+1) =0.8 recall = 4/8 = 0.5
2 0. 7 0 *6 pr = 4/(4+2)= 0.66 recall = 4/8 =0.5
4 0. 7 1 *7 pr = 5/(5+2) = 0.71 recall = 5/8 = 0.63
5 0. 7 0 *8 pr = 5/(5+3) = 0.63 recall = 5/8 =0.63
8 0. 7 1 *9 pr = 5/(5+4) =0.55 recall = 5/8=0.63
6 0. 65 1 *10 pr =6/(6+4) = 0.6 recall = 6/8 = 0.75
3 0. 6 0 *11 pr = 6/(6+5) =0.55 recall = 6/8= 0.75
11 0.51 1 *12 pr = 7/(7+5) = 0.54 recall = 7/8=0.88
10 - 1 *12 pr = 7/(7+5)=0.54 recall = 7/8 =0.88

随后计算AP,选取Recall>=[0:0.1:1]精度最大值:1,1,1,0.8,0.8,0.8,0.71,0.6,0.54.0,0,。AP = sum(1,1,1,0.8,0.8,0.8,0.71,0.6,0.54.0,0)/11 = 0.66.
随后,对于猫猫、狗狗、浣熊、熊猫等等各个类别的AP都求出来以后在类别上做平均就是mAP值了。

  • 另一种方法是针对每一个不同Recall值(M个正例就有M个recall值),选取大于Recall时的最大精度值,并基于这些值计算AP,也即计算每一个recall区间对应pr曲线下的面积。
    上面例子中有八个正例,对于的recall就出recall>=对应recall(包括0,1)的精度最大值:
    recall:0,0.13,0.25,0.38,0.5,0.63,0.75,0.88,1recall:0,0.13,0.25,0.38,0.5,0.63,0.75,0.88,1recall:0,0.13,0.25,0.38,0.5,0.63,0.75,0.88,1
    precisionmax:1,0.8,0.8,0.8,0.71,0.6,0.54,0precisionmax:1,0.8,0.8,0.8,0.71,0.6,0.54,0precisionmax:1,0.8,0.8,0.8,0.71,0.6,0.54,0
    AP=(0.13−0)∗1+(0.25−0.13)∗0.8+(0.38−0.25)∗0.8+(0.5−0.38)∗0.8+(0.63−0.5)∗0.71+(0.75−0.63)∗0.6+(0.88−0.75)∗0.54+(1−0.88)∗0=0.6605AP = (0.13-0)*1+(0.25-0.13)*0.8+(0.38-0.25)*0.8+(0.5-0.38)*0.8+(0.63-0.5)*0.71+(0.75-0.63)*0.6+(0.88-0.75)*0.54+(1-0.88)*0 = 0.6605AP=(0.13−0)∗1+(0.25−0.13)∗0.8+(0.38−0.25)∗0.8+(0.5−0.38)∗0.8+(0.63−0.5)∗0.71+(0.75−0.63)∗0.6+(0.88−0.75)∗0.54+(1−0.88)∗0=0.6605

ref
https://www.zhihu.com/question/53405779/answer/419532990
https://datascience.stackexchange.com/questions/25119/how-to-calculate-map-for-detection-task-for-the-pascal-voc-challenge

3.mAP计算

mAP指的是对所有类别都计算好AP,然后在类别上求平均即可得到mAP
∑classinAPi\sum^{n}_{class_i}AP_iclassi​∑n​APi​

4.实际代码(以Gluon为例)
#line 194
#https://github.com/dmlc/gluon-cv/blob/master/gluoncv/utils/metrics/voc_detection.pydef _recall_prec(self):""" get recall and precision from internal records """n_fg_class = max(self._n_pos.keys()) + 1prec = [None] * n_fg_class    #每个类别中样本数量的字典,定义精度precrec = [None] * n_fg_class     #定义召回率recallfor l in self._n_pos.keys():score_l = np.array(self._score[l])     #confidence,预测bbox的置信度match_l = np.array(self._match[l], dtype=np.int32)    #预测结果,后面用于匹配正样本和负样本,match上的为正例,预测正确。#self._score,self._match,self._n_pos,参考代码的line 43-45,来自于from collections import defaultdictorder = score_l.argsort()[::-1]     #对预测结果置信度进行排序match_l = match_l[order]            #按照置信度重新排序样本tp = np.cumsum(match_l == 1)        #正例,正确的个数TPfp = np.cumsum(match_l == 0)        #负例,错误的个数FP# If an element of fp + tp is 0,# the corresponding element of prec[l] is nan.with np.errstate(divide='ignore', invalid='ignore'):prec[l] = tp / (fp + tp)    #按照顺序计算精度# If n_pos[l] is 0, rec[l] is None.if self._n_pos[l] > 0:rec[l] = tp / self._n_pos[l]    #计算召回率(查全率,分母为所有正确的个数)return rec, prec#
# 得到精度和召回率的array后,就可以计算AP了:
#```python
#方法一def _average_precision(self, rec, prec):"""calculate average precision, override the default one,special 11-point metricParams:----------rec : numpy.arraycumulated recallprec : numpy.arraycumulated precisionReturns:----------ap as float"""if rec is None or prec is None:return np.nanap = 0.for t in np.arange(0., 1.1, 0.1):  #十一个点的召回率,对应精度最大值if np.sum(rec >= t) == 0:p = 0else:p = np.max(np.nan_to_num(prec)[rec >= t])ap += p / 11.  #加权平均return ap#方法二def _average_precision(self, rec, prec):"""calculate average precisionParams:----------rec : numpy.arraycumulated recallprec : numpy.arraycumulated precisionReturns:----------ap as float"""if rec is None or prec is None:return np.nan# append sentinel values at both endsmrec = np.concatenate(([0.], rec, [1.]))mpre = np.concatenate(([0.], np.nan_to_num(prec), [0.]))# 将精度和召回率值全部链接起来# compute precision integration ladder# 整数间隔内的最大值,对应正例的recall计算max precision  for i in range(mpre.size - 1, 0, -1):mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i])# 计算精度# look for recall value changesi = np.where(mrec[1:] != mrec[:-1])[0]# sum (\delta recall) * prec  将所有的精度和召回率加起来得到apap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])return ap

ref:
https://www.zhihu.com/question/53405779/answer/419532990
code:https://github.com/dmlc/gluon-cv/blob/master/gluoncv/utils/metrics/voc_detection.py
Detectron:https://github.com/facebookresearch/Detectron/blob/master/detectron/datasets/voc_eval.py
https://blog.csdn.net/chengyq116/article/details/81290447
https://blog.csdn.net/zdh2010xyz/article/details/54293298
https://blog.csdn.net/littlehaes/article/details/83278256
https://blog.csdn.net/lz_peter/article/details/78133069
https://www.jianshu.com/p/1afbda3a04ab
https://datascience.stackexchange.com/questions/25119/how-to-calculate-map-for-detection-task-for-the-pascal-voc-challenge
https://en.wikipedia.org/wiki/Precision_and_recall
Threshold P11 of VOC :http://homepages.inf.ed.ac.uk/ckiw/postscript/ijcv_voc09.pdf
Voc evalutaion:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/htmldoc/devkit_doc.html#SECTION00044000000000000000
code:https://github.com/dmlc/gluon-cv/blob/master/gluoncv/utils/metrics/voc_detection.py


关于TP/FP/FN以及精度召回率的另一种解释

如果使用目标检测的概念来辅助理解的话,我们可以将算法检测框看做是所有预测为正的区域(包含了TP,FP),而将原始标注框看做是所有实际正确的区域(包含了FN,TP):

精度:如果利用目标检测中框的概念来理解可以看做是下图的表示,其中检测框为预测认为Positive的、重叠部分为实际正确的部分:

召回率:而原始的标注框可以表示所有的True、重叠部分为实际正确的部分,也即为召回率:


【mAP】关于目标检测mAP的一些理解相关推荐

  1. 睿智的目标检测20——利用mAP计算目标检测精确度

    睿智的目标检测20--利用mAP计算目标检测精确度 学习前言 GITHUB代码下载 知识储备 1.IOU的概念 2.TP TN FP FN的概念 3.precision(精确度)和recall(召回率 ...

  2. 目标检测+mAP+IoU

    目标检测+mAP+IoU IoU 的全称为交并比(Intersection over Union),通过这个名称我们大概可以猜到 IoU 的计算方法.IoU 计算的是 "预测的边框" ...

  3. ap 目标检测算法map_目标检测mAP怎么计算

    啥也不说,直接把精简总结贴最前面,懂的回顾一下帮忙看看总结的对不对,不懂的继续往下翻看细节解释.如有纰漏,欢迎各位大佬指正. 总结 输入 个真值框GTs, 个检测结果Dets(bbox+scores) ...

  4. 【目标检测】FSSD论文理解

    摘要   SSD (Single Shot Multibox Detector):   是目前最好的目标检测算法之一,它具有精度高.速度快的优点.然而SSD的特征金字塔检测方法难以融合不同尺度的特征. ...

  5. 论文篇 | 2020-Facebook-DETR :利用Transformers端到端的目标检测=>翻译及理解(持续更新中)

    论文题目:End-to-End Object Detection with Transformers 2020 论文复现可参考:项目复现 | DETR:利用transformers端到端的目标检测_夏 ...

  6. 【目标检测 DeformableDETR】通俗理解 DEFORMABLE TRANSFORMERS FOR END-TO-END OBJECT DETECTION,值得一看。

    文章目录 DeformableDETR 1. 引言 1.1 E to E 1.2 远近高低各不同 1.3 先CNN,在DETR 1.4 DETR未解决的问题 2. 背景知识 2.1 NMS 2.2 t ...

  7. 目标检测FCOS的初步理解

    FCOS FCOS是一阶段anchor free目标检测算法,其主要的卖点为无锚.通过回归特征图上每个位置距离目标框的上下左右距离来实现目标检测.如果一个位置落在了多个目标框内,文中的方法是通过多尺度 ...

  8. YOLO目标检测算法的深入理解

    YOLO框架概述 YOLO(You only look once)是一种目标检测算法,目标检测算法分为两大任务:目标分类和定位,YOLO创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片(不用看 ...

  9. 目标检测-Iou(交并比)理解

    文章目录 一. IOU概述 二.IOU计算 三.IOU代码实现 一. IOU概述 IOU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是&q ...

最新文章

  1. 优化C代码常用的几招
  2. 【bzoj4842】[Neerc2016]Delight for a Cat 线性规划与网络流
  3. raw_input 与 input的区别
  4. Struts标签和OGNL表达式
  5. 华为云大数据轻模式体验:忘掉底层烦恼,专注数据开发
  6. Solr系列二:solr-部署详解(solr两种部署模式介绍、独立服务器模式详解、SolrCloud分布式集群模式详解)...
  7. python 和 iphone 通过socket传数据注意
  8. jQuery.ajax(解决跨域问题,jquery解决AJAX跨域问题
  9. Mybatis-Plus 自定义 id 生成器
  10. 超小型射频接头SMP/SSMP
  11. 《数据资产管理实践白皮书3.0》发布!(附全文下载)
  12. 2016年1月.CN域名总量净增44.7万 增速环比下降
  13. 004-行为型-02-模板方法模式(Template Method)
  14. json文件是什么?
  15. IKEv2的密钥计算方式
  16. Breakpoint和Watchpoint的区别
  17. 计算机原理实验红绿灯转换,微机原理实验交通灯控制实验.doc
  18. windows10电脑在哪配置DNS
  19. 针对L型区域的椭圆方程的差分法
  20. n叉树的遍历递归实现

热门文章

  1. 电脑怎么结束进程_小协漫谈 | 聊聊电脑卡顿那些事
  2. linux那些事之LRU(1)
  3. Java的static关键字用法及原理
  4. linux mysql异机备份_Linux环境下oracle数据库Rman备份异机恢复
  5. Mybatis(19)注解实现多表查询
  6. markdown编辑器介绍 - 更具表达性的文档格式
  7. java三判式,Java编程设计模式,第 3 部分
  8. pyinstaller与anaconda python_Win10上Anaconda环境下python3.6安装和使用pyinstaller
  9. HTML5营销代理商设计机构网站模板
  10. 百度SEO站群最新易支付源码完整版 已pj全解密