关于pycocotools中COCOeval类accumulate函数的技术疑问
pycocotools cocoeval.py 核心疑问解答
npig变量含义:npig是
number of positive images的缩写,指包含至少一个标注目标的图像总数,和negative-positive完全无关。代码里它用来统计存在ground truth的图像数量,是计算召回率时的关键分母项。能否用self.eval的precision/recall画PR曲线:可以直接用,但要注意多维数组的维度对应。
self.eval['precision']是形状为[T, R, K, A, M]的数组,self.eval['recall']是[R, K, A, M]的数组。如果要绘制单类别的PR曲线,需要先提取对应维度的数据——比如指定IoU阈值(如0.5对应索引0)、类别索引、难度等级(all对应0)、任务类型(bbox对应0),再用提取后的precision和recall数组绘图。scores是不是F1 score:不是。这里的scores是模型输出的检测框置信度分数,即模型判断该框为目标的概率值,用来对检测结果排序,是划分正负样本的依据,和F1 score(2PR/(P+R))完全不相关。
T、R、K、A、M变量含义:
- T:IoU阈值的数量,默认10个(从0.5到0.95,步长0.05)
- R:召回率的采样点数,默认101个(从0到1,步长0.01)
- K:数据集的类别总数,比如COCO是80类
- A:目标难度等级,0代表all(所有目标)、1代表small(小目标)、2代表medium(中目标)、3代表large(大目标)
- M:检测任务类型,0是bbox(边界框检测)、1是segm(实例分割)
终端打印precision和recall的值:
可以在自己的评估脚本里添加打印逻辑,示例代码如下:from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval # 初始化评估对象 coco_gt = COCO('ground_truth.json') coco_dt = coco_gt.loadRes('detection_results.json') coco_eval = COCOeval(coco_gt, coco_dt, 'bbox') # 执行评估流程 coco_eval.evaluate() coco_eval.accumulate() coco_eval.summarize() # 提取并打印指定类别的precision和recall(以person类别为例) person_cat_id = coco_gt.getCatIds(catNms=['person'])[0] cat_array_idx = coco_eval.params.catIds.index(person_cat_id) # 取IoU=0.5(索引0)、所有召回率点、person类别、all难度、bbox任务的precision precision_data = coco_eval.eval['precision'][0, :, cat_array_idx, 0, 0] # 取对应类别的recall数据 recall_data = coco_eval.eval['recall'][:, cat_array_idx, 0, 0] print("Person类别Precision值:") print(precision_data) print("\nPerson类别Recall值:") print(recall_data) # 也可以直接打印summarize输出的平均指标 print(f"\nAP@0.5: {coco_eval.stats[0]}") print(f"AR@0.5: {coco_eval.stats[6]}")如果你想在cocoeval.py内部打印,可在
accumulate()函数末尾添加打印逻辑,比如输出self.eval['precision']的特定切片。
内容的提问来源于stack exchange,提问作者NJR11
相关产品推荐
相关产品推荐

