bytetrack 多目标跟踪 学习笔记

news2024/12/24 21:05:01

效果:

ByteTrack在遮挡情况下ID不丢失演示

 

最近几天在看Bytetrack,感觉自己的学习方法有点问题,

应该先断点跑通,总体把握

然后完全理解算法代码的每一行,可以自己复现(这个就很难,看github的大佬把python转C++ 好羡慕)

所以如果学习Bytetrack,需要:

  1. 了解卡尔曼滤波和匈牙利算法
  2. 了解bytetrack思路
  3. 阅读bytetrack源码

目录

Pre

匈牙利算法

卡尔曼追踪器

bytetrack思路


Pre

轨迹:不断保存某一个目标在画面中出现的位置(bbox)于一容器中

Bytetrack 无需训练,只要在数据集上训练好检测模型即可

Bytetrack只是对追踪结果作逻辑处理

匈牙利算法

现在有4个目标检测框,4个轨迹,如何将其一一配对?

匈牙利算法干的就是这件事,可以依据检测框与轨迹的IoU距离,也可以利用目标的外观信息,让检测框与轨迹配对。

源码:

BYTETracker.cpp

    // 让预测后的 track 和当前帧的 detection 框做 cost_matrix,用的方式是 IOU关联
    // 这里的 iou_distance 函数中 调用了track.tlbr,返回的是预测之后track坐标信息
	 std::vector< std::vector<float> > dists;
	int dist_size = 0, dist_size_size = 0;
	dists = iou_distance(strack_pool, detections, dist_size, dist_size_size);

    // 用匈牙利算法算出相匹配的 track 和 detection 的索引,以及没有被匹配到的 track 和没有匹配到的 detection 框的索引
	 std::vector< std::vector<int> > matches;
	 std::vector<int> u_track, u_detection;
	linear_assignment(dists, dist_size, dist_size_size, match_thresh, matches, u_track, u_detection);

说明:

  1. 轨迹与检测框做代价计算
  2. 轨迹与检测框进行匹配

卡尔曼追踪器

卡尔曼滤波有涉及公式,我不大看的懂

但是需要晓得卡尔曼的操作对象是轨迹(track),卡尔曼追踪其有两个要点:

均值(Mean):表示目标的位置信息,由bbox的中心坐标(cx,cy),宽高比r,高h,以及各自的速度变化值组成,由8维向量表示为 x = [cx, cy, r, h, vx, vy, vr, vh],各个速度值初始化为0。

协方差(Covariance):表示目标位置信息的不确定性,由8x8的对角矩阵表示,矩阵中数字越大则表明不确定性越大,可以以任意值初始化。

源码:

#pragma once

#include "dataType.h"

namespace byte_kalman
{
	class ByteKalmanFilter
	{
	public:
		static const double chi2inv95[10];
		ByteKalmanFilter();
        // 初始化均值状态(mean)与状态协方差(covariant)
		KAL_DATA initiate(const DETECTBOX& measurement);

        // 预测
		void predict(KAL_MEAN& mean, KAL_COVA& covariance);

        // 分布转换
		KAL_HDATA project(const KAL_MEAN& mean, const KAL_COVA& covariance);

        // 更新
        KAL_DATA update(const KAL_MEAN& mean,
			const KAL_COVA& covariance,
			const DETECTBOX& measurement);

        // 计算状态分布和测量 (检测框)之间的距离
		Eigen::Matrix<float, 1, -1> gating_distance(
			const KAL_MEAN& mean,
			const KAL_COVA& covariance,
			const std::vector<DETECTBOX>& measurements,
			bool only_position = false);

	private:
		Eigen::Matrix<float, 8, 8, Eigen::RowMajor> _motion_mat;
		Eigen::Matrix<float, 4, 8, Eigen::RowMajor> _update_mat;
		float _std_weight_position;
		float _std_weight_velocity;
	};
}

bytetrack思路

track-by-detection目标追踪算法一般由检测器模块数据关联模块两个模块组成。先由检测器进行检测获得目标检测框,然后数据关联模块会赋予这些检测框ID进行轨迹跟踪。

大多数关联方法只对检测分数高于阈值的检测框进行ID标识。那些检测分数低于阈值的检测框,会被简单地丢掉,这不是很合理。

如a组图1的第二个人,没有被遮挡时候,检测分数为0.8,但是其被遮挡时候,检测分数为0.1。

Bytetrack会关联每个检测框,而不是简单的丢掉低检测分数检测框。具体见下

