
本文聚焦如何画出基于coco格式数据集测试得到的precision-recall curve (PR curve)。
众所周知,对于目标检测的论文,往往要列出mAP的表格和PR曲线的图。
以FAIR开源的maskrcnn_benchmark为例子,模型训练好了之后进行测试只能得到mAP,并没有直接给出PR曲线。

所以我对coco_eval.py和cocoapi的代码进行了一下研究。
https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.pygithub.comcoco_eval.eval['precision']是一个5维的数组。
# precision - [TxRxKxAxM] precision for every evaluation setting

第一维T:IoU的10个阈值,从0.5到0.95间隔0.05。
第二维R:101个recall 阈值,从0到101
第三维K:类别,如果是想展示第一类的结果就设为0
第四维A:area 目标的大小范围 (all,small, medium, large)
第五维M:maxDets 单张图像中最多检测框的数量 三种 1,10,100
所以, coco_eval.eval['precision'][0, :, 0, 0, 2] 所表示的就是当IoU=0.5时,从0到100的101个recall对应的101个precision的值。
在coco_eval.py中加入一些代码把这个1维数组画出来就是IoU=0.5时对应的PR曲线。
如果对于recall 对应的 precision如何计算有些不清楚的同学,可以看一下这篇文章,一定就可以明白了。
zzzz1:浅析经典目标检测评价指标--mmAP(一)zhuanlan.zhihu.com
其他的语句就是一些plt.相关的用来画图的语句了。
plt.grid是用来在图中加网格。
plt.legend是用来在图中添加注释。
核心其实就是搞懂 coco_eval.eval['precision'] 这个5维数组表达的是什么。
搞懂了就可以以此类推画出各种自己需要的pr曲线了。

最后列举了基于三种不同的IoU阈值得到的PR曲线。