当前位置: 首页 > article >正文

目标检测评估指标mAP详解:原理与代码

目标检测评估指标mAP详解:原理与代码

  • 目标检测评估指标mAP详解:原理与代码
    • 一、前言:为什么需要mAP?
    • 二、核心概念解析
      • 2.1 PR曲线(Precision-Recall Curve)
      • 2.2 AP计算原理
    • 三、代码实现详解
      • 3.1 核心函数`ap_per_class`
      • 3.2 AP计算函数`compute_ap`
    • 四、关键实现细节
      • 4.1 排序的重要性
      • 4.2 插值处理技巧
      • 4.3 平滑处理
    • 五、结果解读与可视化
      • 5.1 输出指标解析
    • 六、实际应用建议
    • 七、常见问题FAQ
    • 八、完整代码获取

目标检测评估指标mAP详解:原理与代码

一、前言:为什么需要mAP?

在目标检测任务中,mAP(mean Average Precision)是最重要的评估指标之一。本文将深入解析:

  • 精确率(Precision)与召回率(Recall)的平衡关系
  • PR曲线的绘制原理
  • AP(Average Precision)的计算方法
  • 多类别场景下的mAP计算
  • 附完整代码实现与逐行解析

二、核心概念解析

2.1 PR曲线(Precision-Recall Curve)

PR曲线是评估分类模型性能的重要工具,其绘制过程包含以下关键步骤:

  1. 将预测结果按置信度降序排列
  2. 以不同置信度阈值划分正负样本
  3. 计算各阈值下的Precision和Recall
  4. 连接所有点形成曲线

PR曲线示例(参考P-R曲线绘制原理及代码实现):
在这里插入图片描述

2.2 AP计算原理

AP即PR曲线下面积,计算方法主要有两种:

  1. 插值法(COCO标准)
    在11个等间距Recall值(0.0, 0.1,…,1.0)处取最大Precision求平均

  2. 连续积分法(VOC2007标准)
    对Recall进行分段积分计算

三、代码实现详解

3.1 核心函数ap_per_class

def ap_per_class(tp, conf, pred_cls, target_cls, plot=False, save_dir=".", names=(), eps=1e-16, prefix=""):"""计算每个类别的平均精度(Average Precision,AP),并生成相关评估指标和曲线图。来源: https://github.com/rafaelpadilla/Object-Detection-Metrics参数:tp (numpy.ndarray): 形状为[n, 1]或[n, 10]的布尔数组,表示预测框是否为真正例(True Positive)conf (numpy.ndarray): 预测框的置信度数组,范围0-1pred_cls (numpy.ndarray): 预测框的类别数组target_cls (numpy.ndarray): 真实框的类别数组plot (bool): 是否绘制P-R曲线(mAP@0.5时的曲线)save_dir (str): 绘图保存路径names (dict/array): 类别名称字典或列表eps (float): 防止除零的小量prefix (str): 保存文件的前缀返回:(tuple): 包含各类评估指标的元组:- tp (numpy.ndarray): 真正例数量(按类别)- fp (numpy.ndarray): 假正例数量(按类别)- p (numpy.ndarray): 精确率数组(按类别)- r (numpy.ndarray): 召回率数组(按类别)- f1 (numpy.ndarray): F1分数数组(按类别)- ap (numpy.ndarray): AP值数组,形状为[nc, 10](不同IoU阈值下的AP)- unique_classes (numpy.ndarray): 存在的类别索引数组"""# 按置信度降序排序(关键第一步)i = np.argsort(-conf)tp, conf, pred_cls = tp[i], conf[i], pred_cls[i]# 统计唯一类别unique_classes, nt = np.unique(target_cls, return_counts=True)nc = unique_classes.shape[0]# 初始化数据结构px = np.linspace(0, 1, 1000)ap = np.zeros((nc, tp.shape[1]))# 遍历每个类别for ci, c in enumerate(unique_classes):# 筛选当前类别的预测结果i = pred_cls == cn_l = nt[ci]  # 真实框数量n_p = i.sum()  # 预测框数量if n_p == 0 or n_l == 0:continue# 累积计算FP和TP(cumsum返回累积和)# fpc: 累积假正例(False Positive Cumulative)# tpc: 累积真正例(True Positive Cumulative)fpc = (1 - tp[i]).cumsum(0)  # 1 - TP 得到FP,然后累加tpc = tp[i].cumsum(0)       # 直接累加TP# 计算召回率(Recall = TP / (TP + FN) = TP / 真实框数)recall = tpc / (n_l + eps)  # 召回率曲线# 将召回率插值到统一坐标px(通过置信度排序后的位置)(置信度递减)r[ci] = np.interp(-px, -conf[i], recall[:, 0], left=0)# 计算精确率(Precision = TP / (TP + FP))precision = tpc / (tpc + fpc + eps)  # 精确率曲线# 插值得到统一坐标下的精确率p[ci] = np.interp(-px, -conf[i], precision[:, 0], left=1)# 计算APfor j in range(tp.shape[1]):ap[ci, j], _, _ = compute_ap(recall[:, j], precision[:, j])# 计算F1分数f1 = 2 * p * r / (p + r + eps)# 绘制曲线(可选)if plot:plot_pr_curve(...)plot_mc_curve(...)# 寻找最优F1阈值(平滑后)i = smooth(f1.mean(0), 0.1).argmax()  # 最大F1索引p, r, f1 = p[:, i], r[:, i], f1[:, i]  # 取该索引处的值# 计算最终统计量tp = (r * nt).round()   # 真正例数 = 召回率 * 真实框数fp = (tp / (p + eps) - tp).round()  # 假正例数 = 总预测数 - 真正例数(由p = tp/(tp+fp)推导)return tp, fp, p, r, f1, ap, unique_classes.astype(int)

