Fehlerbehebung

Binärer Python-Pfad fehlt

Die Fehlermeldung:

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

weist in der Regel darauf hin, dass Qwiklabs das lokale Python-Binärprogramm nicht finden kann. Um dieses Problem zu lösen, suchen Sie zuerst nach, wo sich die Python-Binärdatei befindet, und fügen Sie dann --action_env PYTHON_BIN_PATH=<path to python binary> in den Befehl „Ballu“ ein. Mit dem folgenden Befehl können Sie beispielsweise das Standard-Python3-Binärprogramm des Systems verwenden:

bazel build -c opt \
  --define MEDIAPIPE_DISABLE_GPU=1 \
  --action_env PYTHON_BIN_PATH=$(which python3) \
  mediapipe/examples/desktop/hello_world

Erforderliche Python-Pakete fehlen

Die Fehlermeldung:

ImportError: No module named numpy
Is numpy installed?

gibt normalerweise an, dass bestimmte Python-Pakete nicht installiert sind. Führen Sie je nach Python-Binärversion pip install oder pip3 install aus, um diese Pakete zu installieren.

Fehler beim Abrufen von Remote-Abhängigkeits-Repositories

Die Fehlermeldung:

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)

weist in der Regel darauf hin, dass Bazel die erforderlichen Abhängigkeits-Repositories nicht herunterlädt, die MediaPipe benötigt. MedaiPipe hat mehrere Abhängigkeits-Repositories, die von Google-Websites gehostet werden. In einigen Regionen müssen Sie möglicherweise einen Netzwerkproxy einrichten oder ein VPN verwenden, um auf diese Ressourcen zuzugreifen. Möglicherweise müssen Sie auch --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" an den YAML-Befehl anhängen. Weitere Informationen finden Sie in diesem GitHub-Problem.

Wenn Sie glauben, dass es sich nicht um ein Netzwerkproblem handelt, können einige Ressourcen auch vorübergehend nicht verfügbar sein. Führen Sie bazel clean --expunge aus und versuchen Sie es später noch einmal. Wenn sie immer noch nicht funktioniert, melden Sie ein GitHub-Problem mit der detaillierten Fehlermeldung.

Falsche MediaPipe-OpenCV-Konfiguration

Die Fehlermeldung:

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)'

gibt normalerweise an, dass OpenCV nicht richtig für MediaPipe konfiguriert ist. Sehen Sie sich unter Installation die Abschnitte „OpenCV und FFmpeg installieren“ an, um zu erfahren, wie Sie die Dateien WORKSPACE und linux_opencv/macos_opencv/windows_opencv.build von MediaPipe für Ihre lokalen opencv-Bibliotheken ändern. Auch dieses GitHub-Problem könnte hilfreich sein.

Fehler bei der Python-Pip-Installation

Die Fehlermeldung:

ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe

pip install mediapipe zeigt in der Regel an, dass kein qualifiziertes MediaPipe-Python für Ihr System vorhanden ist. Beachten Sie, dass das Python-PyPI von MediaPipe offiziell die 64-Bit-Version von Python 3.7 bis 3.10 auf den folgenden Betriebssystemen unterstützt:

  • x86_64 Linux
  • x86_64 macOS 10.15+
  • amd64 Windows

Wenn das Betriebssystem derzeit unterstützt wird und dieser Fehler weiterhin angezeigt wird, prüfen Sie, ob sowohl das Python- als auch das pip-Binärprogramm für Python 3.7 bis 3.10 verwendet wird. Andernfalls sollten Sie das Python-Paket für MediaPipe eventuell lokal erstellen. Folgen Sie dazu dieser Anleitung.

Fehler beim Laden der Python-DLL unter Windows

Die Fehlermeldung:

ImportError: DLL load failed: The specified module could not be found

weist in der Regel darauf hin, dass im lokalen Windows-System verteilbare Visual C++-Pakete und/oder Visual C++-Laufzeit-DLLs fehlen. Sie können dieses Problem beheben, indem Sie entweder das offizielle vc_redist.x64.exe oder das Python-Paket „msvc-runtime“ installieren. Führen Sie dazu den folgenden Befehl aus:

