Skip to main content

概述

qtimltflite 是一个 GStreamer 推理元素,可在 AI 和多媒体流水线中执行 TensorFlow Lite 模型。该元素完全以张量模式运行:它在 sink pad 上接收输入张量,并根据模型的输入和输出规范在 source pad 上生成输出张量。 该元素仅限于模型执行。它不执行预处理、张量重塑、批处理、布局转换或特定于模型的后处理。这些功能应由流水线中的相邻元素处理。因此,上游元素必须提供已经符合模型要求的张量,而下游元素必须解释推理生成的输出张量。 qtimltflite 通过委托(delegate)支持多种 TensorFlow Lite 执行后端,包括 **CPU、GPU 和外部委托(external delegate)**配置。这使得相同的流水线结构可以部署到不同的硬件目标,并针对不同的性能、延迟和功耗需求进行优化。该元素面向实时和嵌入式 AI 流水线,其中推理是更大的模块化处理流程中的一个阶段。

主要职责

qtimltflite 负责:
  • 加载并执行 TensorFlow Lite 模型
  • 接收来自上游元素的预格式化输入张量
  • 生成与模型输出签名匹配的输出张量
  • 与相邻元素协商张量数据类型和维度
  • 传播下游元素所需的张量元数据
在实际使用中,qtimltflite 充当流水线中的推理阶段,而张量准备和结果解释则由外部处理。

示例流水线

1

下载所需文件

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

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行流水线

层次结构

GObject
   GstObject
      GstElement
         GstBaseTransform
            qtimltflite

Pad 模板

sink

src

元素属性

输入与输出行为

输入张量

qtimltflite 暴露单个 sink pad,但同时支持单输入和多输入模型。对于多输入模型,所有所需张量以张量集的形式通过同一个 sink pad 传递。 输入张量必须在到达 qtimltflite 之前完全准备好。预期的张量布局、形状、数据类型和批量大小由以下因素决定:
  • TensorFlow Lite 模型输入签名
  • 与上游元素的 caps 协商
典型的上游元素包括: qtimltflite 不会修改、重塑、批处理或重新解释传入的张量。它按接收到的原样将其传递给 TensorFlow Lite 运行时。

输出张量

qtimltflite 暴露单个 source pad,并根据模型输出签名生成输出张量。单个 source pad 并不限制元素只能输出单个张量。完全支持具有多个输出张量的模型,所有输出会在同一个 pad 上一起发出。 该元素支持:
  • 单输出和多输出模型
  • 任意张量秩,包括批量维度和深度维度
  • 量化和浮点输出
输出张量通常由下游后处理元素消费,这些元素解码特定于模型的结果,例如分类分数、检测框、分割掩码、关键点或其他结构化输出。

量化与反量化

qtimltflite 可以选择性地将量化输出张量(例如 UINT8INT8)反量化为 FLOAT32。此转换使用存储在 TensorFlow Lite 模型元数据中的量化参数。

条件性输出反量化

仅当下游路径需要 FLOAT32 张量时才执行反量化。实际上,当下游 caps 协商表明需要浮点输出时,此功能才会启用。 应用反量化时,qtimltflite 会:
  • 读取张量的 scale
  • 读取张量的 zero_point
  • 应用标准的 TensorFlow Lite 反量化公式:
  • 生成供下游处理的 FLOAT32 张量

何时跳过反量化

以下情况不执行反量化:
  • 下游元素仅接受量化张量类型
  • 没有下游元素协商 FLOAT32
  • 模型输出张量不包含有效的量化元数据
在这些情况下,输出张量以其原始量化表示形式向下游转发。 这种行为使得同一条下游处理路径在适用时既能支持量化模型也能支持浮点模型,同时避免不必要的转换。

支持的数据类型

qtimltflite 支持 TensorFlow Lite 运行时和所选执行后端提供的张量数据类型,具体取决于与相邻元素的 caps 协商。 常用的数据类型包括:
  • UINT8
  • INT8
  • INT32
  • FLOAT16
  • FLOAT32
除了运行时、所选委托以及协商的流水线 caps 所要求的限制之外,该元素不会施加额外的数据类型限制。

批量与深度模型支持

qtimltflite 支持具有批量和多维张量输入输出的模型,包括带有显式批量和深度维度的张量。 示例包括:
  • 批量张量:N × H × W × C
  • 多维张量:N × D × H × W × C
该元素对这些维度进行透明处理,并根据协商的形状将张量传递给 TensorFlow Lite。它不会在内部构建批量、重塑张量或重新解释张量维度。 批量构建必须由上游元素(例如 qtibatch)处理。 这种行为使推理在单帧、批量和更高维度的工作流中保持可预测。

