1. 基本要求

从直观理解,一个目标检测网络性能好,主要有以下表现:

  • 把画面中的目标都检测到——漏检少
  • 背景不被检测为目标——误检少
  • 目标类别符合实际——分类准
  • 目标框与物体的边缘贴合度高—— 定位准
  • 满足运行效率的要求——算得快

下图是从 Tensorflow Object Detection API 的 Model Zoo 中截取的部分模型列表。

算得快这一点通过 Speed 来体现。而其他因素,使用了mAP (mean average Precision) 这一个指标来综合体现。

mean 和 average 都有平均的意思,因此从字面理解,mAP 指标至少从两个方面进行了平均。

2. mAP指标计算

mAP 的计算大致可以分解为以下几步:

阶段 输出 关键变量
针对单个目标 TP、FP、FN IOU(交并比)
针对单个类别 PR-Cureve、AP Confidence(置信度)
针对测试集全集 mAP

2.1 输出检测结果

针对不同类型的目标检测网络,模型推理的原始输出可能的形式多种多样。

首先需要完成目标解码,生成标准化的目标列表,至少包含每个目标的:

  • 类别
  • 2DBBox
  • 置信度

这里的置信度与推理使用时的置信度阈值有差别,没有固定的阈值,只要在该通道有响应,都输出为目标。

不同类型的网络,置信度数值的含义也不同,因此也无法设定一个统一的阈值。

2.2 针对单个目标

针对单个目标,问题简化为分类结果的判定。

首先将 GT (Ground Truth) 和 Predictions 分别按照各自的类别分组。

在每一个类别内,对 GTPredictions 两组数据进行匹配,匹配的依据是 IOU

匹配结果可能有如下几种:

  • TP (True Positive):一个正确的检测,IOU ≥ threshold。即预测的目标分类正确,且边框与 GT 重合度够高。

  • FP (False Positive):一个错误的检测,没有匹配上 GT 的目标,或IOU < threshold。即预测的目标分类不正确,或边框与 GT 重合度不够高。

  • FN (False Negative):漏检的 GT。即没有被匹配上目标的 Ground Truth。

2.3 针对单个类别

完成对整个测试集上每个目标的判断后,分类别统计 PrecisionRecall

  • Precision:准确率(查准率),模型只找正确目标的能力。

    Precision = TP / (TP + FP),其中 TP+FP 即模型找到的所有目标。

  • Recall:召回率(查全率),模型找到所有目标的能力。

    Recall = TP / (TP + FN),其中 TP+FN 即所有的 GT

在单个目标的处理步骤中,只需要记录TP。则对于所有检测目标,非TP即为FP,对于所有 GT,非TP即为FN。

当设定不同的 Confidence 阈值时,输出的检测目标数量不同,由此计算得到的 PrecisionRecall 也不同。

根据不同的阈值,可以得到一系列 PrecisionRecall 的值,连起来即可得到PR曲线。

在实际操作中,将所有目标按照置信度从高到低排序,每一步都只累加一个目标,统计当前的P-R值。

PR曲线示例如上图所示。

PR曲线会有折线的原因。每累加一步,如果:

  • 当前累加的目标是FP,则 Recall 值不变, Precision 值变小,对应图中竖直向下的线段;

  • 当前累加的目标是TP,则 Recall 和 Precision 都变大,对应图中斜向右上方的线段。

2.4 针对全集

至此,针对每一个类别,都计算得到一条PR曲线。

PR曲线与x轴所围成的面积,即为当前类别的AP值。

Average 是指对不同 Confidence 阈值下的结果进行平均。

所有类别AP值的均值,即为 mAP。

mean 是指对不同类别之间结果进行平均。

3. 存在问题及改进思路

3.1 问题

(1)误检/漏检少、分类准、定位准,这些要求并没有在 mAP 的整个计算过程中一直传导到最终结果。

首先按照目标类别进行分类处理。

在对单个目标的处理中,将IOU作为匹配的指标,将检测到的目标二分类为TP/FP。在选定IOU阈值后,TP/FP的分配也就确定了。在后续的步骤中,目标被抽象为正确/错误两类,但正确或错误的程度被忽略了。

下图为 IOU=0.5 时的极限情况示意:

类似的IOU值实际可能代表的不同情况:

在对所有目标的处理中,主要考察不同的 Confidence 阈值下,检测出正确目标的能力。

因此,误检/漏检少、分类准、定位准这几个要求是按照一种串行的方式,分阶段组织起来的。

(2)问题是多样化的,只用一个指标,没法知道目前的性能瓶颈在哪里。

根据 mAP 的高低,我们只能较为概括地知道网络整体性能的好坏,但比较难分析问题具体在哪。

