COCO评估指标
- 除非另有说明,否则AP和AR在多个交汇点(IoU)值上取平均值,使用0.50到0.95共10个IOU阈值下的mAP求平均,结果就是COCO数据集定义的AP,与只用一个IOU=0.50下计算的AP相比,是一个突破;
- AP是所有类别的平均值。传统上,这被称为“平均准确度”(mAP,mean average precision)。官方没有区分AP和mAP(同样是AR和mAR),并假定从上下文中可以清楚地看出差异。
- AP(所有10个IoU阈值和所有80个类别的平均值)将决定赢家。在考虑COCO性能时,这应该被认为是最重要的一个指标。
- 在COCO中,比大物体相比有更多的小物体。具体地说,大约41%的物体很小(area<322),34%是中等(322 < area < 962)),24%大(area > 962)。测量的面积(area)是分割掩码(segmentation mask)中的像素数量。
- AR是在每个图像中检测到固定数量的最大召回(recall),在类别和IoU上平均。AR与proposal evaluation中使用的同名度量相关,但是按类别计算。
- 所有度量标准允许每个图像(在所有类别中)最多100个最高得分检测进行计算。
- 除了IoU计算(分别在框(box)或掩码(mask)上执行)之外,用边界框和分割掩码检测的评估度量在所有方面是相同的。
COCO结果文件格式
Object Detection
1 2 3 4 5 6
| [{ "image_id" : int, "category_id" : int, "bbox" : [x,y,width,height], "score" : float, }]
|
框坐标是从图像左上角测量的浮点数(并且是0索引的)。官方建议将坐标舍入到最接近十分之一像素的位置,以减少JSON文件的大小。
对于对象segments的检测(实例分割),请使用以下格式:
1 2 3 4 5 6
| [{ "image_id" : int, "category_id" : int, "segmentation" : RLE, "score" : float, }]
|
Keypoint Detection
1 2 3 4 5 6
| [{ "image_id" : int, "category_id" : int, "keypoints" : [x1,y1,v1,...,xk,yk,vk], "score" : float, }]
|
关键点坐标是从左上角图像角测量的浮点数(并且是0索引的)。官方建议四舍五入坐标到最近的像素,以减少文件大小。还请注意,目前还没有使用vi的可视性标志(除了控制可视化之外),官方建议简单地设置vi=1。
Stuff Segmentation
1 2 3 4 5
| [{ "image_id" : int, "category_id" : int, "segmentation" : RLE, }]
|
除了不需要score字段外,Stuff 分割格式与Object分割格式相同。注意:官方建议用单个二进制掩码对图像中出现的每个标签进行编码。二进制掩码应该使用MaskApi函数encode()通过RLE进行编码。例如,参见cocostuffhelper.py中的segmentationToCocoResult()。为了方便,官方还提供了JSON和png格式之间的转换脚本。
Panoptic Segmentation
1 2 3 4 5 6 7 8 9 10
| annotation{ "image_id": int, "file_name": str, "segments_info" : [segment_info], }
segment_info{ "id": int, "category_id" : int, }
|
Image Captioning
1 2 3 4
| [{ "image_id": int, "caption": str, }]
|
COCOEVAL API使用(官方例程)
COCO还提供了一个计算评估指标的API,即当自己的模型按照官方定义的格式输出后,可以使用API进行快速评估模型的一系列指标。
1、导入必要的包
1 2 3 4 5 6 7 8
| imatplotlib inline import matplotlib.pyplot as plt from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval import numpy as np import skimage.io as io import pylab pylab.rcParams['figure.figsize'] = (10.0, 8.0)
|
2、选择任务
1 2 3 4
| annType = ['segm', 'bbox','keypoints'] annType = annType[1] #specify type here prefix = 'person_keypoints' if annType=='keypoints' else 'instances' print('Running demo for *%s* results.'%(annType))
|
输出如下:
Running demo for bbox results.
3、加载json注释文件(即:Ground Truth)
1 2 3 4 5
| dataDir='../' dataType='val2014' annFile = '%s/annotations/%s_%s.json'%(dataDir,prefix,dataType) cocoGt=COCO(annFile)
|
输出如下:
loading annotations into memory…
Done (t=3.16s)
creating index…
index created!
4、加载result文件(即:Predict)
COCO.loadRes(resFile)返回的也是一个COCO类,与COCO(annFile)不同的是,前者加载官方规定格式的result文件,后者加载官方提供的json文件。
1 2 3 4
| resFile='%s/results/%s_%s_fake%s100_results.json' resFile = resFile%(dataDir, prefix, dataType, annType) cocoDt=cocoGt.loadRes(resFile)
|
输出如下:
Loading and preparing results…
DONE (t=0.03s)
creating index…
index created!
5、使用测试集当中的100张图片进行评估
1 2 3
| imgIds = sorted(cocoGt.getImgIds()) imgIds = imgIds[0:100] imgId = imgIds[np.random.randint(100)]
|
6、执行评估
1 2 3 4 5 6
| # running evaluation cocoEval = COCOeval(cocoGt,cocoDt,annType) cocoEval.params.imgIds = imgIds cocoEval.evaluate() cocoEval.accumulate() cocoEval.summarize()
|
输出如下:
Running per image evaluation…
Evaluate annotation type bbox
DONE (t=0.21s).
Accumulating evaluation results…
DONE (t=0.25s).
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.505
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.697
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.573
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.586
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.519
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.501
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.387
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.594
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.595
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.640
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.566
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.564