1)每一帧率,检测器获得该帧检测框和分数,依据分数分为高分数检测框、低分数检测框,并添加进轨迹中。用卡尔曼滤波对每个轨迹的当前帧中的新位置进行预测

2)对高分数检测框和所有轨迹执行第一次关联:先计算检测框与预测轨迹框之间的 IoU 或 Re-ID 特征距离,获得相似度(代价矩阵)。然后采用匈牙利算法完成检测框与轨迹间的匹配,并保留未匹配到轨迹的检测框、未匹配到检测框的轨迹。

3)对低分数检测框和第一次关联未匹配到检测框的轨迹执行第二次关联:与第一次关联大体类似,但只使用IoU计算检测框与轨迹的相似度。因为低分数检测框通常包含严重的遮挡或运动模糊,外观特征不可靠。保留在迹第二次关联仍旧未匹配到检测框的轨,放入TLost中,存在超过30帧被删除。删除未匹配到轨迹的低分数检测框

4)将第一次关联未匹配到轨迹的高分检测框初始化为新的轨迹。每个单独帧的输出是当前帧中轨迹的边界框和ID标识

 

参考:

多目标跟踪MOT——对ByteTrack算法的一些理解_johnhamtom的博客-CSDN博客

ByteTrack注释详解 - 腾讯云开发者社区-腾讯云

 

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

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

相关文章

【Git】Git(分布式项目管理工具)在Windows本地/命令行中的基本操作以及在gitee中的操作,使用命令行、图形化界面,进行提交,同步,克隆

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

菜鸡shader:L1基于兰伯特原理的玉石、条纹、点阵材质

目录 玉石材质条纹材质点阵效果 这里就简单说下原理吧&#xff0c;使用unity很久之前的一个插件shaderforge&#xff0c;最近几年好像在unity资源商店已经不再维护了&#xff0c;但是有shader forge的官网&#xff1a;在这&#xff0c;碰到节点不会的时候可以查一下官方文档&am…

手把手,带你发布你的第一个npm包

我们在编写项目的时候&#xff0c;都会引入很多很好用的工具包&#xff0c;例如VueX、axios、Router、Element UId等。这些包很好用&#xff0c;安装引入也很方便。那如果我们也想发布一个我们自己的工具包&#xff0c;在以后编写项目时&#xff0c;直接引入我们自己的工具包要…

干货 | 正确引用参考文献的6大技巧

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐&#xff5e; 对于学术研究而言&#xff0c;正确引用参考文献非常重要。参考文献不仅展现了自己的学术水平&#xff0c;同时也给研究定位&#xff0c;突显研究在前人研究基础上作出的贡献。 …

牛客_华为_HJ32 密码截取

HJ32 密码截取 647. 回文子串 516.最长回文子序列 ## 这不就是 最长回文子串&#xff01;&#xff01; ## 回文子串有两种模式 ## ABA ##CAACst input() n len(st) ## 双指针 def func(s,i,j,n):res 0while i>0 and j<n and s[i]s[j]:i-1j1return j-i-1 ## 由于i j…

五本计算机必读书籍总结

一、计算机组成原理 思维导图&#xff1a; 1、计算机系统概述 主要讲授信息的数字化表示、存储程序与冯诺依曼体制&#xff1b;计算机的诞生和发展&#xff1b;计算机系统的层次结构和硬件系统组织&#xff1b;计算机的主要性能指标。 2、数据的表示、运算与校验 主要讲授数值…

C语言中链表中经典面试题

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

扩展 VirtualBox 已分配磁盘的方法

扩展 VirtualBox 已分配磁盘的方法 第一步&#xff1a;用VirtualBox命令行调整已分配磁盘的大小第二步&#xff1a;用windows磁盘管理工具扩展磁盘空间 第一步&#xff1a;用VirtualBox命令行调整已分配磁盘的大小 "c:\Program Files\Oracle\VirtualBox\VBoxManage.exe&q…

3年经验程序员聊聊外包项目,总结了6个典型的问题该如何解决

我是一名老程序员&#xff0c;接了项目&#xff0c;接外包项目已经有3年多的经验了。今天我想分享一些接项目的经验给大家。 第一&#xff0c;辞职去接外包&#xff0c;好吗&#xff1f;有很多人幻想辞职了全职去接外包&#xff0c;但我并不太建议这样做。我建议大家先把自己的…

计算机基础必读书籍

