You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MaskRCNN模型测试:提取AP/AR并绘制Precision-recall曲线问询

MaskRCNN中AP/AR提取与计算逻辑解析

一、AP/AR的存储位置

在coco_eval.py的COCOeval类中,所有评估相关的计算结果都存在成员变量self.eval里,核心数据结构如下:

  • self.eval['precision']:多维数组,形状为[T, R, K, A, M],各维度含义:
    • T:IoU阈值(默认是0.5到0.95,步长0.05,共10个取值)
    • R:Recall阈值(0到1,步长0.01,共101个取值)
    • K:数据集的类别总数
    • A:目标尺寸难度(0=所有尺寸,1=小目标,2=中目标,3=大目标)
    • M:任务类型(0=边界框检测,1=掩码分割,对应MaskRCNN的两个任务)
  • self.eval['recall']:多维数组,形状为[T, K, A, M],存储不同IoU、类别、难度下的最大Recall值。

二、计算逻辑的位置

summarize()方法只是负责从已计算好的结果中提取统计值并打印,真正的AP/AR计算逻辑在这两个方法里:

  1. evaluate():逐个样本比对预测结果与标注数据,生成初始的匹配对和未匹配数据。
  2. accumulate():对所有样本的匹配结果进行累积统计,计算不同IoU、类别、难度下的Precision和Recall数值,最终填充到self.eval['precision']和self.eval['recall']中。

三、提取数据并绘制Precision-Recall曲线

假设你已经完成评估流程(调用过coco_eval.evaluate()和coco_eval.accumulate()),可以按以下步骤操作:

1. 提取单类别、单IoU的PR曲线数据

比如提取IoU=0.5、全尺寸、边界框任务下,类别索引为0的PR数据:

import numpy as np

# 假设coco_eval是已完成累积计算的COCOeval实例
iou_idx = 0  # 对应IoU=0.5(默认IoU列表索引0为0.5)
cat_idx = 0  # 目标类别索引
area_idx = 0  # 0代表所有尺寸目标
task_idx = 0  # 0=边界框,1=掩码分割

# 获取Precision数组:长度101,对应Recall从0到1的每个步长值
precision = coco_eval.eval['precision'][iou_idx, :, cat_idx, area_idx, task_idx]
# 生成对应的Recall数组:0到1,步长0.01
recall = np.linspace(0, 1, 101)

2. 绘制PR曲线

用matplotlib实现:

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 6))
plt.plot(recall, precision, label=f'Class {cat_idx}, IoU=0.5')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend()
plt.grid(True)
plt.show()

3. 提取AP值

AP是Precision在Recall区间上的平均(或积分),可以直接从已计算的数组中提取:

# 提取对应条件下的AP值,和summarize打印结果一致
ap = coco_eval.eval['precision'][iou_idx, :, cat_idx, area_idx, task_idx].mean()

如果需要掩码分割任务的结果,只需将task_idx改为1;要针对特定尺寸目标,调整area_idx为1/2/3即可。

内容的提问来源于stack exchange,提问作者Leon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 13:10:30