DeepSORT(目标跟踪算法)中的初始化卡尔曼滤波器的状态向量和协方差矩阵

本文主要是介绍DeepSORT(目标跟踪算法)中的初始化卡尔曼滤波器的状态向量和协方差矩阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DeepSORT(目标跟踪算法)中的初始化卡尔曼滤波器的状态向量和协方差矩阵

flyfish

如果看了下面遇到了状态转移矩阵,可以先看 DeepSORT(目标跟踪算法)中的卡尔曼滤波 - 看了就会的状态转移矩阵 ,这里做了非常详细的描述

import numpy as npnp.set_printoptions(suppress=True)class KalmanFilter(object):def __init__(self):ndim, dt = 4, 1.0# 创建卡尔曼滤波模型矩阵self._motion_mat = np.eye(2 * ndim)for i in range(ndim):self._motion_mat[i, ndim + i] = dt#运动矩阵(F)将线性关系表达为矩阵形式    print("__init__ _motion_mat:",self._motion_mat)    #更新矩阵(H)用于将观测结果转换为状态向量。在这个例子中,观测结果只包含位置和大小(不包括速度),所以它是一个4x8的矩阵:self._update_mat = np.eye(ndim, 2 * ndim)print("__init__ _update_mat:",self._update_mat)  # _std_weight_position = 1. / 20 表示位置的不确定性权重,值为0.05。# _std_weight_velocity = 1. / 160 表示速度的不确定性权重,值为0.00625。#位置的不确定性较大,速度的不确定性较小,这使得滤波器对位置变化更加敏感,而对速度变化更加稳定。self._std_weight_position = 1. / 20self._std_weight_velocity = 1. / 160def initiate(self, measurement):#mean_pos:代表观测到的位置向量 measurement。# 假设 measurement 包含物体的检测信息(如中心点的坐标和尺寸),通常为一个长度为4的向量 [x, y, a, h],其中 x 和 y 是位置坐标,a 是纵横比(宽/高),h 是高度。mean_pos = measurementprint("initiate mean_pos:",mean_pos)#mean_vel:代表速度向量的初始均值。这里初始化为与 mean_pos 相同长度的零向量,因为在初始化时,通常没有速度信息mean_vel = np.zeros_like(mean_pos)print("initiate mean_vel:",mean_vel)#方便的垂直拼接数组mean = np.r_[mean_pos, mean_vel]print("initiate mean:",mean)std = [2 * self._std_weight_position * measurement[3],2 * self._std_weight_position * measurement[3],1e-2,2 * self._std_weight_position * measurement[3],10 * self._std_weight_velocity * measurement[3],10 * self._std_weight_velocity * measurement[3],1e-5,10 * self._std_weight_velocity * measurement[3]]print("initiate std:",std)print("initiate np.square(std):",np.square(std))# np.square(std)计算标准差的平方,即方差。# np.diag(np.square(std)) 构造一个对角矩阵,主对角线上是方差值,其它位置为零。这形成了初始协方差矩阵,表示系统状态的不确定性。#covariance矩阵表示初始状态的不确定性。covariance = np.diag(np.square(std))return mean, covariance# 示例检测到的物体位置和尺寸
measurement = np.array([10, 5, 1.2, 4])# 创建 KalmanFilter 实例
kf = KalmanFilter()# 调用 initiate 方法
mean, covariance = kf.initiate(measurement)# 输出结果
print("Mean:")
print(mean)
print("Covariance:")
print(covariance)

上面代码加了注释,也可以先看 DeepSORT(目标跟踪算法)中的卡尔曼滤波 - 看了就会的状态转移矩阵 更详细。
结果