委托(Delegate)

TensorFlow Lite **委托(delegate)**定义了运行模型所使用的执行后端。委托使 qtimltflite 能够将推理从默认的 TensorFlow Lite CPU 解释器卸载到经过优化的后端,例如 GPU、优化的 CPU 运行时或 NPU。 qtimltflite 支持多种委托选项。通过 delegate 属性选择委托,它控制 TensorFlow Lite 在推理期间如何分派模型操作。

内置委托选项

none

在默认的 TensorFlow Lite CPU 解释器上运行模型。
  • 后端:CPU
  • 使用场景:参考执行、调试或没有加速的系统

gpu

通过 TensorFlow Lite GPU 委托运行受支持的操作。
  • 后端:GPU
  • 使用场景:受益于 GPU 并行性的浮点模型/工作负载

xnnpack

通过 XNNPACK 优化的 CPU 后端运行推理。
  • 后端:优化的 CPU
  • 使用场景:为受支持的浮点和量化模型提升 CPU 性能

外部委托支持

外部委托用于在 Qualcomm 的 NPU 上加速模型。 选择外部委托时,qtimltflite 使用以下属性在运行时加载并配置委托:
  • external-delegate-path
    • 外部委托共享库的路径。
  • external-delegate-options
    • 传递给外部委托的委托特定初始化选项。
初始化完成后,受支持的模型操作将被卸载到外部委托实现的 NPU 后端。

运行时内存行为与 GAP 处理

qtimltflite 在 TensorFlow Lite 运行时的内存模型内运行。尽管周围的流水线可能对张量缓冲区使用零拷贝传输,但 TensorFlow Lite 执行要求输入和输出张量位于运行时管理的内存中。

TensorFlow Lite 内存模型

TensorFlow Lite 使用内部内存竞技场(memory arena)来分配:
  • 输入张量
  • 中间激活张量
  • 输出张量

GAP 缓冲区处理

qtimltflite 支持 GAP 感知,能够正确处理标记了 GST_BUFFER_FLAG_GAP 的输入缓冲区。 当收到 GAP 缓冲区时,元素跳过推理并将缓冲区向下游转发。这在保持时序和同步的同时,明确表明该时间戳没有可用的有效推理输入。 GAP 缓冲区常见于条件式 AI 流水线,例如级联工作流,其中只有当前面的阶段产生有效的感兴趣区域时,后续推理阶段才会运行。

用法

实时摄像头流上的单阶段 AI 推理

本示例演示了使用单个 qtimltflite 实例,在实时摄像头流上进行实时推理。推理结果作为 MLMeta 附加到每个 GstBuffer,使下游元素可以直接从帧中访问同步的元数据。叠加阶段随后使用此元数据在显示或进一步处理之前渲染边界框、标签或关键点等注释。
1

下载所需文件

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

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行流水线

Run the pipeline

实时摄像头流上的两阶段级联(Daisy Chain)AI 推理

本示例演示了使用两个 qtimltflite 实例的两阶段 TensorFlow Lite 推理工作流。第一个模型在经过配置为全帧输入的 qtimlvconverter 预处理后的完整视频帧上运行。推理结果(例如检测到的目标)被附加到对应的视频缓冲区并向下游传播。第二个模型针对第一阶段检测到的每个目标各运行一次。第二个配置为基于 ROI 处理的 qtimlvconverter 从输入帧中裁剪每个检测到的区域,并将其准备为第二个 qtimltflite 实例的输入。
1

下载所需文件

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

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行流水线

Run the pipeline

实时摄像头流上的四阶段级联(Daisy Chain)AI 推理

本示例演示了一个面向实时手势识别用例的多阶段推理工作流,由四个通过四个 qtimltflite 实例执行的 TensorFlow Lite 模型构建。
  • 阶段 1 执行全帧手掌检测。输入视频帧经过预处理、推理和后处理,生成描述检测到的手掌的元数据。
  • 阶段 2 执行按 ROI 的手部关键点推理。第一阶段检测到的区域被裁剪并批量处理。使用两条后处理路径:一条生成可视化元数据,另一条为下一阶段重新格式化输出张量。
  • 阶段 3 以纯张量模式链接两个模型,不进行额外的预处理或后处理。第一个模型消费上一阶段生成的多个张量,其输出直接传递给第二个模型。
  • 阶段 4 执行最终的手势分类,并将模型输出转换为供下游使用的元数据。
1

下载所需文件

从 Google MediaPipe 下载手势识别器模型:
这些是 FLOAT 精度模型。
2

将文件复制到设备

3

连接到设备

4

设置环境变量

在设备上运行以下命令
5

运行流水线

Run the pipeline