ByteTrack论文解读


论文地址: https://arxiv.org/abs/2110.06864
代码地址: https://github.com/ifzhang/ByteTrack

摘要

MOT任务旨在评估视频中的目标边界框和身份信息。大多数方法是选项将那些检测置信度高于某一阈值的边界框进行关联,并且直接丢弃那些由于遮挡等问题产生的低置信度的边界框。这带来了不可忽略的真实物体丢失和碎片轨迹。为此ByteTrack提出了一个考虑所有边界框的关联方法。对于低置信度的边界框,利用他们与之前的轨迹进行之间进行相似度对比,实现恢复真实目标和过滤背景检测。当应用于其他多种不同的追踪器上时,IDF1都有明显的提升。并且该论文也是使得MOT任务中MOTA首次突破了80的。

直接贴图,下图为各个追踪器的MOTA-IDF1-FPS的对比图,可以看出ByteTrack的优越性,各种指标均达到了最高。
在这里插入图片描述

介绍

ByteTrack描述的现象正如下图所示,在帧 t 1 t_1 t1时刻,模型初始化了三个高置信度的检测框作为追踪轨迹,但是在 t 3 t_3 t3 t 3 t_3 t3帧时由于遮挡问题,导致这两个真实目标的检测框的置信度被严重降低。如果对于筛选高置信度的检测框的方法,那么这些真实目标就直接被丢弃了,这也就导致了目标的丢失,产生了轨迹的断裂。

实时上ByteTrack思考的就是如何将这些低置信度的目标筛选回来。本文中ByteTrack选择定义低置信度检测目标与轨迹的相似度作为判断的线索(这里主要还是位置信息)。如下图(c)中,红色目标轨迹存在,则导致后面的黄色目标能够被查询到。但是背景目标由于找不到与之前匹配的轨迹,则会被丢弃。
在这里插入图片描述
作者将他们的关联方法命名为BYTE,具体做法如下:
首先,基于运动相似度来实现高得分的检测框与轨迹的匹配,具体的使用卡尔曼滤波来预测目标在下一帧中的位置信息,运动相似度的计算由当前帧的检测目标框和卡尔曼滤波预测边界框之间的IoU体现,实现效果如图上图(b)。
然后,实现未匹配轨迹的第二次匹配(红色虚线边界框和低置信度边界框之间的匹配)。匹配成功后如上图(c)效果,真实目标过滤下来,背景目标丢弃。

最终模型的确定,ByteTrack选择了以YOLOX为检测器获取检测信息,BYTE的检测关联方法。并且实验中,他放弃了ReID分支(外貌特征),仅用简单的运动线索,就能很好的处理遮挡与关联问题。

BYTE关联方法

这一节主要介绍BYTE的关联实现,步骤如下伪代码算法图。
在这里插入图片描述
首先,算法的输入由一个视频片段 V V V,相应的还有一个检测器 D e t Det Det和一个卡尔曼滤波器 K F KF KF。同时设定三个阈值 τ high  , τ low  \tau_{\text {high }}, \tau_{\text {low }} τhigh ,τlow  ϵ \epsilon ϵ。前两个为检测的分数阈值,后一个为追踪得分阈值。BYTE的最终输出为视频的轨迹 T \mathcal{T} T,其中的每条轨迹包括目标的检测框和身份。

(3-13行):对于所有的由检测器产生的检测框和得分信息,将他们分为两部分,检测得分高于阈值 τ high  \tau_{\text {high }} τhigh 的归类为 D high  \mathcal{D}_{\text {high }} Dhigh  ,同时检测得分高于阈值 τ low  \tau_{\text {low }} τlow 且低于阈值 τ high  \tau_{\text {high }} τhigh 的归类为 D low  \mathcal{D}_{\text {low }} Dlow 

(14-16行):对于轨迹集合 T \mathcal{T} T中的所有轨迹,利用卡尔曼滤波 K F KF KF预测其在当前帧中的坐标。

(17-19行):首先对高得分的检测 D high  \mathcal{D}_{\text {high }} Dhigh 和所有轨迹 T \mathcal{T} T进行第一次关联。相似度由模型预测和滤波预测的检测框之间的IoU计算,然后利用匈牙利算法进行匹配。对于相似度小于 0.2 0.2 0.2的拒绝匹配。对于未匹配的检测框,存放于 D r e m a i n D_{remain} Dremain,未匹配成功的轨迹,存放于 T r e m a i n \mathcal{T}_{remain} Tremain。(如果需要,这里也可以加入外貌特征的匹配,如DeepSort。)

(20-21行):对于低得分的检测框 D l o w D_{low} Dlow和剩余轨迹 T r e m a i n \mathcal{T}_{remain} Tremain进行第二次的匹配,未匹配成功的轨迹存放于 T r e − r e m a i n \mathcal{T}_{re-remain} Treremain,未匹配的低的分的检测直接删除。(这里作者认为由于遮挡,运动模糊等问题,会造成外貌特征的不准确,所以也依旧使用IoU作为相似度。)

