DeepSORT中的卡尔曼滤波

news2024/12/25 8:53:35

本文是看了DeepSORT方法视频之后,关于其中使用的卡尔曼滤波的理解

DeepSORT视频链接

首先是视频中的一张图请添加图片描述

预测阶段

x ^ k − = A x ^ k − 1 \hat{x}_k^-=A\hat{x}_{k-1} x^k=Ax^k1
P k − = A P k − 1 + Q , P k − ∈ R 8 , 8 P_k^-=AP_{k-1}+Q, P_k^- \in R^{8,8} Pk=APk1+Q,PkR8,8

更新阶段

K k = P k − C T C P k − C T + R , K k ∈ R 8 , 4 K_k=\frac{P_k^-C^T}{CP_k^-C^T+R}, K_k\in R^{8,4} Kk=CPkCT+RPkCT,KkR8,4
x k ^ = x ^ k − + K k ( y k − C x ^ k − ) , C ∈ R 4 , 8 , x ^ k − ∈ R 8 , 1 , y k ∈ R 4 , 1 \hat{x_k}=\hat{x}_k^-+K_k(y_k-C\hat{x}_k^-), C\in R^{4,8}, \hat{x}_k^-\in R^{8,1}, y_k\in R^{4,1} xk^=x^k+Kk(ykCx^k),CR4,8,x^kR8,1,ykR4,1
P k = ( I − K k C ) P k − P_k=(I-K_kC)P_k^- Pk=(IKkC)Pk

整个过程中,矩阵A和矩阵C保持不变,具体如下所示。C是状态观测矩阵,比如,如果我们现在的观测值是速度,而需要的是位置,那么C就是由速度变化到位置的变换矩阵。而在这里,C是由检测框变换到检测框的变换矩阵,因此C里都是1
请添加图片描述详细步骤:

1.获得第一帧输出的检测框参数初始化

x ^ k − \hat{x}_k^- x^k P k − P_k^- Pk首先被初始化
x ^ 0 − = [ x , y , r , h , 0 , 0 , 0 , 0 ] , ∈ R 1 , 8 \hat{x}_0^-=[x,y,r,h,0,0,0,0], \in R^{1,8} x^0=[x,y,r,h,0,0,0,0],R1,8
P k − P_k^- Pk x ^ 0 − , ∈ R 8 , 8 \hat{x}_0^-, \in R^{8,8} x^0R8,8 有关,差了一个系数,代码如下所示

# self._std_weight_position = 0.05
# self._std_weight_velocity = 0.00625
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]] 
covariance = np.diag(np.square(std))

2.预测下一时刻(第二帧中检测框的位置,图中的Prediction过程)

x ^ k − \hat{x}_k^- x^k正常计算,
P k − 中的 Q P_k^-中的 Q Pk中的Q是一个随机噪声,其为

std_pos = [ self._std_weight_position * mean[3],     
            self._std_weight_position * mean[3],   
            1e-2,    
            self._std_weight_position * mean[3]] 
 std_vel = [self._std_weight_velocity * mean[3],    
            self._std_weight_velocity * mean[3],    
            1e-5,    
            self._std_weight_velocity * mean[3]] 
  motion_cov = np.diag(np.square(np.r_[std_pos, std_vel]))  
  mean = np.dot(self._motion_mat, mean)
  covariance = np.linalg.multi_dot(( self._motion_mat, covariance, self._motion_mat.T)) + motion_cov

3.完成配对,给每一个轨迹匹配一个检测框

4.更新过程(Update)

def project(self, mean, covariance):     
	"""Project state distribution to measurement space.      
	Parameters     
	----------     
	mean : ndarray         The state's mean vector (8 dimensional array).     
	covariance : ndarray         The state's covariance matrix (8x8 dimensional).      
	Returns     
	-------     
	(ndarray, ndarray)         Returns the projected mean and covariance matrix of the given state         estimate.      
	"""     
	std = [ self._std_weight_position * mean[3],        
	        self._std_weight_position * mean[3],        
	        1e-1,         
	        self._std_weight_position * mean[3]]    
	innovation_cov = np.diag(np.square(std))      
	mean = np.dot(self._update_mat, mean)     
	covariance = np.linalg.multi_dot((  self._update_mat, covariance, self._update_mat.T))     
	return mean, covariance + innovation_cov

