AP: average precision

如果做VOC competition一定会用到一个评价指标(evaluation measure)叫做ap(average precision);事实上在VOC中都提供了计算ap的方式,在VOC12中,代码在\VOCdevkit\VOCcode目录下的VOCevaluation.m和VOCap.m两个文件中。代码如下:

[so,si]=sort(-out);%out is the result from your classifier
tp=gt(si)>0;
fp=gt(si)<0;

fp=cumsum(fp);%判为负样本的数
tp=cumsum(tp);%判为正样本的数
rec=tp/sum(gt>0);%召回率
prec=tp./(fp+tp);%精确度

ap=VOCap(rec,prec);

function ap = VOCap(rec,prec)

mrec=[0 ; rec ; 1];
mpre=[0 ; prec ; 0];
for i=numel(mpre)-1:-1:1
    mpre(i)=max(mpre(i),mpre(i+1));
end
i=find(mrec(2:end)~=mrec(1:end-1))+1;%去掉mrec中重复的部分,+1是保持下标的一致
ap=sum((mrec(i)-mrec(i-1)).*mpre(i));%area=(x(2)-x(1))*y

如果只需要ap的结果,上面的代码就够了,需要注意的一点是2010之前和之后ap的计算方式是不同的。具体而言,ap计算相当于计算precision/recall曲线下方的面积,也就是平均精度。在VOC07计算ap时,取rec上的11个位置[0:0.1:0.1:1],然后得到近似的ap;12之后取所有rec上的不同座标值,计算ap,由于两个precision对于recall是分段线性的,故可以得到精确的ap值。
下面从基本概念分析ap的值所代表的含义以及上面的代码。
以正负样本分类为例,分类的样本根据分类结果有四类:true positive(被正确分类的正例)false negative(本来是正例,错分为负例) true negative(被正确分类的负例)false positive(本来是负例,被错分为整理)。
如上所说的,计算ap用到了两个指标:precision和recall;
precision:衡量一个结果的准确度,也称为PPV(positive predictive value);
recall:衡量一个结果的完整性,也被称为true positive rate或sensitivity。
wiki中有个图非常形象的表示出了这几个基本概念:
basic definition
对于一个分类器而言,precision和recall往往是此消彼长的,一个极端的例子是:如果把所有样本都判为正样本,那个precision就会很小,而recall此时达到最大为1;相反地如果只把极少数的样本判为正样本,那么可能能得到很高的precision,而结果不够完整。
ap这个指标则很好的兼顾了两者。可以将它看成precision/recall曲线下方围成的曲面面积,如下图:
area
其中横座标是recall,纵座标是precision,precision是关于recall分段常数的函数。所以计算ap的时候通过计算阴影部分每个小矩形的面积然后再求和就行。而在voc2007中计算ap的时候,相当于人为的将横座标每个区间分成0.1的长度,通过10个矩形的面积相加得到最后的结果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章