點擊上方“AI算法與圖像處理”,選擇加"星標"或“置頂”
重磅乾貨,第一時間送達
卡阿爾曼濾波器爲每個結果狀態找到最佳的平均因子。另外,以某種方式保存過去的狀態。它針對每個時間範圍對變量執行聯合概率分佈。該算法對每個步驟使用新的均值和新方差,以便計算結果的不確定性,並嘗試爲測量更新(傳感/預測)和運動更新(運動)的每個時間範圍提供準確的測量。該算法還使用其他誤差和統計噪聲來表示初始的不確定性。
• 將來自各種傳感器(如LiDAR和Radar跟蹤器)的數據輸入轉換爲可用形式。計算和推斷速度。
• 減少目標位置和速度的測量誤差(噪聲)。
• 使用先前的狀態估計和新數據預測目標的未來狀態。
• 簡單,實用和可移植的算法。
• 估計一個連續狀態和結果,卡爾曼濾波器給了我們一個單峯分佈。
卡爾曼過濾爲我們提供了一種數學方法,這種方法依據物體的初始位置和相關變量來推斷物體之後的運動速度和狀態。因此,在這裏,我們將創建一個一維卡爾曼濾波器,設置初始位置,結合物體運動的不確定性,來估計物體未來的位置以及運動速度。此外,如果我們想了解卡爾曼濾波器的工作原理,我們首先需要了解一些有關高斯的知識,它代表卡爾曼濾波器中的單峯分佈。
高斯是在位置空間上的連續函數,其下面的面積之和最多爲1。高斯的特徵在於兩個參數,平均值,經常縮寫爲希臘字母μ,高斯的寬度通常被稱爲方差即σ ²。所以,我們常用平均值和方差來尋找對象的位置,獲得最佳估計。另外,寬度越大,不確定性越大。
一維高斯方程
上圖表示高斯的均值(μ)和方差(σ²)。平均值(μ)越高,物體在該位置出現的機會就越高。相反,如果方差(σ²)較大,即分佈較寬,則該對象的不確定性較高;可以放置在高斯內部的任何位置。
就公式而言,它是二次函數的指數,我們取表達式的指數。我們的查詢點x相對於平均值(μ)的二次方差,除以方差(σ²),乘以-(1/2)。現在,如果x =μ,則分子變爲0,如果x爲0,即1。事實證明,我們必須在2πσ²的平方根上對常數進行歸一化處理。
高斯是其特徵在於通過給定的指數函數平均值(μ),其限定了高斯曲線的峯值的位置,和一個方差(σ ²)限定曲線的寬度/擴散。所有高斯都是:對稱的。它們具有一個峯(也稱爲“單峯”分佈),並且在該峯的兩側均具有指數下降。
方差是高斯分佈的度量;方差越大,對應的高斯越短。差異也是確定性的度量;如果試圖找到最確定的位置,例如汽車的位置,則需要一個高斯函數,其均值是汽車的位置並且不確定性/傳播範圍最小。我們編寫一個高斯函數:
from math import *
import matplotlib.pyplot as plt
import numpy as np
# gaussian function
def f(mu, sigma2, x):
''' f takes in a mean and squared variance, and an input x
and returns the gaussian value.'''
coefficient = 1.0 / sqrt(2.0 * pi *sigma2)
exponential = exp(-0.5 * (x-mu) ** 2 / sigma2)
return coefficient * exponential
在卡爾曼濾波器中,我們迭代使用貝葉斯規則的測量(測量更新),貝葉斯規則僅是乘積或乘法,而運動更新(預測)則使用總概率(卷積或加法)進行迭代。
爲了理解週期,我們假設我們正在對車輛進行定位並且我們有一個先驗分佈(藍色高斯);這是一個非常寬泛的高斯平均值。現在,我們得到一個測量值(橙色高斯),它告訴我們有關車輛定位的信息。這是我們之前的一個例子,我們對位置不確定,但測量結果告訴我們有關車輛的位置信息。
注意:在上圖中,Mu(μ)是先前的均值,Nu(v) 是新的測量均值。最終均值在兩個舊均值,先驗均值和測量均值之間移動。在測量方面,它要稍遠一些,因爲與以前相比,該測量可以更確定地確定車輛的位置。我們越確定,就越會在確定答案的方向上拉均值。
所得的高斯比兩個分量的高斯更確定,即協方差小於設備中兩個協方差中的任一個。直觀上來說,是因爲我們實際上獲得了位置信息。在任一高斯裝置中,這兩個高斯都具有較高的信息量。
1.假設我們按照貝葉斯規則將兩個高斯乘以一個先驗概率和一個測量概率。先驗的均值爲Mu (μ),且爲σ²,方差爲Nu (v),協方差爲r-square (r²)。
2. 然後,新的均值Mu prime (μ')是舊均值的加權和。Mu (μ)由r平方(r²)加權,Nu (v)由Sigma平方(σ²)加權,並由加權因子之和標準化。新的方差項將是Sigma平方素數(σ²')。
3. 顯然,先驗的高斯不確定性要高得多,因此σ²更大,這意味着Nu(v)的權重比Mu (μ)大得多。需要注意的是,方差項不受實際方法的影響,它僅使用以前的方差。
def update(mean1, var1, mean2, var2):
''' This function takes in two means and two squared variance terms,
and returns updated gaussian parameters.'''
#Calculate the new parameters
new_mean = (var2*mean1 + var1*mean2)/(var2+var1)
new_var = 1/(1/var2 + 1/var1)
高斯運動:
新的均值(μ')是舊均值Mu (μ)加上u的運動。因此,如果在x方向上移動了10米,那麼它就是10米,並且知道σ²'是舊σ²加上運動高斯的方差(r²)。這就是我們所需要知道的,僅僅是補充。在預測步驟中得到的高斯只是將這兩件事加起來,即mu(μ)加u和σ²加方差(r²)。
def predict(mean1, var1, mean2, var2):
''' This function takes in two means and two squared variance terms,
and returns updated gaussian parameters, after motion.'''
#Calculate the new parameters
new_mean = mean1 + mean2
new_var = var1 + var2
return [new_mean, new_var]
過濾器管道:
# measurements for mu and motions, U
measurements = [5., 6., 7., 9., 10.]
motions = [1., 1., 2., 1., 1.]
# initial parameters
measurement_sig = 4.
motion_sig = 2.
mu = 0.
sig = 10000. #0000000001
## TODO: Loop through allmeasurements/motions
## Print out and display the resultingGaussian
# your code here
for i in range(len(measurements)):
#measurement update, with uncertainty
mu, sig = update(mu, sig, measurements[i], measurement_sig)
print('Update: [{}, {}]'.format(mu, sig))
#motion update, with uncertainty
mu, sig = predict(mu, sig, motions[i], motion_sig)
print('Predict: [{}, {}]'.format(mu, sig))
# print the final, resultant mu, sig
print('\n')
print('Final result: [{}, {}]'.format(mu,sig))
•現在,我們將所有內容放在一起編寫一個具有這兩個功能的主程序,進行更新和預測,並饋入一系列測量和運動。選擇的示例中,測量值= 5,6,7,9,10,運動是1,1,2,1,1。如果初始估算爲5,但我們將其設置爲0,不確定性爲10,000。
•假設測量不確定度爲常數4,運動不確定度爲常數2。運行該變量時,位置的第一個估算值基本上應爲5–4.99,原因是初始不確定性太大,因此估算值占主導地位通過第一次測量。不確定性減少到3.99,這比測量不確定性要好一些。然後,預測將增加1,但是不確定性增加到5.99,這是運動不確定性2。
•再次基於度量6更新,得到的估計值爲5.99,幾乎是6。再次移動1。測量了7。移動了2.測量了9.移動了1.測量了10,然後移動了最終1。結果作爲最終結果,該位置的預測爲10.99,即10位置移動了1 ,以及不確定性(殘餘不確定性)4。
繪製高斯:
## Print out and display the final,resulting Gaussian
# set the parameters equal to the output ofthe Kalman filter result
mu = mu
sigma2 = sig
# define a range of x values
x_axis = np.arange(-20, 20, 0.1)
# create a corresponding list of gaussianvalues
g = []
for x in x_axis:
g.append(f(mu, sigma2, x))
# plot the result
plt.plot(x_axis, g)
請記住,在測量更新中,measurement_sig(var2或σ²)= 4,在運動更新(預測)中,motion_sig(var2或σ²)= 2將保持恆定。除此之外,代碼中的每個變量都會在每個時間步更新。例如,在過濾器管道的for循環中,mu和sig值將在測量更新中得到更新,然後將新的更新的mu和sig值輸入到運動更新(預測)功能中。然後再次通過運動更新(預測)功能生成新值時,將這些更新後的值輸入到測量更新(更新)功能中,循環繼續進行,直到爲車輛/物體的每個時間步長計算不確定性爲止。
個人微信(如果沒有備註不拉羣!)
請註明:
地區+學校/企業+研究方向+暱稱
下載1:何愷明頂會分享
在「AI算法與圖像處理」公衆號後臺回覆:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經典工作的總結分析
下載2:終身受益的編程指南:Google編程風格指南
在「AI算法與圖像處理」公衆號後臺回覆:c++,即可下載。歷經十年考驗,最權威的編程規範!
下載3 CVPR2020
在「AI算法與圖像處理」公衆號後臺回覆:
CVPR2020
,即可下載1467篇CVPR 2020論文
覺得不錯就點亮在看吧
本文分享自微信公衆號 - AI算法與圖像處理(AI_study)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。