【转载】目标检测mAP的含义

转载自三叔家的猫
https://blog.csdn.net/qq_39056987
https://blog.csdn.net/qq_39056987/article/details/104348493

            <div id="content_views" class="markdown_views prism-atom-one-light"><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><p>相信大家在看一些目标检测论文中经常会看到作者将自己的模型和其他的模型做了mAP比较,mAP作为目标检测中一个非常重要的评估指标,是对模型好坏的评价标准,当时在看YOLOv3、SSD、Faster R-CNN等这些论文的时候,对mAP还不是很熟悉,看了很多的博文,写得都很零碎,很难理解,虽然大概能明白其原理,但是可能对于很多刚进入这个领域的同学来说,难度还是很大的,刚好这几天被困在家没事做,在复习之前的东西,也重新整理一下本人对mAP的理解,用这篇博客记录下来。</p> 

YOLOv3论文中的各个模型的mAP对比图:
在这里插入图片描述
目标检测问题中,每张图片可能包含多个不同类别的不同物体,需要评测模型的分类和定位性能.

因此,图像分类问题中的精度指标是不能直接适用的. 这就是为什么采用 mAP 的原因.

一、理解mAP前要知道的一些基础概念

1.IOU

IoU 的全称为交并比(Intersection over Union),在目标检测中即计算预测边界框与真实边界框的重叠程度,重叠程度越高,说明越接近真实框。IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值,即公式等于:

IOU = 相交的面积 / 相并的面积

在这里插入图片描述

2. 混淆矩阵

混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值,矩阵表现形式,如下:
在这里插入图片描述
为了更好的理解,我们把矩阵中英文翻译成字面信息,True(对)、False(错)、Positive(正例)、Negative(负例),混淆矩阵重新整理一下:
在这里插入图片描述
现在我们来分析一下这个混淆矩阵,在mAP计算中,混淆矩阵的概念是非常重要的,如果你这步都没有理解的话,那接下来的mAP计算你肯定也看不懂。

2.1 真正例 TP(True Positives):

预测结果是True(对),真实值为Positives(正例),模型认为它也是Positives(正例);在一般情况下,会认为IOU>0.5时为真正例,在一些数据集上的指标也是为0.5;

2.2 假正例 FP(False Positives)

预测结果是False(错),真实值为Negative(负例),模型却认为它是Positives(正例);同理,一般情况下会认为 IOU<0.5 时为假正例;

2.3 假反例 FN( False Negatives)

预测结果是False(错),真实值为Positives(正例),模型预测它为Negative(负例);

2.4 真反例 TN(True Negatives)

预测结果为True(对),真实值为Negative(负例),模型预测它为Negative(负例);一般用不到这个

理解了混淆矩阵里的元素概念后,我们就可以继续了解以下概念

2.5 准确率(Accuracy)

即表示分类模型所判断的所有结果中,预测正确的结果占比,公式为:
在这里插入图片描述
一般不会作为模型的评估标准;

2.6 精准率或者查准率(precision)

即表示在所有预测值为正例中,有多少正例被预测出来,计算公式为:
在这里插入图片描述
相对于准确率来说,对模型的好坏评估结果会更好,注意和上面的准确率区分;

2.7 召回率(Recall)

即表示所有真实值为正例中有多少被预测出来,可以理解为有多少正确的目标被召回(找出),计算公式为:
在这里插入图片描述
在一些特定场景中,会将其作为模型评估标准;

2.8 平均精度 AP(Average Precision)

PR曲线(红线)以下与横轴、纵轴之间的面积。PR曲线是由Precision(精准率或者查准率)与Recall(召回率或者查全率)构成的曲线,横轴为Recall,纵轴为Precision。
在这里插入图片描述
2.9 mAP(mean Average Precision)

AP衡量的是对一个类检测好坏,mAP就是对多个类的检测好坏。在多类多目标检测中,计算出每个类别的AP后,再除于类别总数,即所有类别AP的平均值,比如有两类,类A的AP值是0.5,类B的AP值是0.2,那么mAP=(0.5+0.2)/2=0.35。

