睿智的目標檢測20——利用mAP計算目標檢測精確度
學習前言
好多人都想算一下目標檢測的精確度,mAP的概念雖然不好理解,但是理解了就很懂。
GITHUB代碼下載
這個是用來繪製mAP曲線的。
https://github.com/Cartucho/mAP
這個是用來獲取繪製mAP曲線所需的txt的
https://github.com/bubbliiiing/count-mAP-txt
知識儲備
1、IOU的概念
IOU的概念應該比較簡單,就是衡量監測框和標籤框的重合程度。
下圖是一個示例:圖中綠色框爲實際框(好像不是很綠……),紅色框爲預測框,當我們需要判斷兩個框之間的關係時,主要就是判斷兩個框的重合程度。
計算IOU的公式爲:
可以看到IOU是一個比值,即交併比。
在分子部分,值爲預測框和實際框之間的重疊區域;
在分母部分,值爲預測框和實際框所佔有的總區域。
交區域和並區域的比值,就是IOU。
2、TP TN FP FN的概念
TP TN FP FN裏面一共出現了4個字母,分別是T F P N。
T是True;
F是False;
P是Positive;
N是Negative。
T或者F代表的是該樣本 是否被正確分類。
P或者N代表的是該樣本 原本是正樣本還是負樣本。
TP(True Positives)意思就是被分爲了正樣本,而且分對了。
TN(True Negatives)意思就是被分爲了負樣本,而且分對了,
FP(False Positives)意思就是被分爲了正樣本,但是分錯了(事實上這個樣本是負樣本)。
FN(False Negatives)意思就是被分爲了負樣本,但是分錯了(事實上這個樣本是這樣本)。
在mAP計算的過程中主要用到了,TP、FP、FN這三個概念。
3、precision(精確度)和recall(召回率)
TP是分類器認爲是正樣本而且確實是正樣本的例子,FP是分類器認爲是正樣本但實際上不是正樣本的例子,Precision翻譯成中文就是“分類器認爲是正類並且確實是正類的部分佔所有分類器認爲是正類的比例”。
TP是分類器認爲是正樣本而且確實是正樣本的例子,FN是分類器認爲是負樣本但實際上不是負樣本的例子,Recall翻譯成中文就是“分類器認爲是正類並且確實是正類的部分佔所有確實是正類的比例”。
4、概念舉例
如圖所示,藍色的框是 真實框。綠色和紅色的框是 預測框,綠色的框是正樣本,紅色的框是負樣本。
因此對於這幅圖來講。
真實框一共有3個,正樣本一共有2個,負樣本一共有2個。
此時
5、單個指標的侷限性
在目標檢測算法裏面有一個非常重要的概念是置信度,如果置信度設置的高的話,預測的結果和實際情況就很符合,如果置信度低的話,就會有很多誤檢測。
假設一幅圖裏面總共有3個正樣本,目標檢測對這幅圖的預測結果有10個,其中3個實際上是正樣本,7個實際上是負樣本。對應置信度如下。
如果我們將可以接受的置信度設置爲0.95的話,那麼目標檢測算法就會將序號爲1的樣本作爲正樣本,其它的都是負樣本。此時TP = 1,FP = 0,FN = 2。
此時Precision非常高,但是事實上我們只檢測出一個正樣本,還有兩個沒有檢測出來,因此只用Precision就不合適。
這個時候如果我們將可以接受的置信度設置爲0.35的話,那麼目標檢測算法就會將序號爲1的樣本作爲正樣本,其它的都是負樣本。此時TP = 3,FP = 3,FN = 0。
此時Recall非常高,但是事實上目標檢測算法認爲是正樣本的樣本里面,有3個樣本確實是正樣本,但有三個是負樣本,存在非常嚴重的誤檢測,因此只用Recall就不合適。
二者進行結合纔是評價的正確方法。
什麼是AP
AP事實上指的是,利用不同的Precision和Recall的點的組合,畫出來的曲線下面的面積。
如下面這幅圖所示。
當我們取不同的置信度,可以獲得不同的Precision和不同的Recall,當我們取得置信度夠密集的時候,就可以獲得非常多的Precision和Recall。
此時Precision和Recall可以在圖片上畫出一條線,這條線下部分的面積就是某個類的AP值。
mAP就是所有的類的AP值求平均。
繪製mAP
我們首先在這個github上下載繪製mAP所需的代碼。
https://github.com/Cartucho/mAP
在這個代碼中,如果想要繪製mAP則需要三個內容。分別是:
detection-results:指的是預測結果的txt。
ground-truth:指的是真實框的txt。
image-optional:指的是圖片,有這個可以可視化,但是這個可以沒有。
我們需要生成這三個內容,此時下載第二個庫,這個是我拿我製作的ssd代碼寫的一個可以生成對應txt的例子。
https://github.com/bubbliiiing/count-mAP-txt
我們首先將整個VOC的數據集放到VOCdevikit中
然後修改voc2ssd.py裏面的trainval_percent,一般用數據集的10%或者更少用於測試。如果大家放進VOCdevikit的數據集不是全部數據,而是已經篩選好的測試數據集的話,那麼就把trainval_percent設置成0,表示全部的數據都用於測試。
然後運行voc2ssd.py。
此時會生成test.txt,存放用於測試的圖片的名字。
然後依次運行主目錄下的get_dr_txt.py和get_gt_txt.py獲得預測框對應的txt和真實框對應的txt。
get_dr_txt.py是用來檢測測試集裏面的圖片的,然後會生成每一個圖片的檢測結果,我重寫了detect_image代碼,用於生成預測框的txt。
利用for循環檢測所有的圖片。
get_dr_txt.py是用來獲取測試集中的xml,然後根據每個xml的結果生成真實框的txt。
利用for循環檢測所有的xml。
完成後我們會在input獲得三個文件夾。
此時把input內部的文件夾複製到mAP的代碼中的input文件夾內部就可以了,然後我們運行mAP的代碼中的main.py,運行結束後,會生成mAP相關的文件。
結果生成在Result裏面。