考察目标检测性能的最常见指标MAP,本文主要整理来自pytorch-yolov4的map的参考文献
rafaelpadilla/Object-Detection-Metricsgithub.com一、TP,FP,FN,FN
- TP:true positive,实际为正的,预测成正的个数
- FN:false negative,实际为正的,预测成负的个数
- FP:false positive,实际为负的,预测成正的个数
- TN:true negative,实际为负的,预测成负的个数
这里正负表示是否预测成目标类别,所以可以有很多类,不只是两类
所以,对于一组测试图像的一个类别,确定IOU阈值与置信度阈值之后,会有确定的TP,FN,FP,TN
举例:
对于knief这一类:
TP:实际为knief,判断为knief
FP:实际不是knief,判断为knief
FN:实际为knief,判断不是knief
TN:实际不是knief,判断不是knief
马上会用到的两个指标:
TP+FP:测试结果图中knief个数
TP+FN:测试图中真实的knief个数(测试图标注的结果)
二、precision、recall
准确率
召回
准确率与召回可以表示在确定IOU阈值与置信度阈值之后,对于测试结果性能的评估。
但是不知道多少的IOU阈值与置信度阈值是最合适,所以考虑尽可能多的情况,得到确定的IOU阈值下,随着置信度阈值变化下,precision与recall的曲线,如下图。这个曲线的面积越大,性能越好。怎么理解这句话?
我们首先理解下precision与recall曲线的意义:
根据之前说过的目的,曲线的生成是变化置信度阈值,做法是:
1.将测试结果的bbox按照置信度阈值排序
2.对于某一个位置,只记录置信度在这之上的TP,FP,置信度比较大的正例才被记录,置信度小的直接归到反例
3.得到不同置信度阈值下的TP与FP,具体做法是,按照排序后的置信度阈值,逐个下移记录TP与FP的变化量,并记录。
现象:
随着置信度阈值的减小,precision会减小,recall会增加,一开始的precision比较大
对现象的说明:
1.对precision减小的解释
对于随着置信度的减小,sumcum(TP)/sumcum(TP+FP)减小。因为每增加一个框,precision分母始终是加1的,但是因为置信度减小,分子更有可能+0,而不是+1
2.对recall增加的解释
随着置信度的减小,recall的分母保持不变,因为标注的检测框数量是不变的。TP会慢慢增加,所以recall肯定是增加的
3.对开始的precision比较大的解释
置信度高的话,说明很有可能是判断正确的,所以很有可能排序前几个都是TP
对于曲线的面积越大,性能越好的理解:
对于两个曲线,如果recall最大值相同,面积大的,说明在平均意义下,相同recall的precision大,即相同置信度水平,TP的概率大
对于两个曲线,如果recall重合的部分precision相等,面积大的,说明recall最大值大,即FN小,即标注的检测框没被检测出来的比较少
综上面积越大,模型表现越好。
三、面积的替换指标AP
虽然求曲线的面积不是很麻烦,但是一般情况下,曲线不会像我们希望的一样,单调递减。有可能出现抖动,即Recall值较大时,Precision反而比Recall较小时的值更大。为了避免少数检测框对结果产生较大的影响,还需采取一定的平滑措施,用新指标AP代替面积。
AP的计算有两种方法
1.PASCAL VOC 2007的AP:
11点插值法
2.PASCAL VOC 2012 的AP(更常用了):
考虑所有点
四、MAP
确定IOU阈值的情况下,每个类别可以根据precision-recall曲线得到一个ap值 ,所有类别的ap的平均就是map。
一般模型中的ap即map,ap50表示iou阈值为50%时的map,map表示iou阈值为0.5:0.95:0.05的均值
现象:
iou阈值增大,ap减小。
解释:
这是因为iou控制tp与fp的转换。iou阈值增大时,precision的分母相同的情况下,tp减小,所以precision分子减小,与此同时recall的分子也减小,所以precision-recall曲线整体的下移且左移 。
五、实现
因为我的测试结果数据是一个txt文件,不能按照置信度排序。所以按照测试结果的文本顺序,对于某一类,记录det数据,计算并记录【最大IOU,最大IOU对应的true框的顺序imagefile_num】。
然后创建tp,fp的list,对于置信度顺序下的每个检测框,如果对应的gt不是-1(IOU等于0),最大IOU大于阈值,且对应的框上面没出现过,标记为TP,否则标记为FP,进而得到precision的list。
遍历标注文件,得到这一类的gt的总个数,进而得到recall的list。
然后根据PASCAL VOC 2012年的版本计算AP。
伪代码
Image_file=reorder(image_file,descend by confidence)
for each class:
for each bbox in image_file:
record TP and FP
tp_list=cunsum(TP)
fp_list=cumsum(FP)
satatistic num_gts for this class
precision=tp_list./(tp_list+fp_list)#点除
recall=tp_list./num_gts
calculate ap
calculate map
附:TP,FP计算流程图
参考文献:
目标检测测评指标--mAP_Peanut 大本营-CSDN博客_map指标
rafaelpadilla/Object-Detection-Metrics