智慧交通day02-车流量检测实现04:卡尔曼滤波器

简介: 卡尔曼滤波(Kalman)无论是在单目标还是多目标领域都是很常用的一种算法,我们将卡尔曼滤波看做一种运动模型,用来对目标的位置进行预测,并且利用预测结果对跟踪的目标进行修正,属于自动控制理论中的一种方法。

1、背景介绍


卡尔曼滤波(Kalman)无论是在单目标还是多目标领域都是很常用的一种算法,我们将卡尔曼滤波看做一种运动模型,用来对目标的位置进行预测,并且利用预测结果对跟踪的目标进行修正,属于自动控制理论中的一种方法。


在对视频中的目标进行跟踪时,当目标运动速度较慢时,很容易将前后两帧的目标进行关联,如下图所示:


dc55a4eabceb495083333460eb3cc324.png


如果目标运动速度比较快,或者进行隔帧检测时,在后续帧中,目标A已运动到前一帧B所在的位置,这时再进行关联就会得到错误的结果,将A‘与B关联在一起。


fdf4fa5e9192438d9ec4d493039572e7.png


那怎么才能避免这种出现关联误差呢?我们可以在进行目标关联之前,对目标在后续帧中出现的位置进行预测,然后与预测结果进行对比关联,如下图所示:


26a69b06e3814295bfe73a5073eaa57a.png


我们在对比关联之前,先预测出A和B在下一帧中的位置,然后再使用实际的检测位置与预测的位置进行对比关联,只要预测足够精确,几乎不会出现由于速度太快而存在的误差。


卡尔曼滤波就可以用来预测目标在后续帧中出现的位置,如下图所示,卡尔曼滤波器就可以根据前面五帧数据目标的位置,预测第6帧目标的位置。


07a39a7a9ed7492292265673b92c8380.png


卡尔曼滤波器最大的优点是采用递归的方法来解决线性滤波的问题,它只需要当前的测量值和前一个周期的预测值就能够进行状态估计。由于这种递归方法不需要大量的存储空间,每一步的计算量小,计算步骤清晰,非常适合计算机处理,因此卡尔曼滤波受到了普遍的欢迎,在各种领域具有广泛的应用前景。


2.原理介绍


我们假设一个简单的场景,有一辆小车在行驶,它的速度是v,可以通过观测得到它的位置p,也就是说我们可以实时的观测小车的状态。


  • 场景描述


小车在某一时刻的状态表示为一个向量:


 d92ceedba13e417298ed1e4600cddbe0.png


虽然我们比较确定小车此时的状态,无论是计算还是检测都会存在一定的误差,所以我们只能认为当前状态是其真实状态的一个最优估计。那么我们不妨认为当前状态服从一个高斯分布,如下图所示:


b5e57e2055634a779a5dee1e1ddb9742.png


高斯分布的中心835bfdc929be45faa086ba31d41c0ca7.png就是图中82ccf292c901487fb87d47c7961d8253.png

615404b95c9347f9a553bc46e687c64e.png


因为我们有两个变量,所以可以用一个协方差矩阵Pk来表示数据之间的相关性和离散程度:


 0e2511f7a56d4bdd8ab0a4152126d531.png


  • 预测下一时刻的状态


下面我们需要通过小车的当前状态,运用一些物理学的知识来预测它的下一个状态,即通过k-1时刻的位置和速度,可以推测下一个时刻的状态为:


12e0e2d81f0d47c09da1128192ce92d9.png


写成矩阵形式就是:


8c2f92b77a6a4664bb774da0c4d4a4bd.png


此处的Fk就是状态转移矩阵。


系统的不确定性和相关性可以通过协方差矩阵描述,那根据当前协方差矩阵预测下一时刻的协方差矩阵:


86b02a6af0e54b219a0334d97f35b3dd.png


在这里我们用到了协方差的性质:


fb78e4f6335641fc96f19f270587c45f.png


  • 增加系统的内部控制


我们需要对小车进行控制,比如加速和减速,假设某个时刻我们施加的加速度是\color{green}{\mathbf{a}}a,那么下一时刻的位置和速度则应该为:


20190817113318171.png


再写成矩阵的形式:


 20190817113330252.png


