文章目录
- 存在问题
- 解决方案
- 结构流程
- 算法流程
- DeBug流程
- ultralytics\cfg\trackers\bytetrack.yaml
- ultralytics\ultralytics\trackers\track.py的on_predict_start方法
- ultralytics\engine\predictor.py的stream_inference方法
- 第一帧处理结果
- 第二帧处理结果
- ultralytics\ultralytics\trackers\track.py的on_predict_postprocess_end方法
- 第一帧图像轨迹结果
- 第二帧图像轨迹结果
- 第三帧图像轨迹结果
- ultralytics\trackers\byte_tracker.py的update方法
- 第一帧轨迹更新结果
- 第二帧轨迹跟踪结果
- 高置信度匹配结果
- 算法流程
- 一、 对追踪轨迹和边界框进行分类
- 二、对轨迹进行第一次追踪(仅针对激活状态的轨迹的高分匹配)
- 三、对轨迹进行第二次追踪(仅针对激活状态的轨迹的低分匹配)
- 四、对未激活状态的轨迹进行追踪
- 五、新建轨迹
- 六、返回结果
在
ultralytics
框架中,提供了两种用于目标追踪的算法,分别是
ByteTrack
算法与
Botsort
算法,这两种算法都是在Sort算法的基础上改进的,今天,我们学习一下
ByteTrack
算法。
存在问题
首先,我们看下ByteTrack
所解决的问题:
- 遮挡目标:
低置信度的检测框有时确实可以指示目标的存在,尤其是在目标被部分遮挡或者遮挡物很大时。丢弃这些低置信度的检测框可能会导致漏检目标,因为算法无法正确地识别被遮挡的目标。 - 轨迹断裂:
移除低置信度的检测框可能导致轨迹的不连续性,因为目标在一帧中被识别出来,在另一帧中却被移除了。这可能会导致跟踪算法无法正确地维持目标的标识符,从而产生碎片化的轨迹,使跟踪结果不连贯。
解决方案
因此,ByteTrack采用高低检测框进行分级匹配,从而有效的解决上述问题,此外,ByteTrack
算法是一种基于目标检测的追踪算法,和其他非ReID的算法一样,仅仅使用目标追踪所得到的bbox
进行追踪,因此,其与Sort
算法流程一致,使用卡尔曼滤波预测边界框,然后使用匈牙利算法进行目标和轨迹间的匹配。故而,其具有以下特点:
- 没有使用
ReID
特征计算外观相似度(DeepSort
算法使用外观特征,因此其速度慢一些) - 非深度方法,不需要训练(同上,
DeepSort
算法需要训练一个特征提取网络) - 利用高分框和低分框之间的区别和匹配,有效解决遮挡问题(这是
ByteTrack
的一个创新点)
那么,其相较于Sort
算法又有哪些改变呢(下图红色框部分)?
ByteTrack
算法的最大创新点就是对低分框的使用,作者认为低分框可能是对物体遮挡时产生的框,直接将低分框抛弃会影响性能,所以作者使用低分框对追踪算法进行了二次匹配,有效优化了追踪过程中因为遮挡造成换id
的问题:
结构流程
ByteTrack的流程图结构如下:
算法流程
ByteTrack算法框架流程如下:
DeBug流程
那么,在ultralytics
框架中是如何实现的呢?我们通过DeBug
的形式来看一下:
ultralytics\cfg\trackers\bytetrack.yaml
关于bytetrack的相关配置参数如下:
ultralytics\ultralytics\trackers\track.py的on_predict_start方法
随后,根据上述参数完成Tracker的初始化:
ultralytics\engine\predictor.py的stream_inference方法
上述的过程是完成了track的初始化,将video转换为dataset,进行检测: