在YOLO中进行高效再识别跟踪

在 YOLO、SSD、DETR 等实时物体检测工具中识别物体,一直是监控特定框架区域内各种物体的移动和行动的关键。一些行业,如交通管理、商场、安防和个人防护设备等,都利用这种机制进行跟踪、监控和分析。

但是,此类模型的最大挑战在于锚点框或边界框,当不同的物体覆盖在我们正在追踪的物体上时,锚点框或边界框往往会失去对某个物体的追踪,从而导致某些物体的识别标签发生变化。在本文中,我们将进一步讨论如何在 YOLO 中采用 Re-ID。

物体检测和跟踪是一个多步骤过程

  1. 物体检测:物体检测主要是对帧内的物体进行检测、定位和分类。目前有许多物体检测算法,如 Fast R-CNN、Faster R-CNN、YOLO、Detectron 等。YOLO 针对速度进行了优化,而 Faster R-CNN则偏向于更高的精度。
  2. 唯一 ID 分配:在真实世界的物体跟踪场景中,通常需要跟踪的物体不止一个。因此,在初始帧检测之后,每个物体都将被分配一个唯一的 ID,以便在整个图像或视频序列中使用。ID 管理系统在生成稳健的分析结果、避免重复和支持长期模式识别方面起着至关重要的作用。
  3. 运动跟踪:跟踪器会估算每个独特物体在剩余图像或帧中的位置,从而获得每个重新识别物体的运动轨迹。卡尔曼滤波器和光流等预测跟踪模型通常会结合使用,以考虑临时遮挡或快速运动的情况。

Source – Link

为什么要重新识别?

重新识别(Re-ID)或识别对象在这里将发挥重要作用。在 YOLO 中,重新识别将使我们能够保留被跟踪物体的身份。有几种深度学习方法可以同时实现跟踪和重新识别。重新识别可以在短期内恢复跟踪中丢失的轨迹。通常是通过使用嵌入来比较物体之间的视觉相似性,而嵌入是由处理裁剪过的物体图像的不同模型生成的。然而,这会给管道增加额外的延迟,从而导致实时检测中的延迟或 FPS 率问题。

研究人员通常在大规模的人物或物体 Re-ID 数据集上训练这些嵌入,使他们能够捕捉到精细的细节,如服装纹理、颜色或结构特征,这些细节在姿势和光照发生变化时仍能保持一致。在早期的工作中,有几种深度学习方法将跟踪和 Re-ID 结合在一起。流行的跟踪模型包括 DeepSORT、Norfair、FairMOT、ByteTrack 等。

Source – Link

让我们来讨论一些广泛使用的跟踪方法

1. 一些旧策略

一些老式方法会将每个 ID 及其对应的帧和图片片段存储在本地。然后,系统会根据视觉相似性将 ID 重新分配给特定对象。然而,这种策略会消耗大量时间和内存。此外,由于这种手动重新分配 ID 的逻辑不能很好地处理视角变化、背景杂乱或分辨率下降等问题。它缺乏可扩展或实时系统所需的鲁棒性。

2. 字节跟踪

ByteTrack 的核心理念非常简单。它不是忽略所有低置信度的检测,而是保留非背景低分方框进行第二次关联,从而提高遮挡情况下的轨迹一致性。在初始检测阶段之后,系统会将方框划分为高置信度、低置信度(但非背景)和背景(丢弃)集。

首先,系统使用 IoU 或可选的特征-相似性亲和力将高置信度的方框与活动的和最近丢失的小轨迹进行匹配,并应用匈牙利算法和严格的阈值。然后,系统使用任何未匹配的高置信度检测结果来生成新的轨迹,或将其排成队列进行单帧重试。

在二次检测中,系统会使用较低的阈值将低置信度方框与剩余的小轨迹预测相匹配。这一步骤可恢复因遮挡或外观偏移而导致置信度下降的物体。如果仍有未匹配的小轨迹,系统会在一定时间内将它们移入“丢失”缓冲区,以便在它们再次出现时将其重新纳入。这种通用的两阶段框架可与任何检测器模型(YOLO、Faster-RCNN 等)和任何关联指标无缝集成,以最小的开销提供 50-60 FPS 的速度。

然而,当物体交叉、消失时间较长或外观发生剧烈变化时,ByteTrack 仍然会出现身份切换问题。添加专用的 Re-ID 嵌入网络可以减少这些错误,但代价是每帧需要额外增加 15-25 毫秒,并增加内存使用量。

如果您想参考 ByteTrack GitHub,请点击此处:ByteTrack

Source – Link

3. 深度跟踪

