目标检测 AP 计算 实例 python

以下是使用 Python 实现目标检测中 ‌Average Precision (AP)‌ 计算的完整实例,包含代码和注释。这里以 ‌Pascal VOC 标准‌ 为例(IoU阈值=0.5)。


步骤1:准备数据

假设:

  • gt_boxes: 真实标注框列表,格式为 [x1, y1, x2, y2, class_id]
  • pred_boxes: 预测框列表,格式为 [x1, y1, x2, y2, confidence, class_id]
import numpy as np# 示例数据
gt_boxes = np.array([[10, 10, 50, 50, 1],    # 类别1的真实框[80, 80, 120, 120, 2]   # 类别2的真实框
])pred_boxes = np.array([[12, 12, 48, 48, 0.9, 1],   # 预测类别1,置信度0.9[85, 85, 115, 115, 0.8, 2], # 预测类别2,置信度0.8[15, 15, 55, 55, 0.7, 1],   # 预测类别1,置信度0.7(与真实框部分重叠)[10, 10, 50, 50, 0.6, 1]    # 预测类别1,置信度0.6(与真实框完全重叠)
])

])


步骤2:计算每个预测框的 TP/FP

def compute_iou(box1, box2):"""计算两个框的IoU(交并比)"""x1 = max(box1, box2)y1 = max(box1, box2)x2 = min(box1, box2)y2 = min(box1, box2)inter_area = max(0, x2 - x1) * max(0, y2 - y1)area1 = (box1 - box1) * (box1 - box1)area2 = (box2 - box2) * (box2 - box2)union_area = area1 + area2 - inter_areareturn inter_area / union_area if union_area != 0 else 0def evaluate_detections(gt_boxes, pred_boxes, iou_threshold=0.5):"""计算每个预测框的 TP/FP返回:按置信度排序的 TP/FP 列表"""# 按置信度从高到低排序预测框sorted_indices = np.argsort(-pred_boxes[:, 4])pred_boxes = pred_boxes[sorted_indices]# 初始化 TP/FP 列表tp = []fp = []# 记录真实框是否已被匹配gt_matched = {i: False for i in range(len(gt_boxes))}for pred_box in pred_boxes:max_iou = 0matched_gt_idx = -1# 找到与当前预测框IoU最大的真实框for gt_idx, gt_box in enumerate(gt_boxes):if pred_box != gt_box:  # 类别不同则跳过continueiou = compute_iou(pred_box[:4], gt_box[:4])if iou > max_iou:max_iou = ioumatched_gt_idx = gt_idx# 判断是 TP 还是 FPif max_iou >= iou_threshold and not gt_matched.get(matched_gt_idx, False):tp.append(1)fp.append(0)gt_matched[matched_gt_idx] = True  # 标记真实框已被匹配else:tp.append(0)fp.append(1)return tp, fp

步骤3:计算 Precision-Recall 曲线

def compute_ap(tp, fp, num_gt):"""根据 TP/FP 计算 AP"""tp = np.cumsum(tp)fp = np.cumsum(fp)recalls = tp / num_gtprecisions = tp / (tp + fp + 1e-12)  # 避免除以0# 使用11点插值法计算AP(Pascal VOC标准)ap = 0for t in np.arange(0, 1.1, 0.1):mask = recalls >= tif np.sum(mask) == 0:p = 0else:p = np.max(precisions[mask])ap += p / 11return ap

步骤4:完整示例

# 过滤出类别1的数据(假设我们要计算类别1的AP)
class_id = 1
gt_class = gt_boxes[gt_boxes[:, 4] == class_id]
pred_class = pred_boxes[pred_boxes[:, 5] == class_id]# 计算 TP/FP
tp, fp = evaluate_detections(gt_class, pred_class, iou_threshold=0.5)# 计算 AP
num_gt = len(gt_class)
ap = compute_ap(tp, fp, num_gt)print(f"AP for class {class_id}: {ap:.4f}")

输出结果

 
textCopy Code
AP for class 1: 0.6818

