トラブルシューティング

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> を追加します。たとえば、システムのデフォルト 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 サイトでホストされる複数の依存関係リポジトリがあります。一部のリージョンでは、ネットワーク プロキシを設定するか、VPN を使用してこれらのリソースにアクセスする必要があります。Bazel コマンドに --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" を追加する必要がある場合もあります。詳しくは、こちらの 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 ライブラリ用に MediaPipe の WORKSPACE ファイルと linux_opencv/macos_opencv/windows_opencv.BUILD ファイルを変更する方法については、インストールの「OpenCV と FFmpeg をインストールする」セクションをご覧ください。こちらの 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 は、次の OS 上で 64 ビット バージョンの Python 3.7 ~ 3.10 を正式にサポートしています。

  • x86_64 Linux
  • x86_64 macOS 10.15 以降
  • AMD64 Windows

OS が現在サポートされているのにこのエラーが表示される場合は、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"

通常、OurNewCalculatorCalculatorGraphConfig の名前で参照されているが、OurNewCalculator のライブラリ ターゲットがアプリバイナリにリンクされていないことを示します。新しい計算ツールを電卓のグラフに追加する場合は、電卓グラフを使用するアプリケーションのビルド依存関係としてその計算ツールも追加する必要があります。

計算機のグラフは CalculatorGraphConfig::Node:calculator フィールドを通じて計算機を名前で参照するため、このエラーは実行時に検出されます。計算ツールのライブラリがアプリケーション バイナリにリンクされている場合、registration.h ライブラリを使用して計算ツールが REGISTER_CALCULATOR マクロにより名前で自動的に登録されます。REGISTER_CALCULATOR では、C++ 名前空間と同じ名前空間接頭辞を使用して計算ツールを登録できます。この場合、計算ツールのグラフでも同じ名前空間接頭辞を使用する必要があります。

メモリ不足エラー

メモリの枯渇は、実行中の MediaPipe グラフ内で蓄積されたパケットが多すぎることを示している可能性があります。これには、次のようなさまざまな理由が考えられます。

  1. グラフ内の一部の計算ツールは、ビデオカメラなどのリアルタイムの入力ストリームからのパケットの到着についていくことができません。
  2. 一部の計算機は、到着しないパケットを待機しています。

問題(1)については、新しいパケットを処理するために、古いパケットをドロップする必要がある場合があります。ヒントについては、How to process realtime input streams をご覧ください。

問題(2)については、1 つの入力ストリームになんらかの理由でパケットが欠落している可能性があります。デバイスまたは計算ツールが正しく構成されていないか、パケットが散発的に生成される場合があります。これにより、ダウンストリームの計算ツールが到着しない多くのパケットを待機し、パケットが一部の入力ストリームに蓄積する可能性があります。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

また、max_queue_size がメモリ使用量の上限として機能するように、CalculatorGraphConfig::report_deadlock を設定して、グラフ実行が失敗し、デッドロックをエラーとして表示することもできます。

グラフがハングする

多くのアプリケーションは、CalculatorGraph::CloseAllPacketSourcesCalculatorGraph::WaitUntilDone を呼び出して、MediaPipe グラフの実行を終了または一時停止します。ここでの目標は、保留中の計算ツールまたはパケットの処理を完了してから、グラフをシャットダウンすることです。問題がなければ、グラフ内のすべてのストリームが Timestamp::Done に達し、すべての計算ツールが CalculatorBase::Close に達すると、CalculatorGraph::WaitUntilDone は正常に完了します。

一部の計算ツールまたはストリームが状態 Timestamp::Done または CalculatorBase::Close に到達できない場合は、メソッド CalculatorGraph::Cancel を呼び出して、保留中のすべての計算機とパケットの完了を待たずにグラフの実行を終了できます。

出力タイミングが不均一である

一部のリアルタイムの MediaPipe グラフでは、動画エフェクトまたは動画診断として表示するための一連の動画フレームが生成されます。MediaPipe グラフは、クラスタ内にこれらのフレームを生成することがあります。たとえば、同じ入力フレームのクラスタから複数の出力フレームが推定された場合などです。出力が生成されたときに表示される場合、一部の出力フレームはすぐに同じクラスタ内の後のフレームに置き換えられるため、結果を視覚的に確認することが難しくなります。このような場合、フレームを一定間隔でリアルタイムに表示することで、出力の可視化を改善できます。

MediaPipe は、タイムスタンプをリアルタイムのポイントにマッピングすることで、このユースケースに対処します。各タイムスタンプはマイクロ秒単位で時刻を示し、LiveClockSyncCalculator などの計算機は、タイムスタンプと一致するようにパケットの出力を遅らせることができます。このタイプの計算ツールでは、次のように出力のタイミングが調整されます。

  1. 出力間の時間は、タイムスタンプ間の時間にできるだけ近くなります。
  2. 出力は可能な限り低い遅延で生成されます。

CalculatorGraph が入力より遅れている

多くのリアルタイムの MediaPipe グラフでは、低レイテンシが目標です。MediaPipe は、各パケットの処理をできるだけ早く開始するために、「パイプライン」スタイルの並列処理をサポートしています。通常、最も低いレイテンシは、連続する計算ツールの「クリティカル パス」に沿って各計算ツールが必要とする合計時間です。MediaPipe グラフのレイテンシは、出力タイミングが不均一で説明されているように、等間隔の表示フレームに遅延が発生するため、理想的な値よりも悪くなる可能性があります。

グラフ内の計算ツールの一部がリアルタイムの入力ストリームに対応できない場合、レイテンシは増加し続け、一部の入力パケットをドロップする必要があります。この目的のために特別に設計された MediaPipe 計算ツール(How to process realtime input streams で説明されている FlowLimiterCalculator など)を使用することをおすすめします。