问题排查

缺少 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 二进制文件的位置,然后将 --action_env PYTHON_BIN_PATH=<path to python binary> 添加到 Bazel 命令中。例如,您可以通过以下命令切换为使用系统默认的 python3 二进制文件:

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 软件包。请根据您的 Python 二进制版本运行 pip installpip3 install,以安装这些软件包。

未能提取远程依赖项仓库

错误消息:

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 正确配置。请查看安装中的“安装 OpenCV 和 FFmpeg”部分,了解如何为本地 Opencv 库修改 MediaPipe 的工作区和 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

请注意,Microsoft 无法发布或维护“msvc-runtime”Python 软件包。

找不到原生方法

错误消息:

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"

通常表示 CalculatorGraphConfig 中按名称引用了 OurNewCalculator,但 OurNewCalculator 的库目标尚未关联到应用二进制文件。向计算器图表添加新计算器后,您还必须将该计算器添加为使用计算器图表的应用的 build 依赖项。

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

内存不足错误

内存耗尽可能表示正在运行的 MediaPipe 图中累积的数据包过多。导致这种情况的原因可能有很多,例如:

  1. 图表中的一些计算器无法跟上实时输入流(例如摄像头)发出的数据包。
  2. 有些计算器可能正在等待数据包永远无法送达。

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

对于问题 (2),可能是因为一个输入流因某种原因而缺少数据包。设备或计算器可能配置有误,或者可能偶尔生成数据包。这可能会导致下游计算器等待许多永远不会到达的数据包,进而导致数据包在某些输入流上累积。MediaPipe 使用“时间戳边界”解决了此类问题。如需了解一些提示,请参阅: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::CloseAllPacketSourcesCalculatorGraph::WaitUntilDone 来完成或暂停 MediaPipe 图的执行。这样做的目标是允许任何待处理的计算器或数据包完成处理,然后关闭图表。如果一切顺利,图表中的每个数据流都将达到 Timestamp::Done,每个计算器将达到 CalculatorBase::Close,然后 CalculatorGraph::WaitUntilDone 将成功完成。

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

输出时间不均匀

某些实时 MediaPipe 图表会生成一系列视频帧,可作为视频特效或视频诊断进行查看。有时,MediaPipe 图会以聚类的形式生成这些帧,例如,从同一个输入帧聚类中推断出多个输出帧时。如果在生成输出时呈现输出,某些输出帧会立即替换为同一集群中的后续帧,这会导致难以直观地查看和评估结果。在这种情况下,通过以均匀的时间间隔实时呈现帧,可以改进输出可视化。

MediaPipe 通过实时将时间戳映射到时间点,解决了此用例的问题。每个时间戳都表示一个时间(以微秒为单位),计算器(如 LiveClockSyncCalculator)可以延迟数据包的输出来匹配其时间戳。此类计算器可调整输出的时间,以便:

  1. 输出之间的时间对应于时间戳之间的尽可能接近的时间。
  2. 以尽可能最短的延迟生成输出。

CalculatorGraph 滞后于输入

对于许多实时 MediaPipe 图表来说,低延迟是一个目标。MediaPipe 支持“流水线”式并行处理,以便尽早开始处理每个数据包。通常,可能的最短延迟时间是指每个计算器在连续计算器的“关键路径”上所需的总时间。由于以均匀间隔显示帧时引入了延迟,如输出时间不均匀中所述,MediaPipe 图的延迟时间可能比理想值更差。

如果图表中的某些计算器无法跟上实时输入流的步伐,那么延迟时间将继续增加,并且有必要丢弃一些输入数据包。建议您使用专门为此而设计的 MediaPipe 计算器,例如 FlowLimiterCalculator(如 How to process realtime input streams 中所述)。