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個矩形的面積相加得到最後的結果。

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