def update(self, mean, covariance, measurement):    
	 """Run Kalman filter correction step.      
	 Parameters     
	 ----------     
	 mean : ndarray         The predicted state's mean vector (8 dimensional).     covariance : ndarray         The state's covariance matrix (8x8 dimensional).     
	 measurement : ndarray         The 4 dimensional measurement vector (x, y, a, h), where (x, y)         is the center position, a the aspect ratio, and h the height of the         bounding box.     
	  Returns    
	   -------     
	   (ndarray, ndarray)         
	   Returns the measurement-corrected state distribution.     
	    """     
	 projected_mean, projected_cov = self.project(mean, covariance)      
	 #求解AX=b中的x
	 chol_factor, lower = scipy.linalg.cho_factor(projected_cov, lower=True, check_finite=False)     
	 kalman_gain = scipy.linalg.cho_solve((chol_factor,lower), np.dot(covariance, self._update_mat.T).T,         check_finite=False).T     
	 innovation = measurement - projected_mean      
	 new_mean = mean + np.dot(innovation, kalman_gain.T)     
	 new_covariance = covariance - np.linalg.multi_dot((         
	 kalman_gain, projected_cov, kalman_gain.T))     
	 return new_mean, new_covariance

然后不断的完成上述步骤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/445403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python轻量级Web框架Flask(10)——Flask进阶知识

1、Flask整体框架流程回顾: 视图函数把数据返回给浏览器的方法有多种,其中一种就是通过模板Templates。 2、Flask插件介绍: Flask插件可以去官网查看,有很多。插件安装流程: 1、通过pip指令在对应环境中下载插件2、在…

【Python入门】NumPy 入门知识介绍,看这一篇足矣

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 什么是 NumPy? NumPy 是用于处理数组的 python 库。 它还拥有在线性代数、傅立叶变换和矩阵领域中工作的函数。 NumPy 由 Travis Oliphant 于 2005 年创建。它是一个开源项目,你可以自由使用它。 …

SAP 性能监控工具

SAP 体系结构可能很复杂,因为它由许多不同的元素和多层应用程序组成。每个元素都必须以最佳方式执行,以确保响应迅速且可靠的服务级别。管理如此复杂的系统可能非常艰巨,这就是为什么使用强大的SAP监控工具绝对必要的原因。 什么是 SAP 监控 …

安装autogpt中出现的问题及安装autogpt的小白教程

ImportError: DLL load failed while importing numpy_ops: The specified module could not be found 解决方案:Latest supported Visual C Redistributable downloads | Microsoft Learn 安装一下这个软件即可, 要安装 Auto-GPT,请按照下…

【Operating Systems:Three Easy Pieces 操作系统导论 】 4 ~ 6 章 (进程 | 进程 API | 受限直接执行)

【读书笔记】 Operating Systems:Three Easy Pieces 操作系统导论 第四章、 抽象 : 进程 4.1 什么是进程 ? 操作系统为正在运行的程序提供的抽象进程可以访问的内存(称为地址空间,address space) 是该进程的一部分。进程的机器…

python+nodejs+ssm+vue 基于协同过滤的旅游推荐系统

本文首先介绍了旅游推荐的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图,流程图以及…

WPF教程(八)--数据绑定(1)

使用WPF可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能。WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似,但也有所不同,在 WPF中以通过后台代码绑定、前台XAML中进行绑定,或者两者组合的方式进行数据绑定。…

VUE基本使用详解

目录 一、VUE框架原理 1. 了解VUE框架 2. VUE框架原理 3. MVC设计模式 4. MVVM设计模式 二、引入VUE框架 1. 本地引入 2. 网络引入 三、安装Vue插件 一、VUE框架原理 1. 了解VUE框架 vue 框架 是基于MVVM设计模式的前端框架,其中的Vue对象是MVVM设计模式中的VM视图…