3.2 AP计算函数compute_ap

def compute_ap(recall, precision):"""根据召回率和精确率曲线计算平均精度(AP)参数:recall (numpy.ndarray): 召回率曲线数组precision (numpy.ndarray): 精确率曲线数组返回:ap (float): 平均精度mpre (numpy.ndarray): 调整后的精确率曲线mrec (numpy.ndarray): 调整后的召回率曲线"""# 在曲线首尾添加哨兵值(确保从0开始,到1结束)mrec = np.concatenate(([0.0], recall, [1.0]))mpre = np.concatenate(([1.0], precision, [0.0]))# 计算精确率包络线(确保曲线单调递减)mpre = np.flip(np.maximum.accumulate(np.flip(mpre)))# 计算AP(积分方法:连续法或插值法)method = "interp"  # 使用COCO的101点插值法if method == "interp":x = np.linspace(0, 1, 101)  # 生成101个插值点ap = np.trapz(np.interp(x, mrec, mpre), x)  # 梯形积分计算面积else:  # 'continuous'方法i = np.where(mrec[1:] != mrec[:-1])[0]  # 找出召回率变化的点ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])  # 计算矩形面积和return ap, mpre, mrec

四、关键实现细节

4.1 排序的重要性

  • 置信度降序排列是正确绘制PR曲线的前提
  • 高置信度预测优先处理,模拟实际检测流程

4.2 插值处理技巧

np.interp(-px, -conf[i], recall[:, 0], left=0)
  • 使用负号实现降序插值
  • left参数处理边界情况

4.3 平滑处理

def smooth(y, f=0.05):nf = round(len(y) * f * 2) // 2 + 1  # 确保奇数窗口yp = np.concatenate(([y[0]]*(nf//2), y, [y[-1]]*(nf//2)))return np.convolve(yp, np.ones(nf)/nf, mode='valid')
  • 使用滑动平均消除曲线抖动
  • 边缘值填充避免边界效应

五、结果解读与可视化

5.1 输出指标解析

指标说明
tp真正例数量(按类别)
fp假正例数量(按类别)
p精确率数组
r召回率数组
f1F1分数数组
apAP值数组(不同IoU阈值)

