您的位置:首页 > 理论基础

【计算机视觉】基于Kalman滤波器的进行物体的跟踪

2014-10-28 11:26 375 查看


预估器

我们希望可以最大限度地使用测量结果来估计移动物体的运动。所以,多个测量的累积可以让我们检测出不受噪声影响的部分观测轨迹。一个关键的附加要素即此移动物体运动的模型。有了这个模型,我们不仅可以知道该移动物体在什么位置,同时还可以知道我们观察支持模型的什么参数。

该任务分为两个阶段。在第一阶段,即预测阶段,用从过去得到的信息进一步修正模型以取得人或物体的下一个将对出现的位置。在第二阶段,即校正阶段,我们获得一个测量,然后与基于前一次测量的预测值(即模型)进行调整。完成两个阶段估计任务的方法可以成为预估器。


关于Kalman滤波的通俗解释

在介绍Kalman滤波器原理之前,先从一个通俗的例子中了解一下该算法的功能和作用,以便更好的理解它。以下是摘自网上的一段资料。

假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的,也就是下一分钟的温度等于现在这一分钟的温度(假设我们用一分钟来做时间单位)。假设你对你的经验不是100%的相信,可能会有上下偏差几度。我们把这些偏差看成是高斯白噪声(White Gaussian Noise),也就是这些偏差跟前后时间是没有关系的而且符合高斯分布(Gaussian Distribution)。另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。

好了,现在对于某一分钟我们有两个有关于该房间的温度值:你根据经验的预测值(系统的预测值)和温度计的值(测量值)。下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。

假如我们要估算k时刻的实际温度值。首先你要根据k-1时刻的温度值,来预测k时刻的温度。因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5)。然后,你从温度计那里得到了k时刻的温度值,假设是25度,同时该值的偏差是4度。

由于我们用于估算k时刻的实际温度有两个温度值,分别是23度和25度。究竟实际温度是多少呢?相信自己还是相信温度计呢?究竟相信谁多一点,我们可以用他们的covariance来判断。因为Kg=5^2/(5^2+4^2),所以Kg=0.61,我们可以估算出k时刻的实际温度值是:23+0.61(25-23)=24.22度。可以看出,因为温度计的covariance比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值

现在我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。到现在为止,好像还没看到什么自回归的东西出现。对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.22度)的偏差。算法如下:((1-Kg)5^2)^0.5=3.12。这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的3.12就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(对应于上面的3)。

就是这样,卡尔曼滤波器就不断的把covariance递归,从而估算出最优的温度值。他运行的很快,而且它只保留了上一时刻的covariance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!


Kalman滤波器简介

Kalman(卡尔曼)滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态。Kalman滤波的一个典型实例是从一组有限的,包含噪声的,对物体位置的观察序列(可能有偏差)预测出物体的位置的坐标及速度。

Kalman滤波器的基本思想是,若有一组强而合理(合理的意思是“限制非常宽松使得这种方法对真实世界中出现的相当多的实际问题都有用”)的假设,给出系统的历史测量值,则可以建立最大化这些早前测量值的后验概率的系统状态模型。

另外,无需存储很长的早前测量历史,我们也可以最大化后验概率,即重复更新系统状态模型,并只为下一次更新保存模型。


应用实例

一个简单的应用是估计物体的位置和速度;简要描述如下:假设我们可以获取一个物体的包含噪声的一系列位置观测数据,我们可以获得此物体的精确速度和位置连续更新信息。

例如,对于雷达来说,我们关心的是跟踪目标,而目标的位置,速度,加速度的测量值是时刻含有误差的,卡尔曼滤波器利用目标的动态信息,去掉噪声影响,获取目标此刻好的位置估计(滤波),将来位置估计(预测),也可以是过去位置估计的(插值或平滑)。


三个重要假设

Kalman滤波器需要三个重要假设:

被建模的系统是线性的
影响测量的噪声属于白噪声
噪声本质上是高斯分布的

第一条假设的意思是k时刻的系统状态可以用某个矩阵与k-1时刻的系统状态的乘积表示。余下两条假设,即假设噪声是高斯分布的白噪声,其含义为噪声与时间不相关,且只用均值和协方差(噪声完全由一阶矩和二阶矩描述)就可以准确地为幅值建模。

给定三条假设,Kalman滤波器是将从不同来源获取的数据或从统一来源不同时间获得的数据结合的最好的方法。从我们知道的信息开始,获取新的信息,然后根据对旧信息和新信息的确定程度,用新旧信息带权重的结合对我们知道的信息进行更新。


Kalman滤波器的数学知识


基本动态模型

卡尔曼滤波建立在线性代数和隐马尔可夫模型(hidden Markov model)上。其基本动态系统可以用一个马尔可夫链(Markov Chain)表示,该马尔可夫链建立在一个被高斯噪声(即正态分布的噪声)干扰的线性算子上的。系统的状态可以用一个元素为实数的向量表示。 随着离散时间的每一个增加,这个线性算子就会作用在当前状态上,产生一个新的状态,并也会带入一些噪声,同时系统的一些已知的控制器的控制信息也会被加入。同时,另一个受噪声干扰的线性算子产生出这些隐含状态的可见输出。

Kalman 滤波可以被看作为类似隐马尔科夫模型,它们的显著不同点在于:隐状态变量的取值空间是一个连续的空间,而离散状态空间则不是;另为,隐马尔科夫模型可以描述下一个状态的一个任意分布,这也与应用于Kalman滤波器中的高斯噪声模型相反。

