由MAP而起

以你喜歡和理解起來最舒服的方式

多標籤圖像分類任務爲背景

多標籤圖像分類(Multi-label Image Classification)任務中圖片的標籤不止一個,因此評價不能用普通單標籤圖像分類的標準,即mean accuracy。該任務採用的是和信息檢索中類似的方法——MAP(Mean Average Precision)。

MAP雖然字面意思和mean accuracy看起來差不多,但是計算方法要繁瑣得多。

一、IOU(捎帶介紹)

      

分子:兩個框的交集,沒有疑問。

分母:兩個框的並集,這個注意數學中交集的概念——兩個框的面積之和減去它們的交集面積。

二、接着說多標籤圖像分類,會涉及TP(True Positive)、FP(False Positive)、TN(True Negative)、FN(True Negative),Precision、Recall

(1)對TP、TN、FP、FN的(很)直觀解釋

假設現在有這樣一個測試集,測試集中的圖片只由大雁和飛機兩種圖片組成,如下圖所示:
這裏寫圖片描述

假設你的分類系統最終的目的是:能出測試集中所有飛機的圖片,而不是大雁的圖片。

現在做如下的定義:
True positives : 飛機的圖片被正確的識別成了飛機。
True negatives: 大雁的圖片沒有被識別出來,系統正確地認爲它們是大雁。
False positives: 大雁的圖片被錯誤地識別成了飛機。
False negatives: 飛機的圖片沒有被識別出來,系統錯誤地認爲它們是大雁。

假設你的分類系統使用了上述假設識別出了四個結果,如下圖所示:
這裏寫圖片描述

那麼在識別出的這四張照片中:
True positives : 有三個,畫綠色框的飛機。
False positives: 有一個,畫紅色框的大雁。

沒被識別出來的六張圖片中:
True negatives : 有四個,這四個大雁的圖片,系統正確地沒有把它們識別成飛機。
False negatives: 有兩個,兩個飛機沒有被識別出來,系統錯誤地認爲它們是大雁。

(2)對precision和recall的(很)直觀解釋:

push一張很有意思很形象image:

(加上一句:上面大圓圈所在四邊形,左邊一半都是真的(正樣本),右邊一半都是假的(負樣本))

Precision其實就是在識別出來的圖片中,True positives所佔的比率
這裏寫圖片描述
其中的n代表的是(True positives + False positives),也就是系統一共識別出來多少照片 。
在這一例子中,True positives爲3,False positives爲1,所以Precision值是 3/(3+1)=0.75。
意味着在識別出的結果中,飛機的圖片佔75%。

Recall 是被正確識別出來的飛機個數與測試集中所有飛機的個數的比值
這裏寫圖片描述
Recall的分母是(True positives + False negatives),這兩個值的和,可以理解爲一共有多少張飛機的照片。
在這一例子中,True positives爲3,False negatives爲2,那麼Recall值是 3/(3+2)=0.6。
意味着在所有的飛機圖片中,60%的飛機被正確的識別成飛機。

調整閾值:

你也可以通過調整閾值,來選擇讓系統識別出多少圖片,進而改變Precision 或 Recall 的值。
在某種閾值的前提下(藍色虛線),系統識別出了四張圖片,如下圖中所示:
這裏寫圖片描述
分類系統認爲大於閾值(藍色虛線之上)的四個圖片更像飛機。

我們可以通過改變閾值(也可以看作上下移動藍色的虛線),來選擇讓系統識別能出多少個圖片,當然閾值的變化會導致Precision與Recall值發生變化。比如,把藍色虛線放到第一張圖片下面(TP=1,FP=0,TN=5,FN=4),也就是說讓系統只識別出最上面的那張飛機圖片,那麼Precision的值就是100% = 1/(1+0),而Recall的值則是20% = 1/(1+4)。如果把藍色虛線放到第二張圖片下面(TP=2,FP=0, TN=5,FN=3),也就是說讓系統只識別出最上面的前兩張圖片,那麼Precision的值還是100% = 2/(2+0),而Recall的值則增長到是40% = 2/(2+3)。

