1. 程式人生 > >視訊跟蹤演算法之粒子濾波

視訊跟蹤演算法之粒子濾波

1. 寫在前面

最近在看視訊跟蹤方面的一些碩博士畢業論文,幾乎看到的每一篇都會涉及到粒子濾波演算法,所以這段時間花了很多時間在看相關的內容。

瀏覽了大量的部落格和文章,跟著不停推導公式,感覺還是無法完全掌握,無法將這個抽象的數學模型和實際應用中聯絡起來,不過隨著時間推移,推導的更多,思考的更多,理解的也越來越透徹了,這裡做一下筆記,一方面整理一下思路加深自己的理解,另一方面也給這篇文章的讀者提供一些參考。

其實有些地方確實比較難以理解,我在看相關資料的時候發現有一些內容和推導都是直接一筆帶過,我也花了不少時間一點一點推導和理解。這篇文章,筆者將盡自己所能把整個過程說的完整詳細,但是限於自己水平有限,如果有什麼說的不好的或者理解有問題的地方,請指正,謝謝。

2. 本文結構

本文將從貝葉斯濾波入手,進而從蒙特卡洛方法,重要性取樣,序貫重要性取樣,重取樣等等方法一步一步闡述基本粒子濾波的完整推導過程,最終會給一個完整的基本粒子濾波的實現流程。據我的理解,整個粒子推導的過程其實就是在解決當前問題的時候挖一個坑,然後在解決這個坑的同時繼續挖坑,然後繼續解決,直到最後得到一個比較完善的演算法框架。

3. 正文

粒子濾波通過非引數化的蒙特卡洛(Monte Carlo)模擬方法來實現遞推貝葉斯濾波,適用於任何能用狀態空間模型描述的非線性系統,精度可以逼近最優估計。粒子濾波器具有簡單、易於實現等特點,它為分析非線性動態系統提供了一種有效的解決方法,從而引起目標跟蹤、訊號處理以及自動控制等領域的廣泛關注。


3.1 貝葉斯框架下的跟蹤問題描述

為了描述跟蹤問題,我們定義目標狀態空間方程如下:

狀態模型x_{n+1} = f_{n}(x_{n}, w_{n})

觀測模型: y_{n} = h_{n}(x_{n}, v_{n})

其中,x_{n}表示狀態,y_{n}表示觀測,w_{n}表示動態噪聲或過程噪聲, v_{n} 表示觀測噪聲。

系統簡易模型如下圖所述所示:


為了方便後面的推導,定義如下:
Y_{n} = y_{1:n} = \{y_{1}, y_{2}, \ldots, y_{n}\}
X_{n} = x_{0:n} = \{y_{0}, y_{1}, \ldots, y_{n} \}

所以從貝葉斯角度,跟蹤問題即為: 從Y _{n} 中推匯出p(x_{n}|Y_{n})後驗概率密度


假設p(x_{0})已知,那麼(px_{t}|Y_{n} )通過以下遞推得到:


預測p(x_{n}|Y_{n-1}) = \int p(x_{n}|x_{n-1})p(x_{n-1}|Y_{n-1})\,dx_{n-1}

跟新p(x_{n}|Y_{n-1}) = \frac{p(y_{n}|x_{n})p(x_{n}|Y_{n-1})}{p(y_{n}|Y_{n-1})}

式中:

p(x_{n}|x_{n-1})為狀態轉移概率,由目標狀態模型定義。

p(y_{n}|x_{n})為觀測模型定義,也稱為觀測似然度。

p(y_{n}|Y_{n-1})為歸一化常數:p(y_{n}|Y_{n-1}) = \int p(y_{n}|x_{n})p(x_{n}|Y_{n-1})\,dx_{n}

註釋:

  • 跟新步的完整推導如下:

