点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
介绍
卡尔曼滤波器是一种复杂的算法,在大多数情况下,我们在没有完全理解其方程的情况下使用它。
当我开始使用卡尔曼滤波器时,我也是这样做的。我阅读了一堆试图直观地解释算法的教程,但在这样做时,忽略了关于协方差矩阵作用的关键部分。
我正在开发的产品是基于检测的对象跟踪器。在其中,卡尔曼滤波器用于预测和更新给定视频流的对象的位置和速度,以及对每一帧的检测。在某些时候,我们还想通过在给定运动角度的情况下调整对象的位置来考虑相机的倾斜和平移。当然,物体的速度应该不受这种相机运动的影响。
但是,当开始实施这种调整时,我意识到我并不真正了解速度是如何估计的。我假设在这个过程中的某个地方,在给定先前和当前位置的情况下会明确计算速度(在我们的例子中,速度永远不会直接测量)。我还假设以与位置相同的方式处理此速度。令我惊讶的是,这两个假设都被证明是错误的。
这使我深入研究了卡尔曼滤波器的方程,试图尽可能直观地弄清楚到底发生了什么,但没有过度简化。本文是我在这个过程中学到的东西的总结。本文中我们需要小伙伴熟悉概率论中的基本概念,例如概率分布函数、高斯和贝叶斯定理。此外,我们将使用矩阵乘法和加法进行一些计算。因此,如果小伙伴也熟悉这一点,那就更好了。
概述
卡尔曼滤波器是一种算法,旨在随着时间的推移估计测量变量的值,给定这些变量的连续测量值以及这些测量值的不确定性。卡尔曼滤波器还考虑了估计变量之间的给定关系。
让我们以在视频中跟踪乒乓球的过程为例,给定球的 2D 边界框检测。检测可能在给定 bbox 的坐标中或由误报/负数引起的坐标中包含一些不准确之处。
为了更顺畅地跟踪球,我们将要跟踪测量的中心坐标 ( x , y )、bbox 的宽度和高度。假设移动球的速度可以在短时间内近似为常数,我们还希望跟踪 x 和 y 速度(v_x,v_y),希望得到这些预测:
通常,当试图解释卡尔曼滤波器时,人们会使用一个例子来跟踪一个物体,使用它的位置和速度的测量值(例如 GPS 和速度计)。在我们的示例中,我们没有直接测量速度。相反,卡尔曼滤波器使用测量的位置和我们注入其方程的先验知识来推断这个速度,这些知识与我们期望的运动学行为有关(在这种情况下是恒定的速度)。
为简单起见,从现在开始我们将只讨论x和v_x 的跟踪(一维跟踪示例)。在了解 1D 中发生了什么之后,逻辑可以很容易地扩展到 2 维和 3 维,因为在我们的示例案例中,每个维度都完全独立于其他维度。
假设
使用卡尔曼滤波器时有两个重要的假设:
传感器有噪声,其输出和噪声可以通过高斯概率分布函数 (PDF)准确建模。
我们对实际状态的初始先验知识也是一个高斯 PDF。
在我们的示例中,传感器输出由一维高斯表示,其中平均值等于实际传感器输出,方差是传感器的不确定性(主要是根据经验测量)。
先验高斯是二维的(一维表示位置,一维表示速度)。可以使用 6 个数字完全描述 2D 高斯:2 表示其中心坐标向量(也称为均值),另外 4 表示 2x2 协方差矩阵。
协方差矩阵的对角线对应于每个维度的方差,2个非对角线元素是位置和速度之间的实际协方差。由于协方差的对称性,非对角线元素总是相同的,即 x 和 y 之间的相关性与 y 和 x 之间的相关性相同(稍后我们将详细介绍该元素)。
卡尔曼滤波器将尝试使用输入检测更新均值和协方差。常用术语是将此分布称为系统状态。
在我们的示例中,我们将使用以下初始状态:
平均位置μ_x取自第