YOLO v8目标跟踪详细解读(二)
上一篇,结合代码,我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解,下面我们将对跟踪中出现的卡尔曼滤波进行解读。

1.卡尔曼滤波器介绍
卡尔曼滤波(kalman Filtering)是一种利用线性系统状态方程,通过系统输入观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。
卡尔曼滤波在测量方差已知的情况夏能够从一系列存在测量噪声的数据中,估计动态系统的状态。在目标跟踪中,将检测框的坐标看作观测数据,通过状态转移矩阵与状态协方差矩阵来更新下一帧的最优估计。
2.卡尔曼滤波器的基本概念

首先,我们需要了解卡尔曼滤波器的一些基本概念。 X k ^ \hat{X_k} Xk^表示k时可的状态量, F k F_k Fk表示 X k ^ \hat{X_k} Xk^的状态转移矩阵(运动估计矩阵)。我们可以利用 X k − 1 ^ \hat{X_{k-1}} Xk−1^通过 F k F_k Fk获得k时刻的估计 X k ^ \hat{X_k} Xk^。 P k P_k Pk作为状态协方差矩阵,也需要根据 F k F_k Fk更新。

观测量与状态量可能存在两个不同的空间,因此需要 H k H_k Hk实现状态空间到观测空间的映射。由于传感器检测的观测量存在误差,我们可以把观测空间理解为高斯分布,而状态量本就是一种估计,相较于观测量,状态量可以理解为具有较大方差的高斯分布,其均值为状态量。
如上图所示,状态量 X k − 1 ^ \hat{X_{k-1}} Xk−1^是位于左侧的高斯分布,通过状态转移矩阵获得k时刻状态量 X k ^ \hat{X_k} Xk^,由于过程中存在各种误差,方差较大。红色部分是k时刻的观测量 y k y_k yk。由于无法预知 X k ^ \hat{X_k} Xk^和 y k y_k yk两者哪边更为准确,我们将两者结合,得到的联合分布看作卡尔曼滤波最后更新的状态量。

已知两个高斯分布,其联合分布也为高斯分布,联合高斯分布的均值为 μ ^ ′ \hat{\mu}' μ^′, Σ ^ ′ \hat{\Sigma}' Σ^′。

根据上图中简单的矩阵计算,我们得到卡尔曼滤波预测与更新5个重要公式。
预测: P k − 1 P_{k-1} Pk−1, X k − 1 ^ \hat{X_{k-1}} Xk−1^根据状态转移矩阵获得k时刻 P k ^ \hat{P_{k}} Pk^与 X k ^ \hat{X_{k}} Xk^
更新:将状态量映射至观测量空间,联合观测量更新状态量 X k ^ ′ \hat{X_{k}}' Xk^′,状态协方差矩阵 P k ′ {P_{k}}' Pk′,本质是将观测量与状态量的高斯分布结合,形成的联合分布看作最终状态量的分布,其中 K ′ K' K′称为卡尔曼增益。
3.卡尔曼滤波在目标跟踪的应用
首先,状态量为[x,y,a,h,dx,dy,da,dh],我们需要预测坐标框下一帧的位置,所以状态转移矩阵很简单,表示为图中所示固定矩阵 F k F_k Fk。物理意义:下一时刻的位置=该时刻的位置+该时刻的速度× Δ \Delta Δt,这里 Δ \Delta Δt设为1。系统输入 u k u_k uk设为0。
为什么选用xyah作为状态量,而不是xyxy?主要考虑xyah作为4个独立变量,他们的协方差=0,因此协方差矩阵可以表示为对角矩阵。而xyxy形式,左上角坐标与右小角坐标有相关性,协方差矩阵不可表示为对角矩阵。

