一直都覺得粒子濾波是個(gè)挺牛的東西泽本,每次試圖看文獻(xiàn)都被復(fù)雜的數(shù)學(xué)符號搞得看不下去裹唆。一個(gè)偶然的機(jī)會發(fā)現(xiàn)了Rob Hess(http://web.engr.oregonstate.edu/~hess/)實(shí)現(xiàn)的這個(gè)粒子濾波钓试。從代碼入手,一下子就明白了粒子濾波的原理。根據(jù)維基百科上對粒子濾波的介紹(http://en.wikipedia.org/wiki/Particle_filter),粒子濾波其實(shí)有很多變種列荔,Rob Hess實(shí)現(xiàn)的這種應(yīng)該是最基本的一種,Sampling Importance Resampling (SIR)枚尼,根據(jù)重要性重采樣贴浙。下面是我對粒子濾波實(shí)現(xiàn)物體跟蹤的算法原理的粗淺理解:
1)初始化階段-提取跟蹤目標(biāo)特征
該階段要人工指定跟蹤目標(biāo),程序計(jì)算跟蹤目標(biāo)的特征署恍,比如可以采用目標(biāo)的顏色特征崎溃。具體到Rob Hess的代碼,開始時(shí)需要人工用鼠標(biāo)拖動出一個(gè)跟蹤區(qū)域锭汛,然后程序自動計(jì)算該區(qū)域色調(diào)(Hue)空間的直方圖,即為目標(biāo)的特征袭蝗。直方圖可以用一個(gè)向量來表示唤殴,所以目標(biāo)特征就是一個(gè)N1的向量V。
2)搜索階段-放狗
好到腥,我們已經(jīng)掌握了目標(biāo)的特征朵逝,下面放出很多條狗,去搜索目標(biāo)對象乡范,這里的狗就是粒子particle配名。狗有很多種放法啤咽。比如,a)均勻的放:即在整個(gè)圖像平面均勻的撒粒子(uniform distribution)渠脉;b)在上一幀得到的目標(biāo)附近按照高斯分布來放宇整,可以理解成,靠近目標(biāo)的地方多放芋膘,遠(yuǎn)離目標(biāo)的地方少放鳞青。Rob Hess的代碼用的是后一種方法。狗放出去后为朋,每條狗怎么搜索目標(biāo)呢臂拓?就是按照初始化階段得到的目標(biāo)特征(色調(diào)直方圖,向量V)习寸。每條狗計(jì)算它所處的位置處圖像的顏色特征胶惰,得到一個(gè)色調(diào)直方圖,向量Vi霞溪,計(jì)算該直方圖與目標(biāo)直方圖的相似性孵滞。相似性有多種度量,最簡單的一種是計(jì)算sum(abs(Vi-V)).每條狗算出相似度后再做一次歸一化威鹿,使得所有的狗得到的相似度加起來等于1.
3)決策階段
我們放出去的一條條聰明的狗向我們發(fā)回報(bào)告剃斧,“一號狗處圖像與目標(biāo)的相似度是0.3”,“二號狗處圖像與目標(biāo)的相似度是0.02”,“三號狗處圖像與目標(biāo)的相似度是0.0003”,“N號狗處圖像與目標(biāo)的相似度是0.013”...那么目標(biāo)究竟最可能在哪里呢?我們做次加權(quán)平均吧忽你。設(shè)N號狗的圖像像素坐標(biāo)是(Xn,Yn),它報(bào)告的相似度是Wn,于是目標(biāo)最可能的像素坐標(biāo)X = sum(XnWn),Y = sum(Yn*Wn).
4)重采樣階段Resampling
既然我們是在做目標(biāo)跟蹤幼东,一般說來,目標(biāo)是跑來跑去亂動的科雳。在新的一幀圖像里根蟹,目標(biāo)可能在哪里呢?還是讓我們放狗搜索吧糟秘。但現(xiàn)在應(yīng)該怎樣放狗呢简逮?讓我們重溫下狗狗們的報(bào)告吧∧蜃“一號狗處圖像與目標(biāo)的相似度是0.3”,“二號狗處圖像與目標(biāo)的相似度是0.02”,“三號狗處圖像與目標(biāo)的相似度是0.0003”,“N號狗處圖像與目標(biāo)的相似度是0.013”...綜合所有狗的報(bào)告散庶,一號狗處的相似度最高,三號狗處的相似度最低凌净,于是我們要重新分布警力悲龟,正所謂好鋼用在刀刃上,我們在相似度最高的狗那里放更多條狗冰寻,在相似度最低的狗那里少放狗须教,甚至把原來那條狗也撤回來。這就是Sampling Importance Resampling斩芭,根據(jù)重要性重采樣(更具重要性重新放狗)轻腺。
(2)->(3)->(4)->(2)如是反復(fù)循環(huán)乐疆,即完成了目標(biāo)的動態(tài)跟蹤。
根據(jù)我的粗淺理解贬养,粒子濾波的核心思想是隨機(jī)采樣+重要性重采樣挤土。既然我不知道目標(biāo)在哪里,那我就隨機(jī)的撒粒子吧煤蚌。撒完粒子后耕挨,根據(jù)特征相似度計(jì)算每個(gè)粒子的重要性,然后在重要的地方多撒粒子尉桩,不重要的地方少撒粒子筒占。所以說粒子濾波較之蒙特卡洛濾波,計(jì)算量較小蜘犁。這個(gè)思想和RANSAC算法真是不謀而合翰苫。RANSAC的思想也是(比如用在最簡單的直線擬合上),既然我不知道直線方程是什么这橙,那我就隨機(jī)的取兩個(gè)點(diǎn)先算個(gè)直線出來奏窑,然后再看有多少點(diǎn)符合我的這條直線。哪條直線能獲得最多的點(diǎn)的支持屈扎,哪條直線就是目標(biāo)直線埃唯。想法非常簡單,但效果很好鹰晨。
扯遠(yuǎn)了墨叛,下面還是說說代碼吧。Rob Hess的代碼好像是linux上的模蜡,我稍微改了下漠趁,讓W(xué)indows+VS2008能跑。main函數(shù)在track1.c里忍疾,默認(rèn)是處理附帶的視頻闯传,當(dāng)然可以方便的改成從攝像頭輸入視頻(cvCaptureFromCAM)。我用的是opencv2.0卤妒,沒有測試低于2.0的版本甥绿。程序開始后,讀入第一幀圖像后则披,需要用鼠標(biāo)拖動出跟蹤目標(biāo)區(qū)域共缕,(然后按回車)。跟蹤區(qū)域較小時(shí)速度較快收叶,跟蹤區(qū)域大時(shí)明顯變得很卡骄呼。代碼還需要gsl庫的支持共苛,我用的是gsl1.8,下面提供了gsl1.8安裝文件的下載判没。這里是全部代碼和相關(guān)的VS2008工程文件
Hope you find it useful!