JavaWeb——TCP协议的相关特性

目录 一、TCP 1、特性 2、确认应答 (1)、定义 (2)、原理 (3)、接收缓冲区 3、超时重传 (1)、丢包 (2)、定义 (3)、分类 二、…

idea在main分支上新建其他分支并同步过去

前言:首先得知道以上(idea 版本为2021.1.3 ,右下角git分支部分)是什么含义。 local Branches 本地分支,代表当前项目路径下所存在的本地分支,以上是有三个,都存在与本地仓库 Remote Branches 远程分支&…

腾讯云服务器:轻量应用服务器、云服务器CVM和GPU云服务器配置表

目前腾讯云服务器分为轻量应用服务器、云服务器云服务器云服务器CVM和GPU云服务器,首先介绍一下这三种服务器。 1、腾讯云云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源&#x…

进程虚拟地址空间划分

任何编程语言->产生指令和数据 我们以x86 32位linux 作为知识介绍的背景 编译后生成exe文件在磁盘上,需要加载到内存才能运行 但不能直接加载到物理内存 linux给当前进程分配一个2^32大小的一块空间,4G 虚拟地址空间解释 它存在,你看得…

背包问题——01背包|完全背包

目录 前言&背包问题的历史 01背包 1、题目 2、暴力解01背包 Ⅰ、代码 3、动态规划解01背包 Ⅰ、二维dp数组解01背包 1)dp数组的含义 2)递推公式 3)dp数组的初始化 4)遍历顺序的讨论 5、代码 Ⅱ、一维数组解01背包 1&…

HCLE----atd以及备份方式

atd是一种基于时间的任务调度器,可以在指定时间执行一次性任务。atd启动时会读取/etc/at.allow和/etc/at.deny两个文件,来决定哪些用户有权限使用at命令提交任务。crond是一种周期性任务调度器,可以按照指定的时间间隔执行重复性任务。crond启…

5.3、web服务器简介HTTP协议

5.3、web服务器简介HTTP协议 1.Web-Server(网页服务器)2.HTTP协议(应用层的协议)①简介②概述③工作原理④HTTP请求报文格式⑤HTTP响应报文格式⑥HTTP请求方法⑦HTTP状态码 1.Web-Server(网页服务器) 一个 Web Server 就是一个服…

【arduino】超声波垃圾桶

🎊专栏【Arduino】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 ⭐效果 ⭐所需器材 ⭐连线图片 ⭐程序代码 ⭐代码分析 …

MySQL常见七种通用的Join查询练习题

准备数据库表 t_dept 和 t_emp CREATE TABLE t_dept (id int NOT NULL AUTO_INCREMENT,deptName varchar(30) DEFAULT NULL,address varchar(40) DEFAULT NULL,CEO int DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8mb3 CREATE TABLE t…

面包多面包多面包多面包多面包多面包多

1.背景 1.摘要 本文是针对智慧政务中的文本数据挖掘应用的研究。通过建立基于三层网络结构的fastText文本分类模型,聚类量化模型,熵权评估模型解决了群众留言分类,热点问题挖掘,答复意见评价等问题。 针对群众留言分类问题&#…

《学习循环》---C语言

目录 前言: 1.while循环 1.1while循环的结构 1.2while语句中的break和continue 2.getchar配合循环清空缓冲区 3.for循环 3.1for循环的结构 3.2for循环中的break和continue 3.3for循环的注意事项 3.4使用多个循环变量控制for循环 4.do while循环 4.1do …

chrome 浏览器在 112 正式版本以及 114 canary 版本从 devtools 控制台复制文本不会复制高亮显示的文本?

问题 我的 chrome 浏览器版本如下:版本 112.0.5615.138(正式版本) (64 位) 今天我在写代码的时候报错了,看了一下控制台浏览器,是某个属性没有定义,然后我双击这个属性名称 ctrl c…