智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)
學(xué)習(xí)目標(biāo)
能夠?qū)崿F(xiàn)兩個(gè)目標(biāo)框的交并比
了解候選框在多目標(biāo)跟蹤中的表達(dá)方式及相應(yīng)轉(zhuǎn)換方法
IOU是交并比(Intersection-over-Union)是目標(biāo)檢測中使用的一個(gè)概念是產(chǎn)生的候選框(candidate bound)與原標(biāo)記框(ground truth bound)的交疊率,即它們的交集與并集的比值。最理想情況是完全重疊,即比值為1。在多目標(biāo)跟蹤中,用來判別跟蹤框和目標(biāo)檢測框之間的相似度。
1.計(jì)算交并比
IoU是兩個(gè)區(qū)域的交除以兩個(gè)區(qū)域的并得出的結(jié)果
背景:在進(jìn)行目標(biāo)檢測時(shí),常常會用到交并比的概念(IOU(Intersection over Union))
?一般來說,這個(gè)IoU > 0.5 就可以被認(rèn)為是一個(gè)不錯(cuò)的結(jié)果。?
舉例如下:綠色框是準(zhǔn)確值,紅色框是預(yù)測值。
?
計(jì)算IOU(交并比)代碼實(shí)現(xiàn):
#計(jì)算IOU(交并比) @jit def iou(bb_test,bb_gt):"""在兩個(gè)box間計(jì)算IOU:param bb_test: box1 = [x1,y1,x2,y2] 左上角坐標(biāo):param bb_gt: box2 = [x1,y1,x2,y2] 右下角坐標(biāo):return: 交并比IOU"""#在兩個(gè)box間的左上角坐標(biāo)的最大值xx1 = np.maximum(bb_test[0],bb_gt[0])#左上角坐標(biāo)x的最大值yy1 = np.maximum(bb_test[1],bb_gt[1])#左上角坐標(biāo)y的最大值#在兩個(gè)box間的右下角坐標(biāo)的最小值xx2 = np.minimum(bb_test[2],bb_gt[2])#右下角坐標(biāo)x的最小值yy2 = np.minimum(bb_test[3],bb_test[3])#右下角坐標(biāo)y的最小值#交的寬高w = np.maximum(0,xx2-xx1)h = np.maximum(0,yy2-yy1)#交的面積wh = w*h#并的面積s = ((bb_test[2] - bb_test[0]) * (bb_test[3] - bb_test[1])+ (bb_gt[2] - bb_gt[0]) * (bb_gt[3] - bb_gt[1]) - wh)#計(jì)算IOU并且返回IOUo_rate = wh/sreturn o_rate2.候選框的表示形式
在該項(xiàng)目中候選框有兩種表示形式:
- [x1,y1,x2,y2] 表示左上角坐標(biāo)和右下角坐標(biāo),目標(biāo)檢測的結(jié)果以該方式表示
- [x,y,s,r]表示中心點(diǎn)坐標(biāo),s 是面積尺度,r是縱橫比,卡爾曼濾波器中進(jìn)行運(yùn)動估計(jì)是使用該方式。
這兩種方式要進(jìn)行相互的轉(zhuǎn)換。
- 將候選框從坐標(biāo)形式轉(zhuǎn)換為中心點(diǎn)坐標(biāo)和面積的形式的代碼實(shí)現(xiàn):
- 將候選框從中心面積的形式轉(zhuǎn)換為坐標(biāo)的形式的代碼實(shí)現(xiàn):
總結(jié)
IOU的計(jì)算方法:兩個(gè)區(qū)域的交比上兩個(gè)區(qū)域的并,即為IOU
候選框不同表示方式之間的轉(zhuǎn)換:
-
[x1,y1,x2,y2] 表示左上角坐標(biāo)和右下角坐標(biāo)
-
[x,y,s,r]表示中心點(diǎn)坐標(biāo),s 是面積尺度,r是縱橫比
代碼匯總:
from __future__ import print_function from numba import jit import numpy as np from scipy.optimize import linear_sum_assignment from filterpy.kalman import KalmanFilter#計(jì)算IOU(交并比) @jit def iou(bb_test,bb_gt):"""在兩個(gè)box間計(jì)算IOU:param bb_test: box1 = [x1,y1,x2,y2] 左上角坐標(biāo):param bb_gt: box2 = [x1,y1,x2,y2] 右下角坐標(biāo):return: 交并比IOU"""#在兩個(gè)box間的左上角坐標(biāo)的最大值xx1 = np.maximum(bb_test[0],bb_gt[0])#左上角坐標(biāo)x的最大值yy1 = np.maximum(bb_test[1],bb_gt[1])#左上角坐標(biāo)y的最大值#在兩個(gè)box間的右下角坐標(biāo)的最小值xx2 = np.minimum(bb_test[2],bb_gt[2])#右下角坐標(biāo)x的最小值yy2 = np.minimum(bb_test[3],bb_test[3])#右下角坐標(biāo)y的最小值#交的寬高w = np.maximum(0,xx2-xx1)h = np.maximum(0,yy2-yy1)#交的面積wh = w*h#并的面積s = ((bb_test[2] - bb_test[0]) * (bb_test[3] - bb_test[1])+ (bb_gt[2] - bb_gt[0]) * (bb_gt[3] - bb_gt[1]) - wh)#計(jì)算IOU并且返回IOUo_rate = wh/sreturn o_rate#左上角坐標(biāo)[x1,y1]和右下角坐標(biāo)[x2,y2], #將候選框從坐標(biāo)形式[x1,y1,x2,y2]轉(zhuǎn)換為中心點(diǎn)坐標(biāo)和面積的形式[x,y,s,r] #其中x,y是框的中心坐標(biāo),s是面積,尺度,r是寬高比 def convert_bbox_to_z(bbox):"""將[x1,y1,x2,y2]形式的檢測框轉(zhuǎn)為濾波器的狀態(tài)表示形式[x,y,s,r]。其中x,y是框的中心坐標(biāo),s是面積,尺度,r是寬高比:param bbox: [x1,y1,x2,y2] 分別是左上角坐標(biāo)和右下角坐標(biāo):return: [ x, y, s, r ] 4行1列,其中x,y是box中心位置的坐標(biāo),s是面積,r是縱橫比w/h"""w = bbox[2] - bbox[0]#寬 x2-x1h = bbox[3] - bbox[1]#高 y2-y1x = bbox[0] + w/2.0#檢測框的中心坐標(biāo)x: x1+(x2-x1)/2.0y = bbox[1] + h/2.0#檢測框的中心坐標(biāo)y: y1+(y2-y1)/2.0s = w*h #檢測框的面積r = w/float(h) #檢測框的寬高比return np.array([x,y,s,r]).reshape([4,1]) #kalman需要四行一列的形式#將候選框從中心面積[x,y,s,r]的形式轉(zhuǎn)換成左上角坐標(biāo)和右下角坐標(biāo)[x1,y1,x2,y2]的形式 #即:將[cx,cy,s,r]的目標(biāo)框表示轉(zhuǎn)為[x_min,y_min,x_max,y_max]的形式 def convert_xto_bbox(x,score=None):"""將[cx,cy,s,r]的目標(biāo)框表示轉(zhuǎn)為[x_min,y_min,x_max,y_max]的形式:param x:[ x, y, s, r ],其中x,y是box中心位置的坐標(biāo),s是面積,r是縱橫比w/h:param score: 置信度:return:[x1,y1,x2,y2],左上角坐標(biāo)和右下角坐標(biāo)"""w = np.sqrt(x[2] * x[3]) #w =sqrt(s*r)=sqrt(s*w/h)=sqrt(w*h * w/h)=sqrt(w*w)h = x[2]/w #h =s/w =w*h/w =hx1 = x[0]-w/2.0 #左上角x坐標(biāo):x1 = x-w/2.0y1 = x[1]-h/2.0 #左上角y坐標(biāo):y1 = y-h/2.0x2 = x[0]+w/2.0 #右下角x坐標(biāo):x2 = x+w/2.0y2 = x[1]+h/2.0 #右下角y坐標(biāo):y2 = y+h/2.0if score is None:return np.array([x1,y1,x2,y2]).reshape((1,4))else:return np.array([x1,x1,x2,y2,score]).reshape((1,5))總結(jié)
以上是生活随笔為你收集整理的智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django之验证码的实现,简单快捷的方
- 下一篇: 智慧交通day04-特定目标车辆追踪01