二、mAP计算过程

要计算mAP,首先要计算每一类的AP,比我我们有一个项目,有一个类别检测的是人脸,模型训练完后,我们有一组测试图片,每张图片上都有已经标记好的人脸 label ,这样我们就有了人脸的真实边界框(Ground Truth),在每张图片输入模型后会得到一系列人脸类别的预测边界框,每一个框上面都有一个置信度(暂时不考虑其他类别的框)。

将每张测试图片进行检测后,会得到一系列预测边界框集合,然后将这个预测边界框集合按照置信度降序排序。对于某一张测试图片,我们先计算该图片上人脸类别的预测边界框和真实的边界框的重叠度(IOU),当重叠度(IOU)大于设定的阈值(一般为0.5,可以自己设置)则将该边界框记作真正例(TP),否则记为假正例(FP)。对于测试集中的每一张图片均进行上述的操作(注意:在计算某一张图片的预测框是否为TP时,会从预测框集合中选取出该图片的预测框和真实框做对比)由此可以判定预测边界框集合中的所有预测框属于TP或者是FP。

比如下面三张测试图片,检测的是人脸,绿色框表示真实边界框,红色框表示预测边界框,旁边的红色数字为置信度。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以得出三个真实边界框(GT1、GT2、GT3),三个预测框边界框(BBox1,BBox2, BBox3)。

  1. 首先按照置信度进行降序排序;
  2. 对于每张图片中的预测框计算IOU,可以很清楚的看出:BBox1为TP,BBox2为FP,BBox3为TP;
  3. 之后计算不同召回率(Recall)下的精准率(Precision)值。对于第一个预测边界框BBox1,其Precision = TP / (TP+NP)=1/(1+0)=1Recall = TP / GT(总真实框数)= 1/3,同理,排序后的前两个预测边界框BBox1、BBox3,计算Precision = 1+1 / (1+1)= 1 ,Recall = 2/3,接下来三个预测边界框BBox1、BBox2、BBox3,Precision = 1+1 / (1+1+1)= 2/3 ,Recall = 2/3,这样我们就有了一组Precision、Recall值[(1,1/3),(1,2/3),(2/3,2/3)]
  4. 绘制PR曲线如下图,然后每个“峰值点”往左画一条线段直到与上一个峰值点的垂直线相交。这样画出来的黄色线段与坐标轴围起来的面积就是AP值。这里
    AP = (1/3 - 0)x 1 + (2/3 - 1/3)x 1 + (1 - 2/3)x 0 = 0.667
    在这里插入图片描述

按照如上方法计算其他所有类的AP,最后取平均值即为mAP(mean Average Precision)
在这里插入图片描述

其中C表示总类别数目,APi表示第i类的AP值。

三、例子(AP计算)

再通过个例子来更好的理解mAP计算过程,该部分摘自这篇博客,原文链接:目标检测中的评价指标mAP理解及计算

比如说我们的测试集中类A的GT(真实框)有7个,经过目标检测模型预测到了10个边界框,经过上次排序及判断操作,有如下结果:
在这里插入图片描述
按照confidence(置信度)降序排序。从上表TP可以看出我们预测正确5个(TP=5),从FP看出预测错误5个(FP=5)。除了表中已预测到的5个GT,还有2个GT并未被预测出来(FN=2)。
接下来计算AP,计算前*个BBox得到的precision和recall:
在这里插入图片描述
在计算precision和Recall时Rank指的是前个预测边界框的TP和FP之和。

于是我们得到了一个recall阈值列表[0,0.14,0.29,0.43,0.57,0.71,1],为recall阈值列表中的各值生成对应的precision列表,选择recall>=阈值元素所对应的precision的最大值。为此可得precision列表为[1,1,1,0.5,0.5,0.5,0]。

在这里举个计算的例子吧,比如找recall阈值列表中0.57所对应的precision,当recall>=0.57时,由上表可得precision为max{0.44,0.5}=0.5,其他recall对应precision的选取同理。

