日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

智慧交通day02-车流量检测实现06:目标估计模型-卡尔曼滤波

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 智慧交通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
  • 更新狀態變量

    使用觀測到的目標框更新狀態變量

  • #使用觀測到的目標框更新狀態變量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]

    整個代碼如下所示:

    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:目标估计模型-卡尔曼滤波的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。