(22行):对于 T r e − r e m a i n \mathcal{T}_{re-remain} Treremain中的轨迹,认为是暂时丢失了目标,将其放入 T l o s t \mathcal{T}_{lost} Tlost,如果 T l o s t \mathcal{T}_{lost} Tlost中轨迹存在超过一定时间(30帧),则从T中删除,否则继续在 T \mathcal{T} T中保存。(如果后期匹配到,也会从 T l o s t \mathcal{T}_{lost} Tlost中将其删除。)

(23-27行):对于 D r e m a i n D_{remain} Dremain中的检测,如果检测得分高于 ϵ \epsilon ϵ且存活超过两帧,则初始化为新的轨迹。

对于每帧的输出,只会输出 T \mathcal{T} T关于当前帧的边界框和对应的ID。

ByteTrack

整体模型的检测使用的是YOLOX,关联使用的是BYTE关联方法。
骨干网络和YOLOV5相同,骨干网络后有两个解耦头,一个用于回归,一个用于分类。作者在回归头中加入一个额外的IoU注意分支,用来预测预测框和GT框之间的IoU。回归头每个位置的直接预测4个值,即网格左上角的两个偏移量,以及预测框的高度和宽度。回归头由GIoU损失监督,分类头和IoU头由二元交叉熵损失监督。

具体的样本分配策略以及训练标签构建等这里就不介绍了,详细看论文或者代码吧。

实验结果

1.相同模型,不同的关联方法的对比:
在这里插入图片描述
2. SORT和BYTE匹配方法在不同检测阈值下的MOTA和IDF1效果对比。
在这里插入图片描述
3.可以看出,BYTE关联在在对低置信度的检测处理时,引入的TP还是很多的,也证明了这么处理的有效性。
在这里插入图片描述
4.MOT17上不同模型使用BYTE关联的效果对比,在不同程度上有涨点。
在这里插入图片描述

5.输入尺寸的消融实验。
在这里插入图片描述
6.数据集的消融实验。

在这里插入图片描述
7.后处理轨迹差值的消融。(差值公式为 B t = B t 1 + ( B t 2 − B t 1 ) t − t 1 t 2 − t 1 B_{t}=B_{t_{1}}+\left(B_{t_{2}}-B_{t_{1}}\right) \frac{t-t_{1}}{t_{2}-t_{1}} Bt=Bt1+(Bt2Bt1)t2t1tt1
在这里插入图片描述
8.可视化效果。
在这里插入图片描述
9.MOT17私有检测结果对比。
在这里插入图片描述
10.MOT20测试集对比。
在这里插入图片描述

代码部署

在这里推荐一个ByteTrack的部署,大佬写的很详细了。

### ByteTrack 代码解析与实现原理 #### 一、ByteTrack 的核心概念 ByteTrack 是一种高效的目标跟踪算法,在多目标跟踪 (MOT) 领域表现出色。该方法通过关联每一个检测框来完成对象的持续追踪,不仅提高了准确性还增强了实时性能[^2]。 #### 二、ByteTrack 主要组成部分 1. **检测模块** 使用强大的物体检测器(如 YOLOX 或其他高性能模型),对每一帧图像中的所有可能的对象实例进行定位并分类。这一步骤提供了用于后续处理的基础数据——边界框及其对应的置信度分数和类别标签[^3]。 2. **卡尔曼滤波预测** 对于已经存在于轨迹池内的各个被跟踪实体,利用卡尔曼滤波器估计其下一时刻可能出现的位置。这种基于运动学特性的预估有助于减少因遮挡或其他因素造成的短暂丢失情况下的误判率[^1]。 3. **匹配策略** 将当前帧新产生的候选区域同已有轨迹末端位置做对比分析,采用匈牙利算法解决最优分配问题;当两者间距离满足一定条件时即认为它们属于同一目标的不同观测结果,并更新相应记录。此外,对于长时间未见重新出现的老面孔,则会尝试建立新的连接关系以恢复连续性。 4. **低龄轨道管理机制** 设定合理的生命周期阈值,及时清除那些长期无法获得有效验证的支持证据而逐渐消亡的小片段路径,从而保持整个系统的健康稳定运行状态。这一措施可以防止内存泄漏同时也降低了计算复杂度。 ```python def match_detections_with_tracks(detections, tracks): """Match detections with existing tracks using IoU and embeddings.""" iou_matrix = bbox_iou(detections[:, :4].unsqueeze(1), torch.cat([track.tlwh_to_tlbr() for track in tracks]).unsqueeze(0)) cost_matrix = -iou_matrix row_ind, col_ind = linear_sum_assignment(cost_matrix.cpu().numpy()) matches = [] unmatched_detections = list(range(len(detections))) unmatched_tracks = list(range(len(tracks))) for r, c in zip(row_ind, col_ind): if iou_matrix[r, c] >= MIN_IOU_THRESHOLD: matches.append((r, c)) unmatched_detections.remove(r) unmatched_tracks.remove(c) return matches, unmatched_detections, unmatched_tracks ``` 上述 Python 函数展示了如何使用 IOU 和线性指派算法来进行检测框与现有轨迹之间的最佳配对过程。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值