# AP/mAP ## Precision、Recall 一般深度學習看到的指標都是寫AP,AP就是average precision,指標有兩個分別為precision和recall;首先主要先理解:什麼是precision」和「什麼是recall」,和「什麼是AP」 ![](https://i.imgur.com/UKdjC70.png) Precision: 「所有被檢測為目標」但「正確分類為目標」的比例。[TP/(TP+FP)] Recall: 資料中的「所有目標」但「正確分類為目標」的比例。[TP/(TP+FN)] 比如說: 有個分類問題要分「狗」和「不是狗」 Precision: 所有被檢測為目標=所有被模型判斷為狗的個數 =是狗且被模型判斷為狗的個數(TP) + 不是狗且被模型判斷為狗的個數(FP) Recall: 資料中的所有目標=資料中為狗的個數 =是狗且被模型判斷為狗的個數(TP) + 是狗但被模型判斷為不是狗的個數(FN) ![](https://i.imgur.com/IYasgRf.png) ## AP 常用在目標偵測(object detection)的評估指標中,AP就是average precision 在目標檢測中,我們通常會認為預測的目標(通常是一個四四方方的bounding box)和Ground truth進行IoU計算,如果IOU(intersection over union)大於一個閾值(threshold,通常是0.5),則認為這個目標被是一個TP,如果小於這個閾值就是一個FP。 IOU (intersection over union): 白話說就是兩個物件的重疊(overlap)/交集比例 IOU就是「兩個物件的交集」除上「兩個物件的聯集」 ![](https://i.imgur.com/lrFIv6d.png) AP計算用舉例的可能會方便一點,下表為例子,這邊是舉「狗偵測」。 1. 假設真實情況有8隻狗(GT1~GT8)。 2. Bounding box是模型偵測出來的有10個狗(BB1~BB10)。 有些BBox只偵測到狗的腳或頭,所以IoU很低(比如BB3, BB4, BB5, BB7, BB8),然後GT7和GT8沒偵測到(FN=(GT7, GT8))。 ![](https://i.imgur.com/kHqauAz.png) 假設IoU>=0.5,我們才會說他有正確判斷為狗(下表第二欄) TP=(BB1, BB2, BB6, BB9, BB10) FP=(BB3, BB4, BB5, BB7, BB8) ![](https://i.imgur.com/UiCSRbQ.png) 這時候根據模型說「判斷為狗的機率」(網路範例大多用Confidence表示)進行排序。 ![](https://i.imgur.com/WqKfQOy.png) 根據不同rank下去計算precision和recall。 Rank 1: Precision = (>=Rank 1被判斷為狗的個數) / (>=Rank 1的總個數)=1/1=1 Recall = (>=Rank 1被判斷為狗的個數) / (真的為狗的總個數)=1/8=0.125 Rank 2: Precision = (>=Rank 2被判斷為狗的個數) / (>=Rank 2的總個數)=2/2=1 Recall = (>=Rank 2被判斷為狗的個數) / (真的為狗的總個數)=2/8=0.25 Rank 3: Precision = (>=Rank 3被判斷為狗的個數) / (>=Rank 3的總個數)=3/3=1 Recall = (>=Rank 3被判斷為狗的個數) / (真的為狗的總個數)=3/8=0.375 Rank 4: Precision = (>=Rank 4被判斷為狗的個數) / (>=Rank 4的總個數)=3/4=0.75 Recall = (>=Rank 4被判斷為狗的個數) / (真的為狗的總個數)=3/8=0.375 Rank 5: Precision = (>=Rank 5被判斷為狗的個數) / (>=Rank 5的總個數)=4/5=0.8 Recall = (>=Rank 5被判斷為狗的個數) / (真的為狗的總個數)=4/8=0.5 Rank 6: Precision = (>=Rank 6被判斷為狗的個數) / (>=Rank 6的總個數)=5/6=0.833 Recall = (>=Rank 6被判斷為狗的個數) / (真的為狗的總個數)=5/8=0.625 Rank 7: Precision = (>=Rank 7被判斷為狗的個數) / (>=Rank 7的總個數)=5/7=0.714 Recall = (>=Rank 7被判斷為狗的個數) / (真的為狗的總個數)=5/8=0.625 Rank 8: Precision = (>=Rank 8被判斷為狗的個數) / (>=Rank 8的總個數)=5/8=0.625 Recall = (>=Rank 8被判斷為狗的個數) / (真的為狗的總個數)=5/8=0.625 Rank 9: Precision = (>=Rank 9被判斷為狗的個數) / (>=Rank 9的總個數)=5/9=0.556 Recall = (>=Rank 9被判斷為狗的個數) / (真的為狗的總個數)=5/8=0.625 Rank 10: Precision = (>=Rank 10被判斷為狗的個數) / (>=Rank 10的總個數)=5/10=0.5 Recall = (>=Rank 10被判斷為狗的個數) / (真的為狗的總個數)=5/8=0.625 ![](https://i.imgur.com/nJvSkxQ.png) ![](https://i.imgur.com/MBD7F3p.png) AP就是計算這條precision-recall curve下的面積(area under curve, AUC)。 ## AP (Average Precision) in PASCAL VOC challenge VOC 2010之前的方法在算AP部分時會做一個小轉換。 就是選取Recall>=0, 0.1, 0.2,…, 1,這11的地方的Precision的最大值。 ![](https://i.imgur.com/UJbUvQM.png) 這邊的p等於precision,r={0, 0.1,…, 1} VOC 2010之後的方法在recall的決斷值又做了修正,就是選取Recall>=0, 0.14, 0.29, 0.43, 0.57, 0.71, 1,這7的地方的Precision的最大值。 ![](https://i.imgur.com/89Ypz1k.png) 下圖表為轉兩個方法換後的結果。 此例子VOC 2010之前的AP=(1+1+1+1+0.833+0.833+0.833+0+0+0+0)/11=6.433/11= 0.591 此例子VOC 2010之後的AP=(1+1+1+0.833+0.833+0+0)/7=4.666/7= 0.667 ![](https://i.imgur.com/zcjSiI0.png) 左表的計算結果來是"根據不同rank下去計算precision和recall";右表的計算結果是"根據不同已經給定的recall決斷值下去計算precision"。左表的Rank來源,來自每個BBOX的機率。 ![](https://i.imgur.com/WRJM3wu.png) ### Pascal VOC 1. PASCAL 組織全名為 Pattern Analysis, Statistical Modelling and Computational Learning Visual Object Classes 2. PASCAL 的 VOC dataset 提供了物件識別模型最主要的兩種功能驗證:classification(分類)及detection(偵測) 3. PASCAL VOC dataset: https://makerpro.cc/2020/01/get-specific-objects-from-voc-dataset/ ## COCO 資料庫的mAP COCO 資料庫的AP計算比較特殊。 論文常常看到AP[.50:.05:.95] 這個解讀方式是在COCO資料庫對performance評比時,IoU閾值設定是動態的,一般VOC資料庫IoU閾值設定為0.5 ![](https://i.imgur.com/70ntdCV.png) ## mAP AP是只偵測一個物體所算出的評估指標,物體偵測不可能只偵測一種東西,以COCO資料庫有80種為例,所以mAP就是每一種物體的AP算完後的平均值。 # 參考文獻 https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173 https://medium.com/@chih.sheng.huang821/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92%E7%B3%BB%E5%88%97-%E4%BB%80%E9%BA%BC%E6%98%AFap-map-aaf089920848