Bytetrack学习笔记

ByteTrack是字节跳动的MOT算法,通过多次匹配处理遮挡,不依赖ReID特征。它利用检测得分和位置重合度维持跟踪连续性。与DeepSORT相比,ByteTrack简化了模型,适合移动端部署。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

ByteTrack是字节跳动发布的一个MOT跟踪算法(“MOT”是“Multi-Object Tracking”)。先前的MOT算法一般在完成当前帧的目标检测后只会保留置信度比较大的检测框用于进行目标跟踪,比如图中置信度为0.9和0.8的目标框。而在BYTE中,作者保留了所有的检测框(图中的所有四个黄色的检测框)并且通过阈值将它们分成了两份

ByteTrack 是基于 tracking-by-detection 范式(首先使用一个深度学习网络(如YOLO系列)进行目标检测,然后使用一个关联算法(如卡尔曼滤波和匈牙利算法)来建立目标之间的关联,从而实现目标的跟踪)的跟踪方法。ByteTrack中用多次匹配的方法,首先将得分较高的目标框与历史轨迹相匹配,然后将得分较低的目标框与与第一次没有匹配上的轨迹匹配,用于检测目标遮挡的情形。相对于deepsort,直接减少了ReID模型,更加方便移动端的部署。

缺点:由于ByteTrack 没有采用外表特征进行匹配,所以跟踪的效果非常依赖检测的效果,也就是说如果检测器的效果很好,跟踪也会取得不错的效果,但是如果检测的效果不好,那么会严重影响跟踪的效果。

为什么没有使用ReID 特征? 作者解释:第一点是为了尽可能做到简单高速,第二点是我们发现在检测结果足够好的情况下,卡尔曼滤波的预测准确性非常高,能够代替 ReID 进行物体间的长时刻关联。实验中也发现加入 ReID 对跟踪结果没有提升。

算法原理

ByteTrack的工作原理是遮挡往往随着检测得分由高到低的缓慢降低,被遮挡物体在被遮挡之前是可视物体,检测分数较高,建立轨迹;当物体被遮挡时,通过检测框与轨迹的位置重合度就能把遮挡的物体从低分框中挖掘出来,保持轨迹的连续性

跟踪步骤流程:

  1. 对于所有由检测器得到检测框信息,将他们分为两部分,检测得分高于阈值Thigh的归类为Dhigh,检测得分低于阈值Tlow归为Dlow;

  2. 对于轨迹集合T中的所有轨迹,利用KF预测其在当前帧中的坐标

  3. 第一次匹配:对得分高的检测框Dhigh和所有轨迹T进行匹配关联,计算(当前帧中检测)框与(轨迹T进行KF滤波在当前帧中位置)两者进行iou计算,然后用匈牙利算法进行匹配;对于IOU小于0.2的拒绝匹配,未匹配的检测框存放在Dremain;未匹配成功的轨迹T,存放于Tremain

  4. 第二次匹配:对于低得分的检测框Dlow(例如在当前帧受到严重遮挡导致得分下降的物体)和剩余轨迹Tremain进行二次匹配,方法同第一次匹配

    两次均未匹配成功的轨迹存放于Tre-remain,未匹配的低分检测框删除

  5. 对于Tre-remain中的轨迹,认为是暂时丢失目标,将其放入Tcost,如果Tcost中的轨迹存在超过一定时间(30帧)则从T中删除,否则继续保存。(如果后期匹配到,也会从Tcost中删除,对于Dremain中检测如果得分高于E,且存活超过两帧,则初始化为新的轨迹)。

下面是第一次匹配的可视化图
在这里插入图片描述下面是第二次匹配的可视化图
在这里插入图片描述
作者表示,对于低置信度的检测框,由于目标往往处于严重遮挡和严重运动模糊的状态,所以外观相似度特征(比如ReID)非常不可靠,而相比较而言IoU匹配是更佳的选择,鉴于此,在关联2中,作者仅仅只使用了IoU,而并未引入外观相似度。

### ByteTrack 算法工作原理详解 #### 1. 概述 ByteTrack 是一个多目标跟踪 (MOT) 算法,其核心在于 BYTE 方法。该方法允许将任意检测算法的结果作为输入来执行跟踪操作,这使得 ByteTrack 在实际应用中更加灵活和简便[^1]。 #### 2. 主要组件 ByteTrack 的实现主要依赖以下几个关键模块: - **检测器**:负责提供每一帧图像中的物体位置信息。 - **特征提取器**:用于获取每个检测框对应的外观描述符。 - **匹配机制**:通过计算代价矩阵并求解指派问题来进行轨迹关联。 - **状态管理**:维护各个目标的状态(激活/失活),处理新出现的目标以及丢失后的重新识别。 #### 3. 匹配过程 在每一步迭代过程中,ByteTrack 需要完成当前时刻检测到的对象与已有轨迹之间的最佳匹配。具体来说,就是构建一个表示候选对象间相似度的代价矩阵 `cost_matrix` ,并通过调用 `lap.lapjv()` 函数寻找最优分配方案[^3]。 ```python import numpy as np from scipy.optimize import linear_sum_assignment as lapjv def match_detections_to_tracks(detections, tracks, thresh): """ 将检测结果与现有轨迹进行匹配 参数: detections: 当前帧的所有检测框列表 tracks: 前一帧已有的活动轨迹集合 thresh: 成本阈值 返回: matches: 对应关系数组 """ if not detections or not tracks: return [] # 计算代价矩阵 cost_matrix = compute_cost_matrix(detections, tracks) # 使用匈牙利算法解决线性分配问题 row_ind, col_ind = lapjv(-np.array(cost_matrix)) # 获取满足条件的成本小于等于设定阈值的索引对 matches = [(row_ind[i], i) for i in range(len(row_ind)) if cost_matrix[row_ind[i]][i] <= thresh] return matches ``` 上述代码片段展示了如何利用 `scipy.optimize.linear_sum_assignment` 来代替原始论文提到的 `lap.lapjv` 实现相同功能。这里采用负数形式是因为默认情况下此函数找的是最大权匹配而不是最小化成本。 #### 4. 轨迹更新逻辑 一旦完成了匹配步骤之后,就需要依据得到的结果调整各条轨迹的状态。对于成功找到对应项的老轨迹而言,则继续沿用之前的 ID;而对于未能被正确关联上的情况则需创建新的轨迹实例或将旧有未确认轨迹标记为失效等待进一步验证。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值