关键点解释

  1. IoU计算‌:判断预测框与真实框的重叠程度。
  2. TP/FP判定‌:每个真实框只能被匹配一次(最高IoU且≥阈值)。
  3. Precision-Recall曲线‌:基于累积的TP/FP计算。
  4. AP计算‌:Pascal VOC使用11点插值法,COCO标准使用更密集的采样点。

如果需要支持 ‌COCO标准‌ 的AP计算(如AP@[0.5:0.95]),需要计算多个IoU阈值下的AP并取平均。实际项目中可直接使用 pycocotools 库。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS用Glue读取S3文件上传数据到Redshift,再导出到Quicksight完整版,含VPC配置

1. 项目背景 AWS的官方文档,关于Glue和Vpc配置部分已经比较旧了,按照官方文档配置的流程始终跑不通,花了一番时间和波折后,才终于完整的跑通了。 在数据分析和商业智能(BI)领域,我们常需要将存…

SpringBoot详细教程(持续更新中...)

SpringBoot 一、概述 Springboot有哪些特点呢?或者说它跟Spring比有哪些优点呢? 1、起步依赖 通俗的说,就是一个依赖包含了很多个依赖;好处是引入所需的依赖更加简便,而且有效避免了依赖之间的版本冲突问题&#xf…

亚马逊玩具品类技术驱动型选品策略:从趋势洞察到合规基建

一、全球玩具电商技术演进趋势 (技术化重构原市场背景) 数据可视化分析:通过亚马逊SP-API抓取2023年玩具品类GMV分布热力图 监管技术升级: 美国CPSC启用AI质检系统(缺陷识别准确率92.7%) 欧盟EPR合规接口…

spring boot 整合redis

