智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波
生活随笔
收集整理的這篇文章主要介紹了
智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在這里我們主要完成卡爾曼濾波器進行跟蹤的相關內容的實現。
- 初始化:卡爾曼濾波器的狀態變量和觀測輸入
- 更新狀態變量
- 根據狀態變量預測目標的邊界框
初始化:
狀態量x的設定是一個七維向量:
分別表示目標中心位置的x,y坐標,面積s和當前目標框的縱橫比,最后三個則是橫向,縱向,面積的變化速率,其中速度部分初始化為0,其他根據觀測進行輸入。
初始化卡爾曼濾波器參數,7個狀態變量和4個觀測輸入,運動形式和轉換矩陣的確定都是基于勻速運動模型,狀態轉移矩陣F根據運動學公式確定:
?量測矩陣H是4*7的矩陣,將觀測值與狀態變量相對應:
?
以及相應的協方差參數的設定,根據經驗值進行設定。
# 內部使用KalmanFilter,7個狀態變量和4個觀測輸入def __init__(self,bbox):"""初始化邊界框和跟蹤器:param bbox:"""#等速模型#卡爾曼濾波:狀態轉移矩陣:7,觀測輸入矩陣:4self.kf = KalmanFilter(dim_x=7,dim_z=4) #初始化卡爾曼濾波器# F:狀態轉移/狀態變化矩陣 7*7 用當前的矩陣預測下一次的估計self.kf.F = np.array([[1, 0, 0, 0, 1, 0, 0],[0, 1, 0, 0, 0, 1, 0],[0, 0, 1, 0, 0, 0, 1],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 0, 1]])#H:量測矩陣/觀測矩陣:4*7self.kf.H = np.array([[1, 0, 0, 0, 0, 0, 0],[0, 1, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0]])#R:測量噪聲的協方差,即真實值與測量值差的協方差self.kf.R[2:,2:] *= 10#P:先驗估計的協方差self.kf.P[4:,4:] *= 1000 #give high uncertainty to the unobservable initial velocities 對不可觀測的初始速度給予高度不確定性self.kf.P *= 10#Q:過程激勵噪聲的的協方差self.kf.Q[-1,-1] *= 0.01self.kd.Q[4:,4:] *= 0.01#X:觀測結果、狀態估計self.kf.x[:4] = convert_bbox_to_z(bbox)#參數的更新self.time_since_update = 0self.id = KalmanBoxTracker.countKalmanBoxTracker.count += 1self.history=[]self.hits = 0self.hit_streak = 0self.age = 0更新狀態變量
使用觀測到的目標框更新狀態變量
進行目標框的預測
推進狀態變量并返回預測的邊界框結果
整個代碼如下所示:
class KalmanBoxTracker(object):count = 0"""初始化邊界框和跟蹤器:param bbox:"""#等速模型#卡爾曼濾波:狀態轉移矩陣:7,觀測輸入矩陣:4self.kf = KalmanFilter(dim_x=7,dim_z=4) #初始化卡爾曼濾波器# F:狀態轉移/狀態變化矩陣 7*7 用當前的矩陣預測下一次的估計self.kf.F = np.array([[1, 0, 0, 0, 1, 0, 0],[0, 1, 0, 0, 0, 1, 0],[0, 0, 1, 0, 0, 0, 1],[0, 0, 0, 1, 0, 0, 0],[0, 0, 0, 0, 1, 0, 0],[0, 0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 0, 0, 1]])#H:量測矩陣/觀測矩陣:4*7self.kf.H = np.array([[1, 0, 0, 0, 0, 0, 0],[0, 1, 0, 0, 0, 0, 0],[0, 0, 1, 0, 0, 0, 0],[0, 0, 0, 1, 0, 0, 0]])#R:測量噪聲的協方差,即真實值與測量值差的協方差self.kf.R[2:,2:] *= 10#P:先驗估計的協方差self.kf.P[4:,4:] *= 1000 #give high uncertainty to the unobservable initial velocities 對不可觀測的初始速度給予高度不確定性self.kf.P *= 10#Q:過程激勵噪聲的的協方差self.kf.Q[-1,-1] *= 0.01self.kd.Q[4:,4:] *= 0.01#X:觀測結果、狀態估計self.kf.x[:4] = convert_bbox_to_z(bbox)#參數的更新self.time_since_update = 0self.id = KalmanBoxTracker.countKalmanBoxTracker.count += 1self.history=[]self.hits = 0self.hit_streak = 0self.age = 0#使用觀測到的目標框更新狀態變量def update(self,bbox):"""使用觀察到的目標框更新狀態向量。filterpy.kalman.KalmanFilter.update 會根據觀測修改內部狀態估計self.kf.x。重置self.time_since_update,清空self.history。:param bbox:目標框:return:"""#重置部分參數self.time_since_update = 0#清空self.history = []#hitsself.hits += 1self.hit_streak += 1#根據觀測結果修改內部狀態xself.kf.update(convert_bbox_to_z(bbox)) #進行目標框的預測:推進狀態變量并返回預測的邊界框結果def predict(self):"""推進狀態向量并返回預測的邊界框估計。將預測結果追加到self.history。由于 get_state 直接訪問 self.kf.x,所以self.history沒有用到:return:"""#狀態變量if(self.kf.x[6] + self.kf.x[2]) <= 0:self.kf.x[6] *= 0# 進行預測self.kf.predict()#卡爾曼濾波的預測次數self.age += 1#若過程中未進行更新,則將hit_streak置為0if self.time_since_update > 0:self.hit_streak=0self.time_since_update += 1#將預測結果追加到hietory中self.history.append(convert_x_to_bbox(self.kf.x))return self.history[-1]#獲取到當前的邊界框的預測結果def get_state(self):"""返回當前邊界框估計值:return:"""return convert_x_to_bbox(self.kf.x)總結
了解初始化,卡爾曼濾波器的狀態變量和觀測輸入
更新狀態變量update()
根據狀態變量預測目標的邊界框predict()
總結
以上是生活随笔為你收集整理的智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智慧交通day02-车流量检测实现08:
- 下一篇: 【Pytorch神经网络实战案例】12