缺少 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 install
或 pip3 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),您可能需要捨棄較早的舊封包才能處理較新的封包。如需提示,請參閱: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::CloseAllPacketSources
和 CalculatorGraph::WaitUntilDone
,以完成或暫停 MediaPipe 圖表的執行作業。這裡的目標是允許所有待處理計算器或封包完成處理,然後關閉圖表。如果一切順利,圖表中的每個串流都會達到 Timestamp::Done
,且每個計算機都會達到 CalculatorBase::Close
,然後 CalculatorGraph::WaitUntilDone
就會順利完成。
如果部分計算機或串流無法達到 Timestamp::Done
或 CalculatorBase::Close
狀態,則可以呼叫 CalculatorGraph::Cancel
方法來終止圖形執行,不必等待所有待處理計算器和封包完成。
輸出時間不平均
部分即時 MediaPipe 圖表會產生一系列影片影格,用於查看影片效果或診斷影片。有時候,MediaPipe 圖表會在叢集中產生這些影格,例如從同一個輸入影格叢集內插出多個輸出影格的情況。如果輸出結果在產生時提供,系統會立即將部分輸出影格取代為同一叢集內的較晚影格,導致結果難以以視覺化方式查看和評估。在這類情況下,您可以平均間隔顯示影格,藉此改善輸出的視覺化效果。
MediaPipe 透過將時間戳記即時對應至時間點,藉此處理這個使用案例。每個時間戳記都代表時間 (以微秒為單位),而 LiveClockSyncCalculator
等計算機會延遲封包輸出,使其與時間戳記相符。這個計算器會調整輸出的時間,讓結果如下:
- 輸出結果之間的時間會盡可能接近時間戳記之間的時間。
- 輸出結果會以最短的延遲時間產生。
計算器圖形落後輸入
對許多即時 MediaPipe 圖表而言,低延遲是目標。MediaPipe 支援「管道」樣式平行處理,以便盡早開始處理每個封包。一般來說,延遲時間最長為:每個計算機在連續計算器的「關鍵路徑」上需要的總時間。如輸出時間不均勻所述,造成影格顯示間隔的時間延遲,因此 MediaPipe 圖表的延遲時間可能低於理想。
如果圖形中的某些計算機無法與即時輸入串流維持速度,則延遲時間會持續增加,而且必須捨棄某些輸入封包。建議您採用專為此目的設計的 MediaPipe 計算機,例如 How to process realtime input streams
中所述的 FlowLimiterCalculator
。