举几个例子:

  • 如果网络输出的框很贴合,选择合适的 Confidence 阈值时,检出和召回也较均衡,但是目标的类别判断错误较多。由于首先根据类别结果分类处理,只要类别错了,定位、检出和召回都很好,mAP 指标也不会高。但从结果观察,并不能很明确知道,问题出在类别判断上。

    比如 Faster-RCNN 系列网络,如果 RPN 部分效果很好,但是 RCNN 部分效果很差,只根据 mAP, 是无法判断出来的。

  • 如果两个网络的其他性能表现都类似,但是输出框的定位精度不同。对于大部分判定为 TP 的目标,一个网络的目标 IOU 值很高,框非常贴合 GT;另一个网络的目标 IOU 值刚刚超过阈值。理论上这样两个网络计算出来的 mAP 值是类似的,但实际使用的表现是有差别的。

(3)mAP 指标关注的点,与实际应用时关注的点,并不完全吻合

mAP 会统计所有 Confidence 值下的 PR值,而实际使用时,会设定一个 Confidence 阈值,低于该阈值的目标会被丢弃,这部分目标在统计 mAP 时也会有一定的贡献。部分针对比赛刷榜的涨点技巧,会关注这部分检测结果对 mAP 的影响。

此外,在 ADAS 应用(特别是车辆检测)中一些比较关心的点,mAP 指标并没有很好地体现。比如:

  • 最关心正前方近处的目标,对远处侧面的目标关注度相对低
  • 关注目标框的下沿和宽度,而对上沿的要求不高
  • 关注连续帧中,同一个目标检测结果的稳定性和连续性
  • 不同的类别错判,严重程度不同(比如卡车误判为客车问题不大,行人误判为车辆问题就比较大)

3.2 改进

(1)考察不同 IOU 阈值下的性能表现

在 VOC 标准的 mAP 计算中,只取 IOU=0.5 一个阈值。

MS-COCO 标准对此进行了改进,取0.5:0.05:0.95等间隔的11个阈值,分别统计:

  • AP:在所有11个 IOU 阈值上计算出来的 mAP 的均值(最主要的度量指标)
  • AP@.5IOU:阈值取0.5时的 mAP 值(等价于 VOC mAP)
  • AP@.75IOU:阈值取0.75时的 mAP 值

此外还针对目标大小分别进行了统计:

  • AP(small):像素面积小于322的目标,在所有11个 IOU 阈值上的AP
  • AP(medium):像素面积介于322和962之间的目标,在所有11个 IOU 阈值上的AP
  • AP(medium):像素面积大于962的目标,在所有11个 IOU 阈值上的AP

此外,还有 AR (Average Recall) 相关的一系列指标。

可见, COCO mAP 对检测性能进行了更全面的评估,改进了单一 IOU 阈值的问题。

COCO mAP 的计算可以直接使用pycocotools,将检测结果按照规定的格式提供,即可自动完成计算。

(2)统一训练和评测的指标

在网络训练过程中,location 分支的输出通常会用IOU Loss去进行优化,目前已经升级到DIOUCIOU

那么在测试过程中,也可以将 IOU 指标替换为类似 DIOU 或 CIOU 的版本,实现更合理的评价,以及训练和评测的统一。

(3)设计更多自定义的指标

mAP 是一个基准指标,属于规定动作,可以用来比较不同网络,包括与开源模型、外部团队开发的模型等进行比较。

此外,基于我们关心的模型性能表现,可以设计一些额外的指标。包括:

  • mAP 计算过程中,可拆分出来的的一些中间指标
  • mAP 没有涵盖到的指标

(4)模型使用时的阈值选择

使用模型进行推理时,在目标解码过程中涉及 Confidence 阈值的选取。通常是采用一刀切的方式,选择一个统一的阈值。

在 mAP 的计算过程中,会输出每个类别的PR曲线。一个典型PR曲线的示意如下:

根据PR曲线,既可以找到一个数学意义上的最优点,也可以根据实际使用时,对于误检和漏检的不同容忍程度,选定一个权衡值。

可以根据每个类别的不同情况,选取不同的 Confidence 阈值,来让每一个类别的检测结果达到最优。

在实际操作中,可先根据 class 通道的结果,判定类别,再根据 conf 通道的结果和不同的阈值,筛选检出的目标。

对于类别性质差异较大,类别不均衡现象较为严重的案例,可以实现更理想的输出。

比如,在ADAS应用中,对于车辆目标、行人目标、交通标识目标的识别要求可能存在差异。根据各自的PR曲线去定制阈值,是一个更合理的选择。

参考:

  1. https://zhuanlan.zhihu.com/p/94597205
  2. https://www.jianshu.com/p/d7a06a720a2b
  3. https://www.cnblogs.com/laozhanghahaha/p/12383363.html

