疑難排解

缺少 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 指令。適用對象 例如,您可以改用 以下指令:

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 無法下載必要的依附元件存放區 所需資料MedaiPipe 有多個依附元件存放區 由 Google 網站代管。在某些區域,您可能需要設定網路 Proxy 或是使用 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)'

通常表示 MediaPipe 未正確設定 OpenCV。請 查看「安裝 OpenCV 和 FFmpeg」中的 個區段 安裝,瞭解如何修改 MediaPipe 的 WORKSPACE 和 本機 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::CloseAllPacketSourcesCalculatorGraph::WaitUntilDone 可結束或暫停 MediaPipe 的執行 圖表。這個步驟的目標是讓所有待處理計算機或封包 完成處理作業,然後關閉圖表。如果一切順利 達到 Timestamp::Done,而且每個計算機都會 觸及 CalculatorBase::Close,然後CalculatorGraph::WaitUntilDone 才能順利完成

部分計算機或串流無法達到狀態 Timestamp::DoneCalculatorBase::Close,接著CalculatorGraph::Cancel 方法的可 會呼叫 來終止圖表執行作業,不必等待所有待處理的計算機 要完成的封包和封包

輸出時間不均

有些即時 MediaPipe 圖表會產生一系列影片影格,方便觀眾 影片特效或影片診斷工具。有時候,MediaPipe 圖形會產生 例如在多個輸出影格中 從同一輸入影格叢集推斷。如果輸出內容 部分輸出影格會在產生時立即取代 導致使用者難以查看和評估結果 視覺效果在這種情況下,我們可以用下列方式改善輸出圖表: 以平均間隔即時顯示影格

MediaPipe 將時間戳記對應至即時點,藉此處理這個使用情境。 每個時間戳記都代表以微秒為單位的時間,且計算器 (例如 LiveClockSyncCalculator 可以將封包的輸出延遲至與其相符 時間戳記。這種計算機可調整輸出時間,以:

  1. 輸出之間的時間相當於時間戳記的
  2. 輸出結果會以最短的延遲時間產生。

輸入後方的計算機圖形延遲

對許多即時 MediaPipe 圖表來說,低延遲是目標。MediaPipe 支援「pipelined」以便開始處理 及早下載每個封包在正常情況下,最低延遲時間為 每個計算工具在「關鍵路徑」上花費的總時間連續的 計算機。MediaPipe 圖表的延遲時間可能不如理想 也是因為上述的 ANR 事件發生時間延遲 輸出時間不均

如果圖表中的部分計算工具無法跟上即時輸入的速度 延遲時間也會持續增加 捨棄一些輸入封包建議的技巧是使用 MediaPipe 專門針對這類用途設計的計算機,例如 FlowLimiterCalculator,如 How to process realtime input streams