Skip to main content

概述

qtiobjtracker 是一个 GStreamer 插件,通过在连续视频帧之间关联检测到的目标,并为每个目标分配持久的跟踪 ID,提供实时多目标跟踪功能。 该插件基于上游推理或后处理元素产生的目标检测元数据运行。对于每个检测到的目标,它分析跨帧的时间连续性,并使用跟踪信息更新元数据,从而使同一目标能够随时间被一致地识别。

主要职责

qtiobjtracker 的主要目的是:
  • 使用持久的跟踪 ID 在帧间保持稳定的目标身份
  • 基于检测结果随时间跟踪目标运动
  • 提高目标级分析的时间一致性
  • 使下游组件能够执行更高级的视频分析、事件处理和行为分析。
qtiobjtracker 本身执行目标检测。它依赖上游管道元素生成目标检测结果及相关元数据。跟踪器消费这些元数据,执行帧到帧的关联,并为目标元数据添加跟踪 ID 供下游使用。

示例管道

1

下载所需文件

如果下载的任何文件是 .zip 压缩包,请在复制前先在主机上解压: unzip filename.zip
2

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行管道

层级结构

GObject
   GstObject
      GstElement
         qtiobjtracker

Pad 模板

sink

src

元素属性

内部架构详情

可插拔跟踪后端架构

qtiobjtracker 采用模块化跟踪架构设计,将 GStreamer 插件框架与底层跟踪算法实现分离。该插件公开一个通用的跟踪接口,同时允许不同的跟踪算法独立于核心元素进行实现、选择和维护。 每种跟踪算法被打包为单独的共享库,称为跟踪后端qtiobjtracker 元素负责:
  • 管理 GStreamer 元素生命周期
  • 与管道集成
  • 接收和转发检测元数据
  • 加载所选的跟踪后端并与之交互
跟踪逻辑本身完全在后端库中实现。 运行时算法选择 跟踪算法通过 algo 属性在运行时选择。qtiobjtracker 根据配置的值动态加载相应的后端库并初始化所选的实现。 这种设计提供了以下优势:
  • 运行时灵活性 — 可以针对每个管道或用例选择跟踪行为
  • 关注点分离 — 算法实现与插件核心保持独立
  • 可维护性 — 跟踪后端可以独立开发和更新
  • 可扩展性 — 可以在不更改公共插件接口的情况下添加新的跟踪算法
只有与所选算法关联的后端会被加载和执行。 后端职责 每个跟踪后端实现一个通用接口,并负责:
  • 在连续帧之间关联检测结果
  • 创建、更新和终止跟踪轨迹
  • 应用运动预测和/或空间匹配
  • 维护内部跟踪状态
后端仅基于检测元数据(如边界框、类别标签和置信度分数)运行。它们不执行目标检测。 基于后端的架构使 qtiobjtracker 能够在一致的插件接口内支持多种跟踪策略。这使得针对不同工作负载调整跟踪行为、评估替代算法以及针对特定硬件或应用需求优化实现变得更加容易。

输入和输出格式

qtiobjtracker 完全基于目标检测元数据及相关坐标运行。它不检查、分析或修改视频帧的像素数据。跟踪决策仅基于从上游元素接收的检测元数据。 因此,qtiobjtracker 必须放置在一个或多个生成目标检测并附加相应元数据的元素的下游。

支持的检测元数据格式

qtiobjtracker 支持两种检测目标的输入格式。两者在基于 GStreamer 的 AI 管道中都很常用。 1. 结构化文本元数据(text/x-raw 在此模式下,检测结果作为结构化文本数据与视频缓冲区分开传输。
  • 缓冲区 caps:text/x-raw
  • 检测结果存储在缓冲区负载中
  • 负载包含检测目标的结构化描述
  • 文本表示可以与 GstStructure 相互转换
  • 边界框坐标在 [0.0, 1.0] 范围内归一化
  • 坐标与分辨率无关
这种格式允许在不同分辨率的流(包括缩放或调整大小的视频分支)之间复用相同的检测数据。 2. 视频缓冲区上的 ROI 元数据(GstROIMeta 在此模式下,检测结果作为 ROI 元数据直接附加到视频缓冲区。
  • 检测结果以 GstROIMeta 元数据的形式附加到原始视频缓冲区
  • 每个 ROI 条目代表一个检测到的目标
  • 边界框坐标以视频帧的坐标空间表示(绝对坐标,与分辨率相关)

跟踪行为与格式处理

qtiobjtracker 与底层视频内容无关,仅依赖检测元数据进行跟踪。它同时支持结构化文本元数据和 ROI 元数据,无需在两种格式之间转换。 该插件在整个处理过程中保留输入元数据的表示形式。输出格式始终与输入格式一致:
  • 如果输入是 text/x-raw,输出仍为 text/x-raw
  • 如果输入使用 GstROI 元数据,输出仍为附加到同一视频缓冲区的 ROI 元数据
qtiobjtracker 不会在基于文本的元数据和基于 ROI 的元数据之间进行转换。

输出跟踪信息

qtiobjtracker 保留所有输入检测元数据,并为每个检测到的目标添加一个跟踪属性:
  • 唯一跟踪 ID(Unique Track ID) — 用于在连续帧之间关联同一目标的持久标识符。
所有现有的检测属性,包括边界框、类别标签、置信度分数和坐标表示,都会原样传递。该插件不会修改或扩展任何其他目标属性。 输出元数据格式始终与输入格式一致。如果检测以 text/x-raw 形式接收,跟踪结果以相同格式输出。如果检测以视频缓冲区上的 ROI 元数据形式提供,更新后的跟踪信息将附加到相同的元数据表示中。

用法

为每个检测到的目标附加跟踪 ID

此示例演示了对实时摄像头流上运行的 AI 推理管道所检测目标的实时跟踪。推理结果以 MLMeta 形式附加到每个 GstBuffer,随后 qtiobjtracker 跨帧跟踪检测到的目标,并将持久的跟踪 ID 添加到元数据中。包含跟踪信息的最终 AI 元数据随后使用 qtimlmetaparser 序列化为 JSON,并通过 qtiredissink 插件发布到 Redis 服务器。
1

下载所需文件

如果下载的任何文件是 .zip 压缩包,请在复制前先在主机上解压: unzip filename.zip
2

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行管道

Run the pipeline

附加跟踪 ID 并传播到下一阶段 AI 推理

此示例演示了在实时摄像头流上运行的实时多阶段 AI 管道。第一个推理阶段执行目标检测,并将结果以 MLMeta 形式附加到每个 GstBufferqtiobjtracker 随后跨帧关联检测到的目标,并将持久的跟踪 ID 添加到元数据中。视频帧连同增强后的元数据一起被传递到后续的姿态估计阶段进行进一步推理。最后,qtimetamux 合并所有阶段的元数据,叠加阶段渲染合并后的结果——包括边界框、跟踪 ID 和估计的姿态——用于实时显示。
1

下载所需文件

如果下载的任何文件是 .zip 压缩包,请在复制前先在主机上解压: unzip filename.zip
2

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行管道

Run the pipeline