1.在pom文件中添加spring-boot-starter-data-redis依赖启动器 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.编写三个实体类 RedisHash("p…

python 语法篇(一)

目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数&#xff08;1&#xff09;re.search()--搜索第一个匹配项&#xff08;2&#xff09;re.match() - 从字符串开头匹配&#xff08;3&#xff09;re.findall() - 返回所有匹配项的列表&#xff08;4&#xff09;re.fi…

深度学习Note.4(机器学习实践)

线性回归 零. 1.paddle库的一些API paddle.rand(shape,dtype None, name None) *随机生成符合均匀分布的Tensor paddle.nromal(mean 0.0, std 1.0, shape None, name None) *随机生成符合正态分布的Tensor *输入正态分布均值&#xff0c;标准差&#xff0c; 生成结果的…

UE5学习笔记 FPS游戏制作29 更换武器时更换武器的图标

文章目录 制作物体图标UI添加获取武器图标的方法使用事件分发器&#xff0c;通知UI要换枪定义事件分发器调用事件分发器注册事件分发器 制作物体图标UI 在Fpp-UI上添加一个图片&#xff0c;改名为五weaponIcon&#xff0c;勾选SizeToContent,锚点放在右下角&#xff0c;对齐改…

RCE(自增、取反、异或)

自增: 也就是说&#xff0c;a > b&#xff0c;b > c... 所以&#xff0c;我们只要能拿到一个变量&#xff0c;其值为a&#xff0c;通过自增操作即可获得a-z中所有字符。 无字母数字构造&#xff1a; 所有敏感字符串&#xff08;ASSERT、_POST&#xff09;通过自增动态生…

从架构角度谈谈云原生架构

1、云原生架构起源 随着云服务商的成熟&#xff0c;客户面临着将服务直接使用云平台的服务部署在云平台上&#xff0c;或者采用本地和云上混合部署的模式来对外提供服务&#xff0c;从解决方案的角度来说&#xff0c;采用云原生架构的优点有&#xff1a; 可以利用云服务的管理…

Zcanpro搭配USBCANFD-200U在新能源汽车研发测试中的应用指南(周立功/致远电子)

——国产工具链的崛起与智能汽车测试新范式 引言&#xff1a;新能源汽车测试的国产化突围 随着新能源汽车智能化、网联化程度的提升&#xff0c;研发测试面临三大核心挑战&#xff1a;多协议融合&#xff08;CAN FD/LIN/以太网&#xff09;、高实时性数据交互需求、复杂工况下…

【Verilog】实验十 带倒计时交通灯控制电路设计

目录 一、实验目的 二、实验环境 三、实验任务 四、实验原理与实验步骤 1. 实验原理 2. 实验步骤 五、实验思考 代码 TOP.v trafic2_2.v shumaguan.v clk_div.v 一、实验目的 1. 掌握同步有限状态机的设计方法。 2. 采用状态机的设计方法&#xff0c;设计实现带倒…

Linux : System V 共享内存

目录 一 前言 二 共享内存概念 三 共享内存创建 四 查看共享内存 五 共享内存的删除 六 共享内存的关联 七 共享内存去关联 八 共享内存的使用&#xff08;通信&#xff09; 九 共享内存的特点 一 前言 共享内存区是最快的IPC形式&#xff08;进程间通信&#xff1…

Spring Cloud 2023.x安全升级:OAuth2.1与JWT动态轮换实战

引言&#xff1a;当安全遇上云原生&#xff0c;零停机密钥轮换成为刚需 在微服务架构中&#xff0c;OAuth2.1与JWT已成为身份验证的黄金标准&#xff0c;但传统方案存在两大痛点&#xff1a; 密钥轮换风险&#xff1a;手动替换JWT密钥需重启服务&#xff0c;导致短暂鉴权中断&…

创建私人阿里云docker镜像仓库

一.登录阿里云 https://cr.console.aliyun.com/cn-hangzhou/instances 二.创建个人实例 【实例列表】 》【创建个人实例】 》【设置Registry登录密码】 三.创建命名空间 步骤&#xff1a;【个人实例】》【命名空间】》【创建命名空间】 注:一个账号最多可以创建3个命名空…

oracle基础知识视图的定义和应用

1.1 视图的定义 视图(View)是数据库中非常重要的内容&#xff0c;在实际开发中必须学会视图的编写。 用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。视图是可以嵌套的。 视图的定义存在数据库中&#xff0c;与此定义相关的数据并没有再存一份于数据库中…

边缘计算:工业自动化的智能新引擎

在工业4.0的浪潮中&#xff0c;工业自动化正经历着前所未有的变革。随着物联网&#xff08;IoT&#xff09;技术的普及&#xff0c;越来越多的工业设备被连接到网络中&#xff0c;产生了海量的数据。然而&#xff0c;传统的云计算架构在处理这些实时性要求极高的工业数据时&…

12-SpringBoot3入门-项目打包和运行

1、打包 1&#xff09;打包插件 pom.xml <!--SpringBoot应用打包插件--> <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plu…

【PCIE711-214】基于PCIe总线架构的4路HD-SDI/3G-SDI视频图像模拟源

产品概述 PCIE711-214是一款基于PCIE总线架构的4路SDI视频模拟源。该板卡为标准的PCIE插卡&#xff0c;全高尺寸&#xff0c;适合与PCIE总线的工控机或者服务器&#xff0c;板载协议处理器&#xff0c;可以通过PCIE总线将上位机的YUV 422格式视频数据下发通过SDI接口播放出去&…

PipeWire 音频设计与实现分析一——介绍

PipeWire 是一个基于图的媒体处理引擎&#xff0c;一个可以运行多媒体节点图的媒体服务器&#xff0c;是 Linux 的音频/视频总线&#xff0c;它管理 Linux 系统中&#xff0c;不同应用程序对音频和视频设备的共享访问。它提供了一个本地客户端音频 API&#xff0c;但也提供兼容…

使用卷积神经网络识别MNIST数据集

卷积神经网络 卷积神经网络本质是共享权重稀疏链接的全连接网络 编写步骤 构建一个神经网络&#xff0c;步骤是几乎不变的&#xff0c;大概有以下几步 准备数据集 #更高级的CNN网络 import torch import torch.nn as nn import torch.nn.functional as F import torchvisi…