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计算逻辑在这两个方法里:
evaluate():逐个样本比对预测结果与标注数据,生成初始的匹配对和未匹配数据。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
相关产品推荐
相关产品推荐