观测量为[x,y,a,h],因此映射矩阵 H k H_k Hk为图中所示固定矩阵。我们对KF进行初始化,self._motion_mat表示 F k F_k Fk状态转移矩阵,self._update_mat表示 H k H_k Hk映射矩阵, self._std_weight_position表示位置方差的权重,self._std_weight_velocity 表示速度方差的权重,赋值均为经验值。
def __init__(self):"""Initialize Kalman filter model matrices with motion and observation uncertainties."""ndim, dt = 4, 1.# Create Kalman filter model matrices.self._motion_mat = np.eye(2 * ndim, 2 * ndim)for i in range(ndim):self._motion_mat[i, ndim + i] = dtself._update_mat = np.eye(ndim, 2 * ndim)# Motion and observation uncertainty are chosen relative to the current# state estimate. These weights control the amount of uncertainty in# the model. This is a bit hacky.self._std_weight_position = 1. / 20self._std_weight_velocity = 1. / 160
将该帧未关联的检测框坐标作为新轨迹的状态量,同时将mean_vel初始化为0。 X k ^ \hat{X_k} Xk^=mean = np.r_[mean_pos, mean_vel]。 P k {P_k} Pk初始化,其中x,y,h, x ′ , y ′ , h ′ x',y',h' x′,y′,h′的方差均与h为正比,a, a ′ a' a′为宽高比,方差为常值1e-2,1e-5。因为xy为检测框中心点,它存在于图中任意点,作为方差没有意义,因此方差正比于h。
def initiate(self, measurement):"""Create track from unassociated measurement.Parameters----------measurement : ndarrayBounding box coordinates (x, y, a, h) with center position (x, y),aspect ratio a, and height h.Returns-------(ndarray, ndarray)Returns the mean vector (8 dimensional) and covariance matrix (8x8dimensional) of the new track. Unobserved velocities are initializedto 0 mean."""mean_pos = measurementmean_vel = np.zeros_like(mean_pos)mean = np.r_[mean_pos, mean_vel]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))return mean, covariance
在进行轨迹关联前,需要预测轨迹在该帧的状态量。上面我们已经讨论了卡尔曼滤波预测的公式,翻译成代码就如下所示,其中motion_cov表示不确定性干扰,通常为对角矩阵状态量相关,对位元素越大,其值越大。
def predict(self, mean, covariance):"""Run Kalman filter prediction step.Parameters----------mean : ndarrayThe 8 dimensional mean vector of the object state at the previoustime step.covariance : ndarrayThe 8x8 dimensional covariance matrix of the object state at theprevious time step.Returns-------(ndarray, ndarray)Returns the mean vector and covariance matrix of the predictedstate. Unobserved velocities are initialized to 0 mean."""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)mean = np.dot(mean, self._motion_mat.T)covariance = np.linalg.multi_dot((self._motion_mat, covariance, self._motion_mat.T)) + motion_covreturn mean, covariance
在更新状态量之前,需要将状态量以及状态协方差矩阵映射到观测量空间,公式如下所示。

