一、需要安装的包

numpy、pycocotools、terminaltables

其中windows环境下pycocotools的安装请参见这个博客:

windows如何安装pycocotools_Everything_changes的博客-CSDN博客_windows安装pycocotools

二、需要准备的文件

1.检测模型下输出的json文件,一般以coco数据集作为目标检测的数据集在最后评测时,通常会在测试数据集或者验证数据集上做推演。一般会输出一个预测bbox的json文件,其内部的结构大致是这样的:

2.还需要准备模型推演时的数据集(一般是测试集或者验证集)所对应的instance_XXX2014.json这样的文件。文件内部记录的数据是测试集图像或验证集图像的标注信息。内部结构是这样的(后面有很长,只截取前面几行):

总的来说,第一个json文件就是预测得到的数据输出,第二个json文件就是真实标签的信息。

三、运行提供的代码

import argparse
import pickle, json
import numpy as np
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
import itertools
from terminaltables import AsciiTableparser = argparse.ArgumentParser(description='Calculating metrics (AR, Recall) in  every class')
parser.add_argument('--det_json', default='results.json', type=str,help='inference detection json file path')
parser.add_argument('--gt_json', default='instances_minival2014.json', type=str,help='ground truth json file path')
parser.add_argument('--classes', default=('car', 'people', 'building'), type=tuple,help='every class name with str type in a tuple')def read_pickle(pkl):with open(pkl,'rb') as f:data = pickle.load(f)return datadef read_json(json_pth):with open(json_pth,'r') as f:data = json.load(f)return datadef process(det_json, gt_json, CLASSES):cocoGt = COCO(gt_json)# 获取类别(单类)对应的所有图片idcatIds = cocoGt.getCatIds(catNms=list(CLASSES)) #,'long','meihua'# 获取多个类别对应的所有图片的idimgid_list = []for id_c in catIds:imgIds = cocoGt.getImgIds(catIds=id_c)imgid_list.extend(imgIds)# 通过gt的json文件和pred的json文件计算mapclass_num = len(CLASSES)cocoGt = COCO(gt_json)cocoDt = cocoGt.loadRes(det_json)cocoEval = COCOeval(cocoGt, cocoDt, "bbox")cocoEval.params.iouThrs = np.linspace(0.5, 0.95, int(np.round((0.95 - .5) / .05)) + 1, endpoint=True)cocoEval.params.maxDets = list((100, 300, 1000))cocoEval.evaluate()cocoEval.accumulate()cocoEval.summarize()# 过gt和pred计算每个类别的recallprecisions = cocoEval.eval['precision'] # TP/(TP+FP) right/detectionrecalls = cocoEval.eval['recall'] # iou*class_num*Areas*Max_det TP/(TP+FN) right/gtprint('\nIOU:{} MAP:{:.3f} Recall:{:.3f}'.format(cocoEval.params.iouThrs[0],np.mean(precisions[0, :, :, 0, -1]),np.mean(recalls[0, :, 0, -1])))# Compute per-category AP# from https://github.com/facebookresearch/detectron2/# precision: (iou, recall, cls, area range, max dets)results_per_category = []results_per_category_iou50 = []res_item = []for idx, catId in enumerate(range(class_num)):name = CLASSES[idx]precision = precisions[:, :, idx, 0, -1]precision_50 = precisions[0, :, idx, 0, -1]precision = precision[precision > -1]recall = recalls[ :, idx, 0, -1]recall_50 = recalls[0, idx, 0, -1]recall = recall[recall > -1]if precision.size:ap = np.mean(precision)ap_50 = np.mean(precision_50)rec = np.mean(recall)rec_50 = np.mean(recall_50)else:ap = float('nan')ap_50 = float('nan')rec = float('nan')rec_50 = float('nan')res_item = [f'{name}', f'{float(ap):0.3f}',f'{float(rec):0.3f}']results_per_category.append(res_item)res_item_50 = [f'{name}', f'{float(ap_50):0.3f}', f'{float(rec_50):0.3f}']results_per_category_iou50.append(res_item_50)item_num = len(res_item)num_columns = min(6, len(results_per_category) * item_num)results_flatten = list(itertools.chain(*results_per_category))headers = ['category', 'AP', 'Recall'] * (num_columns // item_num)results_2d = itertools.zip_longest(*[results_flatten[i::num_columns]for i in range(num_columns)])table_data = [headers]table_data += [result for result in results_2d]table = AsciiTable(table_data)print('\n' + table.table)num_columns_50 = min(6, len(results_per_category_iou50) * item_num)results_flatten_50 = list(itertools.chain(*results_per_category_iou50))iou_ = cocoEval.params.iouThrs[0]headers_50 = ['category', 'AP{}'.format(iou_),'Recall{}'.format(iou_)] * (num_columns_50 // item_num)results_2d_50 = itertools.zip_longest(*[results_flatten_50[i::num_columns_50]for i in range(num_columns_50)])table_data_50 = [headers_50]table_data_50 += [result for result in results_2d_50]table_50 = AsciiTable(table_data_50)print('\n' + table_50.table)if __name__ == '__main__':args = parser.parse_args()process(det_json=args.det_json, gt_json=args.gt_json, CLASSES=args.classes)

需要修改参数。把parser中的det_json参数设置为你的预测输出json文件的路径

