ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读

news2025/2/24 6:06:44

ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读

文章目录

  • ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读
    • ByteTrack
    • ByteTrack算法简介
    • ByteTrack算法流程
      • ByteTrack算法描述
        • 一:对检测框进行分类
        • 二:对轨迹进行第一次跟踪
        • 三:对轨迹进行第二次追踪
        • 四:对未激活状态的轨迹进行追踪
        • 五:创建新轨迹
      • ByteTrack伪代码描述
        • 第一部分:
        • 第二部分:
        • 第三部分:
        • 第四部分:
        • 第五部分:
        • 第六部分:
        • 算法总览:
    • 实验效果
        • MOT17:
        • MOT20:
        • HiEve
    • 借鉴来源:

ByteTrack

论文标题:ByteTrack: Multi-Object Tracking by Associating Every Detection Box
论文地址:https://arxiv.org/pdf/2110.06864.pdf
论文源码:https://github.com/ifzhang/ByteTrack
论文发表:ECCV2022

ByteTrack算法简介

   ByteTrack是一种基于检测的多目标跟踪算法。和其他的非Re-id算法一样,byteTrack仅使用目标检测得到的bounding box进行跟踪,通过卡尔曼滤波器使用当前帧的轨迹,来预测出现下一帧中轨迹可能存在的地方,使用预测框在下一帧中显示出来。在将检测的结果和预测的结果进行数据关联。而本文的主要创新点就在数据关联上。
  本文主要的创新点就在于在对低置信度检测框的使用。之前的一些基于检测范式的多目标跟踪算法更多的只是会使用高置信度的检测框来进行数据的关联,而对于低置信度的检测框则直接简单的进行抛弃,这样做是不合理的,因为低置信度有时也可以表明物体的存在,例如当遮挡出现的时候。那么滤除这些目标就会给MOT带来不可逆转的误差,并带来不可忽略的漏检和碎片轨迹。
  接下来我们通过论文中作者给的例子来说明只是用高分置信框带来的问题以及同时使用高分置信框和低分置信框的效果。
示例图
  通过上图的a组和b组图片可知,在 t 1 t_1 t1帧的时候,我们检测到4个检测框,并同时赋予置信度分数,然后初始化了3个跟踪轨迹,如b组图片中显示的绿色、红色、蓝色框,因为他们的检测框的置信度都高于0.5。那么当来到 t 2 t_2 t2帧的时候,遮挡出现,此时红色跟踪框对应的目标框的置信度从0.8 ->0.4,然后从0.4 -> 0.1。此时如果使用阈值化机制来消除这些检测框的话,那么就如b组图片中的 t 2 , t 3 t_2,t_3 t2,t3帧中所示,因为消除了低置信度的检测框,从而b组中的红色的跟踪轨迹也随之消失。那么可能会有小伙伴想,既然只使用高置信度的检测框会有如此问题,那么我们干脆把所有能够检测到的检测框全部用上,也就是考虑到每一个检测框,但是因为检测器存在误检现象,这样不加处理直接使用的话会导致引入更多的假阳性,例如上图中a组中 t 3 t_3 t3 帧中最右边的检测框。
  那么本文做的创新点就是不光使用高置信度的检测框来进行轨迹的匹配,同时也使用低置信度的检测框,通过运动模型的预测框将低置信度的检测框和轨迹进行匹配。从而正确的恢复对象,同时,背景检测框被移除掉,因为他们没有匹配的轨迹。

ByteTrack算法流程

  这里分成两部分来描述,一种是先使用语言描述算法流程,第二部分是通过论文中给定的伪代码在来串联一边算法流程。