__init__ _motion_mat: [[1. 0. 0. 0. 1. 0. 0. 0.][0. 1. 0. 0. 0. 1. 0. 0.][0. 0. 1. 0. 0. 0. 1. 0.][0. 0. 0. 1. 0. 0. 0. 1.][0. 0. 0. 0. 1. 0. 0. 0.][0. 0. 0. 0. 0. 1. 0. 0.][0. 0. 0. 0. 0. 0. 1. 0.][0. 0. 0. 0. 0. 0. 0. 1.]]
__init__ _update_mat: [[1. 0. 0. 0. 0. 0. 0. 0.][0. 1. 0. 0. 0. 0. 0. 0.][0. 0. 1. 0. 0. 0. 0. 0.][0. 0. 0. 1. 0. 0. 0. 0.]]
initiate mean_pos: [10.   5.   1.2  4. ]
initiate mean_vel: [0. 0. 0. 0.]
initiate mean: [10.   5.   1.2  4.   0.   0.   0.   0. ]
initiate std: [0.4, 0.4, 0.01, 0.4, 0.25, 0.25, 1e-05, 0.25]
initiate np.square(std): [0.16   0.16   0.0001 0.16   0.0625 0.0625 0.     0.0625]
Mean:
[10.   5.   1.2  4.   0.   0.   0.   0. ]
Covariance:
[[0.16   0.     0.     0.     0.     0.     0.     0.    ][0.     0.16   0.     0.     0.     0.     0.     0.    ][0.     0.     0.0001 0.     0.     0.     0.     0.    ][0.     0.     0.     0.16   0.     0.     0.     0.    ][0.     0.     0.     0.     0.0625 0.     0.     0.    ][0.     0.     0.     0.     0.     0.0625 0.     0.    ][0.     0.     0.     0.     0.     0.     0.     0.    ][0.     0.     0.     0.     0.     0.     0.     0.0625]]

代码中的 self._motion_mat(运动矩阵)实际上就是状态转移矩阵(State Transition Matrix),通常表示为 F \mathbf{F} F。在卡尔曼滤波器的术语中,运动矩阵和状态转移矩阵指的是同一个概念,即描述系统状态在时间上的演变关系。

  • 运动矩阵(Motion Matrix):这个名称强调了该矩阵描述的是系统状态如何随时间变化,即系统的运动学特性。
  • 状态转移矩阵(State Transition Matrix):这个名称更通用,强调了该矩阵在卡尔曼滤波中的作用,即将当前状态转移到下一时刻的状态。
    两者虽然名称不同,但在具体应用中它们的作用和定义是相同的。在不同的文献或代码实现中,有不同的名称来强调其特定的用途或背景,但本质上它们是相同的。

对于状态向量 z \mathbf{z} z
z = [ x , y , a , h , v x , v y , v a , v h ] T \mathbf{z} = [x, y, a, h, vx, vy, va, vh]^T z=[x,y,a,h,vx,vy,va,vh]T
这里:

  • x x x y y y 是位置坐标,
  • a a a 是纵横比(宽度/高度),
  • h h h 是高度,
  • v x vx vx v y vy vy 是位置的速度,
  • v a va va 是纵横比的变化率,
  • v h vh vh 是高度的变化率。
    std 是一个包含标准差的列表,用于初始化协方差矩阵。每个标准差对应于状态向量中不同元素的不确定性。具体的标准差取值和倍率因素如下:

不确定性采用了measurement[3],它是当前测量值中的高度

2 * self._std_weight_position * measurement[3]:代表位置 x 的标准差,乘以位置权重系数和高度(或某个相关度量)。self._std_weight_position 是位置的不确定性权重。
2 * self._std_weight_position * measurement[3]:代表位置 y 的标准差。
1e-2:代表纵横比 a 的标准差,一个固定的小值。
2 * self._std_weight_position * measurement[3]:代表高度 h 的标准差。
10 * self._std_weight_velocity * measurement[3]:代表速度 vx 的标准差,乘以速度权重系数和高度。self._std_weight_velocity 是速度的不确定性权重。
10 * self._std_weight_velocity * measurement[3]:代表速度 vy 的标准差。
1e-5:代表纵横比变化率 va 的标准差,一个固定的很小的值。
10 * self._std_weight_velocity * measurement[3]:代表高度变化率 vh 的标准差。

倍率因素(2* 和 10*)
倍率因素是根据经验或具体应用调整的,用于控制不确定性的初始值:

2 *:位置的不确定性权重。位置的不确定性通常根据物体检测框的大小(如高度)来确定。
10 *:速度的不确定性权重。速度的不确定性通常比位置的不确定性大,因此乘以一个较大的系数,以反映速度估计的高不确定性。

协方差矩阵
也就是上面代码中的Covariance
描述状态估计的不确定性,是一个对称矩阵。在初始化时,它通常是对角矩阵,对角线元素表示各个状态变量的初始方差。在预测和更新步骤中,协方差矩阵会不断调整以反映新的不确定性。协方差矩阵在卡尔曼滤波器中用于描述状态估计的不确定性。具体来说,它表示状态向量中每个元素的方差(不确定性)以及这些元素之间的协方差。协方差矩阵是对称的,并且在滤波器的预测和更新步骤中不断更新。

这篇关于DeepSORT(目标跟踪算法)中的初始化卡尔曼滤波器的状态向量和协方差矩阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052421

相关文章

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu