上一篇博文已經講了貝葉斯濾波的原理以及公式的推導:http://www.cnblogs.com/JunhaoWu/p/bayes_filter.html
本篇文章將從貝葉斯濾波引入到粒子濾波,講訴粒子濾波的原理。
前面我們已經提到,將跟蹤目標的運動看作是一個動態系統。系統的狀態以目標的狀態來表示。這里,不妨將跟蹤目標的中心位置作為系統狀態 xt=(it,jt)。在連續變化的圖像序列里,狀態xt隨時間不斷變換。我們的目的是估計t時刻系統的狀態,在這個例子中為目標的中心位置。
狀態估計問題(目標跟蹤,信號濾波)就是根據之前一系列已有數據y1:t(后驗只是)遞推計算出當前狀態xt的可信度。這個可信度就是概率公式p(xt|y1:t)。
p(xt|y1:t)可以使用貝葉斯公式計算得出,即:
,
上面的式子中,我們還需要對p(yt|xt)和p(yt|y1:t-1)進行建模。例如,p(yt|xt)可以被看作是候選目標yt與跟蹤目標的相似度(即實際值xt與觀測值yt的相似度),用一系列的模板來重構yt,然后將其重構誤差作為候選目標跟跟蹤目標的相似度。
然而,這是貝葉斯濾波要解決的問題,我們現在想使用的是粒子濾波。
我們知道p(xt|y1:t)可以描述的是狀態xt的分布情況(取什么值,還有取得這個值的概率大小)。同樣的,樣本也有描述概率分布的能力。若將xt看作是一個隨機變量,如果能取得足夠多的樣本值,那么這些樣本完全可以描述xt的分布情況。無非就是取什么值,還有取得這個值的概率大小嘛。樣本中,落在該值上的樣本越多,那么取得這個值得概率就越大哩,也就是說用頻率來表示概率了。
粒子濾波的思想就是如上所述的使用樣本去模擬狀態xt的概率分布。啪啪啪,我們根據某個概率分布函數撒一些粒子xti,然后計算這些粒子的權值,該權值表示該粒子是我們想要的狀態xt的可能性,即p(xt|y1:t)。粒子撒的越多,模擬結果越精確(畢竟樣本越多越能說明真是情況嘛)。
下面以目標跟蹤為例簡述一下粒子濾波的算法流程:
1. 初始化階段:目標的特征描述,即如何表示跟蹤目標(灰度值,顏色特征等等);初始化粒子,可以使用高斯分布或者均勻分布來進行初始化(在Matlab中分別是randn函數和rand函數)。
2. 對每一個粒子(每個粒子也可以看做是一個候選目標)
1) 粒子傳播xt-1i --> xti
2) 計算粒子的觀測值 xti --> yti
3) 提取候選目標yti的特征,度量其與跟蹤目標的相似度,該相似度作為粒子xti的權值
3. 粒子重采樣
4. 根據粒子及其權值估計系統狀態xt
說明:
粒子傳播:xt-1表示的是t-1時刻的粒子,這些粒子近似表示了系統狀態xt-1的分布函數。而我們現在要估計的是t時刻的狀態xt,可以根據狀態方程對t-1時刻的粒子進行傳播,得到t時刻的粒子xt,用來近似表示t時刻的狀態分布。當然,也可以選用其它的方式進行粒子傳播,主要思想是使得傳播后的粒子更好地近似表示狀態xt的概率分布。
計算粒子的觀測值:前面我們使用目標的中心表示該目標在t時刻的狀態xt。根據不同的跟蹤目標,我們需要根據xt得到不同的觀測值。例如,跟蹤目標是一個3x3的矩陣,那么我們需要根據xt,取得其局部領域作為觀測值yt。
特征提取:我們雖然得到了粒子的觀測值yt。但是,我們需要提取更多關於目標的信息,例如灰度值,顏色特征等等。這些信息的目的都是為了更好地描述跟蹤目標,為得到更好的跟蹤效果而服務。提取了特征之后,我們就可以比較候選目標和跟蹤目標的相似度了。而相似度的衡量標准也有很多,這里就不詳細說明了。總而言之,相似度越大的候選目標越有可能是我們想要的跟蹤結果。因此,我們可以用相似度作為粒子的權值。畢竟相似度越大的粒子,狀態xt取得該粒子的可能性也越大嘛。
粒子重采樣:在跟蹤過程中,有一些粒子可能偏離目標太遠。這些粒子是我們想要的系統狀態xt的可能性非常小,因此取得的權值非常小。只是根據粒子傳播來改變粒子的狀態的話,偏離的粒子永遠是偏離的,很難再回到目標周圍。這樣的話,偏離的粒子可能越積越多。這就是所謂的粒子退化現象。退化了得粒子(權值小)作用就不大了,甚至說根本沒用啊!浪費了各種資源,對狀態估計又不做貢獻。因此我們需要對粒子進行重采樣。最簡單的方式是剔除掉權值小的粒子(也就是退化了的粒子),然后將權值大的再復制幾個唄。多簡單粗暴啊,哈哈哈!
以上便是粒子濾波的目標跟蹤流程了!如果還有什么問題,或者我寫的不好的地方,歡迎各位看官各種抨擊。
