絕對不容錯過:最完整的檢測模型評估指標mAP計算指南(附程式碼)在這裡!
作者: 葉 虎
編輯: 趙一帆
前 言
本文翻譯自Measuring Object Detection models - mAP - What is Mean Average Precision?(http://tarangshah.com/blog/2018-01-27/what-is-map-understanding-the-statistic-of-choice-for-comparing-object-detection-models/),原作者保留版權。對於使用機器學習解決的大多數常見問題,通常有多種可用的模型。每個模型都有自己的獨特之處,並隨因素變化而表現不同
每個模型在“驗證/測試”資料集
這篇文章將介紹目標檢測(Object Detection)問題中的最常用評估指標-Mean Average Precision,即mAP。
大多數時候,這些指標很容易理解和計算。例如,在二元分類中,精確度和召回率是一個一個簡單直觀的統計量。然而,目標檢測是一個非常不同且有趣的問題。即使你的目標檢測器在圖片中檢測到貓,但如果你無法定位,它也沒有用處。由於你要預測的是影象中各個物體是否出現及其位置,如何計算mAP將非常有趣。
在講解mAP之前,我們先定義目標檢測問題。
01
目標檢測問題
在目標檢測問題中,給定一個影象,找到它所包含的物體,找到它們的位置並對它們進行分類。目標檢測模型通常是在一組特定的類集合上進行訓練的,所以模型只會定位和分類影象中的那些類。另外,物件的位置通常採用矩形邊界框表示。因此,目標檢測涉及影象中物體的定位和分類。
下面所述的Mean Average Precision特別適用於同時預測物體位置及類別的演算法。 因此,從圖1可以看出,它對評估定位模型、目標檢測模型和分割模型非常有用。
02
評估目標檢測模型
1. 為什麼是mAP?
目標檢測問題中的每個圖片都可能包含一些不同類別的物體。如前所述,需要評估模型的物體分類和定位效能。因此,用於影象分類問題的標準指標precision不能直接應用於此。 這就是為什麼需要mAP。 我希望讀完這篇文章後,你將能夠理解它的含義。
2. 關於Ground Truth
對於任何演算法,評估指標需要知道ground truth(真實標籤)資料。 我們只知道訓練、驗證和測試資料集的ground truth。對於目標檢測問題,ground truth包括影象中物體的類別以及該影象中每個物體的真實邊界框。
這裡給出了一個實際圖片(jpg、png等格式),以及相應的文字註釋(邊界框座標(x, y, w, h)和類別),如圖中紅色框以及文字標籤所示。
對於這個特殊例子,模型在訓練時需要原始的圖片:
以及ground truth的3個座標及類別(這裡假定圖片大小是1000x800px,所有的座標值都是以畫素為單位的近似值):
下面讓我們動一下手,去看如何計算mAP。這裡我們不談論不同的目標檢測演算法,假定我們已經有了一個訓練好的模型,現在只需要在驗證集上評估其效能。
03
mAP含義及計算
前面展示了原始影象和以及對應的ground truth。訓練集和驗證集中所有影象都以此方式標註。
訓練好的目標檢測模型會給出大量的預測結果,但是其中大多數的預測值都會有非常低的置信度(confidence score),因此我們只考慮那些置信度高於某個閾值的預測結果。
將原始圖片送入訓練好的模型,在經過置信度閾值篩選之後,目標檢測演算法給出帶有邊界框的預測結果:
現在,由於我們人類是目標檢測專家,我們可以知道這些檢測結果大致正確。但我們如何量化呢?我們首先需要判斷每個檢測的正確性。這裡採用IoU(Intersection over Union),它可以作為評價邊界框正確性的度量指標。 這是一個非常簡單的指標。從名稱看,有些人會發現這個名字是自解釋的,但我們需要更好的解釋。這裡會以簡短的方式解釋IoU,如果想深入理解,可以參考Adrian Rosebrock的這篇文章(Intersection over Union (IoU) for object detection)。
1. IoU
IoU是預測框與ground truth的交集和並集的比值。這個量也被稱為Jaccard指數,並於20世紀初由Paul Jaccard首次提出。為了得到交集和並集,我們首先將預測框與ground truth放在一起,如圖所示。
對於每個類,預測框和ground truth重疊的區域是交集,而橫跨的總區域就是並集。其中horse類的交集和並集如下圖所示(這個例子交集比較大):
其中藍綠色部分是交集,而並集還包括橘色的部分。那麼,IoU可以如下計算:
2. 鑑別正確的檢測結果並計算precision和recall
為了計算precision和recall,與所有機器學習問題一樣,我們必須鑑別出True Positives(真正例)、False Positives(假正例)、True Negatives(真負例)和 False Negatives(假負例)。
為了獲得True Positives and False Positives,我們需要使用IoU。計算IoU,我們從而確定一個檢測結果(Positive)是正確的(True)還是錯誤的(False)。最常用的閾值是0.5,即如果IoU> 0.5,則認為它是True Positive,否則認為是False Positive。而COCO資料集的評估指標建議對不同的IoU閾值進行計算,但為簡單起見,我們這裡僅討論一個閾值0.5,這是PASCAL VOC資料集所用的指標。
為了計算Recall,我們需要Negatives的數量。由於圖片中我們沒有預測到物體的每個部分都被視為Negative,因此計算True Negatives比較難辦。但是我們可以只計算False Negatives,即我們模型所漏檢的物體。
另外一個需要考慮的因素是模型所給出的各個檢測結果的置信度。通過改變置信度閾值,我們可以改變一個預測框是Positive還是 Negative,即改變預測值的正負性。基本上,閾值以上的所有預測(Box + Class)都被認為是Positives,並且低於該值的都是Negatives。
對於每一個圖片,ground truth資料會給出該圖片中各個類別的實際物體數量。我們可以計算每個Positive預測框與ground truth的IoU值,並取最大的IoU值,認為該預測框檢測到了那個IoU最大的ground truth。然後根據IoU閾值,我們可以計算出一張圖片中各個類別的正確檢測值(True Positives, TP)數量以及錯誤檢測值數量(False Positives, FP)。據此,可以計算出各個類別的precision:
既然我們已經得到了正確的預測值數量(True Positives),也很容易計算出漏檢的物體數(False Negatives, FN)。據此可以計算出Recall(其實分母可以用ground truth總數):
3. 計算mAP
mAP這個術語有不同的定義。此度量指標通常用於資訊檢索和目標檢測領域。然而這兩個領域計算mAP的方式卻不相同。這裡我們只談論目標檢測中的mAP計算方法。
在目標檢測中,mAP的定義首先出現在PASCAL Visual Objects Classes(VOC)競賽中,這個大賽包含許多影象處理任務,詳情可以參考這個http://homepages.inf.ed.ac.uk/ckiw/postscript/ijcv_voc09.pdf(裡面包含各個比賽的介紹以及評估等)。
前面我們已經講述瞭如何計算Precision和Recall,但是,正如前面所述,至少有兩個變數會影響Precision和Recall,即IoU和置信度閾值。IoU是一個簡單的幾何度量,可以很容易標準化,比如在PASCAL VOC競賽中採用的IoU閾值為0.5,而COCO競賽中在計算mAP較複雜,其計算了一系列IoU閾值(0.05至0.95)下的mAP。但是置信度卻在不同模型會差異較大,可能在我的模型中置信度採用0.5卻等價於在其它模型中採用0.8置信度,這會導致precision-recall曲線變化。為此,PASCAL VOC組織者想到了一種方法來解決這個問題,即要採用一種可以用於任何模型的評估指標。在paper中,他們推薦使用如下方式計算Average Precision(AP):
For a given task and class, the precision/recall curve is computed from a method’s ranked output. Recall is defined as the proportion of all positive examples ranked above a given rank. Precision is the proportion of all examples above that rank which are from the positive class. The AP summarises the shape of the precision/recall curve, and is defined as the mean precision at a set of eleven equally spaced recall levels [0,0.1,…,1]:
可以看到,為了得到precision-recall曲線,首先要對模型預測結果進行排序(ranked output,按照各個預測值置信度降序排列)。那麼給定一個rank,Recall和Precision僅在高於該rank值的預測結果中計算,改變rank值會改變recall值。這裡共選擇11個不同的recall([0, 0.1, ..., 0.9, 1.0]),可以認為是選擇了11個rank,由於按照置信度排序,所以實際上等於選擇了11個不同的置信度閾值。那麼,AP就定義為在這11個recall下precision的平均值,其可以表徵整個precision-recall曲線(曲線下面積)。
另外,在計算precision時採用一種插值方法(interpolate):
The precision at each recall level r is interpolated by taking the maximum precision measured for a method for which the corresponding recall exceeds r:The intention in interpolating the precision/recall curve in this way is to reduce the impact of the “wiggles” in the precision/recall curve, caused by small variations in the ranking of examples.
及對於某個recall值r,precision值取所有recall>r中的最大值(這樣保證了p-r曲線是單調遞減的,避免曲線出現搖擺):
不過這裡VOC資料集在2007年提出的mAP計算方法,而在2010之後卻使用了所有資料點,而不是僅使用11個recall值來計算AP(詳細參考這篇http://host.robots.ox.ac.uk/pascal/VOC/pubs/everingham15.pdf):
Up until 2009 interpolated average precision (Salton and Mcgill 1986) was used to evaluate both classification and detection. However, from 2010 onwards the method of computing AP changed to use all data points rather than TREC-style sampling (which only sampled the monotonically decreasing curve at a fixed set of uniformly-spaced recall values 0, 0.1, 0.2,…, 1). The intention in interpolating the precision–recall curve was to reduce the impact of the ‘wiggles’ in the precision–recall curve, caused by small variations in the ranking of examples. However, the downside of this interpolation was that the evaluation was too crude to discriminate between the methods at low AP.
對於各個類別,分別按照上述方式計算AP,取所有類別的AP平均值就是mAP。這就是在目標檢測問題中mAP的計算方法。可能有時會發生些許變化,如COCO資料集採用的計算方式更嚴格,其計算了不同IoU閾值和物體大小下的AP(詳情參考http://cocodataset.org/#detection-eval)。
當比較mAP值,記住以下要點:
mAP通常是在一個數據集上計算得到的。
雖然解釋模型輸出的絕對量化並不容易,但mAP作為一個相對較好的度量指標可以幫助我們。 當我們在流行的公共資料集上計算這個度量時,該度量可以很容易地用來比較目標檢測問題的新舊方法。
根據訓練資料中各個類的分佈情況,mAP值可能在某些類(具有良好的訓練資料)非常高,而其他類(具有較少/不良資料)卻比較低。所以你的mAP可能是中等的,但是你的模型可能對某些類非常好,對某些類非常不好。因此,建議在分析模型結果時檢視各個類的AP值。這些值也許暗示你需要新增更多的訓練樣本。
04
程式碼實現
Facebook開源的Detectron包含VOC資料集的mAP計算(https://github.com/facebookresearch/Detectron/blob/05d04d3a024f0991339de45872d02f2f50669b3d/lib/datasets/voc_eval.py),這裡貼出其核心實現,以對mAP的計算有更深入的理解。首先是precision和recall的計算:
# 按照置信度降序排序
sorted_ind = np.argsort(-confidence)
BB = BB[sorted_ind, :] # 預測框座標
image_ids = [image_ids[x] for x in sorted_ind] # 各個預測框的對應圖片id# 便利預測框,並統計TPs和FPs
nd = len(image_ids)
tp = np.zeros(nd)
fp = np.zeros(nd)for d in range(nd):
R = class_recs[image_ids[d]]
bb = BB[d, :].astype(float)
ovmax = -np.inf
BBGT = R['bbox'].astype(float) # ground truth
if BBGT.size > 0:
# 計算IoU
# intersection
ixmin = np.maximum(BBGT[:, 0], bb[0])
iymin = np.maximum(BBGT[:, 1], bb[1])
ixmax = np.minimum(BBGT[:, 2], bb[2])
iymax = np.minimum(BBGT[:, 3], bb[3])
iw = np.maximum(ixmax - ixmin + 1., 0.)
ih = np.maximum(iymax - iymin + 1., 0.)
inters = iw * ih # union
uni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) +
(BBGT[:, 2] - BBGT[:, 0] + 1.) *
(BBGT[:, 3] - BBGT[:, 1] + 1.) - inters)
overlaps = inters / uni
ovmax = np.max(overlaps)
jmax = np.argmax(overlaps) # 取最大的IoU
if ovmax > ovthresh: # 是否大於閾值
if not R['difficult'][jmax]: # 非difficult物體
if not R['det'][jmax]: # 未被檢測
tp[d] = 1.
R['det'][jmax] = 1 # 標記已被檢測
else:
fp[d] = 1.
else:
fp[d] = 1.# 計算precision recallfp = np.cumsum(fp)
tp = np.cumsum(tp)
rec = tp / float(npos)# avoid divide by zero in case the first detection matches a difficult# ground truth
prec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps)
這裡最終得到一系列的precision和recall值,並且這些值是按照置信度降低排列統計的,可以認為是取不同的置信度閾值(或者rank值)得到的。然後據此可以計算AP:
def voc_ap(rec, prec, use_07_metric=False):
"""Compute VOC AP given precision and recall. If use_07_metric is true, uses
the VOC 07 11-point method (default:False).
"""
if use_07_metric: # 使用07年方法
# 11 個點
ap = 0.
for t in np.arange(0., 1.1, 0.1):
if np.sum(rec >= t) == 0:
p = 0
else:
p = np.max(prec[rec >= t]) # 插值
ap = ap + p / 11.
else: # 新方式,計算所有點
# correct AP calculation
# first append sentinel values at the end
mrec = np.concatenate(([0.], rec, [1.]))
mpre = np.concatenate(([0.], prec, [0.]))
# compute the precision 曲線值(也用了插值)
for i in range(mpre.size - 1, 0, -1):
mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i])
# to calculate area under PR curve, look for points
# where X axis (recall) changes value
i = np.where(mrec[1:] != mrec[:-1])[0]
# and sum (\Delta recall) * prec
ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])
return ap
計算各個類別的AP值後,取平均值就可以得到最終的mAP值了。但是對於COCO資料集相對比較複雜,不過其提供了計算的API,感興趣可以看一下https://github.com/cocodataset/cocoapi/blob/master/PythonAPI/pycocotools/cocoeval.py。
注:譯文相比原文略有刪改。
END
往期回顧之影象目標檢測節選
機器學習演算法工程師
一個用心的公眾號
長按,識別,加關注進群,學習,得幫助
你的關注,我們的熱度,
我們一定給你學習最大的幫助
相關推薦
絕對不容錯過:最完整的檢測模型評估指標mAP計算指南(附程式碼)在這裡!
作者: 葉 虎 編輯: 趙一帆 前 言本文翻譯自Measuring Obje
目標檢測模型評估指標——mAP計算的討論
對於使用機器學習解決的大多數常見問題,通常有多種可用的模型。每個模型都有自己的獨特之處,並隨因素變化而表現不同。 每個模型在“驗證/測試”資料集上來評估效能,效能衡量使用各種統計量如準確度(accuracy),精度(precision),召回率(recall)等。選擇的統計量通常針對特定應用場景
目標檢測模型的評估指標mAP詳解(附程式碼)
文章轉自:https://zhuanlan.zhihu.com/p/37910324 對於使用機器學習解決的大多數常見問題,通常有多種可用的模型。每個模型都有自己的獨特之處,並隨因素變化而表現不同。 每個模型在“驗證/測試”資料集上來評估效能,效能衡量使用各種統計量如準確度(accuracy
二分類模型評估指標的計算方法與程式碼實現
一、定義 在研究評估指標之前,先給出分類結果混淆矩陣(confusion matrix)。 預測 真實 正例 反例 正例 TP FN 反例 FP TN 1.準確率--accuracy 定義:對於給定的測試資料集,分類器正確分類的樣本數與總樣
機器學習:圖文詳解模型評估指標ROC/AUC
模型訓練好,必須要通過各種指標去衡量模型的好壞,也就是模型的泛化能力。模型的評估指標有很多,筆者在剛開始學習的時候,也是搞得焦頭爛額,有時候自己理解了,但又很難跟別人解釋清楚,所以寫下這邊文章。本文主要介紹分類的模型的各種評估指標以及ROC和AUC。 1.混淆矩陣 對於二分類的模型,
顯著性目標檢測模型評價指標(一)——平均絕對誤差:Mean Absolute Error(MAE)
顯著性目標檢測模型評價指標 之 平均絕對誤差(MAE)原理與實現程式碼 目錄 一、顯著性目標檢測簡介 顯著性目標(Salient Object): 當我們在看一張圖片時,注意力首先會落在我們所感興趣的物體部分。比如我們看到一張畫有羊
不容錯過,最全的安卓架構合集【從零開始搭建android框架系列(2)】
安卓架構文章合集(a collection of android Architecture) 部落格原地址: 簡書部落格 github地址: 這是從各大平臺上參考的android架構文章,文章資料,主要參考自Info,推薦關注: infoQ 1 Android
自然語言處理之一:最大熵模型
一直對自然語言處理中的各種模型一知半解。總是抓不住它們的思想。 今天看了一下這個“最大熵模型”(A Maximum Entropy Approach to Natural Language Processing),寫寫自己的想法吧。呵呵。 就像論文中所說的:希望找到
強烈推薦 :最用心的運營資料指標解讀
資料分析涉及不同的業務領域,很多時候,業務的瞭解比資料技巧更重要。很多新人常問Python、SQL,但鮮有問業務,可後者才決定分析的成敗。 業務的洞悉決定了資料分析師發展的上限,資料技巧只是逼近它。好的分析師都懂業務,也必須懂業務。 我希望通過本文,讓資料
ml課程:最大熵與EM演算法及應用(含程式碼實現)
以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教。 本文主要介紹最大熵模型與EM演算法相關內容及相關程式碼案例。 關於熵之前的文章中已經學習過,具體可以檢視:ml課程:決策樹、隨機森林、GBDT、XGBoost相關(含程式碼實現),補充一些 基本概念: 資訊量:資訊的度量,即
顯著性目標檢測模型評價指標(二)——PR曲線
顯著性目標檢測模型評價指標 之 PR曲線原理與實現程式碼 目錄 一、PR曲線原理 在顯著目標提取中(關於視覺顯著性的簡要介紹點此處連結),PR曲線是用來評估模型效能的重要指標之一,PR曲線中的P(Precision)和R(Recall)分
【深度學習】常用的模型評估指標
是我 初學者 cnblogs 沒有 線下 均衡 顯示 總數 效果 “沒有測量,就沒有科學。”這是科學家門捷列夫的名言。在計算機科學中,特別是在機器學習的領域,對模型的測量和評估同樣至關重要。只有選擇與問題相匹配的評估方法,我們才能夠快速的發現在模型選擇和訓練過程中可能出現的
sklearn之模型評估指標總結歸納
文章目錄 機器學習模型評估 分類模型 迴歸模型 聚類模型 交叉驗證中指定scoring引數 網格搜尋中應用 機器學習模型評估 以下方法,sklearn中都在
機器學習常見模型評估指標
1.單值評估指標 在機器學習或深度學習中,為了評估最終模型的好壞,我們經常會引入各種評估指標,為了便於指標的說明,我們這裡具一個例子作為說明。假設我們想要建立一個垃圾郵件的分類模型,此時,模型預測結果的混淆矩陣如下表所示: 此時,我們常用的評估指標就有如下:
Python爬蟲實戰:抓取並儲存百度雲資源(附程式碼)
尋找並分析百度雲的轉存api 首先你得有一個百度雲盤的賬號,然後登入,用瀏覽器(這裡用火狐瀏覽器做示範)開啟一個分享連結。F12開啟控制檯進行抓包。手動進行轉存操作:全選檔案->儲存到網盤->選擇路徑->確定。點選【確定】前建議先清空一下抓包記錄,這樣可以精確定位到轉存的api,這就是
深度學習模型評估指標(http://scikit-learn.org/stable/)
在機器學習中,對模型的測量和評估同樣至關重要。只有選擇與問題相匹配的評估方法,我們才能夠快速的發現在模型選擇和訓練過程中可能出現的問題,迭代地對模型進行優化。 常見的模型評估指標: precision recall F1-score PRC ROC/AUC
快速理解分類模型評估指標
一、從混淆矩陣說起 我們以二分類模型來舉例,假設我們要預測使用者在借款之後是否會逾期。 對於我們的預測來說,有逾期/不逾期兩種結果。 對於真實情況,同樣有逾期/不逾期兩種結果。 我們以逾期為正例,以不逾期為反例,將預測結果與真實結果進行列聯交叉,就生成了混淆矩陣
模型評估指標AUC(area under the curve)
AUC在機器學習領域中是一種模型評估指標。根據維基百科的定義,AUC(area under the curve)是ROC曲線下的面積。所以,在理解AUC之前,要先了解ROC是什麼。而ROC的計算又需要藉助混淆矩陣,因此,我們先從混淆矩陣開始談起。 混淆矩陣
物體交叉檢測---IoU評價指標的計算
對於物體檢測的結果不管是HOG+SVM,還是deep learnning 檢測到的結果,我們如何去評價我們檢測的好壞? 一、Jason 提出了IoU---Intersection over Union 來評估物體檢測的好壞,IoU演算法很簡單,其計算條件如下: 1、物體的
目標檢測效能評價指標mAP、Precision、Recall、IoU
一、mAP 1. TP,FP,FN,TN (1)TP(True positives):正確劃分正例個數;正->正; (2)FP(False positives):錯誤劃分正例個數;負->正; (3)FN(False negatives):錯誤劃分負例個數;