DeepSORT 是对经典 SORT 追踪器的增强,它将深度外观特征与运动和空间线索融合在一起,大大减少了 ID 切换,尤其是在遮挡或突然运动变化的情况下。要了解 DeepSORT 如何建立在 SORT 的基础上,我们需要了解 SORT 的四个核心组件:

  • 检测:每帧对象检测器(如 YOLO、Faster R-CNN)为每个对象输出边界框。
  • 估计:恒定速度卡尔曼滤波器会将每个轨迹的状态(位置和速度)投射到下一帧,一旦发现匹配的检测结果,就会更新其估计值。
  • 数据关联:在预测的轨迹框和新的检测结果之间计算 IOU 成本矩阵;匈牙利算法解决这一分配问题,但需要一个 IOU(最小)阈值来处理简单的重叠和短时间的遮挡。
  • 轨迹创建和删除:不匹配的检测会初始化新的轨迹;缺失检测时间超过用户定义的 Tₗₒₛₜ 帧的轨迹会被终止,重新出现的物体会收到新的 ID。

由于速度快,SORT 可以在现代硬件上实现实时性能,但它完全依赖于运动和空间重叠。这往往会导致当物体交叉、被遮挡或长时间阻塞时,交换物体的身份。为了解决这个问题,DeepSORT 会离线训练一个判别特征嵌入网络(通常使用大规模的人物再识别数据集),为每个检测作物生成 128-D 的外观向量。在关联过程中,DeepSORT 会计算一个综合的亲和力得分,其中包括

  1. 基于运动的距离(来自卡尔曼滤波器的马哈拉诺比斯距离)
  2. 空间 IoU 距离
  3. 嵌入之间的外观余弦距离

由于余弦度量即使在运动线索失效时(如长期闭塞或速度突然变化时)也能保持稳定,因此一旦物体重新出现,DeepSORT 就能正确地重新分配原始轨迹 ID。

其他细节和权衡:

  • 嵌入网络通常会增加约 20-30 毫秒的每帧延迟,并增加 GPU 内存使用量,使吞吐量最多降低 50%。
  • 为了限制计算成本的增长,DeepSORT 会为每个轨迹(如最近 50 帧)维护一个固定长度的最近嵌入图库,但即便如此,在拥挤的场景中,大型图库也会减慢关联速度。
  • 尽管存在开销,DeepSORT 在标准基准(如 MOT17)上的 IDF1 通常比 SORT 提高 15-20 分,这使它成为身份持久性至关重要时的首选解决方案。

Source – Link

4. FairMOT

FairMOT 是一种真正的单镜头多目标跟踪器,它在一个统一的网络中同时执行目标检测和再识别,具有高精度和高效率的特点。当输入图像进入 FairMOT 时,它会通过一个共享主干网,然后分成两个同构分支:检测分支和再识别分支。检测分支采用无锚中心网式头部,下设三个子头部–热力图、方框尺寸 中心偏移

  • Heatmap 头在下采样特征图上精确定位对象的中心。
  • 方框大小头预测每个对象的宽度和高度
  • 中心偏移头可纠正因下采样造成的任何偏差(最多四个像素),确保精确定位。

FairMOT如何工作?

与此同时,Re-ID 分支将相同的中间特征投射到低维嵌入空间,生成可捕捉物体外观的判别特征向量。

Source – Link

Ultralytics重新识别

在开始介绍这种高效再识别策略的变化之前,我们必须先了解 YOLO 和 BotSORT 是如何检索对象级特征的。

什么是BoT-SORT?

BoT-SORT (Robust Associations Multi-Pedestrian Tracking) 由 Aharon人于 2022 年提出,是一种通过检测进行跟踪的框架,它将运动预测和外观建模以及明确的相机运动补偿统一起来,从而在各种挑战性场景中保持稳定的物体识别。它结合了三项关键创新:增强卡尔曼滤波状态GMCIoU-Re-ID 融合。BoT-SORT 在标准 MOT 基准上实现了卓越的跟踪指标。

您可以从这里阅读研究论文。

Source: Link

结构和方法

1. 检测和特征提取

  • Ultralytics YOLOv8 的检测模块会为帧中的每个对象输出边界框、置信度分数和类别标签,作为 BoT-SORT 管道的输入。

2. BOTrack:保持对象状态

  • 每次检测都会产生一个 BOTrack 实例(STrack 的子类),该实例会添加以下内容:
    • 通过对最近 Re-ID 嵌入的 deque 进行指数移动平均来平滑特征
    • 用于外观匹配的 curr_feat smooth_feat 向量。
    • 用于精确运动预测的 eight-dimensional 卡尔曼滤波状态(均值、协方差)。

这种模块化设计还允许混合跟踪系统直接在每个对象实例中嵌入不同的跟踪逻辑(如闭塞恢复或重新激活阈值)。