其中,Bk我们称为状态控制矩阵,而uk称为状态控制向量,前者表明的是加速减速如何改变小车的状态,而后者则表明控制的力度大小和方向。


  • 考虑系统的外部影响


4ac7468b2d5047dbacb82fc169fe274d.png


  • 对观测数据的预测


前面我们通过小车的上一个状态,对它的当前状态做了预测,此时我们要考虑对于小车的状态能够观测到什么呢?


小车的当前状态和观测到的数据应该具备某种特定的关系,假设这个关系通过矩阵表示为Hk,如下图所示:


344c4edc01674b16ad53c7ff682a26a2.png


在此前对小车所做的预测状态下,我们的观测值为:


2894522b24de4b409ab3892637f94a33.png


那我们就完成了对观测值的预测:


d22ddac28fb542959ba3dfb7c9ebccb7.png


  • 实际的观测结果


前面推测小车当前的状态,推测了我们的观测数据,但是现实和理想之间必然是存在差距的,我们预测的观测结果和实际的观测结果可能如下图所示:


adefbc625908435fadb974b08f83c3ac.png

9f298b9ea0574e9a96138e2129fa8214.png


卡尔曼滤波需要做的最重要的最核心的事就是融合预测和观测的结果,充分利用两者的不确定性来得到更加准确的估计。通俗来说就是怎么从上面的两个椭圆中来得到中间淡黄色部分的高斯分布,看起来这是预测和观测高斯分布的重合部分,也就是概率比较高的部分。


  • 高斯分布的乘积


一维高斯分布来分析比较简单点


1c4d8a6ec4654d268611728c6a24b865.png


两个服从高斯分布的函数相乘:


       对于任意两个高斯分布,将二者相乘之后还是高斯分布,我们利用高斯分布的两个特性进行求解,其一是均值处分布函数取极大值,其二是均值处分布曲线的曲率为其二阶导数,我们可以求出:


20190817132507870.png


重新归一化,使总概率为1,可以得到


aae3cd503fc64b6fae5efa551e01f394.png


图中蓝色和橙色两个波形的直接乘积是黄色这个波形,紫色是计算了均值和方差的记过,黄色的分布可以通过紫色的波形乘上一个系数得到。


787f48d0e7c84c23884a5e3e01b2c182.png


对于高阶的高斯分布:


7cf0e4536ef54afe99d839fc49e41064.png


  • 新的高斯分布


通过预测和观测值的高斯分布的乘积得到的即是卡尔曼滤波的最优估计


在新的均值和方差计算公式中,我们令:


254dd22ceca24099959b5fc53b858e5a.png


将式(11)中的两个式子相同的部分用 k 表示为(13),下面进一步将式(13)写成矩阵的形式:


c7f9081799fd422d8e5da84f4e72f61e.png


如果 Σ 表示高斯分布的协方差,u 表示每个维度的均值,将它们写成矩阵形式就是:


20190817113940124.png


前面我们已经得到了预测结果和观测结果服从的两个高斯分布,如下:


预测部分:


20190817114029226.png


测量部分:


20190817114058531.png


将它们放到式(15)中算出它们之间的重叠部分


20190817114125142.png


由式(14)可得卡尔曼增益为:


20190817114142974.png


所以我们可以进行如下推导,将式(16)和式(17)两边化简下,注意K可以展开得到卡尔曼滤波对当前状态(基于预测和观测的)最优估计的计算方程:


20190817114158765.png


K′就是卡尔曼增益:


23390b3bf51b4d7c94c1fe7cfc3b2ef3.png

0db450706a034b6b9a70c92ab07c3c1d.png

20190817114212747.png


  • 实际中的计算方法


在实际使用卡尔曼滤波的时候,计算的步骤一般为:


1.预测阶段


f6003cc18b7243768218396ea7eaf47e.png


2.更新阶段


4a425d829b604c119d759b2933ba574d.png


1.最重要的是,我们要时刻关注不断迭代的系统变量,分别是系统的状态:x,其误差协方差矩阵:P,和卡尔曼增益:K。


2.在实际应用时,对QR的选择要依据实际情况来定,可以不断调试来寻找一个最优解,也可以是可变的,只要最终效果能够更好。


