智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)
生活随笔
收集整理的這篇文章主要介紹了
智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
學習目標
能夠實現兩個目標框的交并比
了解候選框在多目標跟蹤中的表達方式及相應轉換方法
IOU是交并比(Intersection-over-Union)是目標檢測中使用的一個概念是產生的候選框(candidate bound)與原標記框(ground truth bound)的交疊率,即它們的交集與并集的比值。最理想情況是完全重疊,即比值為1。在多目標跟蹤中,用來判別跟蹤框和目標檢測框之間的相似度。
1.計算交并比
IoU是兩個區域的交除以兩個區域的并得出的結果
背景:在進行目標檢測時,常常會用到交并比的概念(IOU(Intersection over Union))
?一般來說,這個IoU > 0.5 就可以被認為是一個不錯的結果。?
舉例如下:綠色框是準確值,紅色框是預測值。
?
計算IOU(交并比)代碼實現:
#計算IOU(交并比) @jit def iou(bb_test,bb_gt):"""在兩個box間計算IOU:param bb_test: box1 = [x1,y1,x2,y2] 左上角坐標:param bb_gt: box2 = [x1,y1,x2,y2] 右下角坐標:return: 交并比IOU"""#在兩個box間的左上角坐標的最大值xx1 = np.maximum(bb_test[0],bb_gt[0])#左上角坐標x的最大值yy1 = np.maximum(bb_test[1],bb_gt[1])#左上角坐標y的最大值#在兩個box間的右下角坐標的最小值xx2 = np.minimum(bb_test[2],bb_gt[2])#右下角坐標x的最小值yy2 = np.minimum(bb_test[3],bb_test[3])#右下角坐標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)#計算IOU并且返回IOUo_rate = wh/sreturn o_rate2.候選框的表示形式
在該項目中候選框有兩種表示形式:
- [x1,y1,x2,y2] 表示左上角坐標和右下角坐標,目標檢測的結果以該方式表示
- [x,y,s,r]表示中心點坐標,s 是面積尺度,r是縱橫比,卡爾曼濾波器中進行運動估計是使用該方式。
這兩種方式要進行相互的轉換。
- 將候選框從坐標形式轉換為中心點坐標和面積的形式的代碼實現:
- 將候選框從中心面積的形式轉換為坐標的形式的代碼實現:
總結
IOU的計算方法:兩個區域的交比上兩個區域的并,即為IOU
候選框不同表示方式之間的轉換:
-
[x1,y1,x2,y2] 表示左上角坐標和右下角坐標
-
[x,y,s,r]表示中心點坐標,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#計算IOU(交并比) @jit def iou(bb_test,bb_gt):"""在兩個box間計算IOU:param bb_test: box1 = [x1,y1,x2,y2] 左上角坐標:param bb_gt: box2 = [x1,y1,x2,y2] 右下角坐標:return: 交并比IOU"""#在兩個box間的左上角坐標的最大值xx1 = np.maximum(bb_test[0],bb_gt[0])#左上角坐標x的最大值yy1 = np.maximum(bb_test[1],bb_gt[1])#左上角坐標y的最大值#在兩個box間的右下角坐標的最小值xx2 = np.minimum(bb_test[2],bb_gt[2])#右下角坐標x的最小值yy2 = np.minimum(bb_test[3],bb_test[3])#右下角坐標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)#計算IOU并且返回IOUo_rate = wh/sreturn o_rate#左上角坐標[x1,y1]和右下角坐標[x2,y2], #將候選框從坐標形式[x1,y1,x2,y2]轉換為中心點坐標和面積的形式[x,y,s,r] #其中x,y是框的中心坐標,s是面積,尺度,r是寬高比 def convert_bbox_to_z(bbox):"""將[x1,y1,x2,y2]形式的檢測框轉為濾波器的狀態表示形式[x,y,s,r]。其中x,y是框的中心坐標,s是面積,尺度,r是寬高比:param bbox: [x1,y1,x2,y2] 分別是左上角坐標和右下角坐標:return: [ x, y, s, r ] 4行1列,其中x,y是box中心位置的坐標,s是面積,r是縱橫比w/h"""w = bbox[2] - bbox[0]#寬 x2-x1h = bbox[3] - bbox[1]#高 y2-y1x = bbox[0] + w/2.0#檢測框的中心坐標x: x1+(x2-x1)/2.0y = bbox[1] + h/2.0#檢測框的中心坐標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]的形式轉換成左上角坐標和右下角坐標[x1,y1,x2,y2]的形式 #即:將[cx,cy,s,r]的目標框表示轉為[x_min,y_min,x_max,y_max]的形式 def convert_xto_bbox(x,score=None):"""將[cx,cy,s,r]的目標框表示轉為[x_min,y_min,x_max,y_max]的形式:param x:[ x, y, s, r ],其中x,y是box中心位置的坐標,s是面積,r是縱橫比w/h:param score: 置信度:return:[x1,y1,x2,y2],左上角坐標和右下角坐標"""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坐標:x1 = x-w/2.0y1 = x[1]-h/2.0 #左上角y坐標:y1 = y-h/2.0x2 = x[0]+w/2.0 #右下角x坐標:x2 = x+w/2.0y2 = x[1]+h/2.0 #右下角y坐標: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))總結
以上是生活随笔為你收集整理的智慧交通day02-车流量检测实现03:辅助功能(交并比and候选框的表现形式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django之验证码的实现,简单快捷的方
- 下一篇: 智慧交通day04-特定目标车辆追踪01