0、导入coco相关库
import pycocotools.coco as coco from pycocotools.cocoeval import COCOeval
1、COCO类简介:初始化参数必须为标注文件即gt.coco或者None
2、COCOeval类简介:参数1==COCO类的gt的对象,参数2==COCO类的result的对象
1、加载gt.coco,返回COCO类的gt.coco的对象
gt_obj=coco.COCO(path+"gt.coco")
执行完以上代码,会输出下图所示的提示信息:
2、加载result.json,返回COCO类的result.json的对象。【即gt_obj与res_obj是相同的类(COCO)的对象】
res_obj=coco_obj.loadRes(resPath+"result.json")
执行完以上代码,会输出下图所示的提示信息:
3、 整合信息,将gt.coco与result.json联系起来,返回COCOeval类的对象。【即该对象同时拥有gt.coco与result.json的信息并指定用gt.coco的annotations的哪个字段进行计算指标 】
coco_eval=COCOeval(gt_obj,res_obj,"bbox")
执行完以上代码,不会输出任何信息
4、设置需要计算指标的模型类别,如果不设置则计算所有类别的平均指标。
coco_eval.params.catIds=data_gt["categories"][n]["id"]
执行完以上代码,不会输出任何信息
5、以指定的gt.coco的annotations字段为准例如"bbox",计算每张图片的所设置的模型类别的结果,核心是计算iou。
coco_eval.evaluate()
执行完以上代码,会输出下图所示的提示信息:
6、累计每张图片的评估结果
coco_eval.accumulate()
执行完以上代码,会输出下图所示的提示信息:
7、打印结果
coco_eval.summarize()
执行完以上代码,会输出下图所示的提示信息【绿框是MAP,红框中的是AP50】:
总结1:以下为计算MAP/AP50的完整代码
8、COCOeval类中的实例的属性COCOeval.params.iouThrs代表了IOU可选的范围,即IOU的可选取coco_eval.params.iouThrs中的任意一个数
print(coco_eval.params.iouThrs)######是一个numpy类型的array[0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95]
执行完以上代码,输出下图所示信息:
9、COCOeval类中的实例的属性COCOeval.eval代表了计算的结果,COCOeval.eval是一个字典,需要计算哪个指标从该字典中获取即可。
print(coco_eval.eval.keys())####coco_eval.eval是一个字典,包含了所有计算的指标信息
执行完以上代码,输出下图所示信息:
10、计算IOU为某几个值的precison。如果IOU选取了coco_eval.params.iouThrs中的所有值,那么就是MAP。如果IOU只选取了0.5,那么就是AP50。
iou_min_index=coco_eval.params.iouThrs.tolist().index(iou_min) iou_max_index=coco_eval.params.iouThrs.tolist().index(iou_max) each_IOU_precision = coco_eval.eval['precision'][iou_min_index:iou_max_index+1, :, 0, 0, 2]#####获取IOU为0.5~0.95的precision MAP=round(np.mean(each_IOU_precision) * 100, 2)####计算所有IOU的precision的均值即MAP min_IOU_precision = coco_eval.eval['precision'][iou_min_index:iou_min_index + 1, :, 0, 0,2] #####获取IOU为0.5的precision AP50 = round(np.mean(min_IOU_precision) * 100, 2) ####计算所有IOU的precision的均值即MAP
总结2:以下为打印精确度更高的MAP&&AP50的完整代码【即计算MAP/AP50的小数点后两位】
以上代码中的result.json的格式为:
以上代码的gt.coco的格式如下:
{
"images": [
{
"file_name": "ZYLC_zunyi_lc_ch02012_20220403145835.mp4.cut0.jpg",
"height": 2160,
"width": 3840,
"id": "ZYLC_zunyi_lc_ch02012_20220403145835.mp4.cut0.jpg"
},
{
"file_name": "ZYLC_zunyi_lc_ch01006_20220403133234.mp4.cut0.jpg",
"height": 2160,
"width": 3840,
"id": "ZYLC_zunyi_lc_ch01006_20220403133234.mp4.cut0.jpg"
}
],
"annotations": [
{
"segmentation": [],
"area": 9450,
"iscrowd": 0,
"image_id": "ZYLC_zunyi_lc_ch02012_20220403145835.mp4.cut0.jpg",
"bbox": [
3318,
194,
135,
70
],
"id": 1,
"category_id": 3
},
{
"segmentation": [],
"area": 114737,
"iscrowd": 0,
"image_id": "ZYLC_zunyi_lc_ch02012_20220403145835.mp4.cut0.jpg",
"bbox": [
3158,
118,
443,
259
],
"id": 3,
"category_id": 1
},
{
"segmentation": [],
"area": 317550,
"iscrowd": 0,
"image_id": "ZYLC_zunyi_lc_ch01006_20220403133234.mp4.cut0.jpg",
"bbox": [
2752,
1035,
730,
435
],
"id": 4,
"category_id": 2
}
],
"categories": [
{
"id": 1,
"name": "car"
},
{
"id": 2,
"name": "front"
},
{
"id": 3,
"name": "rear"
}
]
}
详见:COCO数据集API(单类map,recall,统计) - 百度文库
疑似缺点:COCOAPI无法设置过滤min_size的框,暂时本人未找到具体API【懂的伙伴可以留言】