总结


1.卡尔曼滤波器中在目标跟踪中的应用


卡尔曼滤波器通过预测目标在后续帧中的位置,避免在进行目标关联时出现误差


1.卡尔曼滤波器的原理


滤波器根据上一时刻( k -1 时刻) 的值来估计当前时刻( k 时刻) 的状态,得到 k 时刻的先验估计值; 然后使用当前时刻的测量值来更正这个估计值,得到当前时刻的估计值。


  • 目标不确定性和相关性的度量


  • 预测目标的下一时刻的状态


  • 系统内部的控制和外部的影响


  • 利用观测值进行修正


  • 实际应用中:预测和更新两个阶段
目录
相关文章
|
消息中间件 存储 Java
【Kafka】Kafka 组件分析
【4月更文挑战第5天】【Kafka】Kafka 组件分析
|
机器学习/深度学习 算法 计算机视觉
SORT新方法AM-SORT | 超越DeepSORT/CO-SORT/CenterTrack等方法,成为跟踪榜首
SORT新方法AM-SORT | 超越DeepSORT/CO-SORT/CenterTrack等方法,成为跟踪榜首
556 0
|
机器学习/深度学习 并行计算 编译器
了解NVIDAI显卡驱动(包括:CUDA、CUDA Driver、CUDA Toolkit、CUDNN、NCVV)
开发过程中需要用到GPU时,通常在安装配置GPU的环境过程中遇到问题;CUDA Toolkit和CUDNN版本的对应关系;CUDA和电脑显卡驱动的版本的对应关系;CUDA Toolkit、CUDNN、NCVV是什么呢?
16697 1
了解NVIDAI显卡驱动(包括:CUDA、CUDA Driver、CUDA Toolkit、CUDNN、NCVV)
|
传感器 数据采集 机器学习/深度学习
LabVIEW开发电机故障监测系统
LabVIEW开发电机故障监测系统
234 0
|
9月前
|
计算机视觉
RT-DETR改进策略【卷积层】| 2024最新轻量级自适应提取模块 LAE 即插即用 保留局部信息和全局信息
RT-DETR改进策略【卷积层】| 2024最新轻量级自适应提取模块 LAE 即插即用 保留局部信息和全局信息
245 4
RT-DETR改进策略【卷积层】| 2024最新轻量级自适应提取模块 LAE 即插即用 保留局部信息和全局信息
|
数据挖掘 计算机视觉
YOLOv5改进 | 损失篇 | VarifocalLoss密集检测专用损失函数 (VFLoss,论文一比一复现)
YOLOv5改进 | 损失篇 | VarifocalLoss密集检测专用损失函数 (VFLoss,论文一比一复现)
1084 1
|
存储 安全 Android开发
深入探索安卓与iOS的安全性对比
在这篇文章中,我们将探讨安卓和iOS两大操作系统在安全性方面的不同之处。通过分析它们的安全架构、更新机制以及用户数据保护策略,我们可以更好地理解它们各自的优势和不足。无论是对于普通用户还是专业开发者,了解这些信息都是非常有益的。
|
消息中间件 缓存 API
【后端面经】【消息队列】22 | 消息队列:消息队列可以用来解决什么问题?-03 扩展性+可用性+事件驱动思想
【5月更文挑战第8天】 本文探讨了扩展性、可用性和事件驱动的概念。扩展性方面,消息队列简化了新下游的接入,而同步调用需要复杂的协调。在保证高可扩展性和研发效率的设计中,若无法使用消息队列,可以提供一致性抽象来减轻接入负担。可用性上,消息队列只需确保消息发送,而同步调用需保证所有下游成功,更易出错。事件驱动是一种通过事件进行组件间通信的架构模式,具有低耦合、高扩展性和高可用性,适合处理复杂流程。结合SAGA的事件驱动方案能实现高级分布式事务管理,即使实时性稍弱,但能保证事务的异步和高效执行。
173 1
|
数据采集 机器学习/深度学习 文字识别
OCR -- 文本检测 - 训练DB文字检测模型
OCR -- 文本检测 - 训练DB文字检测模型
400 0
下一篇
开通oss服务