智慧交通day02-车流量检测实现05:小车匀速案例

简介: 智慧交通day02-车流量检测实现05:小车匀速案例
"""
现在利用卡尔曼滤波对小车的运动状态进行预测。主要流程如下所示:
    导入相应的工具包
    小车运动数据生成
    参数初始化
    利用卡尔曼滤波进行小车状态预测
    可视化:观察参数的变化与结果
"""
#导入包
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
from filterpy.kalman import KalmanFilter
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"] #支持中文显示
mpl.rcParams["axes.unicode_minus"] = False
#小车运动数据生成
#在这里我们假设小车作速度为1的匀速运动
# 生成1000个位置,从1到1000,是小车的实际位置
z = np.linspace(1,1000,1000)
# 添加噪声
mu,sigma = 0,1
noise = np.random.normal(mu,sigma,1000)
# 小车位置的观测值
z_nosie = z+noise
#参数初始化
# dim_x 状态向量size,在该例中为[p,v],即位置和速度,size=2
# dim_z 测量向量size,假设小车为匀速,速度为1,测量向量只观测位置,size=1
my_filter = KalmanFilter(dim_x=2, dim_z=1)
# 定义卡尔曼滤波中所需的参数
# x 初始状态为[0,0],即初始位置为0,速度为0.
# 这个初始值不是非常重要,在利用观测值进行更新迭代后会接近于真实值
my_filter.x = np.array([[0.], [0.]])
# p 协方差矩阵,表示状态向量内位置与速度的相关性
# 假设速度与位置没关系,协方差矩阵为[[1,0],[0,1]]
my_filter.P = np.array([[1., 0.], [0., 1.]])
# F 初始的状态转移矩阵,假设为匀速运动模型,可将其设为如下所示
my_filter.F = np.array([[1., 1.], [0., 1.]])
# Q 状态转移协方差矩阵,也就是外界噪声,
# 在该例中假设小车匀速,外界干扰小,所以我们对F非常确定,觉得F一定不会出错,所以Q设的很小
my_filter.Q = np.array([[0.0001, 0.], [0., 0.0001]])
# 观测矩阵 Hx = p
# 利用观测数据对预测进行更新,观测矩阵的左边一项不能设置成0
my_filter.H = np.array([[1, 0]])
# R 测量噪声,方差为1
my_filter.R = 1
#卡尔曼滤波进行预测
# 保存卡尔曼滤波过程中的位置和速度
z_new_list = []
v_new_list = []
# 对于每一个观测值,进行一次卡尔曼滤波
for k in range(len(z_nosie)):
    # 预测过程
    my_filter.predict()
    # 利用观测值进行更新
    my_filter.update(z_nosie[k])
    # do something with the output
    x = my_filter.x
    # 收集卡尔曼滤波后的速度和位置信息
    z_new_list.append(x[0][0])
    v_new_list.append(x[1][0])
#可视化
#预测误差的可视化
# 位移的偏差
dif_list = []
for k in range(len(z)):
    dif_list.append(z_new_list[k]-z[k])
# 速度的偏差
v_dif_list = []
for k in range(len(z)):
    v_dif_list.append(v_new_list[k]-1)
plt.figure(figsize=(20,9))
plt.subplot(1,1,1)
plt.xlim(-50,1050)
plt.ylim(-3.0,3.0)
plt.scatter(range(len(z)),dif_list,color ='b',label = "位置偏差")
plt.scatter(range(len(z)),v_dif_list,color ='y',label = "速度偏差")
plt.legend()
plt.show()
#2.卡尔曼滤波器参数的变化
#首先定义方法将卡尔曼滤波器的参数堆叠成一个矩阵,右下角补0,我们看一下参数的变化。
# 定义一个方法将卡尔曼滤波器的参数堆叠成一个矩阵,右下角补0
def filter_comb(p, f, q, h, r):
        a = np.hstack((p, f))
        b = np.array([r, 0])
        b = np.vstack([h, b])
        b = np.hstack((q, b))
        a = np.vstack((a, b))
        return a
#对参数变化进行可视化:
# 保存卡尔曼滤波过程中的位置和速度
z_new_list = []
v_new_list = []
# 对于每一个观测值,进行一次卡尔曼滤波
for k in range(1):
    # 预测过程
    my_filter.predict()
    # 利用观测值进行更新
    my_filter.update(z_nosie[k])
    # do something with the output
    x = my_filter.x
    c = filter_comb(my_filter.P,my_filter.F,my_filter.Q,my_filter.H,my_filter.R)
    plt.figure(figsize=(32,18))
    sns.set(font_scale=4)
    #sns.heatmap(c,square=True,annot=True,xticklabels=False,yticklabels==False,cbar=False)
    sns.heatmap(c,square=True,annot=True,xticklabels=False,yticklabels=False,cbar=False)
