目标检测中的mAP计算原理和源码实现
简介
在目标检测任务中,mAP(mean Average Precision,平均精度均值)是一个非常重要的评价指标,用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率,能够全面反映模型在检测任务中的表现。
作用:
综合性评估:mAP能够综合考虑模型在不同召回率下的精确率,避免了单一指标(如准确率或召回率)可能带来的片面性。
多类别比较:对于多类别的目标检测任务,mAP可以计算每个类别的AP,然后取平均值得到全局的mAP,从而方便比较模型在不同类别上的性能。
模型选择和调优:通过比较不同模型或不同参数设置下的mAP值,可以选择性能更优的模型或确定最佳的参数配置。
计算方法:
计算每个类别的AP:
对于每个类别,首先根据模型输出的预测框和真实的标注框计算交并比(IOU)。
根据设定的IOU阈值(通常为0.5),将预测框分为真正例(TP)、假正例(FP)和假反例(FN)。
对于每个预测框,根据当前的TP和FP数量计算精确率(Precision)和召回率(Recall)。
绘制该类别的PR曲线,即Precision随Recall变化的曲线。
计算PR曲线下方的面积,得到该类别的AP值。这通常可以通过插值法实现,如11点插值法,即在Recall坐标轴上选择11个点(如0, 0.1, 0.2, …, 1),然后计算这些点对应的Precision的平均值作为AP的近似值。
计算全局的mAP:
对于所有类别,分别计算得到各自的AP值。
将所有类别的AP值取平均值,得到全局的mAP值。
需要注意的是,mAP的计算过程可能因使用的数据集和评估标准而有所不同。例如,COCO数据集和PASCAL VOC数据集在计算mAP时可能采用不同的IOU阈值或插值方法。因此,在实际应用中,需要根据具体的数据集和评估要求来确定mAP的计算方法。
实现过程
假定我的输入为3D的目标检测的pred_boxes和gt_boxes
image_idx cls_id x y z l w h yaw score(for pred_boxes)
pred_boxes = py.array([[0, 1, 13, 13, 0, 6, 6, 2, 0, 0.9],
[0, 0, 35, 30, 0, 10, 8, 2, 0, 0.9],
[1, 0, 12, 30, 0, 6, 9, 2, 0, 0.5]])
gt_boxes = py.array([[0, 1, 10, 10, 0, 6, 6, 2, 0],
[0, 0, 30, 30, 0, 10, 8, 2, 0],
[0, 0, 10, 30, 0, 6, 9, 2, 0]])
可视化一下image_idx=0的boxes:

在每个类别中提取每个样本的这个类别的pred_boxes和gt_boxes,并计算iou值,根据iou阈值划分tp(正确检测)和fp(误检).
over_laps = iou(pred_boxes=pred_boxes_cls_img[:, [2, 3, 5, 6]],gt_boxes=gt_boxes_cls_img[:, [2, 3, 5, 6]])
corr_gts = np.argmax(over_laps, axis=1)
corr_iou = np.max(over_laps, axis=1)
visited_gt = []
for id, pred_box in enumerate(pred_boxes_cls_img):if corr_iou[id] >= iou_threshold and corr_gts[id] not in visited_gt:visited_gt.append(corr_gts[id]) # if pred got gt, the gt should be ignorefp_or_tp.append(1)else:fp_or_tp.append(0)
统计所有样本的pred_boxes的tp/fp类型及其score,安照score降序排序.
scores = pred_boxes_cls[:, -1]
index = np.argsort(-scores, )
# sort fp_or_tp by decending order of scores
fp_or_tp = fp_or_tp[index]
根据score列表依次选择有效的pred_boxes,计算precision=tp/(tp+fp)和recall=tp/gt_boxes.size().
precision和recall列表形成pr曲线,计算pr曲线面积即可.
# 根据>=score的是有效pred,有效pred中,0是f,1是检测到了目标, 1的数量除以总的有效pred就precious
# 1的数量除以真值数量就是recall
tp_num_list = np.cumsum(fp_or_tp)
pred_num_list = np.cumsum(np.ones_like(fp_or_tp))
precision_array = tp_num_list / pred_num_list
recall_array = tp_num_list / tp_and_tn
ap = compute_ap(recall_array, precision_array, class_name)
注意求pr曲线面积时,横坐标(长)要是recall,而不能是用score求平均precision.
思考下:
pr曲线会不会出现左低右高的情况?是有的,当fp的score较高时候就会出现这个问题.比如score最高的第一个就是fp.那么这时recall很小时,precision为0.
解决方法:recall_list和precision_list的首尾补上(0,1)或者(1,0),然后单调性处理

