基于粒子滤波的物体跟踪 Particle Filter Object Tracking
一直都觉得粒子滤波是个挺牛的东西,每次试图看文献都被复杂的数学符号搞得看不下去。一个偶然的机会发现了Rob Hess(http://web.engr.oregonstate.edu/~hess/)实现的这个粒子滤波。从代码入手,一下子就明白了粒子滤波的原理。根据维基百科上对粒子滤波的介绍(http://en.wikipedia.org/wiki/Particle_filter),粒子滤波其实有很多变种,Rob Hess实现的这种应该是最基本的一种,Sampling Importance Resampling (SIR),根据重要性重采样。下面是我对粒子滤波实现物体跟踪的算法原理的粗浅理解:
1)初始化阶段-提取跟踪目标特征
该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征。具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该区域色调(Hue)空间的直方图,即为目标的特征。直方图可以用一个向量来表示,所以目标特征就是一个N*1的向量V。
2)搜索阶段-放狗
好,我们已经掌握了目标的特征,下面放出很多条狗,去搜索目标对象,这里的狗就是粒子particle。狗有很多种放法。比如,a)均匀的放:即在整个图像平面均匀的撒粒子(uniform distribution);b)在上一帧得到的目标附近按照高斯分布来放,可以理解成,靠近目标的地方多放,远离目标的地方少放。Rob Hess的代码用的是后一种方法。狗放出去后,每条狗怎么搜索目标呢?就是按照初始化阶段得到的目标特征(色调直方图,向量V)。每条狗计算它所处的位置处图像的颜色特征,得到一个色调直方图,向量Vi,计算该直方图与目标直方图的相似性。相似性有多种度量,最简单的一种是计算sum(abs(Vi-V)).每条狗算出相似度后再做一次归一化,使得所有的狗得到的相似度加起来等于1.
3)决策阶段
我们放出去的一条条聪明的狗向我们发回报告,“一号狗处图像与目标的相似度是0.3”,“二号狗处图像与目标的相似度是0.02”,“三号狗处图像与目标的相似度是0.0003”,“N号狗处图像与目标的相似度是0.013”...那么目标究竟最可能在哪里呢?我们做次加权平均吧。设N号狗的图像像素坐标是(Xn,Yn),它报告的相似度是Wn,于是目标最可能的像素坐标X = sum(XnWn),Y = sum(YnWn).
4)重采样阶段Resampling
既然我们是在做目标跟踪,一般说来,目标是跑来跑去乱动的。在新的一帧图像里,目标可能在哪里呢?还是让我们放狗搜索吧。但现在应该怎样放狗呢?让我们重温下狗狗们的报告吧。“一号狗处图像与目标的相似度是0.3”,“二号狗处图像与目标的相似度是0.02”,“三号狗处图像与目标的相似度是0.0003”,“N号狗处图像与目标的相似度是0.013”...综合所有狗的报告,一号狗处的相似度最高,三号狗处的相似度最低,于是我们要重新分布警力,正所谓好钢用在刀刃上,我们在相似度最高的狗那里放更多条狗,在相似度最低的狗那里少放狗,甚至把原来那条狗也撤回来。这就是Sampling Importance Resampling,根据重要性重采样(更具重要性重新放狗)。
(2)->(3)->(4)->(2)如是反复循环,即完成了目标的动态跟踪。
根据我的粗浅理解,粒子滤波的核心思想是随机采样+重要性重采样。既然我不知道目标在哪里,那我就随机的撒粒子吧。撒完粒子后,根据特征相似度计算每个粒子的重要性,然后在重要的地方多撒粒子,不重要的地方少撒粒子。所以说粒子滤波较之蒙特卡洛滤波,计算量较小。这个思想和RANSAC算法真是不谋而合。RANSAC的思想也是(比如用在最简单的直线拟合上),既然我不知道直线方程是什么,那我就随机的取两个点先算个直线出来,然后再看有多少点符合我的这条直线。哪条直线能获得最多的点的支持,哪条直线就是目标直线。想法非常简单,但效果很好。
扯远了,下面还是说说代码吧。Rob Hess的代码好像是linux上的,我稍微改了下,让Windows+VS2008能跑。main函数在track1.c里,默认是处理附带的视频,当然可以方便的改成从摄像头输入视频(cvCaptureFromCAM)。我用的是opencv2.0,没有测试低于2.0的版本。程序开始后,读入第一帧图像后,需要用鼠标拖动出跟踪目标区域,(然后按回车)。跟踪区域较小时速度较快,跟踪区域大时明显变得很卡。代码还需要gsl库的支持,我用的是gsl1.8,下面提供了gsl1.8安装文件的下载。这里是全部代码和相关的VS2008工程文件。
Hope you find it useful!
Particle Filter Object Tracking
Visual object tracking is a difficult problem, but in recent years, particle filter-based object trackers have proven to be very effective. Conceptually, a particle filter-based tracker maintains a probability distribution over the state (location, scale, etc.) of the object being tracked. Particle filters represent this distribution as a set of weighted samples, or particles. Each particle represents a possible instantiation of the state of the object. In other words, each particle is a guess representing one possible location of the object being tracked. The set of particles contains more weight at locations where the object being tracked is more likely to be. This weighted distribution is propagated through time using a set of equations known as the Bayesian filtering equations, and we can determine the trajectory of the tracked object by taking the particle with the highest weight or the weighted mean of the particle set at each time step.
The particle filter tracker available here is a simple single-object tracker that uses a color histogram-based observation model and a second-order autoregressive dynamical model. It is implemented in C using OpenCV and the GSL. The image sequence below shows the tracker in action.
A sequence of video frames in which a football player is successfully tracked with a particle filter
Download
- Linux: track.tar.gz
Dependencies
References
- Object Tracking with Particle Filtering [an old course project presentation that describes this particle filter implementation]
- Color-Based Probabilistic Tracking. P. Perez, C. Hue, J. Vermaak, and M. Gangnet. ECCV, 2002.
- Sequential Monte Carlo Methods in Practice. A. Doucet, N. de Freitas, and N. Gordon (eds.). Springer, 2001.
- Discriminatively Trained Particle Filters for Complex Multi-Object Tracking. R. Hess and A. Fern. CVPR, 2009.
From:http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html
http://blogs.oregonstate.edu/hess/code/particles/