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