mAP以及AP計算方式
1、前言
AP就是P—R曲線下的面積,我們需要做的就是根據不同的置信度閾值(p_threshold),計算出這模型得到的預測框的(R,P),然後作出P—R曲線,並求解面積,就能得到目標檢測模型對該檢測種類的AP。(在VOC2010之後,計算AP需要對做出來的P—R曲線做一個平滑,之後會提到)
和分類模型計算P(精確度)R(召回度)不一樣的是(分類模型計算P,R可以參看我這篇博文AUC、精確率和召回率),在目標檢測中我們是沒法知道我們模型出來的預測框的真實值是什麼的(甚至GT和預測框的個數都是不匹配的),但是該怎樣計算P和R呢?其實計算P,R最重要的指標只有3個,分別是:
TP | 真實值為正——>預測值為正 |
FP | 真實值為負——>預測值為正 |
FN | 真實值為正——>預測值為負 |
因此在目標檢測中我們只需要計算出以上三個指標就可以了。
2、例子
我們直接用例子來進行解釋,假設我們有5個GT(Ground_Truth就是目標檢測中人工標註的物件的矩形框,可以認為是真實物體的標籤,下面用BB1—BB5來表示),我們模型對該種識別種類返回了10個預測框,接下來我們計算該種類的AP:
1、根據預測框計算和GT的IOU,如果IOU大於iou_threshold(IOU閾值,不要和前面的p_threshold弄混了)則標記為1,否則標記為0。比如我們預測出來10個框,根據iou_threshold可以得到這些框的IOU結果分別為(1,0,1,0,1,1,1,0,0,1),還有這些框的置信度分別為[0.9,0.85,0.7,0.6,0.45,0.25,0.2,0.15,0.13,0.12](需要對框從小到大排序),並且我們還知道這些預測框和哪一個GT在做IOU,[BB1,BB2,BB1,BB2,BB3,BB4,BB3,BB1,BB4,BB3],如果做一個表來表示結果應該如下圖:
編號 | GT | 置信度 | IOU結果 |
1 | BB1 | 0.9 | 1 |
2 | BB2 | 0.85 | 0 |
3 | BB1 | 0.7 | 1 |
4 | BB2 | 0.6 | 0 |
5 | BB3 | 0.45 | 1 |
6 | BB4 | 0.25 | 1 |
7 | BB3 | 0.2 | 1 |
8 | BB1 | 0.15 | 0 |
9 | BB4 | 0.13 | 0 |
10 | BB5 | 0.12 | 1 |
2、要注意雖然預測出來有10個框,但是我們實際上只有5個GT(也就是隻有5個物體),換句話說其實你預測的10個框裡可能有對同一個GT的重複預測(可能有幾個預測框都和同一個GT滿足IOU>iou_threshold,比如1號框和3號框都是同時對BB1的預測)。
3、接下來我們就是需要根據不同的p_threshold(置信度閾值),計算出這10個預測框的(R,P)點,然後作出P——R曲線,並求解面積。問題就在於如何求對應p_threshold下的P和R,下面我以p_threshold=0.6為例,計算上面表格中10個框的(R,P)具體做法。
- 由於編號1,2,3,4的預測框的置信度都大於等於p_threshold,因此我同意他們的IOU結果(即認為編號1預測框的標籤是BB1的準確框,編號2不是BB2的準確框,編號3也是BB1的準確框,編號4不是BB2的準確框),但是我標記前面四個框(編號1-4)都預測為正例。
- 其餘的預測框我都不認同他們的IOU結果(即我不認為編號5的預測框是BB3的準確框,我也不認為編號8不是BB1的準確框),但是我仍然把剩下的6個框都預測為負例。
- 由上面兩種看法,我們就可以得到當p_threshold=0.6時:這樣我們就可以算出P=TP/(TP+FP),R=TP/(TP+FN)
- TP = 1(只有編號1是正確預測,編號3雖然也是正確預測但是屬於重複預測了歸納到FP中,誰讓它置信度小呢)
- FP = 3(因為編號2的IOU結果表示它為負類,但是我預測為正類,因此編號2是FP,同理編號4也是。編號3是認為重複預測了,因為編號1已經正確預測了BB1)
- FN = 4(這個指標可以直接由GT個數-TP個數得到,因為你可以理解為真實的有5個正例,但是你只預測對了1個(TP=1),所以剩下的框都預測錯了,因此FN=GT-TP)
上面的例子說完其實可能有疑問說為什麼不取分析編號5-10的框呢?置信度小於我設定的閾值p_threshold,我沒有辦法認同他們的IOU結果因此我不知道他們的IOU結果是對的還是錯的,因此認為都是負例。
另一個疑問是,為什麼你要把置信度大於p_threshold的框都預測為正例,其餘的是負例,難道不是應該尊重IOU結果麼?我的想法是模型既然輸出的這些預測框,那麼肯定是模型認為這些預測框都是目標框,但是置信度小於了我設定的p_threshold自然是應該認為模型識別為負例了。
其實,以上的看法都是我我自己根據網上博文得到的結果的理解,並且計算之後發現這一套邏輯是符合最後結果的,為了方便大家及以和自己去理解這個指標。
3、AP的計算
我們知道不同的p_threshold可以計算得出不同的(R,P),由這些點可以畫出影象,我們可以知道P會隨著R上升而下降,根據VOC2010的計算公式,我們需要對P—R曲線做一個平滑,具體的方式很簡單。
4、mAP的計算
參考網址:
以上內容如有錯誤,懇請指正