目标检测性能评价——关于mAP计算的思考的更多相关文章

  1. 目标检测中的mAP

    一.IOU的概念 交集和并集的比例(所谓的交集和并集,都是预测框和实际框的集合关系).如图: 二.Precision(准确率)和Recall(召回率)的概念 对于二分类问题,可将样例根据其真实类别和预 ...

  2. 评价目标检测(object detection)模型的参数:IOU,AP,mAP

    首先我们为什么要使用这些呢? 举个简单的例子,假设我们图像里面只有1个目标,但是定位出来10个框,1个正确的,9个错误的,那么你要按(识别出来的正确的目标/总的正确目标)来算,正确率100%,但是其实 ...

  3. 目标检测 1 : 目标检测中的Anchor详解

    咸鱼了半年,年底了,把这半年做的关于目标的检测的内容总结下. 本文主要有两部分: 目标检测中的边框表示 Anchor相关的问题,R-CNN,SSD,YOLO 中的anchor 目标检测中的边框表示 目 ...

  4. 目标检测算法Faster R-CNN

    一:Faster-R-CNN算法组成: 1.PRN候选框提取模块: 2.Fast R-CNN检测模块. 二:Faster-R-CNN框架介绍 三:RPN介绍 3.1训练步骤:1.将图片输入到VGG或Z ...

  5. 【目标检测】用Fast R-CNN训练自己的数据集超详细全过程

    目录: 一.环境准备 二.训练步骤 三.测试过程 四.计算mAP 寒假在家下载了Fast R-CNN的源码进行学习,于是使用自己的数据集对这个算法进行实验,下面介绍训练的全过程. 一.环境准备 我这里 ...

  6. 定位、识别;目标检测,FasterRCNN

    定位: 针对分类利用softmax损失函数,针对定位利用L2损失函数(或L1.回归损失等) 人关节点检测 针对连续变量和离散变量需要采用不同种类的损失函数. 识别: 解决方案: 1.利用滑动窗口,框的 ...

  7. 平均精度均值(mAP)——目标检测模型性能统计量

    在机器学习领域,对于大多数常见问题,通常会有多个模型可供选择.当然,每个模型会有自己的特性,并会受到不同因素的影响而表现不同. 每个模型的好坏是通过评价它在某个数据集上的性能来判断的,这个数据集通常被 ...

  8. 目标检测模型的性能评估--MAP(Mean Average Precision)

    目标检测模型中性能评估的几个重要参数有精确度,精确度和召回率.本文中我们将讨论一个常用的度量指标:均值平均精度,即MAP. 在二元分类中,精确度和召回率是一个简单直观的统计量,但是在目标检测中有所不同 ...

  9. 目标检测评价指标(mAP)

    常见指标 precision 预测出的所有目标中正确的比例 (true positives / true positives + false positives). recall 被正确定位识别的目标 ...

随机推荐

  1. 为什么建议选择居住在墨尔本CBD以南2公里内

    英国房地产公司PAUL ADAMS ARCHITECT ,简称PPA(公司编号:07635831)成立于2011年,是一家成立近十年的老牌房地产公司.PAA公司一直有着自己的房地产理念,秉持房子是用来 ...

  2. 【Notes】现代图形学入门_01

    跟着闫令琪老师的课程学习,总结自己学习到的知识点 课程网址GAMES101 B站课程地址GAMES101 课程资料百度网盘[提取码:0000] 计算机图形学概述 计算机图形学是一门将模型转化到屏幕上图 ...

  3. 2021-2-27:Linux 下如何优化 Java MMAP 写入

    主要是调整 pdflush 相关参数. 在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到 ...

  4. 一文让你对js的原型与原型链不再害怕、迷惑

    目录 原型与原型链的详细剖析 原型 显式原型prototype 隐式原型__proto__ 显式原型prototype与隐式原型__proto__的关系 原型链(隐式原型链) 探寻原型链的尽头 完整详 ...

  5. HDOJ-1074(动态规划+状态压缩)

    Doing Homework HDOJ-1074 1.本题主要用的是状态压缩的方法,将每种状态用二进制压缩表示 2.状态转移方程:dp[i|(1<<j)]=min(dp[i|(1<& ...

  6. Hadoop的常用命令

    注:hadoop的使用命令包含 hadoop fs 开头 or hdfs dfs开头 等多种形式来操作. 这里以hadoo fs的形式来介绍在这些命令 1.列出根目录下所有的目录或文件 hadoop ...

  7. axios之增删查改操作

    一.get方法获取数据 axios.get('url') .then(function (res) { console.log(res); }).catch(function (error) { co ...

  8. [学习笔记] KM算法

    前言 这个东西学了我挺久了,我先奉劝各位一定要先搞清楚匈牙利算法.感谢 \(\tt jzm\) 巨佬对我耐心的讲解,因为我太弱了所以卡了很久都不懂.如果你有任何问题请在本篇博客下面留言,我会尽力解答的 ...

  9. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

  10. python学习之web中的html基础

     HTML简介及相关标签介绍 首先,我们要了解什么是HTML? HTML被称作超文本标记语言,是一门标记语言,即该语言由各类标记标签组成. 为什么学python要学HTML? 不管学习哪个语言,我们最 ...