3. BOTSORT:关联管道

  • BOTSORT 类(BYTETracker 的子类)引入了
    • proximity_thresh appearance_thresh 参数,用于控制 IoU 和嵌入距离。
    • 可选的 Re-ID 编码器,用于在 with_Re-ID=True 时提取外观嵌入。
    • 全局运动补偿(GMC)模块,用于调整摄像机引起的帧间偏移。
  • 距离计算(get_dists)结合了 IoU 距离(matching.io_distance)和归一化嵌入距离(matching.embedding_distance),屏蔽了超过阈值的数据对,并取元素最小值作为最终成本矩阵。
  • 数据关联在此代价矩阵上使用匈牙利算法;未匹配的轨迹可能会在 track_buffer 帧后重新激活(如果外观匹配)或终止。

这种双阈值方法允许针对特定场景进行更灵活的调整,例如,高闭塞(较低的外观阈值)或高运动模糊(较低的 IoU 阈值)。

4. 全局运动补偿(GMC)

  • 全局运动补偿(GMC)利用 OpenCV 的视频稳定 API 计算连续帧之间的同源性,然后扭曲预测的边界框,在匹配前补偿摄像机的运动。
  • GMC 在无人机或手持镜头中尤其有用,因为突然的运动变化可能会破坏追踪的连续性。

5. 增强卡尔曼滤波器

  • 与传统 SORT 的 7 元组不同,BoT-SORT 的卡尔曼滤波器使用 8 元组,用明确的宽度 w 和高度 h 取代了长宽比 a 和比例 s,并将过程噪声和测量噪声协方差调整为 w 和 h 的函数,以获得更稳定的预测。

6. IoU-Re-ID 融合

  • 系统通过应用两个阈值(IoU 和嵌入)来计算关联成本要素。如果任一阈值超过其限制,系统会将成本设为最大值;否则,系统会将成本设为 IoU 距离的最小值和嵌入距离的一半,从而有效地融合运动和外观线索。
  • 这种融合可以实现稳健的匹配,即使其中一个线索(IoU 或嵌入)变得不可靠时也是如此,例如在部分遮挡或受试者服装一致的情况下。

YAML 文件如下:

tracker_type: botsort      # Use BoT‑SORT
track_high_thresh: 0.25    # IoU threshold for first association
track_low_thresh: 0.10     # IoU threshold for second association
new_track_thresh: 0.25     # Confidence threshold to start new tracks
track_buffer: 30           # Frames to wait before deleting lost tracks
match_thresh: 0.80         # Appearance matching threshold
### CLI Example
# Run BoT‑SORT tracking on a video using the default YAML config
yolo track model=yolov8n.pt tracker=botsort.yaml source=path/to/video.mp4 show=True
### Python API Example
from ultralytics import YOLO
from ultralytics.trackers import BOTSORT
# Load a YOLOv8 detection model
model = YOLO('yolov8n.pt')
# Initialize BoT‑SORT with Re-ID support and GMC
args = {
    'with_Re-ID': True,
    'gmc_method': 'homography',
    'proximity_thresh': 0.7,
    'appearance_thresh': 0.5,
    'fuse_score': True
}
tracker = BOTSORT(args, frame_rate=30)
# Perform tracking
results = model.track(source='path/to/video.mp4', tracker=tracker, show=True)

您可以在此处了解有关兼容 YOLO 追踪器的更多信息。

Ultralytics中的高效再识别功能

系统通常通过使用嵌入式技术比较物体之间的视觉相似性来执行重新识别。通常会有一个单独的模型通过处理裁剪过的物体图像来生成这些嵌入。不过,这种方法会给管道增加额外的延迟。或者,系统可以直接使用对象级特征进行重新识别,而不需要单独的嵌入模型。这一改变在提高效率的同时,也使延迟时间几乎保持不变。

资源:重新识别中的 YOLO 教程

Colab Notebook:链接到 Colab

请尝试运行您的视频,看看 YOLO 中的 Re-ID 是如何工作的。在 Colab NB 中,我们只需将“occluded.mp4”的路径替换为您的视频路径即可。

Source – Link

要查看上下文中的所有差异并获取完整的 botsort.py 补丁,请查看链接到 Colab 和本教程。请务必在阅读本指南时一并阅读,这样您就能逐步了解每一处改动。

第 1 步:打补丁使BoT-SORT接受功能

所做更改:

  • 方法签名更新:update(results, img=None) → update(results, img=None, feats=None) 以接受特征数组。新属性 self.img_width 是根据 img.shape[1] 设置的,以便稍后进行归一化。
  • 特征切分: 根据检测指数提取 feats_keep 和 feats_second。
  • Tracklet 初始化:init_track 调用现在传递相应的特征子集(feats_keep/feats_second),而不是原始图像数组。

第 2 步:修改后处理回调以传递特征

所做更改:

  • 更新调用:tracker.update(det, im0s[i]) → tracker.update(det,result.orig_img,result.feats.cpu().numpy()),以便将特征张量转发给跟踪器。