ByteTrack算法描述

  算法的主要思路就是创建跟踪的轨迹,然后使用卡尔曼滤波器根据根据上一帧的状态,来预测出当前帧中的预测框,在与当前帧中检测到的每一个检测框进行匹配,以此进行,形成完整的轨迹。
  相关追踪轨迹状态:

  • 激活状态: 已追踪两帧以上的目标框(包括第一帧时目标框新建的轨迹)
  • 未激活状态: 在视频帧中出现新的轨迹,但是还没有匹配到轨迹的第二点
  • 新轨迹: 新生成的轨迹
  • 已追踪轨迹: 在前一帧中成功追踪到的轨迹
  • 失追轨迹: 在前n帧中失去追踪的轨迹(n<=30)
  • 已删除轨迹: 前n帧中失去追踪的轨迹(n>30)
    在视频的第一帧,此时所有轨迹集合全为空,算法会将对于该帧目标检测的结果作为轨迹,并存储起来。并且在第一帧中设置的轨迹全部是激活状态,而且是已追踪轨迹

  从第二帧开始,算法就会逐步构建出轨迹:

一:对检测框进行分类

  1. 对所有的轨迹分类成激活状态未激活状态。
  2. 对当前帧的所有检测框分成高置信度检测框和低置信度检测框(按照检测框获得的分数进行分类,论文中的阈值是0.5)

二:对轨迹进行第一次跟踪

  1. 将所有的已追踪轨迹失追轨迹合并,称为初步追踪轨迹
  2. 在上一帧匹配结束,构建完轨迹之后,使用给卡尔曼滤波器根据之前的轨迹信息,预测当前帧的轨迹信息,并以预测框的形式在当前帧中显示出来(也就是使用卡尔曼滤波器预测初步追踪轨迹在当前帧的位置和大小)
  3. 计算初步追踪轨迹的预测框和当前帧的中高置信度检测框之间的IOU(交并比)值,获取一个两两之间的IOU的关系损失矩阵。(论文中同样也表明可以使用re-id形式的关联方式,因此可以在FairMOT模型上较好的使用)
  4. 根据IOU损失矩阵,使用匈牙利算法对初步追踪轨迹和当前帧中高置信度的检测框进行匹配,获得三个结果:已匹配的轨迹个检测框,未匹配成功的检测框,以及未匹配成功的轨迹。(匈牙利算法可以根据损失矩阵对两两之间进行一对一的匹配,返回匹配成功和不成功的结果。)
  5. 使用已经成功匹配的当前帧的检测框来更新初步跟踪轨迹。(应该就是将初步追踪轨迹改为当前帧的检测框,但是id不变)

三:对轨迹进行第二次追踪

  1. 找出在第一次匹配中没有匹配成功的轨迹,并筛选出来其中的已追踪轨迹(将失追轨迹去除是因为作者认为低置信度的检测框,不需要去匹配哪些已经失追的轨迹)
  2. 因为上一步中,这些轨迹已经使用了卡尔曼滤波得到了预测框,所以这一步不需要在进行预测。
  3. 计算预测框和低置信度检测框之间的IOU,获得关系损失矩阵
  4. 使用匈牙利算法对轨迹和低置信度的检测框进行匹配。
  5. 使用已经成功匹配的当前帧的低置信度检测框更新跟踪轨迹。
  6. 将此时还没有成功追踪的轨迹标记成失追轨迹(扔给下一帧中去跟踪)

四:对未激活状态的轨迹进行追踪

  1. 找出第一步中当前帧中没有匹配成功的高置信度检测框,并且找到未激活的轨迹
  2. 计算卡尔曼滤波器得到的预测框和当前帧中的高置信度的检测框之间的IOU 。
  3. 使用匈牙利算法对预测框和检测框进行匹配。
  4. 使用已成功匹配的当前帧中高置信度检测框更新跟踪轨迹。
  5. 此时还没有追踪成功的未激活轨迹直接标记成已删除轨迹

  可以发现,作者认为在视频中突然出现目标的可信度并不高,所以对视频中间出现的新轨迹处理比较谨慎。

