COCOAPI计算mAP

Posted 洪流之源

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了COCOAPI计算mAP相关的知识,希望对你有一定的参考价值。

cal_mAP.py 

import re
import os
import json
import cv2
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
from collections import OrderedDict
import argparse
from pathlib import Path


class COCOResults(object):
    METRICS = 
        "bbox": ["AP", "AP50", "AP75", "APs", "APm", "APl"],
        "segm": ["AP", "AP50", "AP75", "APs", "APm", "APl"],
        "box_proposal": [
            "AR@100",
            "ARs@100",
            "ARm@100",
            "ARl@100",
            "AR@1000",
            "ARs@1000",
            "ARm@1000",
            "ARl@1000",
        ],
        "keypoints": ["AP", "AP50", "AP75", "APm", "APl"],
    

    def __init__(self, *iou_types):
        allowed_types = ("box_proposal", "bbox", "segm", "keypoints")
        assert all(iou_type in allowed_types for iou_type in iou_types)
        results = OrderedDict()
        for iou_type in iou_types:
            results[iou_type] = OrderedDict(
                [(metric, -1) for metric in COCOResults.METRICS[iou_type]]
            )
        self.results = results

    def update(self, coco_eval):
        if coco_eval is None:
            return
        from pycocotools.cocoeval import COCOeval

        assert isinstance(coco_eval, COCOeval)
        s = coco_eval.stats
        iou_type = coco_eval.params.iouType
        res = self.results[iou_type]
        metrics = COCOResults.METRICS[iou_type]
        for idx, metric in enumerate(metrics):
            res[metric] = s[idx]

    def __repr__(self):
        results = '\\n'
        for task, metrics in self.results.items():
            results += 'Task: \\n'.format(task)
            metric_names = metrics.keys()
            metric_vals = [':.4f'.format(v) for v in metrics.values()]
            results += (', '.join(metric_names) + '\\n')
            results += (', '.join(metric_vals) + '\\n')
        return results


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--log')
    parser.add_argument('--anno')
    parser.add_argument('--image-dir')
    args = parser.parse_args()
    coco = COCO(args.anno)
    results = COCOResults('bbox')
    coco_dt = coco.loadRes(args.log)
    coco_eval = COCOeval(coco, coco_dt, 'bbox')
    imagelist = os.listdir(args.image_dir)
    coco_eval.params.imgIds = [int(Path(x).stem) for x in imagelist if x.endswith('jpg')]
    coco_eval.evaluate()
    coco_eval.accumulate()
    coco_eval.summarize()
    results.update(coco_eval)
    print(results)
    

 执行:

python cal_mAP.py --anno ./instances_val2017.json --log ./result.json --image-dir ../../coco2017val/images/val2017

上述命令中--anno是coco格式的标注文件, --image-dir是测试集图片路径,--log是预测的结果文件为json格式,可参考如下伪代码生成:

preds = []
for img in js['images']:
    img_p = img['file_name']
    if not os.path.isfile('/'.join((imgdir, img_p))):
       continue
    
    pred = inference(img_p) # 推理接口, 获取预测结果
    coco91class = coco80_to_coco91_class() # 获取coco类别字典
    for pp in pred:
      if pp is None:
        continue
      for p in pp:
        bbox = p[:4]
        prob = float(p[4])
        clse = int(p[5])
        preds.append(dict(
          image_id=img['id'], # 图片id
          category_id=coco91class[clse], # 类别id
          bbox=[float(bbox[0]), float(bbox[1]), float(bbox[2]-bbox[0]), float(bbox[3]-bbox[1])], # 检测框
          score=prob)) # 预测得分

  with open('result.json', 'w') as f: # 保存为json文件
      json.dump(preds, f)

result.json示例格式如下:

[
    "image_id": 397133, "category_id": 1, "bbox": [382.21466064453125, 61.73094177246094, 123.6776123046875, 290.18048095703125], "score": 0.8199472427368164, 
    "image_id": 397133, "category_id": 1, "bbox": [0.8529815673828125, 262.3185729980469, 62.58330535888672, 47.36285400390625], "score": 0.5744290351867676, 
    "image_id": 397134, "category_id": 51, "bbox": [60.40350341796875, 286.3122863769531, 81.48675537109375, 41.669189453125], "score": 0.28584015369415283, 
    "image_id": 397134, "category_id": 64, "bbox": [-3.7143173217773438, -2.5591201782226562, 70.6357421875, 155.88150024414062], "score": 0.20149467885494232, 
    "image_id": 397135, "category_id": 51, "bbox": [28.550830841064453, 344.74737548828125, 70.10545349121094, 40.75140380859375], "score": 0.11809217184782028
]

mAP计算结果如下:

 

以上是关于COCOAPI计算mAP的主要内容,如果未能解决你的问题,请参考以下文章

windows下 ModuleNotFoundError: No module named ‘pycocotools‘

等保2.0测评综合得分计算

通用漏洞评估方法CVSS 3.0 计算公式中文翻译

球队以及得分计算的SQL语句

你知道es是如何计算相似度得分的吗?

PTA 7-5 得分计算器 (20分)