4

粒子滤波在图像跟踪领域的实践

 3 years ago
source link: https://mp.weixin.qq.com/s/Xs8mqiZ92BL26asZu4XCog
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

T002R90x90M000002FfjbW0A0AkH.jpg

前言

    前两天在GitChat上总结了自己当初研究粒子滤波跟踪时的一些经验与总结:http://gitbook.cn/gitchat/activity/5abf7d5d3deaad78002799ee。 此处对部分章节略有删改,整理如下。

粒子滤波与卡尔曼滤波的介绍

卡尔曼滤波

    卡尔曼滤波可以根据一些已知的量来预测未知的量,这些量受到干扰必须得近似高斯噪声。这个东西可以用来干什么呢?例如我们可以用来预测明天,后天,未来好几天的温度。我们可以在前几天用温度计记录下一系列的温度数据作为我们未来预测的参考数据之一,然后我们根据一年四季的温度变化作为参考数据之二,我们给这两个参考数据各加一个权重综合起来预测未来的温度。如果前几天记录下来的数据与真实温度很切合(毕竟温度计也是有误差),我们就把它的权重加大。用这个方法卡尔曼先生对近期未来的数据预测还是很精确的,只要我们的数据只收到高斯噪声的干扰。

    关于 kalman 滤波器详细的推导过程,如果有兴趣者,可以参考以下一篇论文,这篇论文中对 kalman 滤波器的推导过程做了详细地推导说明。参考论文:《Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation》 可以到我的网盘中直接下载阅读。链接:https://pan.baidu.com/share/init?surl=w9w7pOha4YxD7MijSzezQw 密码:8k07

粒子滤波

    粒子滤波算法源于蒙特卡罗思想,即以某事件出现的频率来指代该事件的概率。通俗地讲,粒子滤波也是能用已知的一些数据预测未来的数据,但是粒子滤波可以不限于高斯噪声,原理上粒子滤波可以驾驭所有的非线性、非高斯系统。粒子滤波还广泛运用于各种军事领域。

  举个例子,假设美帝的爱国者防空导弹里面的程序用的是粒子滤波。三胖某天闲来无事射个导弹出去玩玩,导弹在刚出朝鲜领土时便被美帝的卫星间谍发现,卫星间谍神情高度紧张,它的程序虚拟出来一块包含朝鲜与美国的巨大立体三维空间,在这个空间中加入地球大气阻力系数,地心引力等等参数。然后顺手撒了一把沙子,并给这些沙子赋予初始动量,和模拟导弹质量与外观的系数。这些沙子开始在空间中从朝鲜向着美帝飞去,刚刚进入太平洋的时候,位于夏威夷军事基地上的爱国者导弹发射了,它朝着太平洋中心飞去,因为程序中的那一大堆沙子构成的轨迹最多最粗的那一根 10 分钟后要经过太平洋中心的一个点。10 分钟后 2 个导弹在太平洋中心相遇了,粒子滤波成功预测了导弹的轨迹。

  在粒子滤波过程中,X(t) 实际上是通过对大量粒子的状态进行处理得到的。编写粒子滤波代码的五个步骤如下:
1.初始状态:用大量粒子模拟 X(t), 粒子在空间内均匀分布;
2.预测阶段:根据状态转移方程,每一个粒子得到一个预测粒子;
3.校正阶段:对预测粒子进行评价,越接近于真实状态的粒子,其权重越大;
4.重采样:根据粒子权重对粒子进行筛选,筛选过程中,既要大量保留权重大的粒子,又要有一小部分权重小的粒子;
5.滤波:将重采样后的粒子带入状态转移方程得到新的预测粒子,即步骤 2。

   关于 Particle Filter 详细的推导过程,如果有兴趣者,可以参考以下一篇论文,这篇论文中对粒子滤波的推导过程做了详细地推导说明。参考论文:《Contour Tracking by Stochastic Propagation of Conditional Density 》 可以到我的网盘中直接下载阅读。

链接:https://pan.baidu.com/s/1UtmNpI54lWS-glEBKcQ_AQ  密码:dp2z。

   当然,对于卡尔曼滤波以及粒子滤波的函数已经封装好了,后面对比实验中我会提供代码。

粒子滤波与卡尔曼滤波跟踪对比实验

  在运动跟踪领域,粒子滤波和卡尔曼滤波的重要性不再赘述,都是贝叶斯滤波的不同表述和推广。

640?wx_fmt=jpeg

.1 对比实验流程图

