上一篇博文已经讲了贝叶斯滤波的原理以及公式的推导:
本篇文章将从贝叶斯滤波引入到粒子滤波,讲诉粒子滤波的原理。
前面我们已经提到,将跟踪目标的运动看作是一个动态系统。系统的状态以目标的状态来表示。这里,不妨将跟踪目标的中心位置作为系统状态 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的可能性非常小,因此取得的权值非常小。只是根据粒子传播来改变粒子的状态的话,偏离的粒子永远是偏离的,很难再回到目标周围。这样的话,偏离的粒子可能越积越多。这就是所谓的粒子退化现象。退化了得粒子(权值小)作用就不大了,甚至说根本没用啊!浪费了各种资源,对状态估计又不做贡献。因此我们需要对粒子进行重采样。最简单的方式是剔除掉权值小的粒子(也就是退化了的粒子),然后将权值大的再复制几个呗。多简单粗暴啊,哈哈哈!
以上便是粒子滤波的目标跟踪流程了!如果还有什么问题,或者我写的不好的地方,欢迎各位看官各种抨击。