mean Average Precision (mAP) — 評估物體偵測模型好壞的指標

Jeremy Pai
Life’s a Struggle
9 min readMay 3, 2021
最近終於開始下雨了,總算可以緩解水庫缺水的問題 (Image by Free-Photos from Pixabay)

物體偵測除了要判斷影像中的所有物體各自屬於哪個類別之外,還要找出物體的位置。可想而知模型的好壞不能只單靠準確率來做判斷,因此我們需要其他評估方式來判定模型的物體偵測能力。

mean Average Precision 或簡稱為 mAP,它的意義就如同標題所示,是用來判斷模型在物體偵測領域上表現好壞的指標。不過在說明 mAP 之前,我們還必須知道 precision、recall 與 IoU。接下來我們就來一一了解~

Precision and Recall

Precision:預測為目標物且實際上也確實為目標物的比例,可以得知當模型預測為目標物時,這個結果是不是準確的。Precision 有另一個名字稱作 Positive predictive value (PPV)。

Recall:實際為目標物也確實被預測為目標物的比例,可以得知模型找出目標物的能力。Recall 也有另一個名字稱作 Sensitivity。

寫成數學表示式如下:

或許以上的說明還不夠清楚,以下用一個例子來說明。為了要實現自動駕駛,車子也必須有著能辨識車輛周遭環境物體的能力,因此我們可能會訓練一個模型辨識周圍車子的位置,所以目標物在這個例子中就是車子,而 Precision 與 Recall 則定義如下:

F1 score 則是 Precision 與 Recall 的調和平均數,寫成數學表示式如下:

Intersection over Union (IoU)

IoU 的概念還滿簡單的,就是評估預測的 bounding box 與 ground-truth bounding box 像不像的指標。一般情況下,如果 bounding box 被預測為確實有目標物存在,而且 IoU ≧ 0.5 (此 threshold 會依情況有所調整) 我們就認定此 bounding box 為 TP (True Positive),反之則為 FP (False Positive)

Image from PyImageSearch [3]

Average Precision (AP)

AP 的計算用例子說明會比較容易,例子是從老師的說明截取 [1]:

在此例中假設目標物為車子,總共有 8 台。不過在模型預測的 10 個 bounding box 中漏掉兩台車沒有偵測到。

根據在 IoU 的說明,當 IoU ≧ 0.5 我們就認定此 bounding box 中有車子存在,並且將 bounding box 的排序依據 Confidence 大小重新排序一次 (Confidence 代表將此 bounding box 分類為目標物的機率)。

整理成以上表格的形式後,就可以開始計算 Precision 與 Recall:

Rank 1:
Precision = TP / (TP+FP) = 1/1 = 1
Recall = TP / total P = 1/8 = 0.125 (總共有 8 台車,即便有 2 台車沒被偵測到)

Rank 2:
Precision = 2/2 = 1
Recall = 2/8 = 0.25

Rank 3:
Precision = 3/3 = 1
Recall = 3/8 = 0.375

Rank 4:
Precision = 3/4 = 0.75
Recall = 3/8 = 0.375

Rank 5:
Precision = 4/5 = 0.8
Recall = 4/8 = 0.5

Rank 6:
Precision = 5/6 = 0.833
Recall = 5/8 = 0.625

Rank 7:
Precision = 5/7 = 0.714
Recall = 5/8 = 0.625

Rank 8:
Precision = 5/8 = 0.625
Recall = 5/8 = 0.625

Rank 9:
Precision = 5/9 = 0.556
Recall = 5/8 = 0.625

Rank 10:
Precision = 5/10 = 0.5
Recall = 5/8 = 0.625

將以上結果用 Excel 畫出來得到底下的 Precision-recall curve:

Precision-recall curve

可以發現到 Recall 會隨著計算的 case 越多呈現越來越大的趨勢,反觀 Precision 會受到此時計算的是 TP 還是 FP 而有所不同,反映在折線圖上就是很崎嶇的趨勢。