640?wx_fmt=png

1.2 编码标志点做近似圆周运动(非线性)

   本节设计两组对比实验,目的是通过实际实验来对比粒子滤波和卡尔曼滤波在跟踪非线性、非高斯状态下运动物体的优劣,从而选择跟踪精度更高的方法将其应用于立体视觉动态测量系统,提高程序的运行速度。此处的目标点是编码标志点(如果不理解编码标志点具体是什么,也不影响后续文章的阅读。它仅仅是对我们的运动点有个数值标记而已,编码标志点的中心坐标即为我们的跟踪对象)对比实验的流程图归纳如图 1.1 所示。

(一)第一组实验
   选择一个编码标志点,将其固联于一个长条状的砧板上,不失一般性,此处手持着砧板使编码标志点做近似匀速圆周运动,如图 1.2 所示,其运动轨迹三维显示如图 1.3 所示。按照图 1.1 所示的流程图步骤,绘制出卡尔曼滤波与粒子滤波预估编码标志点坐标位置与真实运动轨迹的误差情况统计如图 1.4 所示。图中红色虚线代表粒子滤波,蓝色虚线代表卡尔曼滤波。

640?wx_fmt=png

图1.3 编码标志点做圆周运动的轨迹示意图

640?wx_fmt=png

图1.4 粒子滤波与卡尔曼滤波跟踪做圆周运动的编码标志点

(二)第二组实验
   选择一个设计好的编码标志点,手持着编码标志点在相机视场范围内做任意非线性无规则运动,实验中编码标志点的运动轨迹示意图如图 1.5 所示。依据图 1.1 所示的流程图步骤,绘制出卡尔曼滤波与粒子滤波预估编码标志点坐标位置与真实坐标的误差情况统计如图 1.6 所示。

   从上述两组实验结果可以发现,红色线条总是处于蓝色线条下方,由此可知,粒子滤波对于非线性运动的编码标志点跟踪精度更高,稳健性更好。

640?wx_fmt=png

图1.5 编码标志点做非线性无规则运动的示意图

640?wx_fmt=png

图1.6 跟踪非线性无规则运动的编码标志点示意图

  粒子滤波和卡尔曼滤波的测试代码已经上传至Github上,粒子滤波测试代码:https://github.com/QiYongBETTER/Particle_Filter,卡尔曼滤波测试代码:https://github.com/QiYongBETTER/Kalman-Filter。

  测试图片及统计数据上传至了百度云网盘:测试图片及统计数据:链接:https://pan.baidu.com/s/1xk7tAijbmzRDTcxUNOld7Q 密码:9q79
  如若您需要成功运行上述的两组实验代码,仅仅需要将项目工程中的属性表「OpenCVDebug64.pros」以及「OpenCVRelease64.props」替换您根据文章第一部分配置好的 opencv 属性表即可。

粒子滤波在图像跟踪领域的应用

  在图像跟踪领域,有时候如果对于高分辨率拍摄的图像都进行全局检测,将导致整个程序运行过慢,而不能做到实时处理,达不到工业要求。因而,需要利用粒子滤波来对目标点下一帧中出现的位置进行预估,从而准确地缩小感兴趣区域(ROI)来进行检测。此处以使用相机跟踪多个编码标志点为例。

640?wx_fmt=png

图1.7 编码标志点在相机中的成像示意图

640?wx_fmt=png

图1.8 利用粒子滤波跟踪编码标志点

640?wx_fmt=png

图1.9 图 3.9 缩小 ROI,局部检测示意图

  使用粒子滤波跟踪编码标志点的流程图,可归纳总结如图 1.8 所示。根据图 1.8 所示,原先图 1.7 中的编码标志点将不再需要每张图都进行全局检测,而是缩小了 ROI 进行检测,大大提高了程序运行速度,如图 1.9 所示。

小结

  上文主要是对粒子滤波与卡尔曼滤波原理进行了简单阐述,重点对粒子滤波与卡尔曼滤波的跟踪性能进行了对比实验,并以案例形式分析了粒子滤波在图像领域的应用。

  前几天无意中发现自己曾经写过的一篇文章被CSDN平台收录并公开发表:那些精贵的文献资源下载经验总结:https://mp.weixin.qq.com/s/I2Sr1QL-jiNoAKzvs-jzbQ,很多人留了言,表示受益很多,对我而言喜悦之前溢于言表。真诚地希望可以和大家一起学习,互相进步。

640?wx_fmt=jpeg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK