关注公众号,发现CV技术之美
最近业余在研究物体追踪,看到传统的方法用到了卡尔曼滤波(Kalman Filter)+匈牙利算法做轨迹匹配,因而开始研究这两种算法是如何实现的。这里简单总结一下卡尔曼滤波算法探索的过程。
▊ 卡尔曼滤波的背景
卡尔曼滤波常用于动态多变化系统中的状态估计,是一种通用性强的自回归滤波器。它的由来和NASA登月有关。其发明者鲁道夫.E.卡尔曼在一次访问NASA的时候,发现阿波罗计划中一个难点是轨道预测问题,因而提出了一种滤波器,可以帮助高效预测轨迹,辅助导航。NASA最终使用了这个滤波器,然后成功实现人类第一次登月计划。卡尔曼滤波器由此得名。
卡尔曼滤波器可以用来估计不确定信息,并给出状态量下一时刻的情况。即便在有噪声干扰的情况下,也可以较好的预测下一状态的情况,并找出多变量间不易察觉的相关性。因而卡尔曼滤波器可以很好适应不断变化的系统,并且内存占用量低,推理速度快,比较适合资源受限制的场景。
▊ 卡尔曼滤波介绍
先来看一个简单的问题。考虑一辆车在道路上行驶,他的状态和运行速度,位置信息相关,用向量表示为:
其中 p 变量对应位置 v 变量对应速度,都为随机变量且符合正态分布,每个分布都有一个均值(正太分布的中心)和对应的方差 .(衡量变量的不确定性)。
那么卡尔曼滤波是怎么工作的呢?我们还是回到刚才的例子。上面例子中的这两个变量看起来没有明显的对应关系,也就是说,给定速度,没法准确定出位置。
但是如果我们知道位置和速度的初始信息,其实是有办法将两个变量联系起来的。假设车辆一直保持匀速行驶,通过下面的公式其实就可以(要注意的是,换成其他问题,我们不一定能意识到这个公式的存在)
基于上面的公式,我们可以直观的定义当前时刻和上一时刻之间的对应关系;假定系统中所有状态量为,对应的有
这里我们称为预测矩阵,也会用表示,预测矩阵的目的是刻画从上一状态到当前状态对应的关系。
这也就是卡尔曼滤波的目标。我们希望从不确定的系统中,尽可能的发掘出确定的信息。那么另一个问题是,如何知道有多少确定(不确定)的信息可以发掘呢?我们需要一个指标来衡量系统的不确定性。
回到上个例子中,位置和速度的关系其实是不确定的,但是却是有相关性的,只是不能直观的看出来。那么如何衡量这种相关性呢?其中一个办法就是使用协方差矩阵,来衡量两个变量的相关程度。给定,对应的协方差矩阵p为
考虑到预测矩阵的影响,给定上一时刻的,对应可以更新为
由此便解决了理想情况下卡尔曼滤波如何做预测的问题。但是实际情况下,系统中可能还是存在干扰或者噪声因素。比如车辆行驶过程中,遇到雨天路滑则需要减速慢行,这种情况下道路状况会作为外部因素,干扰系统行为和决策。因为针对变化量,会额外追加一个控制变量来建模外部因素。
假设行车遇到雨天需要减速,我们考虑了运动时刻的车辆加速度a为外部影响,那么有,
对比之前计算状态的关系式,可以发现新引入的状态对系统产生了影响,因而记为
同时我们使用表示,引入的外部因素对于协方差的影响,因而有
这里总结一下,新引入的外部变量使得
1)当前的最佳估计不再为系统自身的最佳估计,还考虑了外部因素影响
2)当前的不确定性不再为系统自身的不确定性,引入了外部的不确定性做参考
▊ 卡尔曼滤波公式推导
通过预测状态量和不确定性,我们可以有较大把握预测对某一时刻下的状态。到目前为止,我们很好地完成了对系统的建模,但是有一个问题没有考虑到,那就是系统的初始值怎么得到。
对于系统中数据的收集,我们一般基于传感器来实现。但是同一传感器在同一时刻,可能因为外部原因导致收集得到的信号不完全一样。因而系统输入初始值对应结果大概率有很多噪音。这里我们把收集数据的均值记为, 方差记为
现在就有了新的问题。对于当前时刻,我们有了两组参考值,一组是预测值,一组是测量值。也许两组都对,也许其中只有一组对,也可能都不准(比如传感器测得不直接,偏差太大;预测值也偏差太大)。这种情况下,应该如何得到最终结果呢?
其中一个方案是,考虑直接融合两组结果。我们假设这两组数据都是正态分布,因而直接取pdf相乘就可以得到一个新的分布,也就是做一个联合概率分布的计算。这个联合概率分布本质上计算了前后状态转化对应分布和输入输出状态分布联合作用下的结果。
因而我们有下式
这里要注意的是,两个高斯pdf的乘积不是一个pdf(概率加和明显不是1),但是正比于一个未知高斯分布,因而我们可以求得这个新分布的均值和方差,根据如下关系,
为了使其成立,我们需要保证:
联立二式并稍作变化,我们得到:
令
为卡尔曼增益, 我们有
对应的矩阵形式为:
这里为了防止混淆,先停下来总结一下,
1)我们介绍了预测变量,下标为p,分布均值,方差分别对应于
2)我们介绍了观测变量,下标为ob,分布均值记为, 方差记为
3)基于1,2,我们代入即可推导出完整的卡尔曼滤波公式
所以根据刚才列出的计算式分别代入,我们可以得到,
进而可以求解得状态更新方程和卡尔曼增益求解公式:
注意这里的卡尔曼增益更新为
至此,便可以套公式更新卡尔曼滤波的参数了。
▊ 总结
卡尔曼滤波是处理线性系统非常好用的工具,对于不确定性的建模取自于物理、机械模型,所以对于现实生活中的状态还是能很好把握的。对于非线性系统,拓展卡尔曼滤波(extended Kalman filter)也可以做到很好地处理。
本文通过现实场景建模引入问题,简单介绍了卡尔曼滤波算法,对于更加清楚的公式推导请见参考列出的几篇相关文章。
欢迎大家在下方留言或者将建议发到我的邮箱(lcltopismine3@163.com),以便更好地交流心得。另外感谢参考文献所列诸作者。
参考文献:
. 论智:图说卡尔曼滤波,一份通俗易懂的教程
(https://zhuanlan.zhihu.com/p/39912633)
. 涅索斯衬衫:卡尔曼滤波(Kalman Filter)原理与公式推导
(https://zhuanlan.zhihu.com/p/48876718)
. Calculate the product of two Gaussian PDF's
(https://math.stackexchange.com/questions/114420/calculate-the-product-of-two-gaussian-pdfs)
. 详解ADAS之FCW前碰撞预警系统技术原理-公司新闻-深圳前海米乐视科技有限公司
(http://mileview.cn/gongsixinwen/22-43.html)
. 如何通俗并尽可能详细地解释卡尔曼滤波?
(https://www.zhihu.com/question/23971601)
END
欢迎加入「计算机视觉」交流群👇备注:CV