「粒子滤波算法java」粒子滤波算法及其应用
本篇文章给大家谈谈粒子滤波算法java,以及粒子滤波算法及其应用对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
粒子滤波(CSDN通俗解释)
关于卡尔曼滤波和粒子滤波最直白的解释
卡尔曼滤波本来是控制系统课上学的,当时就没学明白,也蒙混过关了,以为以后也不用再见到它了,可惜没这么容易,后来学计算机视觉和图像处理,发现用它的地方更多了,没办法的时候只好耐心学习和理解了。一直很想把学习的过程记录一下,让大家少走弯路,可惜总也没时间和机会,直到今天。。。
我一直有一个愿望,就是把抽象的理论具体化,用最直白的方式告诉大家--不提一个生涩的词,不写一个数学公式,像讲故事一样先把道理说明白,需要知道细节的同学可以自己去查所有需要知道的一切。因为学习的过程告诉我,最难的其实是最初和这个理论和应用背景亲和的过程--这些理论它究竟是做什么的,又是怎么做到的。可惜我们能看到的关于这些理论的资料大多数都是公式的堆砌并且假定我们明白许多“基本的道理”,其实这些“基本的道理”往往是我们最难想象和超越的。以卡尔曼滤波为例,让我们尝试一种不同的学习方法。
相信所有学习卡尔曼滤波的同学首先接触的都是状态方程和观测方程,学过控制系统的同学可能不陌生,否则,先被那两个看起来好深奥的公式给吓跑了,关键是还不知道他们究竟是干什么的,什么是状态,什么是观测。。。。。。如果再看到后面的一大串递归推导增益,实在很晕很晕,更糟糕的是还没整明白的时候就已经知道卡尔曼滤波其实已经不够使了,需要extended kalmanfilter 和particle filter了。。。
其实我们完全不用理会这些公式。先来看看究竟卡尔曼滤波是做什么的,理解了卡尔曼滤波,下面的就顺其自然了。
用一句最简单的话来说,卡尔曼滤波是来帮助我们做测量的,大家一定不明白测量干嘛搞那么复杂?测量长度拿个尺子比一下,测量温度拿温度表测一下不就完了嘛。的确如此,如果你要测量的东西很容易测准确,没有什么随机干扰,那真的不需要劳驾卡尔曼先生。但在有的时候,我们的测量因为随机干扰,无法准确得到,卡尔曼先生就给我们想了个办法,让我们在干扰为高斯分布的情况下,得到的测量均方误差最小,也就是测量值扰动最小,看起来最平滑。
还是举例子最容易明白。我最近养了只小兔子,忍不住拿小兔子做个例子嘻嘻。
每天给兔子拔草,看她香甜地吃啊吃地,就忍不住关心一下她的体重增长情况。那么我们就以小兔子的体重作为研究对象吧。假定我每周做一次观察,我有两个办法可以知道兔子的体重,一个是拿体重计来称:或许你有办法一下子就称准兔子的体重(兽医通常都有这办法),但现在为了体现卡尔曼先生理论的魅力,我们假定你的称实在很糟糕,误差很大,或者兔子太调皮,不能老实呆着,弹簧秤因为小兔子的晃动会产生很大误差。尽管有误差,那也是一个不可失去的渠道来得到兔子的体重。还有一个途径是根据书本上的资料,和兔子的年龄,我可以估计一下我的小兔子应该会多重,我们把用称称出来的叫观察量,用资料估计出来的叫估计值,无论是观察值还是估计值显然都是有误差的,假定误差是高斯分布。现在问题就来了,按照书本上说我的兔子该3公斤重,称出来却只有2.5公斤,我究竟该信哪个呢?如果称足够准,兔子足够乖,卡尔曼先生就没有用武之地了呵呵,再强调一下是我们的现状是兔兔不够乖,称还很烂呵呵。在这样恶劣的情景下,卡尔曼先生告诉我们一个办法,仍然可以估计出八九不离十的兔兔体重,这个办法其实也很直白,就是加权平均,把称称出来的结果也就是观测值和按照书本经验估算出来的结果也就是估计值分别加一个权值,再做平均。当然这两个权值加起来是等于一的。也就是说如果你有0.7分相信称出来的体重,那么就只有0.3分相信书上的估计。说到这里大家一定更着急了,究竟该有几分相信书上的,有几分相信我自己称的呢?都怪我的称不争气,没法让我百分一百信赖它,还要根据书上的数据来做调整。好在卡尔曼先生也体会到了我们的苦恼,告诉我们一个办法来决定这个权值,这个办法其实也很直白,就是根据以往的表现来做决定,这其实听起来挺公平的,你以前表现好,我就相信你多一点,权值也就给的高一点,以前表现不好,我就相信你少一点,权值自然给的低一点。那么什么是表现好表现不好呢,表现好意思就是测量结果稳定,方差很小,表现不好就是估计值或观测值不稳定,方差很大。想象你用称称你的哦兔子,第一次1公斤第二次10公斤,第三次5公斤,你会相信你的称吗,但是如果第一次3公斤第二次3.2公斤,第三次2.8公斤,自然我就相信它多一点,给它一个大的权值了。
有了这个权值,下面的事情就很好办了。很显然卡尔曼先生是利用多次观察和估计来达到目的的,我们也只能一步一步地调整我们的观察和估计值,来渐渐达到准确的测量,所以整个 算法 是递归的,需要多次重复调整的。调整的过程也很简单,就是把实测值(称出来的体重)和估计值(书上得来的体重)比较一下,如果估计值比测量值小,那就把估计值加上他们之间的偏差作为新的估计值,当然前面要加个系数,就是我们前面说的加权系数,这个地方我要写个公式,因为很简单就能说明白
比如我们的观查值是Z,估计值是X, 那么新的估计值就应该是 Xnew = X + K ( Z-X),从这个公式可以看到,如果X估计小了,那么新的估计值会加上一个量K ( Z-X), 如果估计值大了,大过Z了,那么新的估计值就会减去一个量K ( Z-X),这就保证新的估计值一定比现在的准确,一次一次递归下去就会越来越准却了,当然这里面很有作用的也是这个K,也就是我们前面说的权值,书上都把他叫卡尔曼增益。。。(Xnew = X + K ( Z-X) = X ×(1-K) + KZ ,也就是说估计值X的权值是1-k,而观察值Z的权值是k,究竟k 取多大,全看估计值和观察值以前的表现,也就是他们的方差情况了)
发现把一个问题讲明白还真不是件容易的事情,谁听明白了我佩服谁,因为我已经把自己讲糊涂了哈
顺便就把extended kalman filter和particle filter提一下,因为高斯模型有时不适用,于是有了extended kalman filter,而particle filter是用于多个对象的,比如除了兔子我还有只猫,他们的体重有一个联合概率模型,每一个对象就是一个particle。无论是卡尔曼滤波还是particle滤波,都是概率分布传递的过程,卡尔曼传递的是高斯分布,particle filter 传递的是高斯混合分布,每一个峰代表一个动物在我们的例子。
粒子滤波算法的具体流程是怎样的?
粒子滤波(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.初始化阶段
跟踪区域初始化。在使用粒子滤波算法进行目标跟踪前需要选择要跟踪的目标物体。这个过程可以用人工划定方法和自动识别方法。使用人工的方法可以通过鼠标在图像区域标记出一个感兴趣矩形;使用自动的方法就是利用自动的目标检测技术,初步检测出图像中要跟踪物体的大致位置。以人脸跟踪为例,人工方法就是鼠标划定视频第一帧中人脸的区域;自动方法就是可以使用人脸检测算法检测出人脸的初始位置。
粒子初始化。对于本文人脸检测的示例,粒子就是图像中的矩形区域,主要由矩形中心(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滤波的差不多:
上面的是状态转移方程,下面的为观测方程,wk和vk是高斯噪声。在本文示例中,xk=(x,y,w,h)t。变量x,y,w,h可以依据公式(1)分别更新。在不同的算法中,f采用的函数也不相同。如果xk=xk-1+wk,则状态转移方程其实是随机游走过程;如果xk=Axk-1+wk,状态转移方程则为一阶自回归方程;如果xk=A1xk-1+A2xk-2+wk,则状态转移方程为二阶自回归方程。
3.权重重计算阶段
转移阶段将上一帧中粒子的位置进行了转移,得到当前帧中新的位置。但并不是所有粒子的作用都有用。也就是有些粒子并不是跟踪区域所要所移动的位置。因此,在此阶段,粒子滤波算法将对每个粒子进行打分,将得分较低的粒子删除,将得分多的粒子生成更多的粒子(重采样过程完成)。具体打分的方法根据不同的需求会不同,例如人脸跟踪方法中使用距离作为衡量的标准。将每个粒子与跟踪区域进行相似度计算(在这里,分别提取粒子和跟踪区域的视觉特征进行计算,比如颜色直方图),使用相似度作为相应粒子的权重。每一个粒子都需要计算其权重,并且需要将其归一化。该阶段其实也是后验概率进行更新的过程。
4.重采样阶段
粒子滤波算法会淘汰权值低的粒子,让权值高的粒子来产生出更多的粒子,这就使得算法朝着权值高的地方收敛。假设有100个粒子,1号粒子的权重为0.02而2号粒子的权重为0.003。于是在重采样阶段,1号粒子生孩子的指标是0.02×100=2,2号粒子的指标是0.003×100=0.3,可以发现,1号粒子除了刚产生的粒子外还要再额外的产生一个粒子,而2号粒子就被铲除了。如此,最后得到的100个粒子即为所求,然后取个加权平均就得到了目标的状态值。
救命啊!!关于改进粒子滤波算法问题
粒子滤波算法的核心思想是:为了求解数学或物理等方面的问题,首先建立一个概率模型或者随机过程,使它的参数等于问题的解;然后通过对模型或过程的观察或采样试验计算所求参数的统计特征;最后给出所求解的近似值。
下面详细介绍粒子滤波的基本思想。
粒子滤波就是用完全描述后验概率密度分布
这里,x0:k={xj,j=0,…,k},z0:k={zj,j=0,…,k},分别表示各个时刻的系统状态和观测状态,表示j时刻所对应的粒子的归一化权值,即
直接从后验概率p(x0:k|z1:k)中进行取样是比较困难的。假设存在π(x),有并且可以很方便地从π(x)中进行取样,这样的π(x)称作重要性密度。根据贝叶斯理论有:
这样,就能很容易对系统状态进行估计,权值的递推方程可以写成:
在k时刻的后验概率密度可以近似地写成:
1.2 粒子滤波算法改进策略
传统的粒子滤波算法需要使用状态转移后的所有粒子进行系统观测和重采样。这使得计算量很大,而且增加了错误信息,甚至会导致跟踪目标漂移。鉴于此,笔者对传统的粒子滤波进行了一系列的改进。在对系统观测过程进行改进时,只选取局部最优粒子(即权值较大的粒子)进行状态转移;在重采样环节,也使用了这种局部最优原理,只选取部分大权值粒子。改进的粒子滤波算法,能够在很大程度上解决上述问题。
图1描述的是状态转移环节,当前时刻所有粒子对应的位置服从均匀分布。图中“○”表示跟踪目标在该时刻的真实位置,黑点表示该时刻的粒子,黑点的大小代表粒子权值的大小。
由图发现,离“○”越近的粒子权值越大,超出1/2粒子传播半径的粒子,权值可忽略。根据这种先验知识,基于局部最优化原理选取部分粒子。当利用粒子进行系统观测时,将粒子按权值大小依次排序,只需选取半数大权值粒子,就能很准确地计算出最优估计的位置。这种改进策略可使该环节的计算量减少40%。由于忽略了远处的粒子,剔除了部分错误信息,因此跟踪精度也得到了提高。
粒子重采样环节的改进是分裂粒子时只选取上述的半数大权值粒子。改进的重采样具体实现过程如下:将系统观测过程中使用的粒子,按大小排序均分为两组。权值大的一组,每个粒子分裂为三个新的粒子;权值较小的一组,每个粒子只生成一个新粒子。这样做不但简化了计算,提高了运行速度,而且增强了重采样粒子的有效性。
该改进算法的优点:(1)使得后验分布样本更加接近真实分布;(2)大大减少了计算量。多次实验表明,改进算法在人体运动跟踪时较传统算法效果更好,鲁棒性更高。
2 基于改进粒子滤波算法的人体运动跟踪
视频中的特定人体有其独特的运动特征,且其关节运动都是非刚性的。为使运动模型在运动预测中有更好的适用性和更高的准确性,依据统计分析的成果,采用一阶自回归过程ARP(Auto-Regressive Process)动力学模型作为运动模型,并通过训练序列计算出该模型的参数。在模板区域相似性计算的基础上,通过粒子滤波实现人体运动的跟踪。基于这一基本思路,本文提出基于粒子滤波的人体运动跟踪的流程图,如图2所示。
2.1 初始化
跟踪初始化,就是按运动模型的要求,在初始帧形成表示各自分布模型的粒子集。具体过程如下:在被跟踪序列的初始帧中手动提取目标模板,将它作为起始帧的状态向量。提取目标的初始运动参数在状态向量的各分量上加正态随机噪声,构造N个状态向量,即粒子数为N,每个粒子代表一个可能的运动状态。若初始的权值ωi为1,则具有N个运动状态参数这里Pi选择Pinit附近的点。
2.2 采样
采样就是从表示先验模型的状态向量集中按概率选取其中的若干向量。一次采样选取一个状态向量,进行N次这样的采样,得到N个新的状态向量。显然,权值太小的状态向量(即粒子)在采样过程中被选中的概率就小,而且在逐步迭代中可能被丢掉;权值大的粒子被选中的概率就比较大,也可能被多次选中。这样,采样得到的新的粒子集能更好地估计概率分布。
2.3 状态转移
系统状态转移,即粒子的传播过程。从采样得到的新的粒子集出发,经运动模型计算得到预测模型。粒子传播是一种随机运动过程,服从一阶ARP方程。
式中,xt为目标在t时刻的状态,wt-1是归一化噪声量,A和B是常数。这里,t时刻系统的状态转移过程与当前时刻的观测量无关。
粒子Ni的运动状态参量为:
式中,A1、A2、B1、B2为常数,一般A取1,B为粒子传播半径(系统状态转移过程中,粒子所能够传播的范围),W是[-1,1]内的随机数。系统状态转移的实质就是在坐标上迭加一个扰动量。
这一步是先验概率的传播过程,即“假设”目标状态将以何种方式传播。粒子传播是否合理需要通过下一阶段即系统观测进行验证。
2.4 系统观测
系统观测过程就是将当前预测模型中的每一个状态向量所对应的外观模型与由其确定的当前帧图像中的对应区域进行相似性计算,并给每一个状态向量赋一个权值。
每个粒子状态转移后,用对应新坐标计算一个MADi。
定义概率密度函数为:
它作为当前帧的跟踪结果输出。
2.5 重采样
按上述采样、转移和观测过程完成当前帧的跟踪计算后,对当前帧的后验模型进行同样的采样,得到下一帧的先验模型。进而可以对下一帧进行新的预测和观测,继续后续序列的跟踪计算,直至最后一帧,完成跟踪过程。
3 实验仿真和分析
3.1 仿真结果
如何用c语言编写跟踪程序~~以往是用粒子滤波算法跟踪
Python break语句,就像在C语言中,打破了最小封闭for或while循环。
break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。
break语句用在while和for循环中。
如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。
粒子滤波算法java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于粒子滤波算法及其应用、粒子滤波算法java的信息别忘了在本站进行查找喔。