文章目录

  • 什么是mAP
  • 相关概念
  • 如何得到PR曲线
  • 如何计算AP以及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称为mAP50mAP_{50}mAP50​,更进一步,根据COCO数据集的规定,在COCO数据集上将mAPxxmAP_{xx}mAPxx​简称为APxxAP_{xx}APxx​,这时候mAP50mAP_{50}mAP50​就等同与AP50AP_{50}AP50​。然后将IoU threshold分别取0.5,0.55,0.6 … ,0.9,0.95(用切片表示的话是这样:0.5:0.95:0.05)时得到的10个mAP的平均值称为APAPAP,这也是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

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

  1. 【目标检测】K-means和K-means++计算anchors结果比较(附完整代码,全网最详细的手把手教程)

    写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大努力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌. 一.介绍 YOLO系列目标检测算法中基于anchor的 ...

  2. 目标检测中的precision,recall,AP,mAP计算详解

    大雁与飞机 假设现在有这样一个测试集,测试集中的图片只由大雁和飞机两种图片组成,如下图所示: 假设你的分类系统最终的目的是:能取出测试集中所有飞机的图片,而不是大雁的图片. 现在做如下的定义: Tru ...

  3. 目标检测:Faster-RCNN与YOLO V3模型的对比分析

    1 目标检测的背景 作为机器视觉领域的核心问题之一,目标检测的任务是找出图像中所有的目标(物体),并确定它们的位置和大小.由于各类物体有不同的外观,形状,姿态,加上成像时光照,遮挡等因素的干扰,目标检 ...

  4. 深度学习目标检测2013-2018单双阶段主流模型概览及详解

    背景:深度学习引入目标检测领域以来,给目标检测领域带来了很多突破性的进展,文章"Deep Learning for Generic Object Detection: A Survey&qu ...

  5. 目标检测中准确率accuracy的计算(precision是精度、查准率)(Recall是召回率、查全率)

    准确率定义为: 查准率P和查全率R分别定义为: 查准率关心的是"预测出正例的正确率"即从正反例子中挑选出正例的问题. 查全率关心的是"预测出正例的保证性"即从正 ...

  6. 目标检测学习笔记——SSD以及改进模型DSSD的原理解读及SSD的Tensorflow代码实现(图文并茂)

    目录 1.SSD的知识思维脑图 2.简介 2.1.SSD出现的背景 2.2.SSD的模型思想 2.2.1.多尺度特征图预测(Multi-Scale Feature Maps Prediction) 2 ...

  7. Tensorflow目标检测之yolov3训练自己的模型

    0 背景 Tensorflow官方目标检测给出了SSD.Faster rcnn等预训练模型,但没有给yolov3的预训练模型,但有热心的人已经实现了基于tensorflow来复现yolov3的算法,本 ...

  8. 《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办(“OOM: CUDA out of memory“)

    1 前言 在目标检测中,可能会遇到显存不足的情况,我们在这里记录一下解决方案: 2 如何判断真正是出现显存溢出(不是"软件误报") 当前需要分配的显存在600MiB以下, 例如: ...

  9. 跑yolo3模型出的效果图_【目标检测实战】Darknet入门—yolov3模型训练(Win10下的安装、编译、实现)...

    效果图 简介 Yolo,是实时物体检测的算法系统,基于Darknet-一个用C和CUDA编写的开源神经网络框架.它快速,易于安装,并支持CPU和GPU计算,也是yolo的底层.本文主要介绍在win10 ...

最新文章

  1. 【v2.x OGE教程 18】 Entity相关
  2. LAMBDA表达式常用 (全)
  3. 基于Python预测股价的那些人那些坑,请认真看完!
  4. Boost::context模块callcc的circle测试程序
  5. android分层测试,Android视图层次和性能的检测(官方)
  6. 物联网串口服务器的功能和作用
  7. jq设置html的fontsize,Jquery 设置字体大小(font-size)与行高(line-height)
  8. 详解list容器(应用+模拟实现)
  9. java英文拼写检查并自动纠正
  10. wepyjs小程序组件调用pages页面的方法
  11. c语言程序改错输入5结果为15,《C语言程序设计教学课件》程序改错(自我总结).doc...
  12. php数组去重复数据的小例子
  13. C# MP3操作类,能播放指定的mp3文件,或播放嵌入的资源中的Mp3文件
  14. PaddleSeg用于人像分割
  15. python做一个浏览器_用python做一个简单的浏览器
  16. 数据结构与算法分析:C语言描述(原书第2版) PDF
  17. 网站换服务器 备案,网站换服务器备案吗
  18. 计算机英语趣味知识竞赛题库,2019年小学四年级英语趣味知识竞赛试题
  19. 苹果微信换行怎么打_我用了两年的苹果手机,居然才知道,微信信息换行还能这样操作...
  20. 如何git命令创建一个本地分支,并提交到远程(remote)

热门文章

  1. Kubernetes开发(4)-webhook 实现拦截请求
  2. Proteus和Keil C51联调仿真完整解析(附程序)
  3. oracle 审计设置,oracle审计简单设置
  4. entity 与dto 区别
  5. web课程设计:HTML非遗文化网页设计题材【京剧文化】HTML+CSS(大美中国 14页 带bootstarp)
  6. 并发编程(一)多线程基础和原理
  7. Linux Ubuntu20.04安装RTL8156网卡驱动开启巨型帧
  8. Python自动化第二周之数据模块
  9. 2022年新年焰火代码
  10. 如何在Ubuntu上安装OnlyOffice Docs 7.1?