Extended Kalman Filter (EKF)
探索扩展卡尔曼滤波器(EKF)进行非线性状态估计。了解它如何增强 Ultralytics YOLO26 和自主系统中的目标跟踪。
扩展卡尔曼滤波器 (EKF) 是一种稳健的数学算法,旨在估计非线性动态系统的状态。标准 卡尔曼滤波器 (KF) 可为沿直线运动或遵循简单线性方程的系统提供最优解,而现实世界中的物理过程很少如此可预测。大多数物体,例如对抗风阻的无人机或绕多个轴旋转的机械臂,都会沿曲线或复杂路径运动。EKF 通过在特定时间点为系统创建线性近似来应对这种复杂性,使工程师和数据科学家即使在底层机制复杂的情况下,也能将高效的滤波技术应用于 预测建模 任务。
机制与线性化#
为处理复杂的动态过程,EKF 采用一种称为线性化的数学过程,本质上是估计函数在当前工作点的斜率。这通常涉及计算 雅可比矩阵,以近似系统在短时间间隔内的变化方式。该算法以递归循环的方式运行,包含两个主要阶段:预测和更新。在预测阶段,滤波器使用运动物理模型将当前状态向前推算。在更新阶段,滤波器使用来自 陀螺仪 或加速度计等传感器的新数据(通常带有噪声)来修正这一推算结果。这种持续的预测与修正循环有助于减少 数据噪声,并提供比任何单个传感器单独提供的结果更平滑、更准确的真实状态估计。
与计算机视觉的相关性#
在 计算机视觉 (CV) 领域,扩展卡尔曼滤波器在保持运动目标身份方面发挥着关键作用。像 YOLO26 这样的先进模型擅长检测单帧中的目标,但并不会天然理解随时间推移的运动连续性。通过集成 EKF 或类似逻辑,目标跟踪 系统可以根据目标之前的速度和轨迹,预测 边界框 应在下一视频帧中的位置。这对于处理遮挡尤其有用:当目标暂时被挡住而无法看见时,滤波器会通过估计目标位置来保持“跟踪”持续,直到目标再次出现。这项技术对于稳健的 多目标跟踪 (MOT) 至关重要。
实际应用#
EKF 的多功能性使其成为众多高科技行业的核心技术,这些行业将 机器学习 (ML) 与物理硬件相结合:
- 自动驾驶汽车: 自动驾驶汽车依靠 传感器融合 来实现安全导航。EKF 将全球定位系统 (GPS)、LiDAR 和雷达的不同数据流进行融合,以计算车辆在道路上的精确位置和朝向,同时补偿信号中断或环境噪声。
- 机器人技术: 在非结构化环境中运行的机器人会使用 同步定位与建图 (SLAM) 算法。EKF 帮助机器人在构建房间地图的同时确定自己在地图中的位置,并修正车轮打滑或传感器漂移,以确保移动准确。
- 姿态估计: 在虚拟现实或体育分析等应用中,跟踪人体关节需要平滑抖动的关键点。EKF 算法会优化深度学习模型的输出,为 动作识别 系统创建流畅、自然的运动动画。
与相关概念的比较#
为了理解扩展卡尔曼滤波器的具体用途,有必要将其与相关滤波方法区分开来:
- EKF 与 卡尔曼滤波器 (KF) 的比较: 标准 KF 在数学上是最优的,计算成本也更低,但当系统具有高度非线性时会失效。EKF 通过近似扩展了 KF,使其能够处理非线性系统。
- EKF 与 粒子滤波器 的比较: 粒子滤波器通过使用大量随机样本(粒子)表示概率,能够很好地处理非线性和非高斯噪声。然而,它需要显著更多的 计算能力,因此对于资源受限的 嵌入式系统,EKF 是更受偏好的选择。
- EKF 与无迹卡尔曼滤波器 (UKF) 的比较: 无迹卡尔曼滤波器 提供了一种折中方案,它使用确定性采样点来处理非线性问题,而不需要 EKF 所需的复杂微积分,不过 EKF 仍然是许多控制系统的行业标准。
实现示例#
在 ultralytics 包中,跟踪算法会在内部使用卡尔曼滤波的概念来平滑轨迹,并关联不同帧中的检测结果。使用高级工具时,你无需手动编写 EKF 矩阵运算代码,但了解它为跟踪器提供支持,有助于你配置 Ultralytics Platform 的参数。
下面介绍如何使用一个 YOLO 模型 初始化跟踪器,该跟踪器利用这些滤波技术进行状态估计:
from ultralytics import YOLO
# Load the latest YOLO26 model (nano version for speed)
model = YOLO("yolo26n.pt")
# Track objects in a video source
# Trackers like BoT-SORT or ByteTrack use Kalman filtering logic internally
results = model.track(source="https://ultralytics.com/images/bus.jpg", tracker="botsort.yaml")
# Print the ID of the tracked objects
for r in results:
if r.boxes.id is not None:
print(f"Track IDs: {r.boxes.id.numpy()}")








