mAP計(jì)算目標(biāo)檢測(cè)精確度實(shí)現(xiàn)源碼
好多人都想算一下目標(biāo)檢測(cè)的精確度,mAP的概念雖然不好理解,但是理解了就很懂。
GITHUB代碼下載
1、IOU的概念
IOU的概念應(yīng)該比較簡單,就是衡量預(yù)測(cè)框和真實(shí)框的重合程度。下圖是一個(gè)示例:圖中綠色框?yàn)閷?shí)際框(好像不是很綠……),紅色框?yàn)轭A(yù)測(cè)框,當(dāng)我們需要判斷兩個(gè)框之間的關(guān)系時(shí),主要就是判斷兩個(gè)框的重合程度。
計(jì)算IOU的公式為:
可以看到IOU是一個(gè)比值,即交并比。
在分子部分,值為預(yù)測(cè)框和實(shí)際框之間的重疊區(qū)域;
在分母部分,值為預(yù)測(cè)框和實(shí)際框所占有的總區(qū)域。
交區(qū)域和并區(qū)域的比值,就是IOU。
2、TP TN FP FN的概念
TP TN FP FN里面一共出現(xiàn)了4個(gè)字母,分別是T F P N。
T是True;
F是False;
P是Positive;
N是Negative。
T或者F代表的是該樣本 是否被正確分類。
P或者N代表的是該樣本 被預(yù)測(cè)成了正樣本還是負(fù)樣本。
TP(True Positives)意思就是被分為了正樣本,而且分對(duì)了。
TN(True Negatives)意思就是被分為了負(fù)樣本,而且分對(duì)了,
FP(False Positives)意思就是被分為了正樣本,但是分錯(cuò)了(事實(shí)上這個(gè)樣本是負(fù)樣本)。
FN(False Negatives)意思就是被分為了負(fù)樣本,但是分錯(cuò)了(事實(shí)上這個(gè)樣本是這樣本)。
在mAP計(jì)算的過程中主要用到了,TP、FP、FN這三個(gè)概念。
3、precision(精確度)和recall(召回率)
TP是分類器認(rèn)為是正樣本而且確實(shí)是正樣本的例子,F(xiàn)P是分類器認(rèn)為是正樣本但實(shí)際上不是正樣本的例子,Precision翻譯成中文就是“分類器認(rèn)為是正類并且確實(shí)是正類的部分占所有分類器認(rèn)為是正類的比例”。
TP是分類器認(rèn)為是正樣本而且確實(shí)是正樣本的例子,F(xiàn)N是分類器認(rèn)為是負(fù)樣本但實(shí)際上不是負(fù)樣本的例子,Recall翻譯成中文就是“分類器認(rèn)為是正類并且確實(shí)是正類的部分占所有確實(shí)是正類的比例”。
4、概念舉例
如圖所示,藍(lán)色的框是 真實(shí)框。綠色和紅色的框是 預(yù)測(cè)框,綠色的框是正樣本,紅色的框是負(fù)樣本。一般來講,當(dāng)預(yù)測(cè)框和真實(shí)框IOU>=0.5時(shí),被認(rèn)為是正樣本。
因此對(duì)于這幅圖來講。
真實(shí)框一共有3個(gè),正樣本一共有2個(gè),負(fù)樣本一共有2個(gè)。
此時(shí)
5、單個(gè)指標(biāo)的局限性
在目標(biāo)檢測(cè)算法里面有一個(gè)非常重要的概念是置信度,如果置信度設(shè)置的高的話,預(yù)測(cè)的結(jié)果和實(shí)際情況就很符合,如果置信度低的話,就會(huì)有很多誤檢測(cè)。
假設(shè)一幅圖里面總共有3個(gè)正樣本,目標(biāo)檢測(cè)對(duì)這幅圖的預(yù)測(cè)結(jié)果有10個(gè),其中3個(gè)實(shí)際上是正樣本,7個(gè)實(shí)際上是負(fù)樣本。對(duì)應(yīng)置信度如下。
如果我們將可以接受的置信度設(shè)置為0.95的話,那么目標(biāo)檢測(cè)算法就會(huì)將序號(hào)為1的樣本作為正樣本,其它的都是負(fù)樣本。此時(shí)TP = 1,F(xiàn)P = 0,F(xiàn)N = 2。
此時(shí)Precision非常高,但是事實(shí)上我們只檢測(cè)出一個(gè)正樣本,還有兩個(gè)沒有檢測(cè)出來,因此只用Precision就不合適。
這個(gè)時(shí)候如果我們將可以接受的置信度設(shè)置為0.35的話,那么目標(biāo)檢測(cè)算法就會(huì)將序號(hào)為1的樣本作為正樣本,其它的都是負(fù)樣本。此時(shí)TP = 3,F(xiàn)P = 3,F(xiàn)N = 0。
此時(shí)Recall非常高,但是事實(shí)上目標(biāo)檢測(cè)算法認(rèn)為是正樣本的樣本里面,有3個(gè)樣本確實(shí)是正樣本,但有三個(gè)是負(fù)樣本,存在非常嚴(yán)重的誤檢測(cè),因此只用Recall就不合適。
二者進(jìn)行結(jié)合才是評(píng)價(jià)的正確方法。
什么是AP
AP事實(shí)上指的是,利用不同的Precision和Recall的點(diǎn)的組合,畫出來的曲線下面的面積。如下面這幅圖所示。
當(dāng)我們?nèi)〔煌闹眯哦?,可以獲得不同的Precision和不同的Recall,當(dāng)我們?nèi)〉弥眯哦葔蛎芗臅r(shí)候,就可以獲得非常多的Precision和Recall。
此時(shí)Precision和Recall可以在圖片上畫出一條線,這條線下部分的面積就是某個(gè)類的AP值。
mAP就是所有的類的AP值求平均。
繪制mAP
我們首先在下載繪制mAP所需的代碼。
在這個(gè)代碼中,如果想要繪制mAP則需要三個(gè)內(nèi)容。分別是:
detection-results:指的是預(yù)測(cè)結(jié)果的txt。
ground-truth:指的是真實(shí)框的txt。
image-optional:指的是圖片,有這個(gè)可以可視化,但是這個(gè)可以沒有。
我們需要生成這三個(gè)內(nèi)容,此時(shí)下載第二個(gè)庫,這個(gè)是我拿我制作的ssd代碼寫的一個(gè)可以生成對(duì)應(yīng)txt的例子。
我們首先將整個(gè)VOC的數(shù)據(jù)集放到VOCdevikit中
然后修改voc2ssd.py里面的trainval_percent,一般用數(shù)據(jù)集的10%或者更少用于測(cè)試。如果大家放進(jìn)VOCdevikit的數(shù)據(jù)集不是全部數(shù)據(jù),而是已經(jīng)篩選好的測(cè)試數(shù)據(jù)集的話,那么就把trainval_percent設(shè)置成0,表示全部的數(shù)據(jù)都用于測(cè)試。
然后運(yùn)行voc2ssd.py。此時(shí)會(huì)生成test.txt,存放用于測(cè)試的圖片的名字。
然后依次運(yùn)行主目錄下的get_dr_txt.py和get_gt_txt.py獲得預(yù)測(cè)框?qū)?yīng)的txt和真實(shí)框?qū)?yīng)的txt。get_dr_txt.py是用來檢測(cè)測(cè)試集里面的圖片的,然后會(huì)生成每一個(gè)圖片的檢測(cè)結(jié)果,我重寫了detect_image代碼,用于生成預(yù)測(cè)框的txt。利用for循環(huán)檢測(cè)所有的圖片。
get_dr_txt.py是用來獲取測(cè)試集中的xml,然后根據(jù)每個(gè)xml的結(jié)果生成真實(shí)框的txt。利用for循環(huán)檢測(cè)所有的xml。
完成后我們會(huì)在input獲得三個(gè)文件夾。
此時(shí)把input內(nèi)部的文件夾復(fù)制到mAP的代碼中的input文件夾內(nèi)部就可以了,然后我們運(yùn)行mAP的代碼中的main.py,運(yùn)行結(jié)束后,會(huì)生成mAP相關(guān)的文件。
結(jié)果生成在Result里面。
以上就是mAP計(jì)算目標(biāo)檢測(cè)精確度實(shí)現(xiàn)源碼的詳細(xì)內(nèi)容,更多關(guān)于mAP目標(biāo)檢測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python數(shù)據(jù)結(jié)構(gòu)與算法之使用隊(duì)列解決小貓釣魚問題
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之使用隊(duì)列解決小貓釣魚問題,結(jié)合實(shí)例形式分析了Python使用隊(duì)列實(shí)現(xiàn)小貓釣魚游戲的算法操作技巧,代碼中備有較為詳盡的注釋便于讀者理解,需要的朋友可以參考下2017-12-12pd.to_datetime中時(shí)間object轉(zhuǎn)換datetime實(shí)例
本文主要介紹了pd.to_datetime中時(shí)間object轉(zhuǎn)換datetime實(shí)例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06如何利用AJAX獲取Django后端數(shù)據(jù)詳解
ajax一個(gè)前后臺(tái)配合的技術(shù),它可以讓javascript發(fā)送http請(qǐng)求,與后臺(tái)通信,獲取數(shù)據(jù)和信息。下面這篇文章主要介紹了如何利用AJAX獲取Django后端數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-06-06Python高級(jí)過濾器之filter函數(shù)詳解
在Python中,filter()是一個(gè)非常有用的內(nèi)置函數(shù),它能夠根據(jù)指定的函數(shù)來篩選出可迭代對(duì)象中滿足條件的元素,本文將從入門到精通,全面介紹filter()函數(shù)的用法和相關(guān)知識(shí)點(diǎn)2023-08-08在Django中動(dòng)態(tài)地過濾查詢集的實(shí)現(xiàn)
本文主要介紹了Django中動(dòng)態(tài)地過濾查詢集的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Python3中類、模塊、錯(cuò)誤與異常、文件的簡易教程
這篇文章主要給大家介紹了關(guān)于Python3中類、模塊、錯(cuò)誤與異常、文件的相關(guān)教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11django配置DJANGO_SETTINGS_MODULE的實(shí)現(xiàn)
本文主要介紹了django配置DJANGO_SETTINGS_MODULE,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03終于搞懂了Python中super(XXXX,?self).__init__()的作用了
本文主要介紹了終于搞懂了Python中super(XXXX,?self).__init__()的作用了,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08pycharm 2021.3最新激活碼有效期至2100年(親測(cè)可用)
這篇文章主要介紹了pycharm 2021.3最新激活碼有效期至2100年(親測(cè)可用)2021-02-02