目标检测性能的衡量指标:mAP图解

2023-05-16

最近又重新复习了下mAP,在网上找了有关mAP的文章,但是感觉大多数都是左抄一点又抄一点那种。。。写的比较乱,可能因为mAP的计算方法前后变过几次,所以导致有很多版本的说法存在。为了更好的理解,看网上的讲解(包括我这篇博客hhh)不如直接看一遍源代码理解的深。。。下文对mAP计算过程的讲解是我根据对源代码的理解写的,是目前最新的计算方式。下面我们会逐步了解TPFPTNFN四种类型以及精确度precision召回率recallR-P曲线AP值的含义。

源代码链接:https://github.com/Cartucho/mAP

目录

1、对TP、FP、TN、FN四种类型的理解

2、两个相关指标:精确度(Precision)与召回率(Recall)

3、对AP及mAP的理解

4、AP的具体计算方式


1、对TP、FP、TN、FN四种类型的理解

T:True,代表判断正确

F:False,代表判断正确

P:Positive,代表被分为正样本

N:Negative,代表被分为负样本

 

TP:代表被分为正样本且分对了

FP:代表被分为正样本且分错了

TN:代表被分为负样本且分对了,在mAP指标中不会使用到TN

FN:代表被分为负样本但是分错了

2、两个相关指标:精确度(Precision)与召回率(Recall)

3、对AP及mAP的理解

容易理解,单独使用Precision或Recall具有局限性,并不能很全面地反应目标检测的效果。

因为在目标检测的网络中,我们需要使用目标的置信度confidence及IOU的阈值(threshold)来筛选最后的目标框。当我们把threshold设置的较低时,说明筛选相对宽松,会有较多负样本被留下来归类为正样本,此时会导致Precision降低,Recall升高。反之,当我们设置的threshold值较高时,此时对目标的筛选较为严格,会过滤掉置信度较低但本属于正样本的样本,此时会导致Precision升高,Recall降低,这很容易理解。因此我们需要一个用来来平衡Precision与Recall对目标检测的效果的综合评价指标,于是就有了AP与mAP。

AP是针对目标检测模型中某个单独的类别的识别效果来说的。代表某一类别的P-R曲线下的面积值,P-R曲线是在同一IOU阈值下,不同Recall值与Precision值对应关系的曲线。比如下面:

mAP是所有类别的AP值取平均(mean)后的结果,因此下面主要介绍下AP的计算方式。

4、AP的具体计算方式

AP是针对一个类来说的,假设我们有以下六张图片,图中的框是类别“cat”的预测结果。绿色框代表groundtruth,红色的框代表网络的预测结果。

在计算AP之前,我们先把初步预测的结果按照置信度confidence(有些地方叫score)的值进行排序,将大于confidence阈值的预测结果保留下来作为正样本Positive,即图中的红框,红色框旁边的数字代表相应的置信度confidence的值。在确定了正样本后,对于某一确定的IOU阈值(这里取AP50,即阈值为0.5,相应的AP60对应的阈值为0.6),来判断预测出来的正样本是正确的(T)还是错误的(F)。图中共有12个gt框,13个预测框。则上述所说的,   

 我们设置IOU阈值为0.5来作为是预测的正样本是否是正确的依据,当IOU≥0.5时,标记为TP,若一个gt有多个符合条件的预测框(比如image6中的12、13号预测框),则只留下一个预测框作为TP,其余的均记为FP(关于具体留下那个,源代码中的方法是先检测到谁就留下谁,这很容易理解,因为不管留下谁最终的计算结果都一样)。当IOU<0.5时,则标记为FP。这里要注意区别置信度阈值以及IOU阈值在计算过程中扮演的角色,置信度阈值用来初步筛选哪些预测框是正样本(P),而IOU阈值则是用来判别预测的正样本是对的(TP)还是错的(FP)。以上检测结果如下表所示:

