常见问题解答

如何转换 ImageFrames 和 GpuBuffers

计算器 ImageFrameToGpuBufferCalculatorGpuBufferToImageFrameCalculator 可以在 ImageFrameGpuBuffer 类型的数据包之间来回转换。ImageFrame 是指 CPU 内存中采用多种位图图像格式的图片数据。GpuBuffer 是指 GPU 内存中的图片数据。如需了解详情,请参阅“框架概念”部分 GpuBuffer 到 ImageFrame 转换器。您可以在以下位置查看示例:

如何直观呈现感知结果

AnnotationOverlayCalculator 允许将感知结果(例如边界框、箭头和椭圆形)叠加到与识别出的对象对齐的视频帧上。在工作站上运行时,结果可能显示在诊断窗口中;在设备上运行时,结果会显示在纹理帧中。您可以在以下位置查看 AnnotationOverlayCalculator 的示例用法:

如何并行运行计算器

在计算器图中,MediaPipe 会定期并行运行单独的计算器节点。MediaPipe 会维护一个线程池,并在有线程可用且其所有输入准备就绪时立即运行每个计算器。每个计算器实例一次只针对一组输入运行,因此大多数计算器只需保证线程兼容,而没有线程安全。

要使一个计算器能够并行处理多个输入,可以采用两种方法:

  1. 定义多个计算器节点,并将输入数据包分派给所有节点。
  2. 使计算器具备线程安全性,并配置其 max_in_flight 设置。

第一种方法可以使用专门用于在其他计算器之间分配数据包的计算器,例如 RoundRobinDemuxCalculator。单个 RoundRobinDemuxCalculator 可以在多个配置相同的 ScaleImageCalculator 节点之间分发连续数据包。

第二种方案最多允许对同一计算器节点上的 CalculatorBase::Process 方法调用 max_in_flight 次。CalculatorBase::Process 中的输出数据包会自动按时间戳排序,然后再传递给下游计算器。

无论采用哪种方法,都必须注意,并行运行的计算器不能像普通顺序计算器一样维护内部状态。

使用 ImmediateInputStreamHandler 时输出时间戳

ImmediateInputStreamHandler 会在每个数据包到达输入流后立即传送该数据包。因此,它可以先从一个输入流传送时间戳较大的数据包,然后再从其他输入流传送时间戳较小的数据包。如果这些输入时间戳同时用于发送到一个输出流的数据包,该输出流会指出时间戳不是单调递增的。为了解决此问题,计算器必须谨慎地输出数据包,但不要在时间戳处理完毕后才输出数据包。这可以通过等待,直到从该时间戳的所有输入流收到输入数据包,或者忽略到达的时间戳已完成处理的数据包来实现。

如何在运行时更改设置

在应用运行时更改计算器图表设置的方法主要有两种:

  1. 使用修改后的 CalculatorGraphConfig 重启计算器图表。
  2. 通过图表输入流中的数据包发送新的计算器选项。

第一种方法的优点在于可利用 CalculatorGraphConfig 处理工具(例如“子图”)。第二种方案的优点是,在设置发生更改时,处于活动状态的计算器和数据包可以保持传输状态。Mediapipe 贡献者目前正在研究能够实现这两个优势的替代方法。

如何处理实时输入流

mediapipe 框架可用于在线或离线处理数据流。对于离线处理,一旦计算器准备好处理数据包,数据包就会推送到图表中。对于在线处理,在记录该帧时,系统会将每一帧的一个数据包推送到该图中。

MediaPipe 框架只要求为连续的数据包分配单调递增的时间戳。按照惯例,实时计算器和图表将记录时间或呈现时间用作每个数据包的时间戳,其中每个时间戳表示自 Jan/1/1970:00:00:00 起的微秒。这允许以全局一致的顺序处理来自各种来源的数据包。

通常,对于离线处理,系统会处理每个输入数据包,并根据需要持续处理。对于在线处理,通常需要丢弃输入数据包,以便与输入数据帧的到达保持同步。如果输入到达的频率过于频繁,建议采用丢弃数据包的方法,即使用专为此用途设计的 MediaPipe 计算器,例如 FlowLimiterCalculatorPacketClonerCalculator

对于在线处理,还需要及时确定何时可以继续处理。MediaPipe 通过在各计算器之间传播时间戳边界来支持这一点。时间戳边界指示不包含输入数据包的时间戳间隔,可让计算器立即开始处理这些时间戳。专为实时处理设计的计算器应仔细计算时间戳边界,以便尽快开始处理。例如,MakePairCalculator 使用 SetOffset API 将时间戳边界从输入流传播到输出流。

我可以在 MS Windows 上运行 MediaPipe 吗?

目前,MediaPipe 可移植性支持 Debian Linux、Ubuntu Linux、MacOS、Android 和 iOS。MediaPipe 框架的核心是一个符合 C++11 标准的 C++ 库,因此移植到其他平台相对容易。