python:目標(biāo)檢測(cè)模型預(yù)測(cè)準(zhǔn)確度計(jì)算方式(基于IoU)
訓(xùn)練完目標(biāo)檢測(cè)模型之后,需要評(píng)價(jià)其性能,在不同的閾值下的準(zhǔn)確度是多少,有沒(méi)有漏檢,在這里基于IoU(Intersection over Union)來(lái)計(jì)算。
希望能提供一些思路,如果覺(jué)得有用歡迎贊我表?yè)P(yáng)我~
IoU的值可以理解為系統(tǒng)預(yù)測(cè)出來(lái)的框與原來(lái)圖片中標(biāo)記的框的重合程度。系統(tǒng)預(yù)測(cè)出來(lái)的框是利用目標(biāo)檢測(cè)模型對(duì)測(cè)試數(shù)據(jù)集進(jìn)行識(shí)別得到的。
計(jì)算方法即檢測(cè)結(jié)果DetectionResult與GroundTruth的交集比上它們的并集,如下圖:
藍(lán)色的框是:GroundTruth
黃色的框是:DetectionResult
綠色的框是:DetectionResult ⋂GroundTruth
紅色的框是:DetectionResult ⋃GroundTruth
基本思路是先讀取原來(lái)圖中標(biāo)記的框信息,對(duì)每一張圖,把所需要的那一個(gè)類(lèi)別的框拿出來(lái),與測(cè)試集上識(shí)別出來(lái)的框進(jìn)行比較,計(jì)算IoU,選擇最大的值作為當(dāng)前框的IoU值,然后通過(guò)設(shè)定的閾值(漏檢0, 0.3, 0.5, 0.7)來(lái)進(jìn)行比較統(tǒng)計(jì),最后得到每個(gè)閾值下的所有的判定為正確檢測(cè)(IoU值大于閾值)的框的數(shù)量,然后與原本的標(biāo)記框的數(shù)量一起計(jì)算準(zhǔn)確度。
其中計(jì)算IoU的時(shí)候是重新構(gòu)建一個(gè)背景為0的圖,設(shè)定框所在的位置為1,分別利用原本標(biāo)注的框和測(cè)試識(shí)別的框來(lái)構(gòu)建兩個(gè)這樣的圖,兩者相加就能夠讓重疊的部分變成2,于是就可以知道重疊部分的大?。ń患?,從而計(jì)算IoU。
構(gòu)建代碼如下:
#讀取txt-標(biāo)準(zhǔn)txt為基準(zhǔn)-分類(lèi)別求閾值-閾值為0. 0.3 0.5 0.7的統(tǒng)計(jì) import glob import os import numpy as np #設(shè)定的閾值 threshold1=0.3 threshold2=0.5 threshold3=0.7 #閾值計(jì)數(shù)器 counter0=0 counter1=0 counter2=0 counter3=0 stdtxt=''#標(biāo)注txt路徑 testtxt=''#測(cè)試txt路徑 txtlist=glob.glob(r'%s\*.txt' %stdtxt)#獲取所有txt文件 for path in txtlist:#對(duì)每個(gè)txt操作 txtname=os.path.basename(path)[:-4]#獲取txt文件名 label=1 eachtxt=np.loadtxt(path) #讀取文件 for line in eachtxt: if line[0]==label: #構(gòu)建背景為0框?yàn)?的圖 map1=np.zeros((960,1280)) map1[line[2]:(line[2]+line[4]),line[1]:(line[1]+line[3])]=1 testfile=np.loadtxt(testtxt + txtname + '.txt') c=0 iou_list=[]#用來(lái)存儲(chǔ)所有iou的集合 for tline in testfile:#對(duì)測(cè)試txt的每行進(jìn)行操作 if tline[0]==label: c=c+1 map2=np.zeros((960,1280)) map2[tline[2]:(tline[2]+tline[4]),tline[1]:(tline[1]+tline[3])]=1 map3=map1+map2 a=0 for i in map3: if i==2: a=a+1 iou=a/(line[3]*line[4]+tline[3]*tline[4]-a)#計(jì)算iou iou_list.append(iou)#添加到集合尾部 threshold=max(iou_list)#閾值取最大的 #閾值統(tǒng)計(jì) if threshold>=threshold3: counter3=counter3+1 elif threshold>=threshold2: counter2=counter2+1 elif threshold>=threshold1: counter1=counter1+1 elif threshold<threshold1:#漏檢 counter0=counter0+1
以上這篇python:目標(biāo)檢測(cè)模型預(yù)測(cè)準(zhǔn)確度計(jì)算方式(基于IoU)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python爬蟲(chóng)基礎(chǔ)之urllib的使用
這篇文章主要介紹了python爬蟲(chóng)基礎(chǔ)之urllib的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-12-12python利用Appium實(shí)現(xiàn)自動(dòng)控制移動(dòng)設(shè)備并提取數(shù)據(jù)功能
這篇文章主要介紹了python利用Appium自動(dòng)控制移動(dòng)設(shè)備并提取數(shù)據(jù),本文以控制抖音app滑動(dòng)并獲取抖音短視頻發(fā)布者為例,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09詳解Python?AdaBoost算法的實(shí)現(xiàn)
Boosting是機(jī)器學(xué)習(xí)的三大框架之一。Boost也被稱(chēng)為增強(qiáng)學(xué)習(xí)或提升法,其中典型的代表算法是AdaBoost算法。本文介紹了AdaBoost算法及python實(shí)現(xiàn),感興趣的可以學(xué)習(xí)一下2022-10-10python 圖像處理畫(huà)一個(gè)正弦函數(shù)代碼實(shí)例
這篇文章主要介紹了python 圖像處理畫(huà)一個(gè)正弦函數(shù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09python3利用ctypes傳入一個(gè)字符串類(lèi)型的列表方法
今天小編就為大家分享一篇python3利用ctypes傳入一個(gè)字符串類(lèi)型的列表方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02利用Python實(shí)現(xiàn)從PDF到CSV的轉(zhuǎn)換
將PDF轉(zhuǎn)換為CSV極大地提升了數(shù)據(jù)的實(shí)用價(jià)值,Python作為一種強(qiáng)大的編程語(yǔ)言,能夠高效完成這一轉(zhuǎn)換任務(wù),本文將介紹如何利用Python實(shí)現(xiàn)從PDF到CSV的轉(zhuǎn)換,需要的朋友可以參考下2024-07-07Python?Pygame實(shí)戰(zhàn)之打磚塊小游戲
打磚塊最早是由雅達(dá)利公司開(kāi)發(fā)的一款獨(dú)立游戲,也是無(wú)數(shù)人的童年記憶。本文將利用Python中的Pygame模塊制作經(jīng)典的打磚塊游戲,需要的可以參考一下2022-02-02