一、计算机组成原理 思维导图&#xff1a; 1、计算机系统概述 主要讲授信息的数字化表示、存储程序与冯诺依曼体制&#xff1b;计算机的诞生和发展&#xff1b;计算机系统的层次结构和硬件系统组织&#xff1b;计算机的主要性能指标。 2、数据的表示、运算与校验 主要讲授数值…

一个go http和grpc客户端库

大家好&#xff0c;我是peachesTao&#xff0c;今天是五一假期的第4天&#xff0c;首先祝大家劳动节快乐。今天给大家推荐一个统一http和grpc客户端调用的库&#xff0c;名为prpc&#xff0c;github地址&#xff1a;prpc&#xff0c;该库是我公司根据最佳实践总结开发出来的&am…

【C++进阶之路】类和对象(上)

文章目录 一.面向对象和面向过程二.类的引入——结构体三.类的定义1.类定义的两种方式在类里面定义函数在类外定义函数——类域 2.访问限定符3.封装——面向对象的三大特性4.类的实例化 四.类对象模型求一个类的大小 五.this指针基本认识代码解读 一.面向对象和面向过程 面向对…

【移动端网页布局】流式布局案例 ③ ( 实现搜索栏功能 | 伪元素选择器 | 子绝父相 | 外边距塌陷处理 | 二倍精灵图处理方案 )

文章目录 一、搜索栏样式及核心要点1、实现效果2、自动伸缩搜索栏实现3、搜索栏父容器设置4、搜索栏左右两侧的按钮盒子5、搜索栏盒子6、二倍精灵图处理方案 二、完整代码示例1、HTML 标签结构2、CSS 样式3、展示效果 一、搜索栏样式及核心要点 1、实现效果 上一篇博客中 , 完成…

2022年职业教育技能大赛网络安全 linux系统渗透提权

B-10&#xff1a;Linux 系统渗透提权 任务环境说明&#xff1a; ✓ 服务器场景&#xff1a;Server2202&#xff08;关闭链接&#xff09; ✓ 用户名&#xff1a;hacker 密码&#xff1a;123456 使用渗透机对服务器信息收集&#xff0c;并将服务器中 SSH 服务端口号作为 flag…

API 接口自动化测试的基本原理及实战教程

目录 常用API接口协议介绍 Http协议接口请求的介绍 HTTPS协议 SMTP协议 SNMP协议 FTP协议 API 接口自动化测试的基本原理 常用API接口协议介绍 HTTP协议 超文本传输协议 它是用来在Internet上传送超文本的传送协议&#xff0c;运行在TCP/IP协议族之上&#xff0c;它可…

Docker file镜像

目录 一、Docker镜像的创建 1、基于现有镜像创建 2、基于本地模版创建 3、基于Dockerfile创建 1、联合文件系统&#xff08;UnionFS&#xff09; ​编辑2、镜像加载原理 3、Dockerfile 4、Docker 镜像结构的分层 二、Dockerfile 操作常用的指令 &#xff08;1&#xf…

把树莓派改造成NAT软路由器

本文目录 1、查看网卡情况2、配置静态ip3、配置IP转发和SNAT功能3.1、开启Linux的报文转发功能 3.2、开启SNAT功能4、进阶配置4.1、如果WAN口(上行接口)eth0是动态分配的IP地址4.2、在LAN口上&#xff0c;给下游主机开启自动分配IP地址功能4.3、永久保存iptables, SNAT配置&…

Redis学习笔记02(主从同步,哨兵,哨兵集群)

数据同步&#xff1a;主从数据库如何保障数据一致性 redis具有高可靠性&#xff1a;1.数据尽量减少丢失&#xff08;AOF和RDB来保障&#xff09; 2.服务尽量减少中断.第二点通过增加冗余副本来保障。 读写分离&#xff1a; 减少保障数据一致性的开销。修改操作只会在主库上进…

《花雕学AI》解锁ChatGPT潜力!183个最佳提示语,助您充分利用人工智能技术

随着机器学习和自然语言处理技术的不断进步&#xff0c;人工智能在各个领域的应用越来越广泛。ChatGPT&#xff08;Generative Pre-trained Transformer&#xff09;是一个强大的自然语言生成模型&#xff0c;它可以帮助我们生成高质量的文本内容。本文为你列举了 183 种可能的…

【51单片机】DS1302时钟模块

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Waiting For Love】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f354;效果 &#x1f354;代码 main.…