#从图中可以看出变化的P,其他的参数F,Q,H,R为变换。另外状态变量x和卡尔曼系数K也是变化的。
#3.概率密度函数
#为了验证卡尔曼滤波的结果优于测量的结果,绘制预测结果误差和测量误差的概率密度函数:
# 生成概率密度图像
z_noise_list_std = np.std(noise)
z_noise_list_avg = np.mean(noise)
z_filterd_list_std = np.std(dif_list)
import seaborn as sns
plt.figure(figsize=(16,9))
ax = sns.kdeplot(noise,shade=True,color="r",label="std=%.3f"%z_noise_list_std)
ax = sns.kdeplot(dif_list,shade=True,color="g",label="std=%.3f"%z_filterd_list_std)
plt.show()


输出:


79f6bca9e0474292b950acbad5697c53.png

e8391bf93fc943a6b179ab5e87569a01.png


8f812b8c303e44878e5e2c4fae0dbda9.png

目录
相关文章
|
存储 PHP 数据库
新手教程 快速部署PbootCMS到本地或者服务器
新手教程 快速部署PbootCMS到本地或者服务器
1979 0
|
12月前
|
jenkins 持续交付 开发工具
除了 Gitee,还有哪些代码托管平台支持 Webhook?
除了 Gitee,还有哪些代码托管平台支持 Webhook?
|
10月前
|
开发框架 运维 安全
无影云电脑,畅享极速渲染新体验
本文介绍了渲染行业面临的挑战及无影云电脑带来的革新。传统渲染依赖高性能本地设备,面临重投入、性能固定、灵活性差和数据安全问题。无影云电脑通过云端算力,实现了灵活扩展、任意终端接入及按需付费,大幅提升了渲染效率与体验,尤其在游戏设计、工业制造等领域表现突出。其核心技术确保了色彩还原、流畅操作及外设兼容性,满足专业设计师的需求。未来,无影将助力渲染行业实现更高效、安全的云端工作模式。
|
9月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数
RT-DETR改进策略【损失函数篇】| WIoU v3:针对低质量样本的边界框回归损失函数
348 14
|
9月前
|
机器学习/深度学习 编解码 计算机视觉
RT-DETR改进策略【Backbone/主干网络】| 替换骨干网络为:Swin Transformer,提高多尺度特征提取能力
RT-DETR改进策略【Backbone/主干网络】| 替换骨干网络为:Swin Transformer,提高多尺度特征提取能力
356 12
RT-DETR改进策略【Backbone/主干网络】| 替换骨干网络为:Swin Transformer,提高多尺度特征提取能力
|
9月前
|
算法 计算机视觉
RT-DETR改进策略【RT-DETR和Mamba】| 替换骨干 Mamba-RT-DETR-B !!! 最新的发文热点
RT-DETR改进策略【RT-DETR和Mamba】| 替换骨干 Mamba-RT-DETR-B !!! 最新的发文热点
178 4
RT-DETR改进策略【RT-DETR和Mamba】| 替换骨干 Mamba-RT-DETR-B !!! 最新的发文热点
|
9月前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【注意力机制篇】| Large Separable Kernel Attention (LSKA) 大核可分离卷积注意力 二次创新HGBlock、ResNetLayer
RT-DETR改进策略【注意力机制篇】| Large Separable Kernel Attention (LSKA) 大核可分离卷积注意力 二次创新HGBlock、ResNetLayer
173 2
|
JSON JavaScript 前端开发
如何通过 JavaScript 运行用 Go 编写的 WebAssembly 模块? 下
如何通过 JavaScript 运行用 Go 编写的 WebAssembly 模块?
367 0
|
消息中间件 安全 Java
解析KafkaConsumer类的神奇之道
解析KafkaConsumer类的神奇之道
338 0
|
机器学习/深度学习 自然语言处理 决策智能
ICML 2024:大语言模型预训练新前沿:最佳适配打包重塑文档处理标准
【5月更文挑战第27天】ICML 2024 提出大语言模型预训练新方法——最佳适配打包,解决文档截断问题,提高模型性能和可靠性。此方法通过优化组合,保留完整上下文,减少信息丢失,在阅读理解等任务上表现卓越。实验显示,不同尺寸和序列长度的模型使用此方法后,下游任务性能提升,幻觉现象减少。尽管计算资源需求增加,但该方法对预训练技术的改进具有重要意义。[论文链接](https://arxiv.org/pdf/2404.10830)
288 1
下一篇
开通oss服务