下圖爲不同閾值條件下,Precision與Recall的變化情況:
這裏寫圖片描述

precision-recall曲線:

如果你想評估一個分類器的性能,一個比較好的方法就是:觀察當閾值變化時,Precision與Recall值的變化情況。如果一個分類器的性能比較好,那麼它應該有如下的表現:

被識別出的圖片中飛機所佔的比重比較大,並且在識別出大雁之前,儘可能多地正確識別出飛機,也就是讓Recall值增長的同時保持Precision的值在一個很高的水平。而性能比較差的分類器可能會損失很多Precision值才能換來Recall值的提高。通常情況下,文章中都會使用Precision-recall曲線,來顯示出分類器在Precision與Recall之間的權衡。

上圖就是分類器的Precision-recall 曲線,在不損失精度的條件下它能達到40%Recall。而當Recall達到100%時,Precision 降低到50%。

###################################################可以先忽略##########################################################

 (

Approximated Average precision

相比較與曲線圖,在某些時候還是一個具體的數值能更直觀地表現出分類器的性能。通常情況下都是用 Average Precision來作爲這一度量標準,它的公式爲:
這裏寫圖片描述
在這一積分中,其中p代表Precision ,r代表Recall,p是一個以r爲參數的函數,That is equal to taking the area under the curve.

實際上這一積分極其接近於這一數值:對每一種閾值分別求(Precision值)乘以(Recall值的變化情況),再把所有閾值下求得的乘積值進行累加。公式如下:
這裏寫圖片描述
在這一公式中,N代表測試集中所有圖片的個數,P(k)表示在能識別出k個圖片的時候Precision的值,而 Delta r(k) 則表示識別圖片個數從k-1變化到k時(通過調整閾值)Recall值的變化情況。

在這一例子中,Approximated Average Precision的值
=(1 * (0.2-0)) + (1 * (0.4-0.2)) + (0.66 * (0.4-0.4)) + (0.75 * (0.6-0.4)) + (0.6 * (0.6-0.6)) + (0.66 * (0.8-0.6)) + (0.57 * (0.8-0.8)) + (0.5 * (0.8-0.8)) + (0.44 * (0.8-0.8)) + (0.5 * (1-0.8)) = 0.782.

=(1 * 0.2) + (1 * 0.2) + (0.66 * 0) + (0.75 * 0.2) + (0.6 * 0) + (0.66 * 0.2) + (0.57 * 0) + (0.5 * 0) + (0.44 * 0) + (0.5 * 0.2) = 0.782.

通過計算可以看到,那些Recall值沒有變化的地方(紅色數值),對增加Average Precision值沒有貢獻.

Interpolated Average Precision

不同於Approximated Average Precision,一些作者選擇另一種度量性能的標準:Interpolated Average Precision。這一新的算法不再使用P(k),也就是說,不再使用當系統識別出k個圖片的時候Precision的值與Recall變化值相乘。而是使用:
這裏寫圖片描述
也就是每次使用在所有閾值的Precision中,最大值的那個Precision值與Recall的變化值相乘。公式如下:
這裏寫圖片描述

下圖的圖片是Approximated Average Precision 與 Interpolated Average Precision相比較。
需要注意的是,爲了讓特徵更明顯,圖片中使用的參數與上面所說的例子無關。
這裏寫圖片描述
很明顯 Approximated Average Precision與精度曲線挨的很近,而使用Interpolated Average Precision算出的Average Precision值明顯要比Approximated Average Precision的方法算出的要高。

一些很重要的文章都是用Interpolated Average Precision 作爲度量方法,並且直接稱算出的值爲Average Precision 。PASCAL Visual Objects Challenge從2007年開始就是用這一度量制度,他們認爲這一方法能有效地減少Precision-recall 曲線中的抖動。所以在比較文章中Average Precision 值的時候,最好先弄清楚它們使用的是哪種度量方式。

###################################################可以先忽略##########################################################

三. 關於AP、MAP計算

實際多類別分類任務中,我們通常不滿足只通過top-N(前面說的藍色虛線移動的操作,即在操作top數量)來衡量一個模型的好壞,而是需要知道從top-1到top-N(N是所有測試樣本個數,本文中爲10)對應的precision和recall。顯然隨着我們選定的樣本越來也多,recall一定會越來越高,而precision整體上會呈下降趨勢。把recall當成橫座標,precision當成縱座標,即可得到常用的precision-recall曲線。例如某個例子的precision-recall曲線如下:

接下來說說AP的計算,此處參考的是PASCAL  VOC  CHALLENGE的計算方法。首先設定一組閾值,[0, 0.1, 0.2, …, 1]。然後對於recall大於每一個閾值(比如recall>=0.3),我們都會得到一個對應的最大precision。這樣,我們就計算出了11個precision。AP即爲這11個precision的平均值。這種方法英文叫做11-point interpolated average precision。​

當然PASCAL VOC CHALLENGE自2010年後就換了另一種計算方法。新的計算方法假設這N個樣本中有M個正例,那麼我們會得到M個recall值(1/M, 2/M, ..., M/M)——這裏還是不太好理解,或許是表達方式不夠清晰,自己悟(結合下圖每一個item多思考一下,可以針對每個top-N情況下的precision和recall進行計算)。對於每個recall值r,我們可以計算出對應r'(其中r' >= r)的最大precision,然後對這M個precision值取平均即得到最後的AP值(結合下面這張表和文章末尾的藍色部分例子的內容,注意藍色部分例子第二種AP的求取方式)。計算方法如下:

 

 

