【深度学习|目标跟踪】快速入门卡尔曼滤波!

申明

  本博客参考了b站up主“华南小虎队”的卡尔曼滤波教学视频以及Lauszus Kristian Sloth Lauszus的卡尔曼滤波代码(c++实现),以及关于该代码示例中的博客教程

一、什么是卡尔曼滤波

1.1 卡尔曼滤波的使用场景

  卡尔曼滤波是一种最优估计的算法,我们可以把他理解成一个矫正算法,或者是一种插值算法。卡尔曼滤波可以根据我们对当前任务场景的运动学建模方程以及前一时刻的状态来估计下一时刻的状态。卡尔曼滤波被广泛应用于定位导航场景中,比如疾行的汽车在隧道中穿行时,由于我们的卫星定位系统会被隧道的山体所屏蔽信号,因此,我们无法通过卫星定位的方式来直观的定位汽车在隧道中的位置,这个时候我们就可以将当前的一些状态量通过传感器获得,比如当前速度以及当前位置等作为状态量传入我们的状态方程中来进行预测,并通过卡尔曼滤波来矫正我们的预测结果。
  在机器人控制场景中,也可以使用卡尔曼滤波来赋能,对于机器人发出的控制指令往往是离散的,这样会使得我们的机器人在执行动作时显得比较“生硬”,此时我们就可以使用卡尔曼滤波来对机器人进行状态的预测来插值,使得机器人的运动变得更加丝滑。当然卡尔曼滤波也不仅局限于以上两种场景,这只是我举得例子。

1.2 卡尔曼滤波的定义

  卡尔曼滤波的适用系统线性高斯系统(这里我们提到的为常规的kalman filter 而非UKF或者EKF)。线性系统即输入与输出满足齐次性叠加性。高斯则是指外部噪声的概率分布满足正态分布的规律。以一个具有着初速度的小车来说,小车在行驶的过程中会受到地面对于轮胎的摩擦力,空气的阻力,这两者都可以算是影响小车最终位置的外部噪声,实际情况是,空气阻力以及地面的摩擦力都不是恒定的值,那么在卡尔曼滤波中,我们将其的分布假定为满足高斯正态分布的,因此我们的小车的位置最终也是满足高斯正态分布的,如下图所示:
在这里插入图片描述

二、卡尔曼滤波公式详解(无推导)

首先我们先明确一下参数:

  • 过程噪声满足均值为0,方差为Q的高斯正态分布;
  • 观测噪声满足均值为0,方差为R的高斯正态分布;

卡尔曼滤波简单可以总结为以下两个步骤:

  • 使用上一时刻的最优结果来得到当前时刻的先验估计。
  • 使用第一步的先验估计以及观测到的状态来对先验估计进行矫正得到这一时刻的最优结果。

具体来说,卡尔曼滤波可以分为两个阶段,一个是预测阶段,一个是更新阶段,如下图所示:
在这里插入图片描述
其中,最优估计的计算我们可以拆解为先验估计 + 增益 *(观测结果 - 先验估计的观测)。 也就是说,我们可以把它看成一个权重问题,即如果我们更相信观测结果(高精度的传感器),那么我们可以将卡尔曼增益的权重增大,来扩大观测结果与先验估计误差对最终估计的影响力,如果我们更相信预测的结果,那么使卡尔曼增益的值减小,来扩大先验估计对最终结果的影响力。具体的如何通过调节参数来改变卡尔曼增益的值,我们在下面会讲到。

三、卡尔曼滤波的简单应用

### 使用深度学习进行信号滤波的技术实现 近年来,随着深度学习的发展,其在信号处理领域中的应用逐渐增多。相比于传统的滤波方法(如卡尔曼滤波[Kalman Filter][^1]),基于深度学习的方法能够通过数据驱动的方式自动提取特征并优化模型性能。 #### 数据准备阶段 为了训练一个用于信号滤波的深度学习模型,需要收集大量带有噪声和干净版本的目标信号样本。这些样本可以来自实际测量设备或者仿真环境。对于心电信号(EEG)[^2]来说,通常会采集不同状态下的记录作为训练集的一部分。 #### 模型架构选择 目前主流的几种适用于时间序列预测/重建任务的神经网络结构包括但不限于: - **卷积神经网络(CNN)**: 能够捕捉局部模式变化规律; - **循环神经网络(RNN)/长短时记忆单元(LSTM)**: 更擅长于建模长期依赖关系; - **自编码器(Autoencoder)** 和变分自编码器(VAE): 可用来重构输入从而达到去噪目的; 具体选用哪种类型的网络取决于待解决问题的特点以及可用资源情况等因素考虑之后再做决定[^3]. #### 训练过程概述 一旦选定合适的框架,则需定义损失函数来衡量输出与真实值之间的差异程度,并采用梯度下降法调整权重直至收敛为止 。例如均方误差(MSE)常被用作回归类问题的标准评估指标之一 。 以下是Python代码片段展示了一个简单的LSTM模型构建例子: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense def build_lstm_model(input_shape): model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=input_shape)) model.add(Dense(1)) # 输出层只有一个节点表示单步预测 model.compile(optimizer='adam', loss='mean_squared_error') return model ``` 上述脚本创建了一种基础形式的时间分布全连接前馈式RNN实例化对象`model`, 它接受形状为`(timesteps, features)` 的张量作为输入. #### 测试验证效果 完成训练后应当对测试集合上的表现加以检验确认泛化能力良好与否. 如果发现过拟合现象严重的话可能要考虑增加正则项或者其他缓解措施比如Dropout技术等等. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄鑫

谢谢,将继续努力提供技术方案

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值