p(x_{n}|Y_{n-1}) = \frac{p(Y_{n}|x_{n})p(x_{n})}{p(Y_{n})} \\ = \frac{p(Y_{n-1},y_{n}|x_{n})p(x_{n})}{p(Y_{n-1}), y_{n}} \\ =\frac{p(y_{n}|Y_{n-1}, x_{n})p(Y_{n-1}, x_{t})p(x_{t})}{p(x_{n})p(y_{n}|Y_{n-1})p(Y_{n-1})}\\=\frac{p(y_{t}|x_{t})p(x_{t}|Y_{n-1})p(Y_{n-1})p(x_{n})}{p(y_{n}|Y_{n-1})p(Y_{n-1})p(x_{n})}\\=\frac{p(y_{n}|x_{n})p(x_{n}|Y_{n-1}}{p(y_{n}|Y_{n-1})}

所以,在貝葉斯框架下的跟蹤問題即貝葉斯濾波推導完成了,上述推導使用了定積分,當系統處於線性、高斯假設條件下,可以得到解析解,此時即為著名的卡爾曼濾波

(關於卡爾曼濾波的討論又是另一個話題了,這裡不多說,以後有機會會詳細討論),但是在實際使用中,大多情況下均為非線性非高斯系統,就很難得到解析解,所以接下來需要引入蒙特卡羅方法來解決這個問題。


3.2 蒙特卡洛方法

這一節,我們暫時先放下濾波的問題,我們來重點了解一下什麼是蒙特卡洛方法。

蒙特卡羅方法於20世紀40年代美國在第二次世界大戰中研製原子彈的“曼哈頓計劃”計劃的成員S.M.烏拉姆和J.馮·諾伊曼首先提出。數學家馮·諾伊曼用馳名世界的賭城——摩納哥的Monte Carlo——來命名這種方法,為它蒙上了一層神祕色彩。在這之前,蒙特卡羅方法就已經存在,1777年,法國數學家布豐(Georges Louis Leclere de Buffon,1707—1788)提出用投針實驗的方法求圓周率π,這被認為是蒙特卡羅方法的起源。

簡單來說,蒙特卡羅方法就是一種計算方法。原理是通過大量隨機樣本,去了解一個系統,進而得到所要計算的值。它非常強大和靈活,又相當簡單易懂,很容易實現。對於許多問題來說,它往往是最簡單的計算方法,有時甚至是唯一可行的方法。


假設隨機變數x服從某個分佈p(x), 那麼對於x的一個函式f(x),我們有:E[f(x)] = \int_{a}^{b} f(x)p(x)\,dx
Var[f(x)] = \int_{a}^{b}(f(x) - E(f(x))^2p(x)\,dx

若此時我們可以採集到服從p(x)分佈的一系列樣本\{x_{1}, x_{2},\ldots, x_{N}\} ,那麼根據蒙特卡洛使用平均值近似代替積分的思想,就有了:

E[f(x)] \approx \frac{1}{N}\Sigma_{i=1}^{N}f(x_{i})

這很容易從伯努利大數定律的角度理解,當樣本足夠大的時候,我們可以認為上式取等。這就是蒙特卡洛方法的一個簡單理解,這裡只是為了求解上述定積分問題,所以我們瞭解到這一步即可。


3.3 蒙特卡洛思想在貝葉斯濾波中的應用

上面說到貝葉斯濾波使用了積分,不易得到解析解,我們只能採用數值方法求解,而蒙特卡洛方法為高維變數的積分問題求解提供了一種可行的逼近解法,所以,本節我們將討論如何將蒙特卡洛思想應用在貝葉斯濾波中。

首先,假設我們可以從後驗概率p(x_{n}|Y_{n})中採集到N個獨立樣本\{x_{n}^{(1)}, x_{n}^{(2)},\ldots, x_{n}^{(N)}\},那麼後驗概率的計算可以表示為:

\tilde{p}(x_{n}|Y_{n}) \approx \frac{1}{N}\Sigma_{i=1}^{N}\delta(x_{n} - x_{n}^{(i)})

其中,\delta(x_{n} - x_{n}^{(i)})狄拉克函式(學過《訊號與系統》的小夥伴應該比較熟悉,就是衝激響應函式),我們這裡用的是離散形式。

對於這個公式,可以藉助下面概率分佈圖像理解:



從上圖很容易看出,使用N個獨立樣本通過蒙特卡洛方法可以近似得到後驗概率密度函式這裡的圖其實是概率分佈圖,用這個圖只是為了直觀表達一下蒙特卡洛思想,自己又太懶沒有重新畫概率密度函式圖,藉以理解一下即可

估計出了後驗概率,要做影象跟蹤或者濾波,就是要知道當前狀態的期望值

E(f(x_{n}) \approx \int f(x_{n}) \tilde{p}(x_{n}|Y_{n})\,dx_{n} = \frac{1}{N}\Sigma_{i=1}^{N}f(x_{n}^{(i)})

可以看出,只要我們使用取樣粒子的狀態值的平均就能得到期望值,也就是濾波後的值,這裡的f(x)就是每個粒子的狀態函式。這就是粒子濾波名字的由來了,只要從後驗概率中取樣很多粒子,用它們的狀態求平均就得到了濾波結果。

可是問題出現了,在本節的開頭我們假設可以從後驗概率p(x_{n}|Y_{n})中採集到N個獨立樣本,所以說不知道後驗概率的情況下從哪裡採集樣本?這好像就是一個迴圈的問題了:我們沒有後驗概率卻要從後驗概率中採集樣本去逼近後驗概率和狀態期望。別急,接下來就要引出一種用以解決該問題的重要演算法:重要性取樣


3.4 重要性取樣

這一節主要是介紹重要性取樣,這部分有較多的公式推導,請準備好你的紙筆,跟我一起推導吧。

當我們無法從一個未知的分佈中取樣的時候,重要性取樣引入了一個容易取樣的重要性概率密度函式q(x_{n}|Y_{n})重要性取樣的思想就是從這個重要性概率密度函式中取樣粒子,然後使用取樣的結果去加權逼近我們的後驗概率密度函式p(x_{n}|Y_{n})。下面從兩個角度入手進行推導和論證(這兩個思路分別來自兩篇文獻,我覺得兩個配合著看可以更好的幫我們理解)。

3.4.1 首先引入一個支撐粒子集\{(x_{n}^{(i)}, w_{n}^{(i)}),i = 1,2,\ldots, N\} ,其中是從重要性概率密度函式中取樣的粒子,表示在n時刻第i個粒子的狀態w_{n}^{(i)}是其的權值

那麼後驗概率密度函式可以表示為

p(x_{n}|Y_{n}) = \Sigma_{i=1}^{N}w_{n}^{(i)}\delta(x_{n}-x_n^{(i)})

其中,w_{n}^{(i)} \propto \frac{p(x_{n}|Y_{n})}{q(x_{n}|Y_{n})}

根據蒙特卡洛思想,當取樣粒子數目非常大的時候,就可以逼近概率密度函式,那麼f(x_{n})的期望為:

E[f(x_{n})] =\frac{1}{N}\Sigma_{i=1}^{N}f(x_{n}^{(i)})\frac{p(x_{n}|Y_{n})}{q(x_{n}|Y_{n})}= \frac{1}{N}\Sigma_{i=1}^{N}f(x_{n}^{(i)})w_{n}^{(i)}


3.4.2 另一個方面,我們換一個思路,直接求解期望:

E[f(x_{n})] = \int f(x_{n})\frac{p(x_{n}|Y_{n})}{q(x_{n}|Y_{n})}q(x_{n}|Y_{n})\,dx \\ = \int f(x_{n})\frac{p(Y_{n}|x_{n})p(x_{n})}{p(Y_{n})q(x_{n}|Y_{k})}q(x_{n}|Y_{n})\,dx\\= \int f(x_{n})\frac{w_{n}(x_{n})}{p(Y_{n})}q(x_{n}|Y_{n})\,dx

其中,w_{n}(x_{n})表示時刻n粒子x_{n}的權重,和上面的w_{n}^{(i)}一個意思,只是表示形式不同,且:

w_{n}(x_{n}) = \frac{p(Y_{n}|x_{n})p(x_{n})}{q(x_{n}|Y_{n})}\propto \frac{p(x_{n}|Y_{n})}{q(x_{n}|Y_{n})}

又因為p(Y_{n}) = \int p(Y_{n}|x_{n})p(x_{n})\,dx_{n}

所以,進一步推導如下:

E[f(x_{n})] = \frac{1}{p(Y_{n})} \int f(x_{n})w_{n}(x_{n})q(x_{n}|Y_{n})\,x_{n} \\ =\frac{\int f(x_{n})w_{n}(x_{n})q(x_{n}|Y_{n})\,x_{n}}{\int p(Y_{n}|x_{n})p(x_{n})\,dx_{n}} \\=\frac{\int f(x_{n})w_{n}(x_{n})q(x_{n}|Y_{n})\,x_{n}}{\int w_{n}(x_{n})q(x_{n}|Y_{n})\,dx_{n}} \\ =\frac{E_{q(x_{n}|Y_{n})}[w_{n}(x_{n})f(x_{n})]}{E_{q(x_{n}|Y_{n})}[w_{n}(x_{n})]}

通過這一系列推導我們可以看出最後的期望已經轉為完全與q(x_{n}|Y_{n})有關的期望求解了,這也是這個演算法讓我歎服的地方。這樣我們就可以使用蒙特卡洛方法求解了,所以我們只要N個粒子的平均求其期望即可,上面的式子近似為:

E[f(x_{n})] \approx \frac{\frac{1}{N}\Sigma_{i=1}^{N}w_{n}(x_{n}^{(i)})f(x_{n}^{(i)})}{\frac{1}{N}\Sigma_{i=1}^{N}w_{n}(x_{n}^{(i)})} = \frac{1}{N}\Sigma_{i=1}^{N}f(x_{n}^{(i)})\bar w_{n}(x_{n}^{(i)})

這裡的\bar w_{n}(x_{n}^{(i)}) =\frac{w_{n}(x_{n}^{(i)})}{Sigma_{i=1}^{N}w_{n}(x_{n}^{(i)})}為歸一化的權值,這個結果其實與上面的結果完全相同,只是一個權值是人為給出來的,一個是推導得出的。

這裡我們可以看出來,這裡的不是所有粒子的平均值而是所有粒子的加權和,所以每個粒子都有一個權重,可以理解為對當前粒子的信任程度,這樣我們就解決了取樣的問題,但是這種方法每個新的觀測資料都要全部重新計算,這在計算量上是讓人崩潰的,下面就引入一種演算法來解決這種問題。


3.5 序貫重要性取樣

對於上節所述的問題,我們考慮將統計學中的序貫分析方法應用到蒙特卡洛方法中,用以實現後驗概率密度的遞推估計。

假設重要性概率密度函式為q(X_{n}|Y_{n})(注意這裡是X_{n}與上一節有所區別),假設該密度函式可以分解如下:

q(X_{n}|Y_{n}) = q(X_{n-1}|Y_{n-1})q(x_{n}|X_{n-1},Y_{n})

並且需要宣告如下
  • 系統是一個一階馬爾可夫過程,即:p(X_{n}) = p(x_{0:n}) = p(x_{0})\prod_{i=1}^{n}p(x_{i}|x_{i-1})
  • 各次觀測之間相互獨立,即:p(y_{1:n}|x_{1:n}) = \prod_{i=1}^{n}p(y_{i}|x_{i})

那麼後驗概率密度函式的遞推如下:

p(X_{n}|Y_{n}) = \frac {p(Y_{n}|X_{n})p(X_{n})}{p(Y_{n})}\\=\frac{p(y_{n},Y_{n-1}|X_{n})p(X_{n})}{p(y_{n}|Y_{n-1})p(Y_{n-1})} \\ =\frac{p(y_{n}|X_{n},y_{n-1})p(Y_{n-1}|X_{n})p(X_{n})}{p(y_{n}|Y_{n-1})p(Y_{n-1})} \\ = \frac{p(y_{n}|X_{n},Y_{n-1})p(X_{n}|Y_{n-1})}{p(y_{n}|Y_{n-1})} \\ =\frac{p(y_{n}|X_{n},Y_{n-1})p(x_{n}|X_{n-1},Y_{n-1})p(X_{n-1}|Y_{n-1})}{p(y_{n}|Y_{n-1})} \\ = \frac{p(y_{n}|x_{n})p(x_{n}|x_{n-1})p(X_{n-1}|Y_{n-1})}{p(y_{n}|Y_{n-1})} \\ \propto p(y_{n}|x_{n})p(x_{n}|x_{n-1})p(X_{n-1}|Y_{n-1})

其中:

  • 需要注意這裡面的字母大小寫所代表的不同含義,在最開始我們已經宣告。
  • p(y_{n}|Y_{n-1})為歸一化常數,p(y_{n}|Y_{n-1}) = \int p(y_{n}|x_{n})p(x_{n}|Y_{n-1})\,dx_{n} 。
這個過程在很多資料上都沒有說的很詳細,筆者當時也是在這一步卡了很久,花了很長時間才完全弄明白,這個推導過程其實最開始的推導步驟與我們在貝葉斯濾波中的推導是一樣的,但是有一步很難理解(至少筆者當時是不太理解的),即:p(y_{n}|X_{n},Y_{n-1})p(x_{n}|X_{n-1},Y_{n-1}) = p(y_{n}|x_{n})p(x_{n}|x_{n-1})

這一步按照我的理解,這裡面有非常重要的兩點需要注意也是上面宣告所強調的:

  • 狀態系統是一個一階馬爾可夫過程,也就是x_{n} 的狀態只與x_{n-1}有關。
  • 觀測值y_{n}只與x_{n}有關,由觀測模型定義。

所以這樣上式就很容易理解了:

  • p(y_{n}|X_{n},Y_{n-1})中,X_{n-1}Y_{n-1}並不給y_{n}提供資訊量,所以該項等於p(y_{n}|x_{n})
  • p(x_{n}|X_{n-1},Y_{n-1})中,同理,Y_{n-1}X_{n-2}不給x_{n}提供資訊量,所以該項等於p(x_{n}|x_{n-1})

進一步,粒子權值的遞迴推導為:

w_{n}^{(i)} \propto \frac{p(X_{n}^{(i)}|Y_{n}^{(i)})}{q(X_{n}^{(i)}|Y_{n}^{(i)})} \\ = \frac{p(y_{n}^{(i)}|x_{n}^{(i)})p(x_{n}^{(i)}|x_{n-1}^{(i)})p(X_{n-1}^{(i)}|Y_{n-1}^{(i)})}{q(X_{n-1}^{(i)}|Y_{n-1}^{(i)})q(x_{n}^{(i)}|X_{n-1}^{(i)},Y_{n}^{(i)}) }\\ =w_{n-1}^{(i)} \frac{p(y_{n}^{(i)}|x_{n}^{(i)})p(x_{n}^{(i)}|x_{n-1}^{(i)})}{q(x_{n}^{(i)}|X_{n-1}^{(i)},Y_{n}^{(i)}) }

當然,這裡的推導是沒有進行歸一化的,我們實際使用的時候需要使用下式進行歸一化:

w_{n}^{(i)} = \frac{w_{n}^{(i)} }{\Sigma w_{n}^{(i)} }

接下來,我們尋找一個合適的重要性概率密度函式:

q(x_{n}|X_{n-1},Y_{n}) = q(x_{n}|x_{n-1}, y_{n})

即重要性分佈的x_{n}只與x_{n-1}y_{n}有關,則:

w_{n}^{(i)} \propto w_{n-1}^{(i)} \frac{p(y_{n}^{(i)}|x_{n}^{(i)})p(x_{n}^{(i)}|x_{n-1}^{(i)})}{q(x_{n}^{(i)}|x_{n-1}^{(i)},y_{n}^{(i)}) }

所以,我們根據以上的推導,我們就可以總結出序貫重要性取樣演算法

[\{x_{n}^{(i)},w_{n}^{(i)}\}_{i=1}^{N}] = SIS(\{x_{n-1}^{(i)},w_{n-1}^{(i)}\}_{i=1}^{N},Y_{n})

for \,\,i = 1:N

取樣:從重要性概率密度函式中採集樣本x_{n}^{(i)}
計算:根據最新的觀測計算權w_{n}^{(i)}

end

權值歸一化,計算估計目標狀態


這就是一個基本的序貫重要性取樣的推導和演算法流程了,但是隨著時間的推移,會出現權值退化現象:一些粒子的權值變得非常小,但每次都會佔用資源進行計算,這樣大量的計算時間浪費在這些不重要的粒子上,導致估計效能下降。

一般來說,我們用有效粒子數N_{eff}來衡量粒子權值的退化程度,有:

N_{eff} = \frac{N}{1+Var(w_{n}^{*(i)})}
w_{n}^{*(i)} = \frac{p(x_{n}^{(i)}|Y_{n})}{q(x_{n}^{(i)}|x_{n-1}^{(i)},Y_{n})}

上式的意思是:有效的粒子越少,權重方差越大,權值退化越嚴重我們在實際計算中,有效粒子近似為:

\bar N_{eff} \approx \frac{1}{\Sigma_{i=1}^{n}}(w_{n}^{(i)})^2

我們在進行序貫重要性取樣的時候,\bar N_{eff}小於某一設定好的閾值,則應當採取一些措施加以控制。克服序貫重要性取樣演算法權值退化現象最直接的方法是增加粒子數,而這會造成計算量的相應增加,影響計算的實時性。因此,一般採用以下兩種途徑:(1)選擇合適的重要性概率密度函式;(2)在序貫重要性取樣之後,採用重取樣方法。

在我看的大多數論文和部落格中,都以重取樣為主,所以這裡我也著重說一下重取樣,關於其他方法,讀者可以上網查閱相關資料。


3.6 重取樣

重取樣,簡單來說,就是捨棄權值較小的粒子,用新的粒子來代替他們,容易想到的就是將權值較大的粒子多複製幾個出來代替它們,複製的原則就是根據權重按比例進行分配

根據前面的推導我們知道:

p(x_{n}|Y_{n}) = \Sigma_{i=1}^{N}w_{n}^{(i)}\delta(x_{n}-x_{n}^{(i)})

我們希望經過重取樣以後得到如下結果:

\bar p(x_{n}|Y_{n}) =\Sigma_{j=1}^{N}\frac{1}{N}\delta(x_{n}-x_{n}^{(j)}) = \Sigma_{k=1}^{N^{'}}\frac{n^{(k)}}{N^{'}}\delta(x_{n}-x_{n}^{(k)})

上式符號較多,說明如下:

  • x_{n}^{(j)}表示的是從重要性密度函式中取樣得到的粒子,j表示其序號,N表示其個數。
  • x_{n}^{(k)}表示的是重取樣以後留下來的不同的粒子,k表示其序號,N^{'}表示其個數,而每一個x_{n}^{(k)}由於重取樣,它的個數為n^{(k)},但是所有例子的總數加起來仍然為N

常用的重取樣方法包括多項式重取樣、殘差重取樣、分層重取樣與系統重取樣等,我們只說一下殘差重取樣

殘差重取樣流程如下:

  1. 計算當前概率累計和,也就是概率分佈,為\lambda _{i} ,i = \{1, 2, \ldots,N\}
  2. 生成N個在個[0,1]區間均勻分佈的隨機數\mu_{j}, j = \{1, 2, \ldots,N\}
  3. 對於每個\mu_{j},尋找概率分佈中大於或等於\mu_{j}的最小標號m,即\lambda_{m-1} < \mu_{j} <\lambda_{m}。當\mu_{j}落在該區間時,那麼x_{n}^{(m)}被複制一次,最後每個粒子的個數就是這裡累計複製的個數。

看起來可能不太直觀,我們舉個栗子

假設當前有5個粒子,權值分別為:0.1,0.2,0.2,0.2,0.3

那麼當前的概率分佈為:0.1,0.3,0.5,0.7,1.0

生成5個在[0,1]中均勻分佈的隨機數,假設為:0.08,0.27,0.57,0.72,0.9

\mu_{1} = 0.08m=1,複製一次;

\mu_{2} = 0.27m=2,複製一次;

\mu_{3} = 0.57m=4,複製一次;

\mu_{4} = 0.72m=5,複製一次;

\mu_{5} = 0.90m=5,複製一次;

所以上面的五個粒子,序號為1,2,4的分別複製一次,序號為5的複製兩次,序號為3的複製0次(當然,這個例子不一定準確,因為隨機數是我瞎寫的)。

給張圖感受一下:


所以SIR演算法就如下圖所示:


3.7 粒子取樣演算法完整流程

通過以上的敘述,我們可以總結出來一個基本的粒子取樣演算法的完整流程如下:


1. 粒子集初始化,對k=0

\,\,\,\,\,對於i = 1,2,\ldots,N,由