COCO VOC评估输出指定某类AP或输出每个类别AP结果_coco_eval = cocoeval(coco_gt, coco_pred, ‘bbox‘)(1)

一、输出单类AP(不需要修改pycocotools)

coco_eval.py源代码

"""
COCO-Style Evaluations
"""
 
import json
import os
 
import argparse
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
 
def eval(coco_gt, image_ids, pred_json_path):
    # load results in COCO evaluation tool
    coco_pred = coco_gt.loadRes(pred_json_path)
 
    # run COCO evaluation
    print('BBox')
    coco_eval = COCOeval(coco_gt, coco_pred, 'bbox')
    coco_eval.params.imgIds = image_ids
    coco_eval.evaluate()
    coco_eval.accumulate()
    coco_eval.summarize()
 
if __name__ == '__main__':
    ap = argparse.ArgumentParser()
    ap.add_argument('--gt-json', type=str, default='instances.json', help='coco val2017 annotations json files')
    ap.add_argument('--pred-json', type=str, default='coco_results.json', help='pred coco val2017 annotations json files')
    args = ap.parse_args()
    print(args)
 
    pred_json_path = args.pred_json
 
    MAX_IMAGES = 1000
    coco_gt = COCO(args.gt_json)
    image_ids = coco_gt.getImgIds()[:MAX_IMAGES]
 
    eval(coco_gt, image_ids, pred_json_path)

以上代码评估后的输出

修改后的代码,可以指定输出某类AP值,只修改eval函数

def eval(coco_gt, image_ids, pred_json_path):
    # load results in COCO evaluation tool
    coco_pred = coco_gt.loadRes(pred_json_path)
 
    # run COCO evaluation
    print('BBox')
    coco_eval = COCOeval(coco_gt, coco_pred, 'bbox')
    coco_eval.params.imgIds = image_ids
    coco_eval.params.catIds = [2] # 你可以根据需要增减类别
    coco_eval.evaluate()
    coco_eval.accumulate()
    coco_eval.summarize()

修改后输出,比如只输出第2类:

二、输出每个类别AP结果(需要修改pycocotools下的coco.py和cocoeval.py)

在调用的文件中找到coco.py,cocoeval.py文件(pycharm通过Ctrl和鼠标跳转即可)

from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval

① 首先修改coco.py的类COCO的初始化,在84行下添加代码:

    def __init__(self, annotation_file=None):
        """
        Constructor of Microsoft COCO helper class for reading and visualizing annotations.
        :param annotation_file (str): location of annotation file
        :param image_folder (str): location to the folder that hosts images.
        :return:
        """
        # load dataset
        self.dataset,self.anns,self.cats,self.imgs = dict(),dict(),dict(),dict()
        self.imgToAnns, self.catToImgs = defaultdict(list), defaultdict(list)
        if not annotation_file == None:
            print('loading annotations into memory...')
            tic = time.time()
            with open(annotation_file, 'r') as f:
                dataset = json.load(f)
            assert type(dataset)==dict, 'annotation file format {} not supported'.format(type(dataset))
            print('Done (t={:0.2f}s)'.format(time.time()- tic))
            # 下面这句代码为添加内容
            print("category names: {}".format([e["name"] for e in sorted(dataset["categories"], key=lambda x: x["id"])]))
            self.dataset = dataset
            self.createIndex()

② 修改cocoeval.py,在第456行下添加代码,修改summarize函数:

def summarize(self):
        '''
        Compute and display summary metrics for evaluation results.
        Note this functin can *only* be applied on the default parameter setting
        '''
        def _summarize( ap=1, iouThr=None, areaRng='all', maxDets=100 ):
            p = self.params
            iStr = ' {:<18} {} @[ IoU={:<9} | area={:>6s} | maxDets={:>3d} ] = {:0.3f}'
            titleStr = 'Average Precision' if ap == 1 else 'Average Recall'
            typeStr = '(AP)' if ap==1 else '(AR)'
            iouStr = '{:0.2f}:{:0.2f}'.format(p.iouThrs[0], p.iouThrs[-1]) \
                if iouThr is None else '{:0.2f}'.format(iouThr)
 
            aind = [i for i, aRng in enumerate(p.areaRngLbl) if aRng == areaRng]
            mind = [i for i, mDet in enumerate(p.maxDets) if mDet == maxDets]
            if ap == 1:
                # dimension of precision: [TxRxKxAxM]
                s = self.eval['precision']
                # IoU
                if iouThr is not None:
                    t = np.where(iouThr == p.iouThrs)[0]
                    s = s[t]
                s = s[:,:,:,aind,mind]
            else:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值