粒子滤波(PF: Particle Filter)算法起源于20世纪50年代Poor Man's Monte Carlo问题的研究,但第一个具有应用性的粒子滤波算法于1993年由Gordon等提出(“A novel Approach to nonlinear/non-Gaussian Bayesian State estimation”)。它是利用粒子集来表示概率,可以用在任何形式的状态空间模型上。其核心思想是通过从后验概率中抽取的随机状态粒子来表示其分布情况,是一种顺序重要性采样法(Sequential Importance Sampling)。
粒子滤波的应用非常广泛,尤其是在目标跟踪(“A probabilistic framework for matching temporal trajectories”)等视觉任务方面。粒子滤波算法有许多不同的改进方式。针对不同的问题,PF算法被改造以适应更好的问题。本文主要侧重于目标跟踪方面的应用。以人脸跟踪为例,下图展示了粒子滤波的跟踪结果。下面介绍下粒子滤波的基本过程:初始化、概率转移、权重重计算和重采样四个阶段。
图1 人脸跟踪
1.初始化阶段
跟踪区域初始化。在使用粒子滤波算法进行目标跟踪前需要选择要跟踪的目标物体。这个过程可以用人工划定方法和自动识别方法。使用人工的方法可以通过鼠标在图像区域标记出一个感兴趣矩形;使用自动的方法就是利用自动的目标检测技术,初步检测出图像中要跟踪物体的大致位置。以人脸跟踪为例,人工方法就是鼠标划定视频第一帧中人脸的区域;自动方法就是可以使用人脸检测算法检测出人脸的初始位置。
粒子初始化。对于本文人脸检测的示例,粒子就是图像中的矩形区域,主要由矩形中心(x,y)和宽高(w,h)四个变量表示。粒子初始化的步骤,就是在图像中选择指定数量的粒子(矩形),比如N=100个粒子。粒子初始化过程就是在图像中随机或指定方式放粒子。比如说,我们可以指定100个粒子初始状态和跟踪区域一致,即粒子参数和跟踪区域的(x,y,w,h)相等。
2.状态转移阶段
使用粒子滤波算法来对目标进行跟踪,即是通过前一次的先验概率来估算出当前环境下的后验概率密度,这个过程也是由粒子来完成的。具体来说,即根据上一帧中粒子的状态(x,y,w,h)t-1,来估计出本帧中各个粒子的状态(x,y,w,h)t。从上一帧图像的粒子状态转变为当前帧粒子的状态,这个变异过程就叫作转移(transmission)。粒子滤波的转移方程跟Kalman滤波的差不多:
(1)
上面的是状态转移方程,下面的为观测方程, wk 和 vk 是高斯噪声。在本文示例中, x k = ( x,y,w,h ) t 。变量 x , y , w , h 可以依据公式(1)分别更新。在不同的算法中, f 采用的函数也不相同。如果 xk=xk-1+wk , 则状态转移方程其实是随机游走过程; 如果 xk=A x k-1 +w k ,状态转移方程则为一阶自回归方程;如果 xk=A 1 x k-1 +A2xk-2+w k , 则状态转移方程为二阶自回归方程。
3.权重重计算阶段
转移阶段将上一帧中粒子的位置进行了转移,得到当前帧中新的位置。但并不是所有粒子的作用都有用。也就是有些粒子并不是跟踪区域所要所移动的位置。因此,在此阶段,粒子滤波算法将对每个粒子进行打分,将得分较低的粒子删除,将得分多的粒子生成更多的粒子(重采样过程完成)。具体打分的方法根据不同的需求会不同,例如人脸跟踪方法中使用距离作为衡量的标准。将每个粒子与跟踪区域进行相似度计算(在这里,分别提取粒子和跟踪区域的视觉特征进行计算,比如颜色直方图),使用相似度作为相应粒子的权重。每一个粒子都需要计算其权重,并且需要将其归一化。该阶段其实也是后验概率进行更新的过程。
4.重采样阶段
粒子滤波算法会淘汰权值低的粒子,让权值高的粒子来产生出更多的粒子,这就使得算法朝着权值高的地方收敛。假设有100个粒子,1号粒子的权重为0.02而2号粒子的权重为0.003。于是在重采样阶段,1号粒子生孩子的指标是0.02×100=2,2号粒子的指标是0.003×100=0.3,可以发现,1号粒子除了刚产生的粒子外还要再额外的产生一个粒子,而2号粒子就被铲除了。如此,最后得到的100个粒子即为所求,然后取个加权平均就得到了目标的状态值。
参考:
1. http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html