五:创建新轨迹

  如果在经过第一次和第二次的匹配以及处理未激活状态的轨迹之后,还有没有成功匹配的高置信度的检测框,那么作者就认为这是在视频帧中新出现的目标了,给其分配一个新的轨迹并设置id标签,此时的轨迹就是未激活状态的轨迹(除了第一帧)。那么对于低置信度的检测框则直接丢掉,因为他们的利用价值可能很低很低了。

ByteTrack伪代码描述

  算法的输入为视频帧序列 V V V,目标检测器 D e t Det Det,检测框分数阈值 τ \tau τ。算法的输出为视频的轨迹 T T T,每个轨迹中包含每帧中目标对象的边界框和标识。

第一部分:

目标检测结果分类
  该部分是对当前帧 f k f_k fk中的所有目标进行检测,同时得到目标框和目标的置信度分数。然后根据置信度分数将目标检测的结果分成两类 D l o w , D h i g h D_{low},D_{high} DlowDhigh

第二部分:

卡尔曼滤波预测
  这部分就是使用上一帧的轨迹 T T T,利用卡尔曼滤波器来得到当前帧中预测框的大小和位置。

第三部分:

第一次匹配
  第一次匹配,使用 S i m i l a r i t y # 1 Similarity\#1 Similarity#1来进行对预测框和高置信度的检测框进行匹配。 S i m i l a r i t y # 1 Similarity\#1 Similarity#1可以通过检测框和预测框之间的 I O U IOU IOU或者 R e − i d Re-id Reid特征来计算。然后使用匈牙利算法来完成基于相似度的匹配。在这之后将没有成功检测的高置信度的检测框存入 D r e m a i n D_{remain} Dremain中,将未成功匹配的轨迹存入 T r e m a i n T_{remain} Tremain中。

第四部分:

第二次匹配
  第二次匹配,使用 S i m i l a r i t y # 2 Similarity\#2 Similarity#2来对预测框和低置信度的检测框进行匹配。注意,这里的 S i m i l a r i t y # 2 Similarity\#2 Similarity#2 只能使用 I O U IOU IOU 来进行匹配,不能使用 R e − i d Re-id Reid特征。因为低置信度的检测框,大多出现在遮挡或者运动模型的情况下,那么此时外观特征并不可靠。 然后我们保留没有匹配成功的轨迹,将没有匹配成功的低置信度的检测框简单的丢掉,因为此时将他们视为背景,他们的利用价值已经很低很低了。

第五部分:

删除不匹配的轨迹
  此时还没有匹配的轨迹,我们将其放入 T l o s t T_{lost} Tlost中,作为即将丢掉的轨迹,若在30帧中,轨迹被重新匹配,那么将其从 T l o s t T_{lost} Tlost中取出,否则将其彻底删除。

第六部分:

创建新的轨迹
  如果此时还有没有成功匹配的高置信度的检测框,那么则认为次高置信度检测框表示的目标是新的跟踪对象,给其构建轨迹信息并配置id标签,作为新生的轨迹。

算法总览:

算法逻辑

实验效果

  与其它 S O R T SORT SORT模型进行对比

MOT17:

MOT17上对比

MOT20:

MOT20上对比

HiEve

HiEve上对比

借鉴来源:

本文借鉴了以下几篇博客:
实时目标追踪:ByteTrack算法步骤详解和代码逐行解析
目标跟踪之 MOT 经典算法:ByteTrack 算法原理以及多类别跟踪
ECCV2022 ByteTrack: Multi-Object Tracking by Associating Every Detection Box

本人能力有效,对文章理解可能不够透彻,有问题欢迎指正!

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

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

相关文章

SOA架构的理解

1. SOA概述 SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种在计算机环境中设计、开发、部署和管理离散模型的方法。SOA不是一种新鲜事物&#xff0c;它是在企业内部IT系统重复构建以及效率低下的背景下提出的。在SOA模型中&#x…

Nexus 3 清理docker镜像