相應的Precision-Recall曲線(這條曲線是單調遞減的)如下:​

 

another eg:

(1)voc2007的計算方法:

在計算AP時,首先要把結果按照置信度排序,公式如下:

在這裏插入圖片描述

(2)voc2010的計算方法:

比起07年,10年以後的新方法是取所有真實的recall值,按照07年的方法得到所有recall/precision數據點以後,計算recall/precision曲線下的面積:

Compute a version of the measured precision/recall curve with > precision monotonically decreasing, by setting the precision for > recall r to the maximum precision obtained for any recall r′ ≥ r.
Compute the AP as the area under this curve by numerical integration. No approximation is involved since the curve is piecewise constant.

舉一個例子具體說明:

對於Aeroplane類別,我們有以下輸出(BB表示Bounding Box序號,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
------------------------------

在這裏插入圖片描述

(1)07年的方法:我們選取Recall >={ 0, 0.1, …, 1}的11處Percision的最大值:1, 1, 1, 0.5, 0.5, 0.5, 0.5, 0.5, 0, 0, 0。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。計算recall/precision下的面積:AP = (0.14-0)x1 + (0.29-0.14)x1 + (0.43-0.29)x0.5 + (0.57-0.43)x0.5 + (0.71-0.57)x0.5 + (1-0.71)x0 = 0.5

計算出每個類別的AP以後,對於所有類別的AP取均值就得到mAP了。

 

 AP衡量的是學出來的模型在每一個類別上的預測性能的好壞,mAP衡量的是學出來的模型在所有類別上的預測性能的好壞,得到AP後mAP的計算就很簡單了,就是取所有AP的平均值。

 

 ref(多貼幾個鏈接):

https://github.com/rafaelpadilla/Object-Detection-Metrics#interpolating-all-points

https://blog.csdn.net/wc996789331/article/details/83785993

https://www.pianshen.com/article/4176657687/

https://blog.csdn.net/zhou4411781/article/details/105839357?utm_medium=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param_right&depth_1-utm_source=distribute.pc_relevant_right.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param_right

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