为了从一系列的噪声观测中,应用Kalman滤波估计观测过程的内部状态。我们必须把这个过程在Kalman滤波器的框架下建立模型, 这就意味着,对于每一步k 我们要定义:

假设Kalman滤波器的k时刻的真实状态时从k-1时刻眼花而来,

满足X[k] = F[k]x[k-1]+B[k]u[k]+w[k]

F[k]是作用在前一状态的状态转移模型(状态转移矩阵)
B[k]是作用在控制向量u[k]上的控制输入模型(输入输出矩阵),u[k]的作用是允许外部控制施加于系统
w[k]是过程噪声,假设是均值为0的白噪声,协方差为Q[k],则w[k] ~ N(0,Q[k])

在k时刻,假设真实状态x[k]的观测,

Z[k]满足公式Z[k] = H[k]x[k]+v[k]

H[k]是观测模型(观测矩阵),它把真实状态映射到观测空间
v[k]是观测噪声,假设它是均值是0,方差是R[k]的高斯白噪声,v[k] ~ N(0,R[k])

模型图:



动态系统模型

Kalman Filter基本动态系统模型如上图所示,其中,圆圈代表向量,方块代表矩阵,星号代表高斯噪声,其协方差在右下方标出。

初始状态以及每一时刻的噪声向量{x0, w1, ..., wk, v1 ... vk} 都为认为是互相独立的。
实际中,真实世界中动态系统并不是严格的符合此模型,但是Kalman模型是设计在噪声过程工作的,一个近似的符合已经可以使这个滤波器非常有用。



Kalman模型


三种运动

在Kalman滤波器应用中,我们将考虑三种运动。

动态运动

这种运动时我们期望的前次测量时系统状态的直接结果。

控制运动

这种运动是我们期望的,由于某种已知的外部因素以某种原因施加于系统。控制运动最普遍的一个例子是,当对我们施加了控制的系统估计其状态时,我们知道我们的控制会使系统产生什么样的运行。

随机运动

即便是最简单的一维情况,如果观测的目标有因任一原因而产生运动的可能性,那么就需要在预测阶段包含这种随机运动。这种随机运动影响的是简单地增加状态估计随时间的协方差。


公式

Kalman滤波器是一个递归的估计,即只要获知上一时刻的状态估计和当前状态的观测就可以计算出当前状态的估计,不同于其他的估计技术,Kalman滤波器不需要观测或/和估计的历史记录,Kalman滤波器是一个纯粹的时域滤波器,而不像低通滤波器等频域滤波器那样,需要在频域中设计,然后转换到时域中应用。



Kalman变量

Kalman 滤波包括两个阶段:预测和更新;在估计阶段,滤波器应用上一状态的估计做出对当前状态的估计。在更新阶段,滤波器利用在当前状态的观测值优化预测阶段的预测值,以获的一个更精确的当前状态的估计。


预测



预测公式


更新



更新公式


基本概念图示



Kalman基本概念


使用OpenCV中Kalman编程的主要步骤


步骤一

Kalman这个类需要初始化变量

转移矩阵,测量矩阵,控制向量(没有的话,就是0),过程噪声协方差矩阵,测量噪声协方差矩阵,后验错误协方差矩阵,前一状态校正后的值,当前观察值。
void KalmanFilter::init(int dynamParams, int measureParams, int controlParams=0, int type=CV_32F)

//Parameters:    
//dynamParams – Dimensionality of the state.
//measureParams – Dimensionality of the measurement.
//controlParams – Dimensionality of the control vector.
//type – Type of the created matrices that should be CV_32F or CV_64F.


步骤二

调用kalman这个类的predict方法得到状态的预测值矩阵

预测状态的计算公式如下:

predicted state (x'(k)): x'(k)=A x(k-1)+B u(k)

其中x(k-1)为前一状态的校正值,第一个循环中在初始化过程中已经给定了,后面的循环中Kalman这个类内部会计算。A,B,u(k),也都是给定了的值。这样进过计算就得到了系统状态的预测值x'(k)了。
const Mat& KalmanFilter::predict(const Mat& control=Mat())

//Parameters:    control – The optional input control


步骤三:

调用kalman这个类的correct方法得到加入观察值校正后的状态变量值矩阵

其公式为:

corrected state (x(k)): x(k)=x'(k)+K(k) (z(k)-H x'(k))

其中x'(k)为步骤二算出的结果,z(k)为当前测量值,是我们外部测量后输入的向量。H为Kalman类初始化给定的测量矩阵。K(k)为Kalman增益,其计算公式为:

Kalman gain matrix (K(k)): K(k)=P'(k) Ht inv(H P'(k) Ht+R)

计算该增益所依赖的变量要么初始化中给定,要么在kalman理论中通过其它公式可以计算。
const Mat& KalmanFilter::correct(const Mat& measurement)

//Parameters:    measurement – The measured system parameters


经过步骤三后,我们又重新获得了这一时刻的校正值,后面就不断循环步骤二和步骤三即可完成Kalman滤波过程。


参考资料

1、学习OpenCV 中文版

2、学习OpenCV——Kalman滤波

转载请注明作者Jason Ding及其出处

Github主页(http://jasonding1354.github.io/)

CSDN博客(http://blog.csdn.net/jasonding1354)

简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: