整体步骤
-
初始化ByteTrack跟踪器
- 初始化
frame_id
=0、max_time_lost
=30
- 初始化
-
获取视觉检测结果,使用
std::vector<Object> objects
代表
-
对检测结果进行推理
-
参数与设置
-
跟踪器记录帧数,帧数:第X帧图片,X为帧数
-
默认参数设置:跟踪阈值:0.5;高阈值:0.6;匹配阈值:0.8
-
-
对于初始帧的推理跟踪(第一帧检测到目标)
-
对每个检测结果计算对应的一个跟踪状态
STrack
,该跟踪状态包含label、rect框、置信度 -
跟踪结果滤波:将检测结果中置信度小于跟踪阈值的,舍弃;置信度大于跟踪阈值的,保留,记录在
detections
-
在
detections
中置信度大于高阈值的检测目标作为跟踪目标,进行激活-
按照
detections
中检测目标的数量,进行track_id
的赋值。例如,detections
中有3个目标,则track_id
分别赋值1,2,3 -
对
uuid
进行赋值,uuid
为随机生成的数字,也是跟踪目标的身份信息 -
当前目标的跟踪状态设置为
**Tracked**
** 状态** -
该目标的状态设置为
**activateed**
** 状态** -
计算该跟踪目标在卡尔曼滤波中的均值和协方差
-
-
将所有的跟踪目标直接进行发布
-
PS:如果出现一直没有输出的情况,绝大部分都是因为检测的置信度小于高阈值,在如下部分修改
-
-
之后检测到目标(第二帧极其以后检测到目标)
-
跟踪结果滤波:将检测结果中置信度小于跟踪阈值的,添加到低置信度
detections_low
;置信度大于跟踪阈值的,添加到高置信度目标detections
-
对上一时刻跟踪目标进行卡尔曼预测,获得当前时刻跟踪目标位置的预测值,之后一系列的操作都使用的是跟踪目标的预测值信息
-
计算跟踪目标track与检测目标detection之间的IOU代价矩阵,代价矩阵中的每个元素为[1 - IOU(track, detection)],如下所示,IOU越大,代价元素越小
-
应用lapjv算法实现跟踪目标与检测目标的最佳匹配,获得三个矩阵:匹配成功的矩阵matchs,未匹配成功的跟踪目标u_track,未匹配成功的检测目标u_detection
- 匹配阈值设置为0.8
-
对匹配成功的目标
-
如果之前一直跟踪的话,进行跟踪目标更新
-
跟踪目标的跟踪长度+1
-
更新卡尔曼的参数、目标状态改为
activated
-
与上述跟踪目标激活操作基本一致,只是跟踪目标的跟踪长度+1
-
-
如果之前跟踪出现丢失的话,进行跟踪目标的重新激活
- 与上述操作基本一样,只不过跟踪目标的跟踪长度重置
-
-
对未匹配成功的跟踪目标u_track而言,需要将它与低置信度目标
**detections_low**
** **重新进行关联(关联操作与第3、4步相同),此时的匹配参数设置为0.5-
如果匹配成功,对跟踪目标进行更新
-
对于未匹配成功的跟踪目标,保留该跟踪目标,但是将目标的跟踪状态设置为
**Lost**
** 状态**
-
-
对未匹配成功的检测目标u_detection(高置信度检测目标),激活该检测目标对应的跟踪目标
-
当未匹配成功的跟踪目标有**30帧没有匹配成功(max_lost_time)**的话,则删除该跟踪目标
-
-
总结:
步骤总结
-
准备条件:取某一时刻的跟踪目标,则跟踪目标中分为两种状态:
Tracked
和Lost
状态。检测结果根据置信度的高低,分为高置信度和低置信度目标。 -
第一次关联:将高置信度检测目标与跟踪目标进行匹配
-
如果匹配成功,则依据匹配成功的检测目标对跟踪目标进行状态更新
-
目标跟踪状态为
Tracked
时,进行目标数据更新 -
目标跟踪状态为
Lost
时,进行目标的重新激活
-
-
对未匹配的高置信度检测目标,生成新的跟踪目标,进行跟踪目标激活
-
对未匹配的跟踪目标进行第二次关联
-
-
第二次关联:将未匹配成功的跟踪目标与低置信度检测目标进行匹配
-
如果匹配成功,则依据匹配成功的检测目标对跟踪目标进行状态更新
-
目标跟踪状态为
Tracked
时,进行目标数据更新 -
目标跟踪状态为
Lost
时,进行目标的重新激活
-
-
对未匹配的低置信度检测目标,舍弃
-
对未匹配的跟踪目标进行保留,最多保留30帧,即30帧内一直没有匹配,则删除该跟踪目标
-
PS:
代码中目标状态始终为activated
,不存在由非激活到激活状态的切换