该文章提供了一种清理nexus3中存储的docker镜像的一种新思路 查看docker repo 比如你的docker repo名字叫做test-repo&#xff0c;然后在nexus3首页的seatch下面找到docker&#xff0c;点进去随便查看一个已经上传的镜像 记住上面的Name选项&#xff0c;之后要用到 设定清理…

centos7 oracle19c安装||新建用户|| ORA-01012: not logged on

总共分三步 1.下载安装包:里面有一份详细的安装教程 链接&#xff1a;https://pan.baidu.com/s/1Of2a72pNLZ-DDIWKrTQfLw?pwd8NAx 提取码&#xff1a;8NAx 2.安装后,执行初始化:时间较长 /etc/init.d/oracledb_ORCLCDB-19c configure 3.配置环境变量,不配置环境变量,sq…

【Linux快速入门】文件目录操作

文章目录概念1. Linux文件系统概述2. Linux文件目录结构3. Linux文件和目录操作3.1 文件操作3.1.1 创建文件3.1.2 复制文件3.1.3 移动文件3.1.4 删除文件3.1.5 查看文件3.1.6 输出指令3.1.7 >和>>指令3.2 目录操作3.2.1 创建目录3.2.2 复制目录3.2.3 移动目录3.2.4 删…

Lesson 8.3 ID3、C4.5 决策树的建模流程 Lesson 8.4 CART 回归树的建模流程与 sklearn 参数详解

文章目录一、ID3 决策树的基本建模流程二、C4.5 决策树的基本建模流程1. 信息值&#xff08;information value&#xff09;2. C4.5 的连续变量处理方法三、CART 回归树的基本建模流程1. 数据准备2. 生成备选规则3. 挑选规则4. 进行多轮迭代5. 回归树的预测过程四、CART 回归树…

关于推荐系统的详细介绍

简介推荐系统是一种信息过滤系统&#xff0c;能够自动预测用户对特定产品或服务的偏好&#xff0c;并向其提供个性化的推荐。它通常基于用户的历史行为、个人喜好、兴趣和偏好等&#xff0c;通过数据挖掘和机器学习算法&#xff0c;在大数据的支持下生成个性化的推荐内容&#…

智云通CRM:与权力者沟通的策略有哪些?

权力者通常具备两个特点&#xff1a;忙和目标导向 1.忙 权力者都很忙&#xff08;不忙也会装出很忙的样子&#xff09;&#xff0c;时间精力有限&#xff0c;销售人员眼里的大项目在权力者看来很有可能只是他诸多工作中的一项。因此&#xff0c;即使有不满者的引荐&#xff0c;…

ChatGPT露馅了,它明明就是人

让人工智能理解句子成分和语义&#xff0c;这看起来是件不可能的事&#xff0c;看过流浪地球的都知道&#xff0c;那里面的人工智能哪怕发展到2057年&#xff0c;也听不懂比喻和反问。 那最近大火的chatGPT能不能听懂冷笑话呢&#xff1f;它不仅能写代码、论文&#xff0c;居然…

Spring学习——拦截器

拦截器概念 拦截器&#xff08;Interceptor )是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行作用: 在指定的方法调用前后执行预先设定的代码阻止原始方法的执行 拦截器与过滤器区别 归属不同&#xff1a;Filter属于Servlet技术&#xff0…

[oeasy]python0101_尾声_PC_wintel_8080_诸神的黄昏_arm_riscv

尾声 回忆上次内容 回顾了 ibm 使用开放架构 用 pc兼容机 战胜了 dec 小型机apple 个人电脑 触击牺牲打 也破掉了 自己 软硬一体全自主的 金身 借助了 各种 软硬件厂商的 力量 最终完成了 pc架构上 的 大一统 操作系统层面 IBM 计划让 msdos和cp/m 分庭抗礼为什么 最后微软…

NC xml配置文件不能生产java文件