第 3 步:实现特征伪编码器

所做更改:

  • 创建了带有 inference(feat, dets) 方法的虚拟编码器类,该方法只需返回所提供的特征。
  • 引入 BOTSORT 的自定义 BOTSORTRe-ID 子类,其中:
    • self.encoder 被设置为虚拟编码器。
    • self.args.with_Re-ID 标志已启用。
  • 跟踪器注册:track.TRACKER_MAP[“botsort”] 重新映射为 BOTSORTRe-ID,取代默认值。

第 4 步:改进近距离匹配逻辑

所做更改:

  • 中心点计算:添加了基于 L2 的中心点提取器,而不再仅仅依赖边界框 IoU。
  • 距离计算
    • 计算轨迹和检测中心点之间成对的 L2 距离,并以 self.img_width 归一化。
    • 如果 L2 距离超过 proximity_thresh,就会生成近似屏蔽。
  • 成本融合
    • 通过现有的 matching.embedding_distance 计算嵌入距离。
    • 同时应用近似屏蔽和外观阈值,为距离较远或不相似的配对设置较高的成本。
    • 最终的成本矩阵是基于 IoU 的原始距离和调整后的嵌入距离的元素最小值。

第 5 步:调整跟踪器配置

调整 botsort.yaml 参数,以改进遮挡处理和匹配容差:

  • track_buffer:300– 延长丢失的轨迹在删除前的保留时间。
  • proximity_thresh: 0.2– 允许与移动幅度不超过图像宽度 20% 的物体进行匹配。
  • appearance_thresh: 0.3– 要求至少 70% 的特征相似度才能匹配。

第 6 步:初始化模型并为模型打上猴子补丁

所做更改:

  • 自定义 _predict_once 注入模型,以便在检测的同时提取并返回特征图。
  • 重置跟踪器:在 model.track(embed=embed, persist=True) 之后,重置现有的跟踪器,以清除任何陈旧状态。
  • 方法覆盖
    • model.predictor.trackers[0].update 与已修补的更新方法绑定。
    • model.predictor.trackers[0].get_dists 绑定到新的距离计算逻辑。

第 7 步:通过重新识别执行跟踪

所作更改:

  • 便捷函数 track_with_Re-ID(img) 使用了.predictor.trackers[0].get_dists:
    1. get_result_with_features([img]) 来生成带有特征的检测结果。
    2. model.predictor.run_callbacks(“on_predict_postprocess_end”)调用更新后的跟踪逻辑。
  • 输出:返回 model.predictor.results,现在包含检测和重新识别数据。

有了这些简洁的修改,Ultralytics YOLO 与 BoT-SORT 现在可以原生支持基于特征的再识别,而无需添加第二个再识别网络,从而以最小的性能开销实现稳健的身份保护。您可以尝试使用步骤 5 中的阈值,根据自己的应用调整匹配的严格程度。

⚠️ 注:这些更改并非 Ultralytics 正式版本的一部分。它们需要手动执行,以实现高效的重新识别。

结果对比

在这里,水栓(id8)、卡车附近的妇女(id67)和画面左侧的卡车(id3)都被重新准确识别。

虽然有些物体(id4、id5、id60)被正确识别,但背景中的几名警察却得到了不同的 ID,这可能是由于帧频限制造成的。

球(id3)和射手(id1)被很好地跟踪和识别,但被射手遮挡住的守门员(id2 -> id8)由于失去可见度而被赋予了新的 ID。

新发展

我们正在开发一个名为 Trackers 的新开源工具包,以简化多目标跟踪工作流程。Trackers 将提供

  • 即插即用,可与 Transformers、Inference、Ultralytics、PaddlePaddle、MMDetection 等公司的探测器集成。
  • 目前已内置了对 SORT 和 DeepSORT 的支持,还将内置 StrongSORT、BoT-SORT、ByteTrack、OC-SORT 和其他跟踪器。

DeepSORT 和 SORT 已经可以在 GitHub 代码库中导入,其余跟踪器将在随后几周内添加。

Github 链接 –Roboflow

小结

比较部分显示,YOLO 中的 Re-ID 性能可靠,能在各帧中保持对象的身份。偶尔出现的不匹配是由于遮挡或帧频过低造成的,这在实时跟踪中很常见。可调节的接近度阈值和外观阈值 为各种使用案例提供了灵活性。

关键优势在于效率:利用 YOLO 的对象级特征,无需单独的 Re-ID 网络,从而实现了轻量级、可部署的管道。

这种方法提供了一个强大而实用的多目标跟踪解决方案。未来的改进可能包括自适应阈值、更好的特征提取或时间平滑。

注:这些更新还不是官方 Ultralytics 库的一部分,必须手动应用,如共享资源所示。

© 版权声明
THE END
喜欢就支持一下吧
点赞20 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容