六、实际应用建议

  1. 数据准备

    • 确保预测结果与真实标签格式统一
    • 类别ID需要连续编号
  2. 参数调整

    • 调整eps防止除零错误
    • 修改px的分辨率平衡精度与效率
  3. 多阈值评估

    • 默认支持多个IoU阈值评估(tp.shape[1]维度)
    • 可通过调整输入tp结构实现

七、常见问题FAQ

Q1:为什么我的AP计算结果异常高/低?

  • 检查输入数据是否排序正确
  • 验证真实标签与预测结果的ID对应关系

Q2:如何计算COCO格式的mAP?

  • 需要设置多个IoU阈值(0.5:0.95)
  • 对各个阈值下的AP取平均

Q3:类别不平衡问题如何解决?

  • 建议使用加权mAP
  • 可在最终计算时添加类别权重

八、完整代码获取

访问GitHub仓库获取最新完整代码:
https://github.com/ultralytics/yolov5

觉得本文有帮助?欢迎点赞⭐收藏📝留言!

相关文章:

目标检测评估指标mAP详解:原理与代码

目标检测评估指标mAP详解:原理与代码 目标检测评估指标mAP详解:原理与代码一、前言:为什么需要mAP?二、核心概念解析2.1 PR曲线(Precision-Recall Curve)2.2 AP计算原理 三、代码实现详解3.1 核心函数ap_pe…...

【风控】模型算法区分度指标KS

一、KS指标的定义原理 背景 KS(Kolmogorov–Smirnov)原本用于检验样本分布与理论分布或两个样本分布是否一致。风控建模中,将“好样本”(Good)与“坏样本”(Bad)的模型输出概率看作两组经验分布…...

道可云人工智能每日资讯|浙江省人民政府印发《关于支持人工智能创新发展的若干措施》

道可云元宇宙每日简报(2025年5月21日)讯,今日元宇宙新鲜事有: 浙江省人民政府印发《关于支持人工智能创新发展的若干措施》 为抢占人工智能发展制高点,打造全球人工智能创新发展高地,浙江省人民政府于近日…...

win11下jenkins+docker+maven自动部署springboot项目

win11下jenkinsdockermaven自动部署springboot项目 一、前置软件安装二、jenkins配置三、springboot项目准备四、jenkins打包部署项目到本地docker中五、jenkins打包部署项目到远程服务器docker中 一、前置软件安装 docker安装 需要开启wsl,以管理员身份运行docke…...

密码学标准(Cryptography Standards)介绍

密码学标准(Cryptography Standards)是为确保信息安全传输、存储和处理而制定的一系列技术规范和协议,广泛应用于通信、金融、互联网等领域。以下从分类、主流标准、应用场景和发展趋势四个方面进行详细介绍: 一、密码学标准的分类 密码学标准可根据技术原理和应用场景分…...

2 卡尔曼滤波

卡尔曼滤波是啥? 卡尔曼滤波就像是一个“智能猜谜大师”,专门用来在不确定的情况下,算出最接近真实值的答案。 核心思想: 预测(猜):根据之前的经验,猜现在大概是什么状态&#xff…...

《决策科学与艺术》No1: 决策树:概念、原理、发展历史、特点及应用

决策树:概念、原理、发展历史、特点及应用 摘要 决策树是一种广泛使用的机器学习和决策分析方法,以其可解释性、简洁性和多功能性著称。本文全面介绍了决策树的概念基础、基本原理、发展历程、显著特征及其在商业、医疗、金融和工程等多个领域的典型应用…...

手机合集(不定期更新)

一、华为手机: 1.华为手机自助维修的方法: https://blog.csdn.net/humors221/article/details/145946128 2.华为手机实用功能介绍: https://blog.csdn.net/humors221/article/details/132514011 3.华为手机清理大数据的方法:…...

掌握正则表达式:从基础语法到工程实践

