文章目录
  • 存在问题
  • 解决方案
  • 结构流程
  • 算法流程
  • 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所解决的问题:

  1. 遮挡目标
    低置信度的检测框有时确实可以指示目标的存在,尤其是在目标被部分遮挡或者遮挡物很大时。丢弃这些低置信度的检测框可能会导致漏检目标,因为算法无法正确地识别被遮挡的目标。
  2. 轨迹断裂
    移除低置信度的检测框可能导致轨迹的不连续性,因为目标在一帧中被识别出来,在另一帧中却被移除了。这可能会导致跟踪算法无法正确地维持目标的标识符,从而产生碎片化的轨迹,使跟踪结果不连贯。

解决方案

因此,ByteTrack采用高低检测框进行分级匹配,从而有效的解决上述问题,此外,ByteTrack算法是一种基于目标检测的追踪算法,和其他非ReID的算法一样,仅仅使用目标追踪所得到的bbox进行追踪,因此,其与Sort算法流程一致,使用卡尔曼滤波预测边界框,然后使用匈牙利算法进行目标和轨迹间的匹配。故而,其具有以下特点:

  1. 没有使用ReID特征计算外观相似度(DeepSort算法使用外观特征,因此其速度慢一些)
  2. 非深度方法,不需要训练(同上,DeepSort算法需要训练一个特征提取网络)
  3. 利用高分框和低分框之间的区别和匹配,有效解决遮挡问题(这是ByteTrack的一个创新点)

那么,其相较于Sort算法又有哪些改变呢(下图红色框部分)?

ByteTrack算法的最大创新点就是对低分框的使用,作者认为低分框可能是对物体遮挡时产生的框,直接将低分框抛弃会影响性能,所以作者使用低分框对追踪算法进行了二次匹配,有效优化了追踪过程中因为遮挡造成换id的问题:

结构流程

ByteTrack的流程图结构如下:

ultralytics框架实现ByteTrack目标追踪算法_算法

算法流程

ByteTrack算法框架流程如下:

ultralytics框架实现ByteTrack目标追踪算法_算法_02

DeBug流程

那么,在ultralytics框架中是如何实现的呢?我们通过DeBug的形式来看一下:

ultralytics\cfg\trackers\bytetrack.yaml

关于bytetrack的相关配置参数如下:

tracker_type: bytetrack # tracker type, ['botsort', 'bytetrack']
track_high_thresh: 0.5 # threshold for the first association
track_low_thresh: 0.1 # threshold for the second association
new_track_thresh: 0.6 # threshold for init new track if the detection does not match any tracks
track_buffer: 30 # buffer to calculate the time when to remove tracks
match_thresh: 0.8 # threshold for matching tracks
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
ultralytics\ultralytics\trackers\track.py的on_predict_start方法

随后,根据上述参数完成Tracker的初始化:

tracker = check_yaml(predictor.args.tracker)#读取配置文件
cfg = IterableSimpleNamespace(**yaml_load(tracker))

for _ in range(predictor.dataset.bs):
        tracker = TRACKER_MAP[cfg.tracker_type](args=cfg, frame_rate=30)
        trackers.append(tracker)
        if predictor.dataset.mode != "stream":  # only need one tracker for other modes.
            break
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

ultralytics框架实现ByteTrack目标追踪算法_ci_03

ultralytics\engine\predictor.py的stream_inference方法

上述的过程是完成了track的初始化,将video转换为dataset,进行检测: