目标检测评价指标MAP的理解

时间:2022-01-11 09:08:15

做算法实验时,仅仅做好算法本身是不够的,还要理解常用的评价指标和评价代码,这样才能知道自己的算法效果如何

基本概念


MAP:一般理解为PR曲线下的面积

PR曲线:Precision-Recall曲线,纵坐标是准确率Precision,横坐标是召回率Recall,随着召回率的上升,准确率下降

Precision: \(TP/(TP+FP)\)

Recall:\(TP/(TP+FN)\)

TP是预测正确的框,预测正确指类别正确,位置IOU>0.5表示正确。

FN表示漏检测的,TP+FN就是所有的目标框

FP表示错误检测,位置不对的,类别错误的,重复检测的都是FP,TP+FP是预测的所有目标

PR曲线上的每一个坐标点表示一个概率阈值时的(Recall,Precision),概率降序,很容易理解为什么准确率越来越低,而召回率升高。

目标检测评价指标MAP的理解

代码事项

计算MAP的代码有很多,VOC评价都会用到一段代码,输入Recall数组,Precision数组计算MAP。

那么我最关心的是如何获得这两个数组?下面简述一下我的代码思路,欢迎大家批评指正

算法步骤

1.输入: preds (字典){'cat':[[image_id,confidence,x1,y1,x2,y2],...],'dog':[[],...]};target(字典){(image_id,class): [[],] }

预测字典的key是类别,该类别在这些图片中有这些框;目标字典是(图片编号,类别),在这个图片中出现了这个类别,且有这些框。

2.对类别遍历preds,计算每个类别的AP

  • 2.1统计该类别在target中的个数计为npos,也就是TP+FN

  • 2.2取出该类别下preds中的所有预测结果并根据置信度降序排序,遍历每一张图片编号,组成(图片编号,类别)key,判断该key是否在target中,若出现,则从目标中取出框并判断是否含有位置正确的检测,检测到后从目标中删除已经匹配过的框

  • 2.3根据2.2中的每一次判断记录该置信度的正确与否,最后通过累加tp再除npos得到召回率,累加tp再除以(tp+fp)得到准确率

3.得到召回率数组和准确率数组,带入通用函数求AP,最后平均各个类别。

小结:遍历每一个预测框,在目标中寻找是否有这个目标框(位置合理,类别也要相同),找到之后,去除已经匹配过的目标框。置信度降序排序,每取出一个预测框并判断后,得到的都是这个置信度是否预测对了,明确PR曲线坐标点含义,P是当前的准确率,除的都是当前预测框数量,而R总是除npos,总是计算整体数据上的召回。

MAP评价代码更换接口后与其他作者的MAP代码做过比较,相差0.2个点左右吧,比如72.2和72.5这样的。更权威的还是官方代码,比如像coco API这样的。