def project(self, mean, covariance):"""Project state distribution to measurement space.Parameters----------mean : ndarrayThe state's mean vector (8 dimensional array).covariance : ndarrayThe state's covariance matrix (8x8 dimensional).Returns-------(ndarray, ndarray)Returns the projected mean and covariance matrix of the given stateestimate."""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 : ndarrayThe predicted state's mean vector (8 dimensional).covariance : ndarrayThe state's covariance matrix (8x8 dimensional).measurement : ndarrayThe 4 dimensional measurement vector (x, y, a, h), where (x, y)is the center position, a the aspect ratio, and h the height of thebounding box.Returns-------(ndarray, ndarray)Returns the measurement-corrected state distribution."""projected_mean, projected_cov = self.project(mean, covariance)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).Tinnovation = measurement - projected_meannew_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
相关文章:
YOLO v8目标跟踪详细解读(二)
上一篇,结合代码,我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解,下面我们将对跟踪中出现的卡尔曼滤波进行解读。 1.卡尔曼滤波器介绍 卡尔曼滤波(kalman Filtering)是一种利用线性…...
【广州华锐视点】AR电力职业技能培训系统让技能学习更“智慧”
随着科技的发展,教育方式也在不断地进步和创新。其中,增强现实(AR)技术的出现,为教育领域带来了全新的可能。AR电力职业技能培训系统就是这种创新教学方法的完美实践,它将虚拟与现实相结合,为学生提供了一个沉浸式的学…...
C#学习,反射
目录 C#学习 .NET的体系结构 二次编译 反射 什么是反射? 什么是Type? 什么是程序集? 反射API: 一,程序集 1, Load 2,LoadFrom 3,LoadFile 二,类型实例 1&a…...
代理模式概述
1.代理模式概述 学习内容 1)概述 为什么要有 “代理” ? 生活中就有很多例子,比如委托业务,黄牛(票贩子)等等代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这…...
最新AI系统ChatGPT网站程序源码+搭建教程/公众号/H5端/安装配置教程/完整知识库
1、前言 SparkAi系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。 那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧!…...
前端Flex布局
day06-Flex布局 目标:熟练使用 Flex 完成结构化布局 01-标准流 标准流也叫文档流,指的是标签在页面中默认的排布规则,例如:块元素独占一行,行内元素可以一行显示多个。 [外链图片转存失败,源站可能有防盗链机制,建议…...
文盘Rust -- Mutex解决并发写文件乱序问题 | 京东云技术团队
在实际开发过程中,我们可能会遇到并发写文件的场景,如果处理不当很可能出现文件内容乱序问题。下面我们通过一个示例程序描述这一过程并给出解决该问题的方法。 use std::{fs::{self, File, OpenOptions},io::{Write},sync::Arc,time::{SystemTime, UNI…...
数据结构算法--2 冒泡排序,选择排序,插入排序
基础排序算法 冒泡排序 思想就是将相邻元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置,小于右侧元素时,位置不变,最终序列中的最大元素,像气泡一样,到了最右侧。 这时冒泡排序第一…...
秋招面经——快手
Mysql mysql事务 共享锁与排他锁 共享锁:允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。(读都允许读,但我在读不允许你去改) 排他锁:允许一个事务去读一行,阻止其他事务获得相同…...
【STM32RT-Thread零基础入门】 2. 新建RT-Thread项目
硬件:STM32F103ZET6、ST-LINK、usb转串口工具 文章目录 前言一、新建RT-Thread项目二、项目结构三、构建项目四、下载程序(调试器下载)五、终端交互总结 前言 RT-Thread的全称是Real Time Thread,顾名思义,它是一个嵌…...
别人直播的时候怎么录屏?分享一些录屏方法
随着互联网的快速发展,直播已经成为人们日常生活中不可或缺的一部分。但是,有时候我们可能会错过某些重要的直播内容,这时候就需要录屏来保存和观看。那么,如何录屏别人的直播呢?本文将分享一些录屏方法和技巧&#…...
React Native 在高IOS版本下无法显示图片的问题处理
图片在低ios版本下可以看到图片,在高版本ios下显示不了图片 直接上解决方法 找文件 /node_modules/react-native/Libraries/Image/RCTUIImageViewAnimated.m 修改源码 原代码 if (_currentFrame) {layer.contentsScale self.animatedImageScale;layer.contents…...
SSH远程连接MacOS catalina并进行终端颜色配置
一、开关SSH服务 在虚拟机上安装了MacOS catalina,想要使用SSH远程进行连接,但是使用“系统偏好设置”/“共享”/“远程登录”开关进行打开,却一直是正在启动“远程登录”: 难道是catalina有BUG?不过还是有方法的&…...
用JSON.toJSONString转JSON时,属性的值为null时,输出的JSON里没有该属性
1、问题 用JSON.toJSONString转JSON时,当属性值为null的话,转出来的JSON里没有了值为null的属性,属性丢失了 2、原因 用fastjson将java对象转json字符串时会默认去除空字段 2、解决办法 在JSON.toJSONString方法加上SerializerFeature这一…...
Java版企业电子招标采购系统源码—企业战略布局下的采购寻源tbms
项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以…...
轻拍牛头(约数)
题意:求ai在n个数中,ai可以整除的数有多少个,不包括ai自己。 分析:暴力写需要n^2的时间复杂度,此时想一下预处理每个数的倍数,约数和倍数是有关系的,把每个数的倍数都加上1. #include<bits…...
Vc - Qt - 绘制窗口背景色
要在Qt中绘制一个背景颜色,你可以使用Qt的绘图功能来完成。下面是一种简单的方法: 步骤1:在你想要绘制背景颜色的QWidget(例如QMainWindow或QDialog)的派生类中,重写 它的paintEvent函数。步骤2:…...
js和cocos creator学习笔记
1.Javascript有哪些数据类型?举例两个最常见的内置对象数据类型? 常用的数据类型:Number,String,Boolean,Null,Undefined,Object 常见内置对象:Array,Function2.下面代码输出内容是什么? let a []; a[10] 10; console.log(a.length); console.log(a[0]); a[200] undefi…...
Ceph分布式存储系统
Ceph 是一个开源的分布式存储系统,旨在提供高性能、高可靠性和可扩展性的存储解决方案。它被设计用于管理大规模的数据,可以轻松地扩展到数千台服务器和多个存储节点,适用于私有云、公有云、虚拟化环境等多种场景。 Ceph 的主要特点和组件包…...
阿里云SMS,APi接口返回错误码
API错误码 更新时间:2023-06-29 16:33提交缺陷 产品详情 相关技术圈 我的收藏 调用API接口失败时,会返回错误码。本文档为您提供API接口错误码列表,请根据错误码和对应错误信息排查问题。 错误码(Code) 错误信息…...
Hermes Agent用户指南通过Taotoken自定义供应商接入大模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Hermes Agent用户指南:通过Taotoken自定义供应商接入大模型 本文面向使用Hermes Agent框架的开发者,详细说…...
3步掌握Android虚拟定位:FakeLocation完全使用指南
3步掌握Android虚拟定位:FakeLocation完全使用指南 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation FakeLocation是一款基于Xposed框架的Android虚拟定位工具ÿ…...
昇腾CANN ops-nn GELU 激活函数:精确版 vs tanh 近似版,选错就是 3× 慢
GELU(Gaussian Error Linear Unit)是 BERT 的灵魂激活函数,后来被 GPT-2/3 沿用。两种实现:精确版(调用 erf,慢但数学精确)和 tanh 近似版(快但误差 ~0.1%)。BERT 的训练…...
对比按量计费与Token Plan套餐如何为项目选择更优成本模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比按量计费与Token Plan套餐如何为项目选择更优成本模型 在将大模型能力集成到开发项目中时,成本控制是一个绕不开的…...
2025-2026年DHA品牌推荐:十大排行评测夜读提神性价比高注意事项
摘要 当消费者将DHA补充从概念认知推向日常实践,决策者却陷入“如何选型、如何确保安全、如何匹配需求”的现实困境:是在品牌热潮中追逐流量,还是回归科学验证?根据Gartner市场洞察,2025年全球DHA补充剂市场规模预计突…...
2026中国AI应用全景图谱报告
这份《2026 中国 AI 应用全景图谱报告》由量子位智库发布,全景式呈现中国 AI 应用的生态格局、规模数据、发展趋势与标杆方案,揭示行业从工具化走向任务化、商业化与垂直深耕的关键跃迁。关注公众号:【互联互通社区】,回复【AI999…...
可视化 React 水合(Hydration)问题
以下是 Next.js React 水合(Hydration)问题的 Mermaid 可视化,包含流程图(问题全景)和时序图(时间线视角),以及简要说明。1. 水合问题全景流程图 #mermaid-svg-tjAQ0VWDBl1ii9LA{fo…...
如何5分钟将普通图片转换为无限放大的矢量图:Vectorizer终极指南
如何5分钟将普通图片转换为无限放大的矢量图:Vectorizer终极指南 【免费下载链接】vectorizer Potrace based multi-colored raster to vector tracer. Inputs PNG/JPG returns SVG 项目地址: https://gitcode.com/gh_mirrors/ve/vectorizer 还在为图片放大后…...
AutoJs6在安卓11上的存储权限架构深度解析与技术实现方案
AutoJs6在安卓11上的存储权限架构深度解析与技术实现方案 【免费下载链接】AutoJs6 安卓平台 JavaScript 自动化工具 (Auto.js 二次开发项目) 项目地址: https://gitcode.com/gh_mirrors/au/AutoJs6 在安卓11(API级别30)及以上版本中,…...
微信聊天记录永久保存终极指南:3步实现智能数据管理
微信聊天记录永久保存终极指南:3步实现智能数据管理 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatM…...
