2010年11月27日星期六
MadTurtle总结笔记:粒子滤波
离上次写立项的时候已经有5个月左右的时间了,中间没一直做跟踪,毕竟身不由己。一直都想写点什么,关于自己正在做的和即将做的,但是总是没那个时间来好好总结,今天压缩时间还是整点东西上来,希望对大家有点小用。
什么是粒子滤波
粒子滤波(PF: Particle Filter)[1]算法来源于蒙特卡洛方法(Monte Carlo method),它是利用粒子集来表示概率,可以用在任何形式的状态空间模型上。其核心思想是通过从后验概率中抽取的随机状态粒子来表示其分布情况,是一种顺序重要性采样法(Sequential Importance Sampling)。
1. 初始化阶段
在跟踪前需要选定出要跟踪的目标物体,这个过程可以用人工划定方法和自动识别方法。使用人工的方法可以通过鼠标在图像区域标记出一片感兴趣矩形然后计算它的特征;使用自动的方法就是目标检测技术,识别出图像中要跟踪物体的大致位置。
对于粒子滤波的初始化过程我们可以假设成为孕育美女的过程,我们既可以像毛泽东所提倡的那样,全国各地各种人物生出一堆子女(这里的子女即是particle)来,不管美丑------在图像中到处放粒子;也可以人为的指定哪几家豪门贵族太子党才可以生子女------在指定的ROI中放粒子;更或者我们采取公投的方式,选出我们心目中真正的美女世家来制造子女------模式识别的方法。这些采样出来的粒子就是对当前后验概率的一种近似。
2. 转移阶段
使用粒子滤波算法来对目标进行跟踪,即是通过前一次的先验概率来估算出当前环境下的后验概率密度,这个过程也是由粒子来完成的。接着上面的例子来解释,那些有资格造小人的夫妻要开始造小人了(本人没有造过,YY一下),众所周知,这些生出来的小孩是不可能完全跟父母完全一样的,不管是长相、身高还是性格,但是他们却保留着父母的大部分基因。粒子也一样,当前粒子的分布不可能跟上一帧时的分布一模一样,但是他们确实应该分布在上一帧位置的大致周围,这个变异过程就叫作转移。
粒子滤波的转移方程[2]跟Kalman滤波的差不多:
上面的是状态转移方程,下面的为观测方程,wk和vk是高斯噪声。但是有个问题希望有研究过研究的师兄们指点:其实在算法的实现中并不是用的这个方程,Kalman滤波也是一样,而是用的1阶或者2阶自回归方程,使用2阶自回归的转移函数代码如下:
particle transition( particle p, int w, int h, gsl_rng* rng )
{
float x, y, s;
particle pn;
/* sample new state using second-order autoregressive dynamics */
x = A1 * ( p.x - p.x0 ) + A2 * ( p.xp - p.x0 ) +
B0 * gsl_ran_gaussian( rng, TRANS_X_STD ) + p.x0;
pn.x = MAX( 0.0, MIN( (float)w - 1.0, x ) );
y = A1 * ( p.y - p.y0 ) + A2 * ( p.yp - p.y0 ) +
B0 * gsl_ran_gaussian( rng, TRANS_Y_STD ) + p.y0;
pn.y = MAX( 0.0, MIN( (float)h - 1.0, y ) );
s = A1 * ( p.s - 1.0 ) + A2 * ( p.sp - 1.0 ) +
B0 * gsl_ran_gaussian( rng, TRANS_S_STD ) + 1.0;
pn.s = MAX( 0.1, s );
pn.xp = p.x;
pn.yp = p.y;
pn.sp = p.s;
pn.x0 = p.x0;
pn.y0 = p.y0;
pn.width = p.width;
pn.height = p.height;
pn.histo = p.histo;
pn.w = 0;
return pn;
}
3. 决策阶段
转移阶段可以理解为父母基因的结合或突变,使得生出来的小孩具有多样性,却又不失相似性。但是生出来的到底是不是美女,这就要求有个决策过程,要砖家们给她打个分。决策的方法根据不同的需求会不同,例如代码中使用距离作为衡量的标准,同时计算出来的相似度或者说分数就是相应粒子的权重。每一个粒子都需要计算其权重,并且需要将其归一化。
4. 重采样阶段
这样就出现了一个问题,如果某对夫妻生的女儿分数不高怎么办?他们的女儿是否会悲剧?现实是残酷的,在资源有限的情况下,如果你们生不出美女那么对不起,就让其他生出美女的家庭来生更多吧,而且是当场再生。
粒子滤波算法会淘汰权值低的粒子,让权值高的粒子来产生出更多的粒子,这就使得算法朝着权值高的地方收敛。假设有200个粒子,1号粒子的权重为0.01而2号粒子的权重为0.004。于是在重采样阶段,1号粒子生孩子的指标是0.01×200=2,2号粒子的指标是0.004×200=0.8,可以发现,1号粒子除了刚产生的粒子外还要再额外的产生一个粒子,而2号粒子就悲剧了,你再没有机会了[3]。如此,最后得到的200个粒子即为所求,然后取个加权平均就得到了目标的状态值。
一个Linux下的C程序和一个VS2008下的C程序分别参见[4][5]。
个人学习总结,如有错误请指出,相互交流,例子举得比较牵强大家能够理解就行,以后会不断完善,enjoy!
参考文献:
[1] http://www.roboticfan.com/article/html/750.shtml.
[2] http://en.wikipedia.org/wiki/Particle_filter.
[3] S. M. Antonio, “Detection and tracking of humans for visual interaction,” PhD Thesis, UK, 2005.http://www.amicilotta.airpost.net/Publications.html.
[4] http://blogs.oregonstate.edu/hess/.
[5] http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html.