cocoeval计算COCO数据集box mAP源码解析(nandet test部分)

本文深入解析了在nanodet中使用pytorch lightning进行box mAP计算的过程,从evaluate()、accumulate()到summarize(),详细阐述了COCOeval在计算精度、召回率以及mAP时的步骤,包括预测结果的处理、box坐标转换、匹配判断、precision和recall的计算,以及最终mAP的汇总。

本文主要通过nanodet的例子,解读cocoeval的box mAP计算过程。
计算过程主要用了COCOeval的3个函数,
evaluate(): 对每张图片,每个类别用不同IOU阈值得到和gt box的match
accumulate(): 计算precision, recall, 平滑precision-recall曲线
summarize(): 计算mAP, mAR

mAP计算原理见IOU,precision, recall, mAP详解

下面会以nanodet的test部分为切入点详细解析这些函数的计算过程。

test部分主要对模型的预测结果做evaluation.
evaluation的标准为box mAP。

nanodet用的是pytorch lightning框架,很多都是pytorch_lightning内部的调用,这个mAP到底是在哪里计算的。
下面会一步一步看。

nanodet/tools/test.py开始,不看的地方用…代替。
代码中我们看到args中需要指定config文件,于是指定为config/nanodet-plus-n_416.yml
在这个config文件的data部分,只有train和val,并没有test,
你可以添加test数据,
这里没有添加,指定task参数为"val".

所以parameter为:</

### COCO 数据集mAP计算方法 在 COCO 数据集的目标检测任务中,mAP 是一种广泛使用的评价指标。它不仅考虑了预测框的位置准确性(通过 IoU 衡量),还综合评估了类别分类的精确度和召回率。 #### 1. **IoU 阈值的选择** COCO 数据集采用了多 IoU 阈值的方式来更全面地评估模型性能。不同于 PASCAL VOC 中固定的单个 IoU=0.5 阈值,COCO 使用了一系列 IoU 值来定义 AP[^3]。这些 IoU 值范围是从 0.5 到 0.95,步长为 0.05,即 {0.5, 0.55, ..., 0.95}。最终的 mAP 被定义为在这几个 IoU 下的 AP 平均值: \[ mAP = \frac{1}{n} \sum_{i=0.5}^{0.95} AP_i \] 其中 \( n = 10 \) 是不同的 IoU 阈值数量。 --- #### 2. **Precision 和 Recall 曲线** 为了构建 PR 曲线,在目标检测中需要对每个类别的预测结果按照置信度降序排列,并依次计算 Precision (P) 和 Recall (R)[^1]。具体过程如下: - 对于每张图片上的所有预测框,按置信度排序; - 将预测框与真实标注框匹配,判断其是否为 True Positive 或 False Positive; - 根据 TP/FP 统计当前状态下的 Precision 和 Recall。 随后绘制出完整的 PR 曲线。 --- #### 3. **Average Precision (AP)** 的计算 COCO 数据集采用插值法计算 AP,类似于 PASCAL VOC 的方式,但更加精细。以下是具体的步骤: - 设定一组 recall 阈值:\( R = [0, 0.1, 0.2, ..., 1] \); - 对于每个 recall 阈值 \( r_k \in R \),找到对应的最高 precision 值 \( p(r_k) \); - 计算 AP 作为这些最大 precision 值的平均值: \[ AP = \frac{1}{|R|} \sum_{k=1}^{|R|} p(r_k) \] 这里需要注意的是,COCO 不再局限于传统的 “11-point interpolation”,而是基于连续的 PR 曲线下面积进行积分近似[^2]。 --- #### 4. **整体 mAP 的公式化表达** 结合上述内容,可以总结出 COCO 数据集mAP 的完整计算公式: \[ mAP = \frac{1}{N_c} \sum_{c=1}^{N_c} \left( \frac{1}{N_I} \sum_{I=0.5}^{0.95} AP(c, I) \right) \] 其中: - \( N_c \): 类别总数; - \( N_I \): IoU 阈值的数量 (\( N_I = 10 \)); - \( AP(c, I) \): 在特定类别 \( c \) 和 IoU 阈值 \( I \) 下的 Average Precision。 --- #### 5. 实现代码示例 以下是一个简单的 Python 示例,展示如何利用 `pycocotools` 库计算 COCO 数据集上的 mAP: ```python from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval # 初始化 GT 和 DT 文件路径 annFile = 'path/to/coco_annotations.json' resFile = 'path/to/results.json' # 加载 COCO 数据集对象 cocoGt = COCO(annFile) # 加载预测结果文件 cocoDt = cocoGt.loadRes(resFile) # 创建 COCOEval 对象并指定参数 cocoEval = COCOeval(cocoGt, cocoDt, iouType='bbox') # 运行评估 cocoEval.evaluate() cocoEval.accumulate() cocoEval.summarize() print(f"COCO mAP@IoU=[0.5:0.95]: {cocoEval.stats[0]}") ``` 此脚本会输出标准的 COCO mAP 结果以及其他统计信息。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值