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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值