疑難排解

缺少 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 網站代管的依附元件存放區。在某些地區,您可能需要設定網路 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 與 linux_opencv/macos_opencv/windows_opencv.BUILD 檔案,以用於本機 opencv 程式庫。這個 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。請注意,在下列 OS 中,MediaPipe Python PyPI 正式支援 64 位元版本的 Python 3.7 至 3.10:

  • x86_64 Linux
  • x86_64 macOS 10.15 以上版本
  • amd64 Windows

如果目前支援 OS,但系統仍顯示這個錯誤,請確認 Python 3.7 和 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"

通常表示 CalculatorGraphConfig 中由名稱參照 OurNewCalculator,但 OurNewCalculator 的程式庫目標尚未連結至應用程式二進位檔。將新的計算機加入計算機圖時,也必須使用計算機圖,將該計算機新增為應用程式的建構依附元件。

這個錯誤會在執行階段發生,因為計算機圖形會透過 CalculatorGraphConfig::Node:calculator 欄位參照其計算機。當計算機的程式庫連結至應用程式二進位檔時,系統會使用 registration.h 程式庫,透過 REGISTER_CALCULATOR 巨集依名稱自動註冊計算機。請注意,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 會限制輸入到圖形的輸入內容,以限制任何輸入串流排入佇列的封包數量。對於即時輸入串流,在輸入串流中排入佇列的封包數幾乎一律應為零或一。如果並非如此,可能會看到以下警告訊息:

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 支援「管道」樣式平行處理,以便盡早開始處理每個封包。一般來說,延遲時間最長為:每個計算機在連續計算器的「關鍵路徑」上需要的總時間。如輸出時間不均勻所述,造成影格顯示間隔的時間延遲,因此 MediaPipe 圖表的延遲時間可能低於理想。

如果圖形中的某些計算機無法與即時輸入串流維持速度,則延遲時間會持續增加,而且必須捨棄某些輸入封包。建議您採用專為此目的設計的 MediaPipe 計算機,例如 How to process realtime input streams 中所述的 FlowLimiterCalculator