gt_json参数设置为你的真实标签文件的路径(这里的文件一定是coco数据的类型,例如instance_val2017.json)

classes参数设置为你的数据集内的标注的类别名称。例如你的数据集中有car、people、building三种类别。就直接在源码中把--classes的default改成('car', 'people', 'building')就可以了。

最后直接运行就可以看到结果了

如果想知道内部是如何进行计算的,自行debug查看计算过程。

计算COCO数据格式下每个类别的bbox的AP和Recall相关推荐

  1. COCO数据格式说明

    COCO数据格式说明 标注工具推荐:https://github.com/wkentaro/labelme labelme自带了转换VOC和COCO的数据格式:labelme/examples COC ...

  2. commons-math3-3.6.1-org.apache.commons.math3.analysis.function-包下的类(三)-中英对照文档及源码赏析

    commons-math3-3.6.1-org.apache.commons.math3.analysis.function-包下的类(三)-中英对照文档及源码赏析 摘要:中英对照文档.源码赏析.or ...

  3. commons-math3-3.6.1-org.apache.commons.math3.analysis.function-包下的类(二)-中英对照文档及源码赏析

    commons-math3-3.6.1-org.apache.commons.math3.analysis.function-包下的类(二)-中英对照文档及源码赏析 摘要:中英对照文档.源码赏析.or ...

  4. 计算广告小窥[下]要啥自行车!

    原作:@面包包包包包包 修改:@寒小阳 && @龙心尘 鸣谢:百度德川.阿里怀人.阿里口肃.腾讯Fandy王.优酷吕红亮 时间:2016年8月 出处: http://blog.csdn ...

  5. ML学习分享系列3_计算广告小窥[下]要啥自行车!

    原作:@面包包包包包包 修改:@寒小阳 && @龙心尘 鸣谢:百度德川.阿里怀人.阿里口肃.腾讯Fandy王.优酷吕红亮 时间:2016年8月 出处:http://blog.csdn. ...

  6. Java实验一—创建用于计算身体质量指数的BMI类

    (仅记录自己的学习之路) 创建用于计算身体质量指数的BMI类,成员变量和成员方法如下: (1) 一个字符串类型的私有数据域(数据域.成员变量和属性含义相同)name,描述人的名字: (2) 一个int ...

  7. php代码实现xml格式转换,PHP实现XML与数据格式进行转换类实例

    PHP实现XML与数据格式进行转换类实例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  PHP实现XML与数据格式进行转换类实例.txt ] (友情提示:右键点上 ...

  8. commons-math3-3.6.1-org.apache.commons.math3.analysis.integration-包下的类-中英对照文档及源码赏析

    commons-math3-3.6.1-org.apache.commons.math3.analysis.integration-包下的类-中英对照文档及源码赏析 摘要:中英对照文档.源码赏析.or ...

  9. commons-math3-3.6.1-org.apache.commons.math3.analysis.integration.gauss-包下的类-中英对照文档及源码赏析

    commons-math3-3.6.1-org.apache.commons.math3.analysis.integration.gauss-包下的类-中英对照文档及源码赏析 摘要:中英对照文档.源 ...

最新文章

  1. linux如何在shell中自动生成1到100的数组
  2. 领导者的资质——学习笔记(2):领导者的人格
  3. [UWP]用画中画模式(CompactOverlay Mode)让用总在最前端显示
  4. 计算机硬件基础课设总结,计算机硬件基础课程设计报告.doc
  5. 计算机组成原理学习-哈工大《计算机组成原理》第四章-上篇
  6. 网络安全学习第14篇 - 游戏(仙剑奇侠传95)外挂之修改游戏资源文件(修改人物属性)
  7. 怎么学习iOS,如何学习iOS开发?
  8. 01—C语言基本语句
  9. LED显示屏工程招标常见控标十八绝招!
  10. logstash String转data,@timestamp转化为东八区时间
  11. Python中如何读取npy、npz文件?
  12. Grip编辑器增强版(UG二次开发工具,最好用的Grip编辑器,没有之一)
  13. Docker部署percona
  14. eSpace VTM Solution在金融信贷领域的应用开发
  15. 【系统分析与验证笔记】Transition System模型知识点
  16. 小云讲可视化 | 雷达图Radar
  17. VM2 JavaScript 沙箱库中存在严重的 RCE 漏洞
  18. NINJUTSU OS安装
  19. 计算机的四代表格,8代酷睿+144Hz电竞屏 惠普光影精灵4代够惊艳
  20. 产品经理进修第五天 管理你的产品团队

热门文章

  1. [附源码]java毕业设计文章管理系统查重PPT
  2. 5、python基础了解:模块、dir()函数、包
  3. java-net-php-python-jspm景区售票系统查重PPT计算机毕业设计程序
  4. display: weston: opaque region笔记
  5. 85道Java微服务面试题整理(助力2020面试)
  6. 计算机原理实验报告三,计算机组成实验报告3
  7. php SonarLint 代码规范检查提示整理
  8. 编译bibtex时报错“I couldn‘t open file name `xxxx.aux‘.”对应。已亲测可用。
  9. 解神者php奥义高阶,《解神者》技能被动奥义效果介绍 伊南娜特点分析
  10. 2019年最新小说免费API接口干货