在機器學習領域,對於大多數常見問題,一般會有多個模型可供選擇。固然,每一個模型會有本身的特性,並會受到不一樣因素的影響而表現不一樣。算法
每一個模型的好壞是經過評價它在某個數據集上的性能來判斷的,這個數據集一般被叫作「驗證/測試」數據集。這個性能由不一樣的統計量來度量,包括準確率( accuracy )、精確率( precision )、召回率( recall )等等。選擇咱們會根據某個特定的應用場景來選擇相應的統計量。而對每一個應用來講,找到一個能夠客觀地比較模型好壞的度量標準相當重要。機器學習
在本文,咱們將會討論目標檢測問題中最經常使用的度量標準 --- 平均精度均值(Mean Average Precision, mAP)。性能
大多數狀況下,這些度量標準都很容易理解和計算。例如,在二類分類問題中,精確率和召回率都是簡單和直觀的統計量。 學習
而另外一方面,目標檢測則是一個相對不一樣且頗有意思的問題。測試
即便你的目標檢測器檢測到一張圖片中有貓,可是若是你找不到這隻貓在圖片中的具體位置,那麼這個檢測器也是沒有任何用處的。spa
因爲你如今須要預測一張圖片中目標是否出現及其具體位置,那麼咱們如何計算這個度量就變得至關有意思了。3d
首先,讓咱們定義目標檢測問題,這樣咱們能夠對問題有一個統一的認識。blog
對於「目標檢測問題」,個人意思是,給定一張圖片,找到圖中的全部目標,肯定他們的位置並對他們進行分類。圖片
目標檢測模型一般是在給定的固定類別上進行訓練的,所以模型在圖中只能定位和分類這些已有的類別。ci
此外,目標的位置一般是用邊界矩形/邊界框的形式來肯定的。
所以,目標檢測包含了兩個任務,肯定圖片中目標的位置,以及對目標進行分類。
圖1- 幾個比較有名的圖像處理問題,圖片來自斯坦福大學 CS231n 課程幻燈片(第8講)
以下文所說,平均精度均值 mAP 是預測目標位置以及類別的這一類算法的性能度量標準。所以,從圖1咱們能夠看到, mAP 對於評估目標定位模型、目標檢測模型以及實例分割模型很是有用。
爲何選擇 mAP?
目標檢測問題中,每張圖片中可能會含有不一樣類別的不一樣目標。如前文所說,模型的分類和定位性能都須要被評估。
所以,精確率,這個圖像分類問題中使用的標準的評價度量,並不能直接用在這裏。如今,是平均精度均值 mAP 發揮做用的時候了。我但願,讀完本文以後你能夠理解 mAP 的含義和意義。
關於參考標準(Ground Truth)
對於任何算法來講,度量的值老是把預測值和參考標準的信息進行比較以後計算獲得的。咱們只知道訓練、驗證和測試數據集的參考標準信息。
在目標檢測問題中,參考標準的信息包括圖像,圖像中目標的類別,以及每一個目標的真實邊界框。
一個例子
咱們給定了真實圖片(jpg, png 等格式)和其餘解釋性文字(邊界框的座標( x, y,寬度和高度)和類別),畫在圖片上的紅色框和文本標籤只是方便咱們本身觀看。
參考標準信息的可視化
所以,對於這個特定的例子,咱們的模型在訓練期間獲得的實際上是這張圖片:
實際圖片
以及三組定義了參考標準的數字(讓咱們假設這張圖片的分辨率是 1000 x 800 像素,表中全部座標的單位都是像素,座標值大小是估計的)
讓咱們實際操做一下,看看 mAP 是如何計算的。
我會在另外一篇文章介紹各類目標檢測算法,包括它們的方法以及性能。如今,讓咱們假設咱們手上已經有一個訓練好的模型,並且咱們將在驗證數據集上評估它的結果。
讓咱們假設原始圖片和參考標準的解釋性文字如上文所述。訓練數據和驗證數據的全部圖像以相同的方法進行了標註。
訓練好的模型會返回許多預測結果,可是這些預測結果中的大多數都會有很是低的置信度分數,所以咱們只需考慮那些超過某個報告置信度分數的預測結果。
咱們用模型對原始圖像進行處理,下面是目標檢測模型在置信度閾值化以後返回的結果。
帶有邊界框的圖像:
來自咱們模型的結果
咱們能夠說這些檢測結果是正確的,可是咱們怎麼量化呢?
首先,咱們須要知道每一個檢測結果的正確性。可以告訴咱們一個給定的邊界框的正確性的度量標準是「交併比」(Intersection over Union, IoU)。這是一個很是簡單的可視量。
就文字而言,某些人可能會說這個量的名字自己就已經解釋了本身的含義,可是咱們須要更好的解釋。我會簡單地解釋 IoU 的含義,對於那些很想深刻了解 IoU 含義的讀者,Adrian Rosebrock 有一篇寫得很是好的文章,能夠做爲該內容的補充。
(https://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/)
交併比是預測邊界框和參考邊界框的交集和並集之間的比率。這個統計量也叫作 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 值可能看上去還不錯,可是你的模型可能只對某些類別較好,而對某些類別的效果很是差。所以,當分析你的模型結果時,最好單獨類別的平均精度值。這些值太低的話可能意味着須要添加更多的訓練樣本了。