引言:正则表达式的力量与边界​​ 在信息爆炸的数字时代,​​正则表达式(Regular Expression)​​ 作为文本处理的“瑞士军刀”,已成为开发者、数据分析师、运维工程师等群体的核心技能。它能用简洁的符号逻辑描述复杂…...

Prometheus 基础入门文档

目录 概述 核心组件详解 Prometheus Server Exporters Alertmanager 存储解决方案 安装与配置 安装方法 基本配置 示例配置文件 数据模型与查询语言 数据模型 PromQL 查询语言 示例查询 告警系统 告警规则 示例告警规则 Alertmanager 配置 示例 Alertmanager…...

【数据分析】什么是特征蒸馏?

引言 —— “ 在数据洪流中提炼真金——解密特征蒸馏的艺术。” 在数据爆炸的时代,我们每天产生的信息量已远超人类处理能力的极限。当企业拥有百万维的用户行为数据,医疗研究者面对TB级的基因测序记录,工程师试图从千万张图像中识别关键模式…...

【苍穹外卖】Day01—Mac前端环境搭建

目录 一、安装Nginx (一)安装Homebrew (二)Homebrew安装Nginx 1. 执行安装命令: 2. 验证安装: (三)启动与停止Nginx 二、配置Nginx 1. 替换nginx.conf 2. 替换html文件夹 三…...

Apollo10.0学习——planning模块(9)之参数详解一

planning.conf --flagfilemodules/common/data/global_flagfile.txt # 加载全局通用配置,包含基础运行参数 --traffic_rule_config_filenamemodules/planning/planning_component/conf/traffic_rule_config.pb.txt # 交通规则配置文件,定义信号灯、停车…...

Python-多进程编程 (multiprocessing 模块)

目录 一、创建进程1. Process 的语法结构2. 进程不共享全局变量 二、进程间通信1. 队列通信2. 管道通信 三、进程池1. 常用函数2. 进程池中的 Queue 四、应用:复制文件夹(多进程版)五、守护进程和进程同步六、注意事项 通过使用 multiprocess…...

GraphQL在.NET 8中的全面实践指南

一、GraphQL与.NET 8概述 GraphQL是一种由Facebook开发的API查询语言,它提供了一种更高效、更灵活的替代REST的方案。与REST不同,GraphQL允许客户端精确指定需要的数据结构和字段,避免了"过度获取"或"不足获取"的问题。…...

在mobaxterm下面执行shell脚本报错

关键步骤:在 MobaXterm 的 SSH 会话中强制指定 Bash 解释器 若你曾通过 高级 SSH 设置中的「执行命令」 填写 /bin/bash 解决脚本问题,以下是具体操作和原理说明: 1. 设置位置 打开 MobaXterm,选择需要配置的 SSH 会话&#xff0…...

系统集成项目管理工程师学习笔记之启动过程组

第十章 启动过程组 制定项目章程 定义 制定项目章程是编写一份正式批准项目并授权项目经理在项目活动中使用组织资源的文件的过程。 正式批准的项目文件 作用 1、明确项目与组织战略目标之间的直接联系 2、确立项目的正式地位 3、展示组织对项目的承诺 本过程仅开展一…...

OceanBase数据库全面指南(数据操作篇DML)

文章目录 一、OceanBase插入数据全指南1.1 INSERT语句基础用法1.2 高级INSERT用法1.2.1 插入查询结果1.2.2 多表插入1.2.3 条件插入1.3 INSERT性能优化技巧1.3.1 批量插入优化1.3.2 使用APPEND提示1.3.3 并行插入二、OceanBase批量插入优化2.1 多行插入语法详解2.2 批量绑定技术…...

深入解析AI中的Prompt工程:从理论到实践

目录 引言:Prompt在AI中的核心地位 第一部分:Prompt基础理论 1.1 什么是Prompt 1.2 ICIO框架:Prompt设计的结构化方法 1.3 为什么需要Prompt 1.4 Prompt的终极价值 第二部分:Prompt工程实践 2.1 Prompt工程概述 2.2 Prompt工程的具体内容 2.3 Prompt Engineer的工…...

