问题排查

缺少 Python 二进制文件路径

错误消息:

ERROR: An error occurred during the fetch of repository 'local_execution_config_python':
  Traceback (most recent call last):
       File "/sandbox_path/external/org_tensorflow/third_party/py/python_configure.bzl", line 208
               get_python_bin(repository_ctx)
    ...
Repository command failed

通常表示 Bazel 无法找到本地 Python 二进制文件。要解决 请先找到 python 二进制文件所在的位置,然后将 向 Bazel 命令授予 --action_env PYTHON_BIN_PATH=<path to python binary> 权限。对于 例如,您可以通过 以下命令:

bazel build -c opt \
  --define MEDIAPIPE_DISABLE_GPU=1 \
  --action_env PYTHON_BIN_PATH=$(which python3) \
  mediapipe/examples/desktop/hello_world

缺少必要的 Python 软件包

错误消息:

ImportError: No module named numpy
Is numpy installed?

通常表示未安装某些 Python 软件包。请运行 pip installpip3 install,具体取决于您的 Python 二进制版本 安装这些软件包

未能提取远程依赖项代码库

错误消息:

ERROR: An error occurred during the fetch of repository 'org_tensorflow':
   java.io.IOException: Error downloading [https://mirror.bazel.build/github.com/tensorflow/tensorflow/archive/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz, https://github.com/tensorflow/tensorflow/archive/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz] to /sandbox_path/external/org_tensorflow/77e9ffb9b2bfb1a4f7056e62d84039626923e328.tar.gz: Tried to reconnect at offset 9,944,151 but server didn't support it

or

WARNING: Download from https://storage.googleapis.com/mirror.tensorflow.org/github.com/bazelbuild/rules_swift/releases/download/0.12.1/rules_swift.0.12.1.tar.gz failed: class java.net.ConnectException Connection timed out (Connection timed out)

通常表示 Bazel 未能下载必要的依赖项代码库 MediaPipe 所需的资源。MedaiPipe 有多个依赖项代码库, 由 Google 网站托管的资源。在某些区域,您可能需要设置网络代理 或使用 VPN 访问这些资源。您可能还需要将 --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" 添加到 Bazel 命令请参阅 此 GitHub 问题 了解详情。

如果您认为这不是网络问题,则还有一种可能, 资源可能暂时不可用,请运行 bazel clean --expunge 稍后再试。如果仍然无法解决问题,请通过以下网址提交 GitHub 问题: 查看详细的错误消息

MediaPipe OpenCV 配置不正确

错误消息:

error: undefined reference to 'cv::String::deallocate()'
error: undefined reference to 'cv::String::allocate(unsigned long)'
error: undefined reference to 'cv::VideoCapture::VideoCapture(cv::String const&)'
...
error: undefined reference to 'cv::putText(cv::InputOutputArray const&, cv::String const&, cv::Point, int, double, cv::Scalar, int, int, bool)'

通常表示 OpenCV 没有针对 MediaPipe 正确配置。请 请查看个版块中的 安装,了解如何修改 MediaPipe 的工作区和 本地 opencv 的 linux_opencv/macos_opencv/windows_opencv.BUILD 文件 库。此 GitHub 问题 可能也会有所帮助。

Python pip 安装失败

错误消息:

ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe

运行 pip install mediapipe 之后,通常表示您的系统没有符合条件的 MediaPipe Python。 请注意,MediaPipe Python PyPI 正式支持 64 位 以下操作系统上的 Python 3.7 至 3.10 版:

  • x86_64 Linux
  • x86_64 macOS 10.15 及更高版本
  • amd64 Windows

如果操作系统目前受支持,但您仍然看到此错误,请确保 Python 和 pip 二进制文件都适用于 Python 3.7 至 3.10。否则 请考虑在本地构建 MediaPipe Python 软件包,具体方法是 此处的说明。

Windows 上的 Python DLL 加载失败

错误消息:

ImportError: DLL load failed: The specified module could not be found

通常表示本地 Windows 系统缺少 Visual C++ 可再分发软件包和/或 Visual C++ 运行时 DLL。要解决这一问题, 安装官方版或 vc_redist.x64.exe 或安装“msvc-runtime”运行 Python 软件包

$ python -m pip install msvc-runtime

请注意,“msvc-runtime”Python 软件包未发布或维护 由 Microsoft 提供。

找不到原生方法

错误消息:

java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick

通常表示所需的原生库(如 /libwickjni.so)尚未 已加载、尚未包含在应用的依赖项中或无法 因为某种原因被找到了。请注意,Java 要求每个原生库都 使用函数 System.loadLibrary 显式加载。

找不到已注册的计算器

错误消息:

No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"

通常表示 OurNewCalculator 是在 CalculatorGraphConfig,但 OurNewCalculator 的库目标包含 尚未链接到应用二进制文件。将新计算器添加到 计算器图表,还必须将计算器添加为 计算使用计算器图表的应用。

此错误是在运行时捕获的,因为计算器图表会引用 通过 CalculatorGraphConfig::Node:calculator 字段命名计算器。 当计算器库链接到应用程序二进制文件时, 计算器按名称自动注册 使用 registration.h 库的 REGISTER_CALCULATOR 宏。请注意, REGISTER_CALCULATOR 可以注册包含命名空间前缀的计算器, 与其 C++ 命名空间相同。在这种情况下,计算器图也必须使用 相同的命名空间前缀。

内存不足错误

内存耗尽可能是服务器中累积了过多数据包的症状 运行 MediaPipe 图。造成这种情况的原因有很多,例如:

  1. 图表中的一些计算器跟不上 来自实时输入流(例如摄像机)的数据包。
  2. 有些计算器正在等待数据包永远无法到达。

对于问题 (1),可能需要丢弃旧数据包 处理较新的数据包如需了解一些提示,请参阅: How to process realtime input streams

对于问题 (2),可能有一个输入流缺少某些 原因。设备或计算器可能配置有误或可能会产生数据包 只是偶尔完成这可能会导致下游计算器等待 某些数据包永远不会到达,这反过来会导致数据包在 一些输入流。MediaPipe 使用 “timestamp bounds”。如需了解一些提示,请参阅: How to process realtime input streams

MediaPipe 设置 CalculatorGraphConfig::max_queue_size 会限制 通过限制流向 图表。对于实时输入流,在某个输入流排队的数据包数量 视频流几乎始终应为 0 或 1。如果不属于这种情况,您可能会看到 以下警告消息:

Resolved a deadlock by increasing max_queue_size of input stream

此外,设置 CalculatorGraphConfig::report_deadlock 可导致 图运行失败,并将死锁显示为错误,使 max_queue_size 充当内存用量限额

图表挂起

许多应用会调用 CalculatorGraph::CloseAllPacketSources,并且 CalculatorGraph::WaitUntilDone,用于完成或暂停 MediaPipe 的执行 图表。这样做的目的是,允许任何待处理的计算器或数据包 然后关闭图。如果一切进展顺利 图表中的数据流将会达到Timestamp::Done,每个计算器都会 覆盖 CalculatorBase::Close,后续订阅价格为 CalculatorGraph::WaitUntilDone 将成功完成。

如果某些计算器或数据流无法达到 Timestamp::Done 状态,或者 CalculatorBase::Close,则 CalculatorGraph::Cancel 方法可以是 调用以终止图表运行,而不等待所有待处理的计算器 和数据包的处理流程

输出时间不均匀

一些实时 MediaPipe 图表会生成一系列视频帧, 或用作视频诊断信息。有时,MediaPipe 图会生成 这些帧会划分为多个集群 根据同一群输入帧推断出的预测值。如果呈现输出 某些输出帧在生成时会立即被 帧呈现在同一集群中,这使得很难查看和评估结果 。在这种情况下,输出可视化可通过 以平均间隔实时呈现帧。

MediaPipe 将时间戳实时映射到点,从而解决了这种用例。 每个时间戳表示一个以微秒为单位的时间,并且计算器为 LiveClockSyncCalculator 可以延迟数据包输出,使其与 时间戳。这种计算器会调整输出时间,以便:

  1. 输出之间的时间对应于时间戳之间的时间,如下所示: 尽可能贴近这些对象
  2. 以尽可能最短的延迟时间生成输出。

CalculatorGraph 滞后于输入

对于许多实时 MediaPipe 图表来说,低延迟是一个目标。MediaPipe 支持“流水线”样式并行处理,以开始处理 每个数据包的运行时间上限。通常,最短的延迟时间是 每个计算器沿“关键路径”所需的总时间相继的 计算。MediaPipe 图的延迟时间可能比理想情况更差 会造成以均匀间隔显示帧的延迟,如 输出时间不均匀

如果图表中的某些计算器跟不上实时输入的速度 那么延迟时间将继续增加, 并丢弃一些输入数据包推荐的技术是使用 MediaPipe 专门用于此目的的计算器,如 FlowLimiterCalculator(如 How to process realtime input streams