終於可以進到 AP 的定義!一般來說,AP 就是計算 Precision-recall curve 底下的面積,由於 Precision 與 Recall 都是介於 0~1 之間的數值,因此 AP 也是介於 0~1 之間的數值。還有一點需要注意的是在計算 AP 前會先將崎嶇的線條拉平 (紅色線條),如有其他地方也是不平的地方也需要作同樣的動作,這是為了降低崎嶇趨勢的影響 (可能是因為排序方式造成的)。

以計算過程來說,拉平這個動作就是每一個 Recall 對應的 Precision 都會選擇比此 Recall 更大的 Recall 所對應最大的 Precision 取代。舉例來說,本例當 Recall = 0.5 時,是對應到 Precision = 0.8,但是可以發現到當 Recall = 0.625 時,Precision = 0.833 是比自己的 Precision 還大的,因此就用 0.833 來取代自己的 0.8。

Interpolated AP (PASCAL VOC Challenge before 2010)

PASCAL VOC 是在物體偵測領域中很常用來驗證演算法好不好的資料集,會選擇 IoU ≧ 0.5 為 Positive。而且如果不同 bounding box 偵測到同一物體時,只會選擇第一個為 Positive,其餘都設定為 Negative。了解後才知道,原來不同時間的 PASCAL VOC 是採用不同的 AP 計算方式...

PASCAL VOC 2010 之前是將 Recall 分成 11 個點,分別為 {0, 0.1, , …, 0.9, 1.0},並找出這幾個點的最大 Precision 作平均計算。

VOC 2010 之前的 AP = (1+1+1+1+0.833+0.833+0.833+0+0+0+0) / 11 = 0.591

但用 11 個點近似的作法當然不能說到很準確,而且此計算方式如果碰到演算法的 AP 不夠高時,會喪失判斷此演算法是不是優於擁有相近 AP 演算法的能力。

AUC AP (PASCAL VOC Challenge after 2010)

底下才有了新的 AP 計算方法,直接捨棄使用固定 Recall 所對應的最大 Precision 來計算的想法,而是選擇當哪一個 Recall 所對應的最大 Precision 改變了,就將此 Recall 列為之後要計算的點。

本例中在 r1 與 r2 對應的 Precision 發生改變,因此挑出這兩個點來計算 AP,而 AP 其實就是計算藍色與紅色這兩塊區域的面積和

因此計算 AP 也就是拉平趨勢線之後計算 AUC (Area under the Curve):

VOC 2010 之後的 AP = 1*r1+ 0.833*(r2-r1) = 1*0.375 + 0.833*(0.625–0.375) = 0.583

AP (COCO)

COCO 資料庫比較特別,在 AP 的計算上會考慮不同 IoU 的閥值。一般可能會寫成 AP[.50:.05:.95],代表會分別計算當 IoU = 0.5、IoU = 0.55、…、IoU = 0.9 與 IoU = 0.95 的 interpolated AP,最後再將這些 AP 取平均得到最後的 AP。

底下是用來評估模型在 COCO 資料庫表現的 12 個指標:

mean Average Precision (mAP)

剛剛都只是針對其中一個類別來計算 AP,可想而知,當我們計算每一個類別的 AP 之後再作平均就會得到 mAP。

不過在 COCO 資料庫中,其實 AP 與 mAP 是指同一個意思,也許在某些資料庫也會有類似的情形,因此在不確定兩者所代表的意思是不是相同的情況下,會需要去了解該資料庫的 AP 與 mAP 各自所代表的含意!

Resource:

[1] Tommy Huang — 深度學習系列: 什麼是AP/mAP?

[2] Jonathan Hui — mAP (mean Average Precision) for Object Detection

[3] PyImageSearch — Intersection over Union (IoU) for object detection

[4] COCO — Evaluate: Detection

[5] scikit-learn — Precision-Recall

--

--

Jeremy Pai
Life’s a Struggle

機器視覺演算法工程師~不限主題隨心寫下自己想寫的事物