软考中级软件设计师——设计模式篇

一、设计模式核心分类 设计模式分为 3 大类,共 23 种模式(考试常考约 10-15 种): 分类核心模式考试重点创建型模式工厂方法、抽象工厂、单例、生成器、原型单例模式的实现(懒汉、饿汉)、工厂模式的应用场…...

matlab二维随机海面模拟

二维随机海面模拟是一种重要的技术,广泛应用于海洋工程、船舶设计、雷达系统和光学通信等领域。利用蒙特卡罗方法结合二维海浪功率谱模型,可以生成符合实际海面特性的随机表面。 步骤 1: 定义海浪功率谱模型 海浪功率谱模型描述了海浪能量在不同频率和…...

Axure系统原型设计列表版方案

列表页面是众多系统的核心组成部分,承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计,能够极大提升用户获取信息的效率,优化操作体验。下面,我们将结合一系列精心设计的列表版方案图片,深入探讨如何打造出实…...

微软全新开源命令行文本编辑器:Edit — 致敬经典,拥抱现代

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、引言:命令行的新利器二、Edit:致敬经典,拥抱现代1. 命令行的“新升级”2. 为什么要有 Edit?三、核心功能与特性一览1. 完全开源、MIT 许可证…...

年会招标抽奖活动软件———仙盟创梦IDE

年会是企业一年的总结与欢庆时刻,而抽奖环节更是点燃全场气氛的关键。如何让抽奖环节既大气又充满仪式感?选对抽奖软件至关重要!本文精心挑选了 3 款兼具实用性与氛围感的年会抽奖软件,从界面设计到功能特色,全方位为你…...

智防火灾,慧控能耗:物联网赋能金融行业电气安全革新

摘要 随着金融行业对电气安全需求的不断提升,传统用电管理模式已难以满足现代金融机构对火灾防控、能耗管理和智能运维的要求。本文基于物联网、云计算及大数据分析技术,提出一套针对金融行业的安全用电解决方案。该方案通过智能化硬件部署与平台化管理…...

Any类(C++17类型擦除,也称上帝类)

Any类(C17类型擦除,也称上帝类) 在C中,std::any 是C17标准引入的一个灵活的类型安全容器,用于存储任意类型的单个值。 1. std::any 的核心特性 类型安全:存储的值必须通过明确的类型转换(any_…...

jquery.table2excel方法导出

jquery提供了一个table2excel方法可以用来导出页面到xls等 $("#grid_595607").table2excel({exclude: ".noExport", // 排除类名为 noExport 的元素filename: "导出数据.xls",exclude_img: true, // 不导出图片exclude_links: true, // 不导…...

Spring Boot 多租户架构实现:基于上下文自动传递的独立资源隔离方案

一、核心设计思想 通过线程上下文自动传递租户ID,结合动态数据源路由和中间件连接工厂,实现MySQL、Redis、RocketMQ的完全自动化资源隔离。关键设计如下: #mermaid-svg-ZjXCGSWoCuNFMIch {font-family:"trebuchet ms",verdana,aria…...

在 JavaScript 中正确使用 Elasticsearch,第二部分

作者:来自 Elastic Jeffrey Rengifo 回顾生产环境中的最佳实践,并讲解如何在无服务器环境中运行 Elasticsearch Node.js 客户端。 想获得 Elastic 认证?查看下一期 Elasticsearch Engineer 培训的时间! Elasticsearch 拥有大量新…...

更新nvidia-container-toolkit 1.17.7-1后,运行--gpus all 卡死问题

用Arch每日一滚,结果今天用 sudo docker run -it --runtimenvidia --gpus all居然卡死了,排雷排了几小时,才从开源库发现问题 nvidia-container-toolkit 1.17.7-1 是有问题的,而且在ubuntu和arch上都存在问题。 只好Downgrade 1.…...