作者:知乎用户
链接:https://www.zhihu.com/question/53405779/answer/419532990
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
mAP定义及相关概念
1 mAP: mean Average Precision, 即各类别AP的平均值
2 AP: PR曲线下面积,后文会详细讲解
3 PR曲线: Precision-Recall曲线
4 Precision: TP / (TP + FP):“分类器认为是正类并且确实是正类的部分占所有分类器认为是正类的比例”横坐标。
5 Recall: TP / (TP + FN):“分类器认为是正类并且确实是正类的部分占所有确实是正类的比例”纵坐标。
6 TP: IoU>0.5的检测框数量(同一Ground Truth只计算一次)
7 FP: IoU<=0.5的检测框,或者是检测到同一个GT的多余检测框的数量
8 FN: 没有检测到的GT的数量
ROC曲线
Receiver Operating Characteristic,翻译为"接受者操作特性曲线",够拗口的。曲线由两个变量1-specificity 和 Sensitivity绘制. 1-specificity=FPR,即假正类率。Sensitivity即是真正类率,TPR(True positive rate),反映了正类覆盖程度。这个组合以1-specificity对sensitivity,即是以代价(costs)对收益(benefits)。
Sensitivity即是真正类率,TPR(True positive rate)=TP / (TP + FN)纵坐标:刻画的是分类器所识别出的 正实例占所有正实例的比例
1-specificity即假正类率,FPR(false positive rate)= FP / (FP + TN)横坐标:计算的是分类器错认为正类的负实例占所有负实例的比例
mAP的具体计算
由前面定义,我们可以知道,要计算mAP必须先绘出各类别PR曲线,计算出AP。而如何采样PR曲线,VOC采用过两种不同方法。参见:The PASCAL Visual Object Classes Challenge 2012 (VOC2012) Development Kit
在VOC2010以前,只需要选取当Recall >= 0, 0.1, 0.2, …, 1共11个点时的Precision最大值,然后AP就是这11个Precision的平均值。
在VOC2010及以后,需要针对每一个不同的Recall值(包括0和1),选取其大于等于这些Recall值时的Precision最大值,然后计算PR曲线下面积作为AP值。
mAP计算示例
假设,对于Aeroplane类别,我们网络有以下输出(BB表示BoundingBox序号,IoU>0.5时GT=1):
BB | confidence | GT
----------------------
BB1 | 0.9 | 1
----------------------
BB2 | 0.9 | 1
----------------------
BB1 | 0.8 | 1
----------------------
BB3 | 0.7 | 0
----------------------
BB4 | 0.7 | 0
----------------------
BB5 | 0.7 | 1
----------------------
BB6 | 0.7 | 0
----------------------
BB7 | 0.7 | 0
----------------------
BB8 | 0.7 | 1
----------------------
BB9 | 0.7 | 1
----------------------
因此,我们有 TP=5 (BB1, BB2, BB5, BB8, BB9), FP=5 (重复检测到的BB1也算FP)。除了表里检测到的5个GT以外,我们还有2个GT没被检测到,因此: FN = 2. 这时我们就可以按照Confidence的顺序给出各处的PR值,如下:
rank=1 precision=1.00 and recall=0.14
----------
rank=2 precision=1.00 and recall=0.29
----------
rank=3 precision=0.66 and recall=0.29
----------
rank=4 precision=0.50 and recall=0.29
----------
rank=5 precision=0.40 and recall=0.29
----------
rank=6 precision=0.50 and recall=0.43
----------
rank=7 precision=0.43 and recall=0.43
----------
rank=8 precision=0.38 and recall=0.43
----------
rank=9 precision=0.44 and recall=0.57
----------
rank=10 precision=0.50 and recall=0.71
----------
对于上述PR值,如果我们采用:
1 VOC2010之前的方法,我们选取Recall >= 0, 0.1, …, 1的11处Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0。此时Aeroplane类别的 AP = 5.5 / 11 = 0.5
2 VOC2010及以后的方法,对于Recall >= 0, 0.14, 0.29, 0.43, 0.57, 0.71, 1,我们选取此时Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0。此时Aeroplane类别的 AP = (0.14-0)*1 + (0.29-0.14)*1 + (0.43-0.29)*0.5 + (0.57-0.43)*0.5 + (0.71-0.57)*0.5 + (1-0.71)*0 = 0.5
mAP就是对每一个类别都计算出AP然后再计算AP平均值就好了
FROC曲线
FROC曲线:FROC曲线与之前的ROC只是横坐标的不同。横坐标是误报率(测试中所有不是实际结节预测成结节的个数/测试CT个数),纵坐标是召回率(测试所有CT数据中实际是结节的检测出来个数/测试所有CT数据中实际是结节个数)。
具体举个简单的例子:我们的测试集就两个ct序列:
第一个其中真结节2个,检测出的结节自信度列表0.99,0.8,0.7,0.5,0.4,…,其中真结节是0.99和0.5对应的结节。
第二个其中真结节1个,检测出的结节自信度列表[0.9,0.8,0.7,0.6,0.5,…]其中真结节0.8对应的结节.
假设你把自信度阈值设置为0.90(这个值在计算时一般有一个等比列表),那么这时检测到了一个真结节,召回率是(1+0)/(2+1)=1/3,而误报率是(0+1)/(2)=1/2,(0+1)代表所有CT序列中误报结节数,(2)代表CT序列的个数。这可以画出FROC中的点(1/2,1/3)。
然后,你再把自信度阈值设置为0.80,那么这时检测到的还是二个真结节,召回率是(1+1)/(2+1)=2/3,而误报率是(1+1)/(2)=1,这可以画出FROC中的点(1,2/3)。
以此类推当你把自信度阈值设置为0.5时,那么这时检测到的就是三个真结节,召回率是3/3=1,而误报率是(6)/(2)=3,这可以画出FROC中的点(3,1)。
这样你就能画出一条FROC曲线来了。其实原理跟ROC曲线曲线一样的。这是我的理解如果有错误请指出。