概述
qtimltflite 是一个 GStreamer 推理元素,可在 AI 和多媒体流水线中执行 TensorFlow Lite 模型。该元素完全以张量模式运行:它在 sink pad 上接收输入张量,并根据模型的输入和输出规范在 source pad 上生成输出张量。 该元素仅限于模型执行。它不执行预处理、张量重塑、批处理、布局转换或特定于模型的后处理。这些功能应由流水线中的相邻元素处理。因此,上游元素必须提供已经符合模型要求的张量,而下游元素必须解释推理生成的输出张量。 qtimltflite 通过委托(delegate)支持多种 TensorFlow Lite 执行后端,包括 **CPU、GPU 和外部委托(external delegate)**配置。这使得相同的流水线结构可以部署到不同的硬件目标,并针对不同的性能、延迟和功耗需求进行优化。该元素面向实时和嵌入式 AI 流水线,其中推理是更大的模块化处理流程中的一个阶段。主要职责
qtimltflite 负责:- 加载并执行 TensorFlow Lite 模型
- 接收来自上游元素的预格式化输入张量
- 生成与模型输出签名匹配的输出张量
- 与相邻元素协商张量数据类型和维度
- 传播下游元素所需的张量元数据
示例流水线
1
下载所需文件
如果下载的任何文件是
.zip 压缩包,请在主机上先解压再复制:
unzip filename.zip2
将文件复制到设备
3
连接到设备
4
设置环境变量
在设备上运行以下命令
5
运行流水线
层次结构
GObjectGstObject
GstElement
GstBaseTransform
qtimltflite
Pad 模板
sink
src
元素属性
输入与输出行为
输入张量
qtimltflite 暴露单个 sink pad,但同时支持单输入和多输入模型。对于多输入模型,所有所需张量以张量集的形式通过同一个 sink pad 传递。 输入张量必须在到达qtimltflite 之前完全准备好。预期的张量布局、形状、数据类型和批量大小由以下因素决定:
- TensorFlow Lite 模型输入签名
- 与上游元素的 caps 协商
qtimlvconverter:用于缩放、颜色转换、归一化和量化qtibatch:用于批量构建
qtimltflite 不会修改、重塑、批处理或重新解释传入的张量。它按接收到的原样将其传递给 TensorFlow Lite 运行时。
输出张量
qtimltflite 暴露单个 source pad,并根据模型输出签名生成输出张量。单个 source pad 并不限制元素只能输出单个张量。完全支持具有多个输出张量的模型,所有输出会在同一个 pad 上一起发出。
该元素支持:
- 单输出和多输出模型
- 任意张量秩,包括批量维度和深度维度
- 量化和浮点输出
量化与反量化
qtimltflite 可以选择性地将量化输出张量(例如 UINT8 或 INT8)反量化为 FLOAT32。此转换使用存储在 TensorFlow Lite 模型元数据中的量化参数。
条件性输出反量化
仅当下游路径需要FLOAT32 张量时才执行反量化。实际上,当下游 caps 协商表明需要浮点输出时,此功能才会启用。
应用反量化时,qtimltflite 会:
- 读取张量的
scale - 读取张量的
zero_point - 应用标准的 TensorFlow Lite 反量化公式:
- 生成供下游处理的
FLOAT32张量
何时跳过反量化
以下情况不执行反量化:- 下游元素仅接受量化张量类型
- 没有下游元素协商
FLOAT32 - 模型输出张量不包含有效的量化元数据
支持的数据类型
qtimltflite 支持 TensorFlow Lite 运行时和所选执行后端提供的张量数据类型,具体取决于与相邻元素的 caps 协商。
常用的数据类型包括:
UINT8INT8INT32FLOAT16FLOAT32
批量与深度模型支持
qtimltflite 支持具有批量和多维张量输入输出的模型,包括带有显式批量和深度维度的张量。
示例包括:
- 批量张量:
N × H × W × C - 多维张量:
N × D × H × W × C
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- 传递给外部委托的委托特定初始化选项。
运行时内存行为与 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.zip2
将文件复制到设备
3
连接到设备
4
设置环境变量
在设备上运行以下命令
5
运行流水线
Run the pipeline
实时摄像头流上的两阶段级联(Daisy Chain)AI 推理
本示例演示了使用两个 qtimltflite 实例的两阶段 TensorFlow Lite 推理工作流。第一个模型在经过配置为全帧输入的qtimlvconverter 预处理后的完整视频帧上运行。推理结果(例如检测到的目标)被附加到对应的视频缓冲区并向下游传播。第二个模型针对第一阶段检测到的每个目标各运行一次。第二个配置为基于 ROI 处理的 qtimlvconverter 从输入帧中裁剪每个检测到的区域,并将其准备为第二个 qtimltflite 实例的输入。
1
下载所需文件
如果下载的任何文件是
.zip 压缩包,请在主机上先解压再复制:
unzip filename.zip2
将文件复制到设备
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

