在目标检测任务中如何计算评价指标-Recall,Precision以及画出PR曲线

时间:2022-12-07 17:37:32

好久没写博客了,最近在评价结果的时候发现目标检测的评价结果还是比较难以考虑的,研究了好长时间终于明白了!
和单纯的计算Recall和Precision相比,多类的目标检测的Recall和Precision计算有如下几个难度:
1,二类问题的Recall和Precision容易解决,那多类问题该怎么办呢
2,分类任务的评价指标还是容易计算的,那检测任务呢,如何计算其TP以及FP?
3,网上有很多解决方案都是画一个类别的PR曲线,如何将多类别的曲线用一条PR曲线画出来呢?

这里我们用一张图片作为例子,多张图片道理一样。假设一张图片有N个需要检测的目标,分别是object1,object2,object3共分为三类,使用检测器得到了M个Bounding Box(BB),每个BB里包含BB所在的位置以及object1,object2,object3对应的分数confidence。
我把计算目标检测评价指标归为一下几步:
1,对每一类i进行如下操作:
对M个BB中每一个BB,计算其与N个GroundTruth(GT)的IoU值,且取其中的最大值MaxIoU。设定一个阈值thresh,一般设置thresh为0.5。当MaxIoU < thresh的时候,记录其类别i的分数confidencei以及fpi = 1,当MaxIoU>=thresh分为以下俩种情况:
当MaxIoU对应的GT类别为i的时候,记录其类别i的分数以及tpi = 1。
当MaxIoU对应的GT类别不为i的时候,记录其类别i的分数以及fpi = 1。
2,由步骤1我们可以得到3M个分数与tp/fp的元祖,形如(confidencei,tp或者fp),对这3M个元祖按照confidence进行排序。
3,按照顺序1,2,3,4。。。M截取,计算每次截取所获得的recall和precision
recall = tp/N
precision = tp/tp+fp
这样得到M个recall和precision点,便画出PR曲线了~
当然AP值计算也就水到渠成了,具体就不多说了

另外代码请参考faster-RCNN源码
https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/voc_eval.py