缺少 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 install
或 pip3 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),可能需要丢弃旧数据包
处理较新的数据包如需了解一些提示,请参阅:
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
可以延迟数据包输出,使其与
时间戳。这种计算器会调整输出时间,以便:
- 输出之间的时间对应于时间戳之间的时间,如下所示: 尽可能贴近这些对象
- 以尽可能最短的延迟时间生成输出。
CalculatorGraph 滞后于输入
对于许多实时 MediaPipe 图表来说,低延迟是一个目标。MediaPipe 支持“流水线”样式并行处理,以开始处理 每个数据包的运行时间上限。通常,最短的延迟时间是 每个计算器沿“关键路径”所需的总时间相继的 计算。MediaPipe 图的延迟时间可能比理想情况更差 会造成以均匀间隔显示帧的延迟,如 输出时间不均匀。
如果图表中的某些计算器跟不上实时输入的速度
那么延迟时间将继续增加,
并丢弃一些输入数据包推荐的技术是使用 MediaPipe
专门用于此目的的计算器,如
FlowLimiterCalculator
(如
How to process realtime input streams
。