粒子滤波算法程序分析

此文转载自http://lgtip.blog.tianya.cn

参考的程序是Rob Hess(http://web.engr.oregonstate.edu/~hess/)实现的粒子滤波经过饮水思源一位博主yangyangcv修改的,地址


http://www.cnblogs.com/yangyangcv/archive/2010/05/23/1742263.html#Bottom2。里面有对粒子滤波通俗的解释还有程序的下载,也可以点击这里全部代码和相关的VS2008工程文件还要下载安装


gsl1.8安装文件。
  
看了程序觉得自己需要考虑的地方不少,稍微列一下


1、随机采样


  在进行粒子的随机采样时,用到一个叫second-order autoregressive dynamics的方法,大概叫动态自回归检验,目前还没搞懂,我自己写的只是用c语言提供的随机数生成器。


我自己使用了c编写的均匀分布采样和高斯分布采样,均匀分布用rand()产生,而高斯分布用两个均匀分布通过以下步骤产生:
step1 生成服从U(0,1)分布的u1,u2;
step2 令 y = [-2*ln(u1)]^0.5*sin(2*pi*u2);
step3 令 x = miu + y*delta,其中miu为均值,delta为标准差
目前来看效果还可以,也跟我每个目标是用100个粒子有关吧。
  
2 是否更新特征


  粒子结构体中有一项叫
  
  histogram* histo; /**< reference histogram describing region being tracked */
  
  是存储目标的特征,这样每个粒子都会存储了自己需要匹配的目标的特征,每次随机采样后都会与这个特征比较相似性。但是这个特征存储后就不再修改了,这是我觉得欠妥的地方,每次用最相似


的粒子或者加权后的估计粒子的特征来更新这一项会不会更好?


好吧,到目前为止,我都是没有更新特征,考虑到有可能跟踪失败,或者跟踪对象出错,保留原始特征其实并不坏。
  
3 目标状态估计


程序没有状态的加权估计,只是把权值最大粒子的用红色框出来,自己尝试加入状态的加权估计。


设想是好的,只是自己都还没有实现,做下去发现,加权估计的结果有很大可能比取最大权值结果差,因为自己选用的粒子多,大部分都是寻找到了无效目标的,加权进去并不能改善结果,而部分寻找


到正确目标但是区域有所差异的粒子对结果的改善很有限,因为我只需要判断出寻找到正确目标和目标的运动状态。选取最大权值的粒子作为新状态足够完成任务。


4 多目标检测


代码有考虑多目标,只是实现时还有问题,多目标的粒子权值应该分开算的吧,重采样也没有考虑多目标。自己做的程序也需要考虑多目标问题,目前还在编码中。


多目标可以很容易的实现,只是添加循环就ok了。目前还在考虑重采样的必要性,因为我目前只做10帧图像里的目标检测,重采样显得多余。


5


程序里怎么保证粒子的区域没有超出图像大小呢?x,y的值保证了,但是width和height的值看不出来哪里进行了判定,如果区域超出,ROI设置时会报错。


回答:只要x,y的值在图像范围内,矩形区域部分超出图像对设置ROI或画矩形是没问题的,因此width和height不用判定,只要判定x,y就可以了




好吧,以上问题就告一段落


回顾


  
  首先回顾一下上篇博文《粒子滤波程序分析》中第1点有关随机采样的想法。当时我不能理解作者估计粒子状态的方法,还自信的使用了均匀分布高斯分布来估计粒子状态。 目前有了新的看法,说明一下。
  
  

作者相关程序及说明


  
  作者的代码
  
  
  /* 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;
  
  y = A1 * ( p.y - p.y0 ) + A2 * ( p.yp - p.y0 ) + B0 * gsl_ran_gaussian( rng, TRANS_Y_STD ) + p.y0;
  
  s = A1 * ( p.s - 1.0 ) + A2 * ( p.sp - 1.0 ) + B0 * gsl_ran_gaussian( rng, TRANS_S_STD ) + 1.0;
  
  A1,A2,B0,TRANS_*_STD都是宏定义,是系数。等号前的x,y,s是对新状态的估计,参数后面带p的表示前一状态的参数,带个0表示初始状态参数,不带的表示当前状态。x,y表示粒子中心位置,s表示粒子缩放比例。于是,可以很清楚看到每次的粒子采样都是与粒子前一状态和初始状态有关,再加上一个高斯噪声的位移。这正是粒子滤波的灵魂,关键所在。
  
  理论公式就是:X( k+1 ) = A*X(k) + B*w(k);
  
  X(k)包含粒子的位置和速度,因此每次估计都是结合粒子前一位置和前一速度,用代码表示的话与上面程序相同或相似。
  
  搞懂了就很简单,直接拿过来用,以前是怀疑有什么用,现在明白重要性了,呵呵。
  
  

重采样


  使用了上面的粒子采样方式,重采样就自然变得必要了。
  
  因为如果不进行重采样的话,所有的粒子会随着自己原来的方向路径越走越远,分散的越来越开,而对目标搜索来说,在大范围里搜索并没有好处,毕竟粒子是有限的,把大量的计算放在没有贡献的粒子上没有好处。
  
  所以重采样就是修正那些贡献很小的粒子,把他们修正为权值大的粒子,也就是在权值大的方向路径上放置更多的粒子来搜索目标,很正确的做法。
  
  

还有个问题


  文献上有说到新的权值估计要用后验概率乘以前一次的权值。对我来说,后验概率就是粒子与目标的相似度,但是我目前的做法都没有把它与前一次的权值相乘,感觉用处不大啊,也许当前我还没看清,呵呵。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值