在NC开发过程中&#xff0c;新增、或修改了xml文件&#xff0c;在开发工具eclipse中生成或重新生成Java文件&#xff0c;发现生成不了相对应的Java文件。如下图&#xff0c;选中xml文件后&#xff0c;右键点击SpringXml to Java 这种情况其实一般都是xml配置文件有问题&#…

敏捷项目管理的概念,以及与传统项目管理的区别

较之瀑布等传统项目管理模式&#xff0c;敏捷是“适应性的”&#xff0c;而非“预设性的”。团队采用敏捷项目管理可以提高交付速度、协作效率、以及响应市场变化的能力。在这里向大家详细介绍敏捷项目管理的定义、与传统项目管理的区别&#xff0c;以及一些主流的敏捷项目框架…

下一代ERP系统是什么样的呢?什么是智能化ERP系统?AI能改变ERP系统吗?

下一代ERP系统是什么样的呢&#xff1f;什么是智能化ERP系统&#xff1f;AI能改变ERP系统吗&#xff1f;导读1. 用户体验&#xff1a;2. 作业、分析和智能一体化2.1 ERP之采购管理&#xff1a;2.2 ERP之零售商品管理&#xff1a;2.3 ERP之会计和财务管理3. 系统处理大数据导读 …

嵌入式Linux从入门到精通之第十六节:U-boot分析

简介 u-boot最初是由PPCBoot发展而来的,可以引导多种操作系统、支持多种架构的CPU,它对PowerPC系列处理器的支持最为完善,而操作系统则对Linux系统的支持最好目前已成为Armboot和PPCboot的替代品。 特点: 主要支持操作系统:Linux、NetBSD、 VxWorks、QNX、RTEMS、ARTOS、L…

Vue3分页器(Pagination)

自定义传入&#xff1a; 当前页数&#xff08;current&#xff09;&#xff0c;默认为1每页条数&#xff08;pageSize&#xff09;&#xff0c;默认为10只有一页时是否隐藏分页器&#xff08;hideOnSinglePage&#xff09;&#xff0c;默认为false数据总数&#xff08;total&a…

Java进阶(下篇2)

Java进阶&#xff08;下篇2&#xff09;一、IO流01.File类的使用1.1、File类的实例化1.2、File类的常用方法11.3、File类的常用方法21.4、课后练习02、IO流原理及流的分类2.1、IO流原理2.2、流的分类2.3、IO 流体系03、节点流(或文件流)3.1、FileReader读入数据的基本操作3.2、…

Linux应用学习——多线程

多线程 PART1——线程相关概念 ​ 线程时参与系统调度的最小单位。被包含在进程之中&#xff0c;是进程中的实际运行单位。一个进程可以创建多个线程&#xff0c;多个线程实现并发运行&#xff0c;每个线程执行不同的任务。 线程时最基本的运行单位&#xff0c;而进程不能运行…

顺序表——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是数据结构与算法里面的顺序表啦&#xff0c;在我看来&#xff0c;数据结构总体上是一个抽象的东西&#xff0c;关键还是要多写代码&#xff0c;下面&#xff0c;就让我们进入顺序表的世界吧 线性表 顺序表 线性表 线性表&…

为什么要用VR全景?5个答案告诉你

看中了刚上市的一款新车&#xff0c;再也不用等车展、去4s店才能仔细观赏&#xff0c;点开手机就能“置身”车内近距离观看每一处细节&#xff0c;点击关灯开灯、关门关门&#xff0c;除了摸不到&#xff0c;和在现场几乎没有区别&#xff1b; 准备买房的时候&#xff0c;没人愿…

Git 基础(一)—— Git 的安装及其配置

目录 一、Git 的下载与安装 1、Linux 环境 2、Windows 环境 (1) 下载 Git 安装包 (2) 安装 Git 二、Git 配置 1、配置用户信息 2、查看配置信息 3、Windows 环境下配置文件的位置 一、Git 的下载与安装 1、Linux 环境 在保证网络环境畅通的情况下&#xff0c;直接输…