我们可以通过上表绘制出P-R曲线,但在绘制曲线之前我们需要将上表的结果按照置信度的值由高到低排序,然后分别计算TP与FP的累计数量,对置信度进行降序排序的操作是为了便于直观地计算不同置信度下的Recall与 Precision值。容易理解,这里的置信度都是高于前面我们筛选预测正样本时设置的置信度阈值的,在这里再进行排序细分只是为了计算AP值的。AP的求解过程中,求一个Recall值对应的Precision的值就是取大于等于这一Recall值的最大的Precision,即表中的rP(在后面的面积计算中,Recall=0处的rP就是全局最大的Precision,此处为1。说到这里你可能有点懵——为什么不是直接取一个Recall以及他直接对应的Precision的坐标,即(Recall,Precision)来计算AP,而是要娶坐标(Recall,rP)来计算AP值呐?直接说不好理解,继续往下看你就会明白了~最终的结果如下表:

下图中蓝色点描出的折线就是真实的R-P曲线,即坐标(Recall,Precision)绘制出来的曲线。但是,现实中对mAP的计算并不完全是真实R-P曲线下的面积,而是使用上表的绿色部分的数据,即取坐标(Recall,rP)绘制的曲线下的面积,也就是下图中的阴影部分,这一点网上很多地方都没说清楚。这可以理解为:这是为了便于积分计算的一种方式。因为真实情况下,我们计算mAP用到的图片数量远不止例子中的6张,大量图片的结果就是更密集的置信度取值,对应着更密集的(Recall,Precision)点,这些点连接起来可以近似为“光滑”的曲线,而不是例子中这么明显的折线,而直接计算这些“光滑”曲线的积分就显得比较复杂,因此我们采用(Recall,rP)坐标绘制的曲线的积分来计算最终的AP值。

最后mAP的计算就是所有类别的AP相加取平均。特别的,如果网络只是针对一个类别训练的,则此时AP=mAP。一般来说,一个越好的目标检测网络其mAP值就越高。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目标检测性能的衡量指标:mAP图解 的相关文章

  • 《阿里云服务器搭建》------搭建SVN服务

    文章目录 1 查看和卸载SVN2 安装SVN3 建立SVN版本库4 修改配置文件1 修改authz文件2 修改passwd文件3 修改svnserve conf文件 5 启动与停止6 windows客户端检出项目 1 查看和卸载SVN sp
  • 尚医通【预约挂号系统】总结

    这里写目录标题 1 项目介绍2 技术点3 业务流程4 项目架构5 项目源码 xff08 包含sql xff09 6 启动步骤7 项目模块说明8 项目功能总结9 效果图后台管理端前端展示端数据库 1 项目介绍 尚医通即为网上预约挂号系统 xf
  • 谷粒商城项目笔记总结(1/2)

    文章目录 商城项目 基础篇1 环境搭建2 MyBatis plus引入MyBatis plus的步骤 3 SpringCloud AlibabaNacos注册中心Nacos配置中心Fegin 声明式远程调用Gateway API网关 4 商
  • 利用natapp做内网穿透

    有时候我们自己做个小网站 xff0c 或者开发微信公众号做测试时 xff0c 因为没有公网ip而犯难 xff0c 毕竟买一台云服务器带独立ip的 xff0c 加上域名是一笔不小的开支 这时如果有一个内网穿透工具 xff0c 让自己本地电脑充
  • 权限管理系统【SpringBoot + Vue + SpringSecurity】

    文章目录 项目介绍技术选型环境要求项目结构表结构项目地址展示效果图 项目介绍 基于Springboot 构建的 前后端分离 通用权限管理系统 技术选型 后端技术 Spring Boot xff0c MyBatis plus xff0c Sp
  • JVM虚拟机【面试看这一篇就足够了】

    文章目录 前言内存结构说说JVM内存整体的结构 xff1f 线程私有还是共享的 xff1f 什么是程序计数器 xff08 线程私有 xff09 xff1f 什么是虚拟机栈 xff08 线程私有 xff09 xff1f 什么是本地方法栈 xf
  • 在Ubuntu18上用LibTorch(非darknet)部署YOLOv4的填坑之路(附源码)

    目录 坑一 xff1a 从官网下载的LibTorch库是不带torchvision的 坑二 xff1a Python的PIL库与opencv库在图像处理上的差异值得注意 坑三 xff1a LibTorch对tensor的各种变换操作度相比P
  • 锁升级过程(无锁、偏向锁、轻量级锁、重量级锁)

    文章目录 Synchronized锁升级的背景Synchronized的性能变化Java5之前 xff0c 用户态和内核态之间的切换为什么每个对象都可以称为一把锁 xff1f Java6开始优化Synchronized Synchroniz
  • String.format()的详细用法

    问题 在开发中一段字符串的中间某一部分需要可变的 如 xff1a 文本要展示 张三用户来自深圳 xff0c 年龄 18 xff0c 性别 男 其中的 张三 是用户名 xff0c 每个用户都是不一样的 xff1b 地区 深圳 为可变的Stri
  • Element实现行合并

    效果图 完整代码 span class token tag span class token tag span class token punctuation lt span template span span class token p
  • @EnableAsync @Async

    一直不太忙白线程池在实际应用中到底扮演什么样得角色 xff0c 有什么场景可以使用到 xff0c 只有真正做项目中使用到了才逐渐理解 使用多线程 xff0c 往往是创建Thread xff0c 或者是实现Runnable接口 xff0c 用
  • Java实现QQ邮箱发送给网易邮箱,发送邮件+附件

    实现功能 xff1a Java实现 QQ邮箱 给网易邮箱发送邮件获取邮件信息并下载邮件的附件 前置功能 案例以QQ邮箱为例说明 xff1a 首先登录QQ邮箱将SMTP服务开启 xff0c 会得到一个授权码 创建一个Springboot项目
  • kubernetes(v1.21.10)简介

    学习视频地址 xff1a https www bilibili com video BV13Q4y1C7hS 1 背景 1 部署方式的演变 传统部署时代 xff1a 在物理机服务器上运行应用程序 无法为应用程序定义资源边界 导致资源分配问题
  • Kubernetes(v1.21.10)集群安装

    视频中安装的是v1 20 9 xff0c 我们安装kubernetes的v1 21 10版本 1 环境规划 1 集群类型 Kubernetes 集群大致分为两类 xff1a 一主多从和多主多从 一主多从 xff08 单 master xff
  • Kubernetes(v1.21.10)实战入门与组件说明

    文章目录 一 资源管理1 资源管理介绍2 YAML语言介绍3 资源管理方式3 1 命令式对象管理kubectl命令资源类型 type 操作 command 3 2 命令式对象配置3 3 声明式对象配置3 4 总结 二 kubernetes组
  • 嵌入式系统(一):鸿蒙系统

    本文为期末复习笔记 xff0c 内容仅供参考 x1f600 鸿蒙系统是一款面向万物互联时代的 全新的分布式操作系统 鸿蒙提出了基于同一套系统能力 适配多种终端形态的分布式理念提供全场景 xff08 移动办公 运动健康 社交通信 指挥出行 媒
  • 【机组】--总线-例题

    例题1 某总线时钟频率为 66 M H z 66MHz 6 6 M H z xff0c 在一个
  • ROS:运行usb摄像头报错 No JPEG data found in image

    将usb cam功能包从GitHub上clone到ROS的工作空间 xff0c 编译后运行如下命令 xff1a rosrun usb cam usb cam node 然后报错如下 mjpeg 64 0x55e5f4e34120 No JP
  • breakpad简单使用

    breakpad简单使用 文章目录 1 breakpad简介2 源码下载3 源码编译3 1 编译遇到的问题 4 In Process测试程序 xff1a 4 1 测试程序编译4 2 生成sym文件4 3 产生minidump文件4 4 分析
  • 树莓派+PX4固件+T265+MAVROS+QGC实现室内定位

    树莓派 43 PX4固件 43 T265 43 MAVROS 43 QGC实现室内定位 整了整整两礼拜 终于稍微搞明白了一点PX4和MAVROS 因为APM固件下MISSIONPLANNER地面站只能windows下 觉得windows和U

随机推荐

  • Python调用sumo,解决自定义vehicle颜色等问题

    Python调用SUMO接口 xff0c 解决vehicle颜色设置问题 1 Python调用sumo 的traci接口 xff0c 通过 traci vehicle setColor进行设置 以下是 示例代码 span class tok
  • 反向散射通信

    原文 xff1a Ambient Backscatter Communications A Contemporary Survey 反向散射通信 反向散射通信系统根据其体系结构可分为三大类 xff1a a 单基地反向散射通信系统 xff08
  • ESP8266+Micropython+OLED网络天气和时钟

    在网上查了很多的资料 xff0c 打算做一个可以按键显示网络时间和天气预报的东西 手头有WeMos nodeMCU和I2C接口的OLED12864 xff0c 不打算用时钟模块 xff0c 因为ESP8266可以上网 xff0c 完全可以借
  • ros入门与控制无人机

    一 概述 总体来说 xff0c 分为三步 step1 xff1a roscore step2 xff1a 发布话题 step3 xff1a 订阅话题并显示 二 roscore roscore 是你在运行所有ROS程序前首先要运行的命令 现理
  • Oracle创建新用户

    Oracle 创建新用户 SQL语句 span class token operator span span class token operator span span class token operator span 创建用户 cre
  • Centos8.2安装配置 VNC 远程桌面Xfce、解决输入法VNC无法使用的问题、解决浏览器无法播放视频的问题

    本文使用MobaXterm Xshell Xfce TightVNC来搭建百度智能云Centos8 2 同时解决解决输入法VNC无法使用的问题 解决浏览器无法播放视频的问题 目录 一 Windows软件列表 MobaXterm TightV
  • python自定义函数 def 的奇妙世界

    自定义函数 def注意事项案例分析作死挑战函数参数形参与实参位置参数关键字参数默认参数必选参数可变参数可变关键字参数 参数问题解答 这里是三岁 xff0c 来和大家唠唠自定义函数 xff0c 这一个神奇的东西 xff0c 带大家白话玩转自定
  • Qt 怎么设置黑色背景/黑色主题?

    目录 整体分为三步1 更改主题颜色1 1 更改颜色 xff1a 1 2 重启 Qt1 3 第一阶段完成 xff0c 效果如下所示 2 更改编辑器颜色2 1 更改颜色2 2 第二阶段完成 xff0c 效果如下所示 3 更改 Qt 窗口上边框颜
  • YOLOv4在ROS-Melodic上的部署-libtorch(附源码,非Darknet)

    有关YOLOv4 LibTorch的部署可以看我的这篇博客 然后移植到ROS Melodic上就相对简单了 直接上GitHub链接吧 初版可能有点乱 xff0c 但是注释挺详细 xff0c 欢迎交流经验哈 2020 12 16 更新 YOL
  • 手把手安装Windows11虚拟机

    创建虚拟机 想要在虚拟机当中安装windows11系统 xff0c 首先我们就要在Vmware中创建一个虚拟机 这个操作比较简单 xff0c 只需要打开新建虚拟机向导 xff0c 按照提示操作就可以了 在创建虚拟机的时候 xff0c 安装w
  • C++ 学习过程中遇到的难题及解决 (笔记,随更

    C 43 43 报错表达式必须含有常量值 原因 xff1a c 43 43 中不允许使用变量作为数组的长度定义数组 xff0c 必须为常量值 xff0c c 43 43 中所有的内存需求都是在程序执行前通过定义的常量来确定的 C 43 43
  • 一篇文章快速提高Python能力

    确实当你学了Python的一段时间之后会有一阵不知道如何更快的提高自己的功力 其实Python也是语言的一种 xff0c 虽然语法很简单 xff0c 但是内涵真的很丰富 xff0c 招式非常的多 修炼武功我个人觉得分几个层次 第一招是语法
  • python 图形界面库对比合集

    从 Python 语言的诞生之日起 xff0c 就有许多优秀的 GUI 工具集整合到 Python 当中 xff0c 这些优秀的 GUI工具集 xff0c 使得 Python 也可以在图形界面编程领域当中大展身手 xff0c 由于 Pyth
  • TensorFlow深度学习及教程分享

    TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者 xff0c 在机器学习和深度学习上也有很好的实践和积累 xff0c 在2015年年底开源了内部使用的深度学习框架TensorFlow 与Caffe Theano T
  • Python 中国象棋源码 V1

    Pygame 做的中国象棋 xff0c 一直以来喜欢下象棋 xff0c 写了 python 就拿来做一个试试 xff0c 水平有限 xff0c 电脑走法水平低 xff0c 需要在下次版本中更新电脑走法 xff0c 希望源码能帮助大家更好的学
  • python数据爬下来保存在哪里

    昨天下班后忽然兴起想写一个爬虫抓抓网页上的东西 花了一个钟简单学习了python的基础语法 xff0c 然后参照网上的例子自己写了个爬虫 xff08 推荐学习 xff1a Python视频教程 xff09 python数据爬下来保存在本地
  • python求平均值

    python求平均值 首先我们先来了解一下计算平均数的IPO模式 输入 xff1a 待输入计算平均数的数 处理 xff1a 平均数算法 输出 xff1a 平均数 推荐 xff1a python教程 明白了程序的IPO模式之后 xff0c 我
  • 如何用for循环实现一个无限循环

    使用while True可以轻松的实现一个无限循环 xff0c 也叫死循环 xff0c 那么for循环能够实现类似的功能么 xff1f 当然可以 xff0c 借助itertools模块的cycle函数就可以 import time from
  • 闲得发慌之趣味技能:python之猫脸检测

    Python 小猫检测 xff0c 通过调用opencv自带的猫脸检测的分类器进行检测 分类器有两个 xff1a haarcascade frontalcatface xml和 haarcascade frontalcatface exte
  • 目标检测性能的衡量指标:mAP图解

    最近又重新复习了下mAP xff0c 在网上找了有关mAP的文章 xff0c 但是感觉大多数都是左抄一点又抄一点那种 写的比较乱 xff0c 可能因为mAP的计算方法前后变过几次 xff0c 所以导致有很多版本的说法存在 为了更好的理解 x