$ python -m pip install msvc-runtime

Beachten Sie, dass das Python-Paket „msvc-runtime“ nicht von Microsoft veröffentlicht oder gepflegt wird.

Native Methode nicht gefunden

Die Fehlermeldung:

java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick

gibt normalerweise an, dass eine erforderliche native Bibliothek wie /libwickjni.so nicht geladen wurde, nicht in den Abhängigkeiten der Anwendung enthalten ist oder aus irgendeinem Grund nicht gefunden wurde. Beachten Sie, dass Java erfordert, dass jede native Bibliothek mit der Funktion System.loadLibrary explizit geladen wird.

Kein registrierter Rechner gefunden

Die Fehlermeldung:

No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"

gibt normalerweise an, dass OurNewCalculator mit dem Namen in einem CalculatorGraphConfig referenziert wird, aber dass das Bibliotheksziel für OurNewCalculator nicht mit dem Binärprogramm der Anwendung verknüpft ist. Wenn einer Taschenrechnergrafik ein neuer Rechner hinzugefügt wird, muss dieser auch als Build-Abhängigkeit der Anwendungen hinzugefügt werden, die die Taschenrechnergrafik verwenden.

Dieser Fehler wird zur Laufzeit erfasst, da Taschenrechnerdiagramme über das Feld CalculatorGraphConfig::Node:calculator namentlich auf ihre Rechner verweisen. Wenn die Bibliothek für einen Rechner mit einer Anwendungsbinärdatei verknüpft ist, wird der Rechner automatisch mit dem Namen über das REGISTER_CALCULATOR-Makro und die registration.h-Bibliothek registriert. REGISTER_CALCULATOR kann einen Rechner mit einem Namespace-Präfix registrieren, das mit seinem C++-Namespace identisch ist. In diesem Fall muss die Taschenrechnergrafik ebenfalls dasselbe Namespace-Präfix verwenden.

Fehler: Nicht genügend Arbeitsspeicher

Eine Überlastung des Arbeitsspeichers kann ein Symptom dafür sein, dass sich zu viele Pakete in einer laufenden MediaPipe-Grafik angesammelt haben. Dies kann verschiedene Gründe haben, z. B.:

  1. Einige Taschenrechner in der Grafik können einfach nicht mit dem Eingang von Paketen aus einem Echtzeit-Eingabestream wie einer Videokamera Schritt halten.
  2. Einige Rechner warten auf Pakete, die nie ankommen.

Bei Problem 1 kann es erforderlich sein, einige alte Pakete aus den älteren Paketen zu löschen, um die neueren Pakete zu verarbeiten. Einige Hinweise finden Sie unter How to process realtime input streams.

Bei Problem 2 kann es sein, dass in einem Eingabestream aus irgendeinem Grund Pakete fehlen. Ein Gerät oder ein Rechner ist möglicherweise falsch konfiguriert oder kann Pakete nur sporadisch erzeugen. Dies kann dazu führen, dass nachgelagerte Rechner auf viele Pakete warten, die nie ankommen, was wiederum dazu führt, dass sich in einigen Eingabestreams Pakete ansammeln. MediaPipe löst diese Art von Problem mithilfe von Zeitstempelgrenzen. Einige Hinweise finden Sie unter How to process realtime input streams.

Die MediaPipe-Einstellung CalculatorGraphConfig::max_queue_size begrenzt die Anzahl der Pakete, die in der Warteschlange für einen Eingabestream stehen, indem die Eingaben in das Diagramm gedrosselt werden. Bei Echtzeit-Eingabestreams sollte die Anzahl der Pakete in der Warteschlange fast immer null oder eins sein. Wenn dies nicht der Fall ist, wird möglicherweise die folgende Warnmeldung angezeigt:

Resolved a deadlock by increasing max_queue_size of input stream