有了这两个列表就可以计算类A的AP了:
AP=(0.14−0)∗1+(0.29−0.14)∗1+(0.43−0.29)∗0.5+(0.57−0.43)∗0.5+(0.71−0.57)∗0.5+(1−0.71)∗0=0.5。

同样可以通过绘制PR曲线计算线下面积,如下图所示:
在这里插入图片描述
AP值即浅蓝色图形的面积,蓝色折线为recall、precision点,同理求出其他类的AP,即可算出mAP值。


参考文档:

  1. 理解目标检测当中的mAP

  2. 目标检测中的评价指标mAP理解及计算

  3. 目标检测评测指标mAP及计算[译]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3224876.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

灯塔音乐网,灯塔音乐下载官网

音乐&#xff0c;这个无形的艺术&#xff0c;自古以来就伴随着人类的生活&#xff0c;成为了我们表达情感、沟通思想、寻求共鸣的重要桥梁。在我们的日常生活中&#xff0c;音乐无处不在&#xff0c;它不仅仅是一种娱乐方式&#xff0c;更是一种生活态度&#xff0c;一种精神寄…

【Python】基础语法体系:两种常用语句

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言条件语句动态实例if语句if-else 语句if-elif-else 语句嵌套条件语句 循环语句for循环while循环 动态实例嵌套循环 前言 Python语句是构成Python程序的基本单元&#xff0c;用…

Git分支结构

目录 1. 线性分支结构 2. 分叉与合并结构 3. 分支与标签的关系 4. 并行开发与分支管理策略 测试&#xff08;本机系统为Rocky_linux9.4&#xff09; 合并失败解决 删除分支 删除本地分支 删除远程分支 Git 中的分支结构是版本控制中非常重要的概念之一&#xff0c;它描…

Java面试八股之描述一下MySQL使用索引查询数据的过程

描述一下MySQL使用索引查询数据的过程 1.解析查询语句与查询优化 用户提交一个 SQL 查询语句&#xff0c;MySQL 的查询解析器对其进行词法分析和语法分析&#xff0c;生成解析树。 查询优化器根据解析树、表结构信息、统计信息以及索引信息&#xff0c;决定是否使用 B树索引…

如何创建录取查询系统

随着新学期的脚步渐近&#xff0c;老师们的日程表上又添上了密密麻麻的任务。开学前的准备工作总是让人应接不暇&#xff0c;从整理教材到布置教室&#xff0c;再到准备课程计划&#xff0c;每一项工作都需要细心与耐心。而在这些繁琐的事务中&#xff0c;如何高效地将录取结果…

2018-2022 年份微博签到数据集

前阵子接到一个实验室老师的需求&#xff0c;采集五年前&#xff08;2024-52019&#xff09;过年前后的北京微博签到数据。 前两年采集的深圳签到数据是 2022 年是当年的尚可&#xff0c;这次虽然时间跨度只有两个月&#xff0c;但是由于时间太过久远&#xff0c;但是颇费了一…

Java面试八股之MySQL中的MVCC是什么,作用是什么?

MySQL中的MVCC是什么&#xff0c;作用是什么&#xff1f; MySQL中的MVCC&#xff08;Multiversion Concurrency Control&#xff0c;多版本并发控制&#xff09;是一种并发控制机制&#xff0c;用于提高数据库的并发性能并确保数据的一致性&#xff0c;特别是在高并发读写场景…

学习笔记——动态路由——OSPF(特殊区域)

十、OSPF特殊区域 1、技术背景 早期路由器靠CPU计算转发&#xff0c;由于硬件技术限制问题&#xff0c;因此资源不是特别充足&#xff0c;因此是要节省资源使用&#xff0c;规划是非常必要的。 OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不…

Collection 和 Collections 的区别与用法

Collection 和 Collections 的区别与用法 1、Collection 接口1.1 主要特点1.2 常见方法 2、 Collections 工具类2.1 主要特点2.2 常见方法 3、示例代码3.1 使用 Collection 接口3.2 使用 Collections 工具类 4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

Labview_压缩文件

