【解决方案】COCO数据集分类别测试mAP

文章目录

  • 问题描述
  • 解决方案
  • 实现效果


问题描述

coco数据集官方给出的pycocotools.cocoeval库只能测所有类别平均mAP;
需要修改自己的类别数量,并给出单类别mAP;
以下代码参考了这个仓库;
可用于目标检测与实例分割计算单目标mAP。


解决方案

  • 调用代码
from pycocotools.cocoeval import COC0eval
from pycocotools.coco import COCO
gt = r"gt_path" #.json,为coco官方格式
dt = r"dt_path" #.json,为EvalCOCOMetric函数测试时自动保存的,具体看此函数简介
coco_gt = COCO(gt)
coco_dt = coco_gt.LoadRes (dt)
cocoEval = COCOevaL(coco_gt, coco_dt, 'segm') #可改'segm'(实例分割)为'bbox'(目标检测)
cocoEval.evaluate()
cocoEval.accumuLate()
cocoEval.summarize()
print (cocoEval. stats)
  • 修改cocoEval.summarize()中_summarize()函数,在print前添加以下代码,注意代码模块空格。
     #cacluate AP(average precision) for each category
     num_classes = len(p.catIds)
     avg_ap = 0.0
     if ap == 1:
         for i in range(0, num_classes):
             print('category : {0} : {1}'.format(i,np.mean(s[:,:,i,:])))
             avg_ap +=np.mean(s[:,:,i,:])
         print('(all categories) mAP : {}'.format(avg_ap / num_classes))

 print(iStr.format(titleStr, typeStr, iouStr, areaRng, maxDets, mean_s))
 return mean_s
  • 因为_summarizeDets()函数会调用_summarize()很多次,如果不需要每次都计算分类别的mAP,可以增添_summarize()参数。这里我给_summarize()函数加了个mAP的参,这样就只会输出我想要的某几次分类别mAP,即下图第三行里的mAP=True。
    【解决方案】COCO数据集分类别测试mAP_第1张图片
    当然_summarize()函数声明里面也要加一个参mAP=False。
    在这里插入图片描述

实现效果

【解决方案】COCO数据集分类别测试mAP_第2张图片

你可能感兴趣的:(解决方案,分类,python,数据挖掘)