上一篇博文已经讲了贝叶斯滤波的原理以及公式的推导:http://www.cnblogs.com/JunhaoWu/p/bayes_filter.html

  本篇文章将从贝叶斯滤波引入到粒子滤波,讲诉粒子滤波的原理。

  前面我们已经提到,将跟踪目标的运动看作是一个动态系统。系统的状态以目标的状态来表示。这里,不妨将跟踪目标的中心位置作为系统状态 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的可能性非常小,因此取得的权值非常小。只是根据粒子传播来改变粒子的状态的话,偏离的粒子永远是偏离的,很难再回到目标周围。这样的话,偏离的粒子可能越积越多。这就是所谓的粒子退化现象。退化了得粒子(权值小)作用就不大了,甚至说根本没用啊!浪费了各种资源,对状态估计又不做贡献。因此我们需要对粒子进行重采样。最简单的方式是剔除掉权值小的粒子(也就是退化了的粒子),然后将权值大的再复制几个呗。多简单粗暴啊,哈哈哈!

  以上便是粒子滤波的目标跟踪流程了!如果还有什么问题,或者我写的不好的地方,欢迎各位看官各种抨击。

最新文章

  1. 项目游戏开发日记 No.0x000005
  2. 发布一个java Servlet (静态发布)
  3. linux共享库
  4. C# 加载xml文档文件及加载xml字符串
  5. spark mllib k-means算法实现
  6. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析
  7. AFNetworking上传文件
  8. eclipse配置mahout
  9. C#基础练习(时间的三连击)
  10. Android 内核初识(7)RefBase、LightRefBase、sp和wp
  11. shell监控网卡流量
  12. 【fail2ban】使用fail2ban进行攻击防范
  13. 记React+.NetCore API实现动态列导出
  14. fatal error LNK1120: 11 unresolved externals
  15. Java Design Pattern(Factory,Singleton,Prototype,Proxy)
  16. JavaFX(Maven 方式)
  17. MVC应用程序播放FLV视频,部分视图可多地方重复引用
  18. Google V8 引擎 原理详解
  19. asp.net mvc 上传图片 摘自mvc 高级编程第311页
  20. ECharts 柱状图顶部显示百分比

热门文章

  1. mariadb 10.2.3支持延时复制
  2. java必备基础知识点
  3. 纯HTML5+CSS3制作生日蛋糕
  4. arcgis server10.2.2的安装步骤过程
  5. GitHub 实现多人协同提交代码并且权限分组管理
  6. MySQL 使用XtraBackup的shell脚本介绍
  7. [转载]Linux 线程实现机制分析
  8. Microsoft SQL Server 2005 Service fails to start
  9. [AlwaysOn Availability Groups]排查:AG超过RTO
  10. 【转】hive导入数据出现NULL