再分析下:score降序,recall肯定是递增的,但是precision不一定是递减,因此需要使得它单调,具体操作:
for i in range(len(precision_array)-1, 0,-1):precision_array[i-1] = np.max(precision_array[i-1], precision_array[i])
参考:b站视频
相关文章:
目标检测中的mAP计算原理和源码实现
简介 在目标检测任务中,mAP(mean Average Precision,平均精度均值)是一个非常重要的评价指标,用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率,能够全面反映模型在检测任务中…...
Unity 粒子在UI中使用时需要注意的地方
最近项目中要在UI中挂载粒子特效,美术给过来的粒子直接放到UI中会有一些问题,查询一些资料后,总结了一下 一: 粒子的大小发生变化,与在预制件编辑中设计的大小不同 在预制件编辑模式下,大小正常 实际使用的时候特别大或者特别小 经过检查,发现预制件编辑模式下,默认画布的Rend…...
了解Spring:Java开发的利器
Spring是一款开源的轻量级Java开发框架,旨在提高开发人员的效率和系统的可维护性。本文将介绍Spring的基本概念、使用优势、设计模式以及与Spring MVC和Spring Boot的关联。 什么是Spring? Spring是一款开源的轻量级Java开发框架,它由多个模…...
【Hive】with 语法 vs cache table 语法
语法分别如下: cache table table_name as (select ... from ... )with table_name as (select ... from ... )需要注意,with语法只相当于一个视图,并不会将数据缓存;如果要将数据缓存,需要使用cache table语法。 参考…...
CleanMyMac X 4.15.1 for Mac 最新中文破解版 系统优化垃圾清理工具
CleanMyMac X for Mac 是一款功能更加强大的系统优化清理工具,相比于 CleanMyMac 4.15.1来说,功能增加了不少,此版本为4.15.1官方最新中英文正式破解版本,永久使用,解决了打开软件崩溃问题,最新版4.15.1版本…...
查看Linux系统重启的四种基本命令
目录 前言1. last2. uptime3. journalctl4. dmesg 前言 对于排查其原因推荐阅读:详细分析服务器自动重启原因(涉及Linux、Window) 在Linux中,有多种命令可以查看系统重启的信息 以下是其中一些常用的命令及其解释: …...
I/O多路复用:select/poll/epoll
最基本的 Socket 模型 要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。 Socket 的中文名叫作插口,咋一看还挺迷惑的。事实上,双方要…...
使用ansible批量修改操作系统管理员账号密码
一、ansible server端配置 1、对于Linux主机配置免密登录ssh-copy-id -i ~/.ssh/id_rsa.pub rootremote_ip 2、在/etc/ansible/hosts文件中添加相应主机IP 3、对于Windows主机需要在/etc/ansible/hosts文件中进行以下配置 192.168.83.132 ansible_ssh_useradministrator an…...
webpack5零基础入门-13生产模式
1.生产模式介绍 生产模式是开发完成代码后,我们需要得到代码将来部署上线。 这个模式下我们主要对代码进行优化,让其运行性能更好。 优化主要从两个角度出发: 优化代码运行性能优化代码打包速度 2.生产模式准备 我们分别准备两个配置文件来放不同的…...
一篇复现Docker镜像操作与容器操作
华子目录 Docker镜像操作创建镜像方式1docker commit示例 方式2docker import示例1:从本地文件系统导入示例2:从远程URL导入注意事项 方式3docker build示例1:构建镜像并指定名称和标签示例2:使用自定义的 Dockerfile 路径构建镜像…...
【LevelDB】memtable、immutable memtable的切换源码
本文主要分析leveldb项目的MakeRoomForWrite方法及延伸出的相关方法。 努力弄清memtable 和 immutable memtable的切换过程细节, 背景总结: LevelDB 是一个基于 Log-Structured Merge-Tree (LSM Tree) 的高性能键值存储系统。 在 LevelDB 中࿰…...
力扣面试150 x 的平方根 二分 换底法 牛顿迭代法 一题多解
Problem: 69. x 的平方根 思路 👨🏫 参考题解 💖 袖珍计算器算法 class Solution {public int mySqrt(int x){if (x 0)return 0; // Math.exp(3):e的三次方int ans (int) Math.exp(0.5 * Math.log(x));return (long) (an…...
【JavaScript】JavaScript 程序流程控制 ⑤ ( 嵌套 for 循环 | 嵌套 for 循环概念 | 嵌套 for 循环语法结构 )
文章目录 一、嵌套 for 循环1、嵌套 for 循环概念2、嵌套 for 循环语法结构 二、嵌套 for 循环案例1、打印三角形2、打印乘法表 一、嵌套 for 循环 1、嵌套 for 循环概念 嵌套 for 循环 是一个 嵌套的 循环结构 , 其中一个 for 循环 位于另一个 for 循环的内部 , 分别是 外层 f…...
情感计算:大模型在情感识别与交互优化中的作用
情感计算:大模型在情感识别与交互优化中的作用 1. 背景介绍 情感计算(Affective Computing)是人工智能领域的一个重要分支,它致力于使计算机能够识别、理解、处理和模拟人类的情感。随着深度学习、大数据和计算能力的飞速发展&a…...
集合系列(十四) -ConcurrentHashMap详解
一、摘要 在之前的集合文章中,我们了解到 HashMap 在多线程环境下操作可能会导致程序死循环的线上故障! 既然在多线程环境下不能使用 HashMap,那如果我们想在多线程环境下操作 map,该怎么操作呢? 想必阅读过小编之前…...
数据结构面试题
1、数据结构三要素? 逻辑结构、物理结构、数据运算 2、数组和链表的区别? 数组的特点: 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。数组的插入数据和删除数据效率低…...
python爬虫之xpath入门
文章目录 一、前言参考文档: 二、xpath语法-基础语法常用路径表达式举例说明 三、xpath语法-谓语表达式举例注意 四、xpath语法-通配符语法实例 五、选取多个路径实例 六、Xpath Helper安装使用说明例子: 七、python中 xpath 的使用安装xpath 的依赖包xm…...
TikTok云手机是什么原理?
社交媒体的快速发展和普及,TikTok已成为全球最受欢迎的短视频平台之一,吸引了数以亿计的用户。在TikTok上,许多用户和内容创作者都希望能够更灵活地管理和运营多个账号,这就需要借助云手机技术。那么,TikTok云手机究竟…...
24.3.24 《CLR via C#》 笔记10
第十三章 接口 类和接口继承 CLR不支持多继承,因此所有托管编程语言都不支持任何类都从且只能从一个类派生(最终从Object类派生)定义接口实际只是对一组方法进行了统一的命名,类通过指定接口名称来继承接口,且必须显式…...
SpringBoot 3整合Elasticsearch 8
这里写自定义目录标题 版本说明spring boot POM依赖application.yml配置新建模型映射Repository简单测试完整项目文件目录结构windows下elasticsearch安装配置 版本说明 官网说明 本文使用最新的版本 springboot: 3.2.3 spring-data elasticsearch: 5.2.3 elasticsearch: 8.1…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
