平均精度均值(mAP)——目標檢測模型效能統計量
在機器學習領域,對於大多數常見問題,通常會有多個模型可供選擇。當然,每個模型會有自己的特性,並會受到不同因素的影響而表現不同。
每個模型的好壞是通過評價它在某個資料集上的效能來判斷的,這個資料集通常被叫做“驗證/測試”資料集。這個效能由不同的統計量來度量,包括準確率( accuracy )、精確率( precision )、召回率( recall )等等。選擇我們會根據某個特定的應用場景來選擇相應的統計量。而對每個應用來說,找到一個可以客觀地比較模型好壞的度量標準至關重要。
在本文,我們將會討論目標檢測問題中最常用的度量標準 --- 平均精度均值(Mean Average Precision, mAP)。
大多數情況下,這些度量標準都很容易理解和計算。例如,在二類分類問題中,精確率和召回率都是簡單和直觀的統計量。
而另一方面,目標檢測則是一個相對不同且很有意思的問題。
即使你的目標檢測器檢測到一張圖片中有貓,但是如果你找不到這隻貓在圖片中的具體位置,那麼這個檢測器也是沒有任何用處的。
由於你現在需要預測一張圖片中目標是否出現及其具體位置,那麼我們如何計算這個度量就變得相當有意思了。
首先,讓我們定義目標檢測問題,這樣我們可以對問題有一個統一的認識。
▌目標檢測問題
對於“目標檢測問題”,我的意思是,給定一張圖片,找到圖中的所有目標,確定他們的位置並對他們進行分類。
目標檢測模型通常是在給定的固定類別上進行訓練的,因此模型在圖中只能定位和分類這些已有的類別。
此外,目標的位置通常是用邊界矩形/邊界框的形式來確定的。
因此,目標檢測包含了兩個任務,確定圖片中目標的位置,以及對目標進行分類。
圖1- 幾個比較有名的影象處理問題,圖片來自斯坦福大學 CS231n 課程幻燈片(第8講)
如下文所說,平均精度均值 mAP 是預測目標位置以及類別的這一類演算法的效能度量標準。因此,從圖1我們可以看到, mAP 對於評估目標定位模型、目標檢測模型以及例項分割模型非常有用。
▌評估模型檢測模型
為什麼選擇 mAP?
目標檢測問題中,每張圖片中可能會含有不同類別的不同目標。如前文所說,模型的分類和定位效能都需要被評估。
因此,精確率,這個影象分類問題中使用的標準的評價度量,並不能直接用在這裡。現在,是平均精度均值 mAP 發揮作用的時候了。我希望,讀完本文之後你可以理解 mAP 的含義和意義。
關於參考標準(Ground Truth)
對於任何演算法來說,度量的值總是把預測值和參考標準的資訊進行比較之後計算得到的。我們只知道訓練、驗證和測試資料集的參考標準資訊。
在目標檢測問題中,參考標準的資訊包括影象,影象中目標的類別,以及每個目標的真實邊界框。
-
一個例子
我們給定了真實圖片(jpg, png 等格式)和其他解釋性文字(邊界框的座標( x, y,寬度和高度)和類別),畫在圖片上的紅色框和文字標籤只是方便我們自己觀看。
參考標準資訊的視覺化
因此,對於這個特定的例子,我們的模型在訓練期間得到的其實是這張圖片:
實際圖片
以及三組定義了參考標準的數字(讓我們假設這張圖片的解析度是 1000 x 800 畫素,表中所有座標的單位都是畫素,座標值大小是估計的)
讓我們實際操作一下,看看 mAP 是如何計算的。
我會在另一篇文章介紹各種目標檢測演算法,包括它們的方法以及效能。現在,讓我們假設我們手上已經有一個訓練好的模型,而且我們將在驗證資料集上評估它的結果。
▌計算 mAP
讓我們假設原始圖片和參考標準的解釋性文字如上文所述。訓練資料和驗證資料的所有影象以相同的方法進行了標註。
訓練好的模型會返回許多預測結果,但是這些預測結果中的大多數都會有非常低的置信度分數,因此我們只需考慮那些超過某個報告置信度分數的預測結果。
我們用模型對原始影象進行處理,下面是目標檢測模型在置信度閾值化之後返回的結果。
帶有邊界框的影象:
來自我們模型的結果
我們可以說這些檢測結果是正確的,但是我們怎麼量化呢?
首先,我們需要知道每個檢測結果的正確性。能夠告訴我們一個給定的邊界框的正確性的度量標準是“交併比”(Intersection over Union, IoU)。這是一個非常簡單的可視量。
就文字而言,某些人可能會說這個量的名字本身就已經解釋了自己的含義,但是我們需要更好的解釋。我會簡單地解釋 IoU 的含義,對於那些很想深入瞭解 IoU 含義的讀者,Adrian Rosebrock 有一篇寫得非常好的文章,可以作為該內容的補充。
(https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/)
IoU
交併比是預測邊界框和參考邊界框的交集和並集之間的比率。這個統計量也叫做 Jaccard 指數(Jaccard Index),是由 Paul Jaccard 在 20 世紀初首次提出的。
要獲得交集和並集的值,我們首先把預測邊界框覆蓋在參考邊界框之上。(如圖所示)
現在對於每個類別,預測邊界框和參考邊界框的重疊部分叫做交集,而兩個邊界框跨越的所有區域叫做並集。
我們僅以這匹馬作為例子
上圖中類別為馬的交集和並集區域看上去就像這樣:
這個例子中交集區域相當大
交集覆蓋的是邊界框重合區域(藍綠色區域),並集覆蓋的是橙色和藍綠色的所有區域。
然後, IoU 可以像這樣計算:
分辨正確檢測結果和計算精確率
利用 IoU ,我們現在要分辨檢測結果是否正確。最常用的閾值是0.5:如果 IoU > 0.5,那麼認為這是一個正確檢測,否則認為這是一個錯誤檢測。
現在我們為模型生成的每一個檢測框計算其 IoU 值(置信度閾值化之後)。利用該 IoU 值以及我們的 IoU 閾值(例如 0.5),我們為圖片中的每一個類計算其正確檢測的數量(A)。
現在對於每一張圖片,我們都有參考標準的資料,可以告訴我們在圖片中某個特定類別的真實目標數量(B)。而且我們已經計算了正確預測的數量(A)(True Positives)。因此現在我們可以用這條公式計算模型對該類別的精確率(A/B)。
給定的圖片中類別 C 的精確率=圖片中類別 C 的真正類數量/圖片中類別 C 所有目標的數量
對於一個給定的類別,讓我們對驗證集中的每張圖片都計算它的精確率。假設我們的驗證集中有 100 張圖片,並且我們知道每張圖片都包含了所有的類別(根據參考標準告訴我們的資訊)。這樣對於每個類別,我們會有 100 個精度率的值(每張圖片一個值)。讓我們對這些 100 個值進行平均。這個平均值叫做該類的平均精度(Average Precision)。
某個類別(C)的平均精度=驗證集中該類(C)的所有精確率的和/含有該類別(C)目標的影象數量
現在,假設在我們整個資料集中有 20 個類別。對每一個類別,我們都會進行相同的操作:計算 IoU -> 精確率(Precision)-> 平均精度(Average Precision)。所以我們會有 20 個不同的平均精度值。利用這些平均精度值,我們可以很輕鬆地判斷我們的模型對任何給定的類別的效能。
為了只用一個數字來表示一個模型的效能(一個度量解決所有問題),我們對所有類別的平均精度值計算其均值(average/mean)。這個新的值,就是我們的平均精度均值 mAP (Mean Average Precision)!!(我得說,這個命名非常有創意)
平均精度均值=所有類別的平均精度值之和/所有類別的數目
所以,平均精度均值即資料集中所有類別的平均精度的均值。
當我們比較 mAP 值的時候要記得幾個重要的點:
-
-
mAP 總是在固定的資料集上進行計算。
-
-
-
mAP 並不是量化模型輸出的絕對度量,但它是一個不錯的相對度量。當我們在流行的公開資料集上計算這個度量時,它可以很容易地被用來比較目標檢測的新老方法的效能好壞,因此我們並不需要一個絕對度量。
-
-
-
根據不同的類別在訓練資料中的分佈情況不同,平均精度值可能對於某些類別(這些類別有很好的訓練資料)非常高,然後對於某些類別(這些類別有更少的資料或者壞資料)可能非常低。所以,你的 mAP 值可能看上去還不錯,但是你的模型可能只對某些類別較好,而對某些類別的效果非常差。因此,當分析你的模型結果時,最好單獨類別的平均精度值。這些值過低的話可能意味著需要新增更多的訓練樣本了。
-