前言
在目标检测算法中,coco数据集经常用到,对于许多新手来说,由于coco的标注json文件大而且标注看起来不太直观,特别在评估方法方面,导致不太会调用pycocotools的评估脚本。因此,本文记录pycocotools中cocoeval函数使用,使读者方便查找使用。
1、原理
在正式介绍pycocotools前,首先介绍下目标检测mAP的评估方法。以coco为例,总共80个类别,那么分别遍历这80个类别,然后取单独一个类别进行评测:
以person类别为例,遍历到当前图像时,首先拿到
m
m
m个预测框和
n
n
n个真值框,之后,根据交并比计算公式:
IoU
=
Area of Intersection
Area of Union
=
∣
A
∩
B
∣
∣
A
∪
B
∣
\text{IoU} = \frac{\text{Area of Intersection}}{\text{Area of Union}} = \frac{|A \cap B|}{|A \cup B|}
IoU=Area of UnionArea of Intersection=∣A∪B∣∣A∩B∣
其中,
A
A
A和
B
B
B分别表示一个预测框和一个真值框。
在实际评估中,会通过并行计算直接得到大小为
m
∗
n
m*n
m∗n的IOU矩阵,里面每个元素表示当前预测框和真值框的交并比。
在拿到IOU矩阵后,然后遍历每一个预测框,寻找与其IOU值最大的真值框,若超过IOU_thresh,则认为匹配成功, 则TP+1;若同一真实框被多个预测框匹配,仅保留IoU最高的预测框。
然后遍历所有图像,累加TP、FP、FN即可计算PR值:
Precision
=
T
P
T
P
+
F
P
\text{Precision} = \frac{TP}{TP + FP}
Precision=TP+FPTP
Recall
=
T
P
T
P
+
F
N
\text{Recall} = \frac{TP}{TP + FN}
Recall=TP+FNTP
然后计算不同score下PR值,就能得到PR曲线,然后算其包络面积,便是AP。
2、代码
底下是现成的pycocotools评估coco的脚本,可直接出评测结果。
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
import numpy as np
import pylab,json
if __name__ == "__main__":
gt_path = "/home/wujian/WLL/mmdet-master/data/coco/annotations/instances_val2017.json" # 存放真实标签的路径
dt_path = "/home/wujian/WLL/mmdet-master/tools/work_dirs/yolo_result/my_result.json" # 存放检测结果的路径
cocoGt = COCO(gt_path)
cocoDt = cocoGt.loadRes(dt_path)
cocoEval = COCOeval(cocoGt, cocoDt, "bbox") #
cocoEval.evaluate()
cocoEval.accumulate()
cocoEval.summarize()
对于代码中所用到的两个文件,读者可从下面链接中下载:代码中文件下载地址
上述两个文件bbox均是[xmin,ymin,w,h]格式!
总结
本文简单介绍了coco数据集的mAP的评测方法以及如何使用pycocotools,希望读者能够读读mAP的源代码,定会有所收获。