mean Average Precision (mAP) — 評估物體偵測模型好壞的指標
物體偵測除了要判斷影像中的所有物體各自屬於哪個類別之外,還要找出物體的位置。可想而知模型的好壞不能只單靠準確率來做判斷,因此我們需要其他評估方式來判定模型的物體偵測能力。
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)。
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:
可以發現到 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 列為之後要計算的點。
因此計算 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