调用顺序 源文件 生成后的文件 1.新建ZIP文件 生成ZIP文件的路径&#xff1a;为最终生成ZIP文件的路径&#xff0c;需要提供ZIP文件的名称和类型 2.添加文件到压缩文件 源文件路径&#xff1a;为需要压缩的文件路径&#xff0c;非文件夹路径 生成ZIP文件时的路径&#x…

Rust: 高性能序列化库Fury PK bincode

在序列化库中&#xff0c;传统的有Json,XML&#xff0c;性能好的有thrift&#xff0c;protobuf等。 对于二进制库来讲&#xff0c;据Fury官网的介绍&#xff0c;Fury性能要远远好于protobuf&#xff0c;且不象protobuf还需要定义IDL(即写.proto文件)&#xff0c;非常轻便&#…

HTML语言常见标签

语法 HEAD部分的HTML标签 1 标题标签 <title>标题内容</title> 2 段落标签 <meta charset"utf-8"/> BODY部分的HTML标签 1标题标签&#xff08;独占一行&#xff09;<h1>标题内容</h1> 2段落标签&#xff08;独占一行&#xff09;…

禁用华为小米?微软中国免费送iPhone15

微软中国将禁用华为和小米手机&#xff0c;要求员工必须使用iPhone。如果还没有iPhone&#xff0c;公司直接免费送你全新的iPhone 15&#xff01; 、 这几天在微软热度最高的话题就是这个免费发iPhone&#xff0c;很多员工&#xff0c;收到公司的通知。因为&#xff0c;登录公司…

使用Layui实现表格数据的分页功能

最近在用Layui做表格数据的展示时想把所有的数据进行分页展示&#xff0c;于是在网上找了一个模板 <script type"text/javascript" > layui.use([table,layer,form,laypage], function(){var table layui.table,layer layui.layer,form layui.form,laypage…

【ROS2】中级-编写动作服务器和客户端(C++)

目标&#xff1a;用 C实现一个动作服务器和客户端。 教程级别&#xff1a;中级 时间&#xff1a;15 分钟 目录 背景 先决条件 任务 1. 创建 custom_action_cpp 包2. 编写动作服务器3. 编写动作客户端 摘要 相关内容 背景 动作是 ROS 中异步通信的一种形式。动作客户端向动作服务…

LeetCode 203.移除链表元素 C做法

LeetCode 203.移除链表元素 C做法 思路&#xff1a; ​ 由于是单链表&#xff0c;所以我们可以创建一个新的头结点newhead&#xff0c;把不是val的结点尾插在newhead中&#xff0c;而等于val的结点给释放&#xff0c;最后返回newhead。防止时间复杂度过高&#xff0c;我们再创…

数据仓库哈哈

数据仓库 基本概念数据库&#xff08;database&#xff09;和数据仓库&#xff08;Data Warehouse&#xff09;的异同 整体架构分层架构方法论ER模型&#xff08;建模理论&#xff09;维度模型 何为分层第一层&#xff1a;数据源&#xff08;ODS ER模型&#xff09;设计要点日志…

代理详解之静态代理、动态代理、SpringAOP实现

1、代理介绍 代理是指一个对象A通过持有另一个对象B&#xff0c;可以具有B同样的行为的模式。为了对外开放协议&#xff0c;B往往实现了一个接口&#xff0c;A也会去实现接口。但是B是“真正”实现类&#xff0c;A则比较“虚”&#xff0c;他借用了B的方法去实现接口的方法。A…

大小端详解

引例 我们知道整形(int)是4个字节&#xff0c;例如随便举个例子&#xff1a;0x01020304&#xff0c;它一共占了四个地址位&#xff0c;01,02,03,04分别占了一个字节&#xff08;一个字节就对应了一个地址&#xff09;。 那么就会有个问题&#xff1a;我们的01到底是存储在高地…

es是如何处理索引数据的变动的?

1 概述 es是如何处理索引数据的变动的&#xff1f; 或者说索引数据变动时&#xff0c;es会执行哪些操作&#xff1f; refresh、fsync、merge 和 flush 操作有何作用&#xff1f; es是如何确保即使es发生宕机数据也不丢失的&#xff1f; 在回答上述问题前&#xff0c;可以先…