Außerdem kann die Einstellung CalculatorGraphConfig::report_deadlock so festgelegt werden, dass die Ausführung der Grafik fehlschlägt und der Deadlock als Fehler angezeigt wird, sodass „max_queue_size“ als Limit für die Arbeitsspeichernutzung verwendet wird.

Grafik hängt

Viele Anwendungen rufen CalculatorGraph::CloseAllPacketSources und CalculatorGraph::WaitUntilDone auf, um die Ausführung eines MediaPipe-Diagramms abzuschließen oder anzuhalten. Das Ziel besteht hier darin, dass alle ausstehenden Rechner oder Pakete die Verarbeitung abschließen können, und dann die Grafik herunterfahren. Wenn alles gut läuft, erreicht jeder Stream im Diagramm Timestamp::Done und jeder Rechner erreicht CalculatorBase::Close, woraufhin CalculatorGraph::WaitUntilDone erfolgreich abgeschlossen wird.

Wenn einige Rechner oder Streams den Status Timestamp::Done oder CalculatorBase::Close nicht erreichen können, kann die Methode CalculatorGraph::Cancel aufgerufen werden, um die Ausführung der Grafik zu beenden, ohne auf den Abschluss aller ausstehenden Rechner und Pakete zu warten.

Zeitangaben für Ausgabe sind ungleichmäßig

Einige MediaPipe-Echtzeitdiagramme erzeugen eine Reihe von Videoframes, die als Videoeffekt oder als Videodiagnose angesehen werden können. Manchmal erzeugt eine MediaPipe-Grafik diese Frames in Clustern, z. B. wenn mehrere Ausgabeframes aus demselben Cluster von Eingabeframes extrapoliert werden. Wenn die Ausgaben so präsentiert werden, wie sie erstellt wurden, werden einige Ausgabeframes sofort durch spätere Frames im selben Cluster ersetzt, wodurch die Ergebnisse schwer zu sehen und visuell zu bewerten sind. In solchen Fällen kann die Ausgabevisualisierung verbessert werden, indem die Frames in gleichmäßigen Intervallen in Echtzeit präsentiert werden.

MediaPipe berücksichtigt diesen Anwendungsfall, indem es Punkten in Echtzeit Zeitstempel zuordnet. Jeder Zeitstempel gibt eine Zeit in Mikrosekunden an und ein Rechner wie LiveClockSyncCalculator kann die Ausgabe von Paketen verzögern, damit sie ihren Zeitstempeln entsprechen. Diese Art von Rechner passt das Timing der Ausgaben so an:

  1. Die Zeit zwischen den Ausgaben entspricht der Zeit zwischen den Zeitstempeln so genau wie möglich.
  2. Ausgaben werden mit der kleinstmöglichen Verzögerung erzeugt.

CalculatorGraph liegt hinter Eingaben zurück

Für viele Realtime-MediaPipe-Diagramme ist niedrige Latenz ein Ziel. MediaPipe unterstützt die parallele Verarbeitung im Pipeline-Stil, um mit der Verarbeitung jedes Pakets so früh wie möglich zu beginnen. In der Regel ist die geringstmögliche Latenz die Gesamtzeit, die von jedem Rechner entlang eines „kritischen Pfads“ von aufeinanderfolgenden Rechnern benötigt wird. Die Latenz einer MediaPipe-Grafik könnte aufgrund von Verzögerungen bei der Darstellung von Frames in gleichmäßigen Intervallen schlechter als das Ideal sein, wie unter Ausgabezeit ist ungleichmäßig beschrieben.

Wenn einige der Rechner in der Grafik nicht mit den Echtzeit-Eingabestreams Schritt halten können, erhöht sich die Latenz weiter und es müssen einige Eingabepakete verworfen werden. Es wird empfohlen, speziell für diesen Zweck entwickelte MediaPipe-Rechner zu verwenden, z. B. FlowLimiterCalculator, wie in How to process realtime input streams beschrieben.