Dépannage

Chemin d'accès binaire Python manquant

Le message d'erreur suivant:

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

indique généralement que Bazel ne parvient pas à trouver le binaire Python local. Pour résoudre ce problème, commencez par rechercher l'emplacement du binaire Python, puis ajoutez --action_env PYTHON_BIN_PATH=<path to python binary> à la commande Bazel. Par exemple, vous pouvez basculer pour utiliser le binaire Python 3 par défaut du système à l'aide de la commande suivante:

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

Packages Python nécessaires manquants

Le message d'erreur suivant:

ImportError: No module named numpy
Is numpy installed?

indique généralement que certains packages Python ne sont pas installés. Pour installer ces packages, veuillez exécuter pip install ou pip3 install selon la version binaire de Python.

Échec de la récupération des dépôts de dépendances distants

Le message d'erreur suivant:

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)

indique généralement que Bazel ne parvient pas à télécharger les dépôts de dépendances nécessaires dont MediaPipe a besoin. MedaiPipe dispose de plusieurs dépôts de dépendances hébergés par des sites Google. Dans certaines régions, vous devrez peut-être configurer un proxy réseau ou utiliser un VPN pour accéder à ces ressources. Vous devrez peut-être également ajouter --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" à la commande Bazel. Pour en savoir plus, consultez ce problème GitHub.

Si vous pensez qu'il ne s'agit pas d'un problème réseau, il est possible que certaines ressources soient temporairement indisponibles. Veuillez exécuter bazel clean --expunge et réessayer plus tard. Si cela ne fonctionne toujours pas, veuillez signaler un problème sur GitHub en incluant le message d'erreur détaillé.

Configuration de MediaPipe OpenCV incorrecte

Le message d'erreur suivant:

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

indique généralement qu'OpenCV n'est pas correctement configuré pour MediaPipe. Consultez les sections "Installer OpenCV et FFmpeg" dans Installation pour savoir comment modifier les fichiers WORKSPACE et linux_opencv/macos_opencv/windows_opencv.BUILD de MediaPipe pour vos bibliothèques OpenCv locales. Ce problème GitHub peut également vous aider.

Échec de l'installation de Python pip

Le message d'erreur suivant:

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

après l'exécution de pip install mediapipe, cela indique généralement qu'il n'y a pas de Python MediaPipe qualifié pour votre système. Veuillez noter que MediaPipe Python PyPI est officiellement compatible avec les versions 64 bits de Python 3.7 à 3.10 sur les systèmes d'exploitation suivants:

  • Linux x86_64
  • x86_64 macOS 10.15+
  • Windows amd64

Si l'OS est actuellement compatible et que cette erreur s'affiche toujours, veuillez vous assurer que le binaire Python et le binaire pip sont adaptés à Python 3.7 à 3.10. Vous pouvez également compiler le package Python MediaPipe en local en suivant ces instructions.

Échec du chargement de la DLL Python sous Windows

Le message d'erreur suivant:

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

indique généralement que le système Windows local ne dispose pas de packages redistribuables Visual C++ et/ou de DLL d'exécution Visual C++. Pour résoudre ce problème, installez le fichier officiel vc_redist.x64.exe ou installez le package Python "msvc-runtime" en exécutant

$ python -m pip install msvc-runtime

Veuillez noter que le package Python "msvc-runtime" n'est ni publié, ni géré par Microsoft.

Méthode native introuvable

Le message d'erreur suivant:

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

indique généralement qu'une bibliothèque native nécessaire, telle que /libwickjni.so, n'a pas été chargée, n'a pas été incluse dans les dépendances de l'application ou est introuvable pour une raison quelconque. Notez que Java nécessite le chargement explicite de chaque bibliothèque native à l'aide de la fonction System.loadLibrary.

Aucune calculatrice enregistrée trouvée

Le message d'erreur suivant:

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

indique généralement que OurNewCalculator est référencé par son nom dans un élément CalculatorGraphConfig, mais que la cible de la bibliothèque pour OurNewCalculator n'a pas été associée au binaire de l'application. Lorsqu'une nouvelle calculatrice est ajoutée à un graphique de calculatrice, elle doit également être ajoutée en tant que dépendance de compilation des applications utilisant ce graphique.

Cette erreur est détectée au moment de l'exécution, car les graphiques des calculatrices référencent leurs calculatrices par nom via le champ CalculatorGraphConfig::Node:calculator. Lorsque la bibliothèque d'une calculatrice est associée à un binaire d'application, elle est automatiquement enregistrée par nom via la macro REGISTER_CALCULATOR à l'aide de la bibliothèque registration.h. Notez que REGISTER_CALCULATOR peut enregistrer un calculateur avec un préfixe d'espace de noms, identique à son espace de noms C++. Dans ce cas, le graphique du calculateur doit également utiliser le même préfixe d'espace de noms.

Erreur de mémoire insuffisante

L'épuisement de la mémoire peut être le symptôme d'un trop grand nombre de paquets qui s'accumulent dans un graphique MediaPipe en cours d'exécution. Plusieurs raisons peuvent expliquer cette situation. Par exemple:

  1. Certains calculateurs du graphe ne peuvent tout simplement pas suivre le rythme de l'arrivée de paquets provenant d'un flux d'entrée en temps réel, tel qu'une caméra vidéo.
  2. Certains calculateurs attendent des paquets qui n'arriveront jamais.

Pour le problème (1), il peut être nécessaire de déposer certains anciens paquets pour les plus anciens afin de traiter les paquets les plus récents. Pour obtenir des conseils, consultez How to process realtime input streams.

Pour le problème (2), il se peut qu'un flux d'entrée manque de paquets pour une raison quelconque. Un appareil ou un calculateur peut être mal configuré ou produire des paquets de manière sporadique. Cela peut amener les calculateurs en aval à attendre de nombreux paquets qui n'arrivent jamais, ce qui entraîne l'accumulation de paquets sur certains de leurs flux d'entrée. MediaPipe résout ce type de problème en utilisant les "limites d'horodatage". Pour obtenir des conseils, consultez How to process realtime input streams.

Le paramètre MediaPipe CalculatorGraphConfig::max_queue_size limite le nombre de paquets mis en file d'attente sur n'importe quel flux d'entrée en limitant les entrées du graphique. Pour les flux d'entrée en temps réel, le nombre de paquets en file d'attente au niveau d'un flux d'entrée doit presque toujours être égal à zéro ou à un. Dans le cas contraire, le message d'avertissement suivant peut s'afficher:

Resolved a deadlock by increasing max_queue_size of input stream

En outre, le paramètre CalculatorGraphConfig::report_deadlock peut être défini de manière à provoquer l'échec de l'exécution du graphique et à signaler l'interblocage comme une erreur, de sorte que max_queue_size agisse comme une limite d'utilisation de la mémoire.

Le graphique se bloque

De nombreuses applications appellent CalculatorGraph::CloseAllPacketSources et CalculatorGraph::WaitUntilDone pour terminer ou suspendre l'exécution d'un graphique MediaPipe. L'objectif est de permettre aux calculateurs ou aux paquets en attente d'effectuer le traitement, puis d'arrêter le graphique. Si tout se déroule comme prévu, chaque flux du graphique atteindra Timestamp::Done, et chaque calculateur atteindra CalculatorBase::Close, puis CalculatorGraph::WaitUntilDone s'exécutera correctement.

Si certains calculateurs ou flux ne peuvent pas atteindre l'état Timestamp::Done ou CalculatorBase::Close, la méthode CalculatorGraph::Cancel peut être appelée pour arrêter l'exécution du graphe sans attendre la fin de l'exécution de tous les calculateurs et paquets en attente.

Le temps de sortie est inégal

Certains graphiques MediaPipe en temps réel produisent une série d'images vidéo à visualiser comme un effet vidéo ou comme diagnostic vidéo. Parfois, un graphe MediaPipe génère ces frames en groupes, par exemple lorsque plusieurs images de sortie sont extrapolées à partir du même cluster de trames d'entrée. Si les résultats sont présentés tels qu'ils sont produits, certaines images de sortie sont immédiatement remplacées par des images ultérieures du même cluster, ce qui rend les résultats difficiles à voir et à évaluer visuellement. Dans de tels cas, la visualisation des résultats peut être améliorée en présentant les images à intervalles réguliers en temps réel.

MediaPipe résout ce cas d'utilisation en mappant les codes temporels avec des points en temps réel. Chaque horodatage indique une durée en microsecondes, et un calculateur tel que LiveClockSyncCalculator peut retarder la sortie des paquets pour qu'elle corresponde à leur horodatage. Ce type de calculateur ajuste la chronologie des résultats de sorte que:

  1. Le délai entre les sorties correspond à l'intervalle entre les horodatages le plus près possible.
  2. Les résultats sont générés avec le plus court délai possible.

Retards dans le calcul du graphique par rapport aux entrées

Pour de nombreux graphiques MediaPipe en temps réel, l'objectif est de réduire la latence. MediaPipe prend en charge le traitement parallèle de type "pipeline" afin de commencer le traitement de chaque paquet le plus tôt possible. Normalement, la latence la plus faible possible correspond au temps total nécessaire à chaque calculateur sur un "chemin critique" composé de calculs successifs. La latence d'un graphique MediaPipe peut être pire que l'idéale en raison des retards introduits pour afficher les images à intervalles réguliers, comme décrit dans la section Le temps de sortie est inégal.

Si certains calculateurs du graphe ne peuvent pas suivre le rythme des flux d'entrée en temps réel, la latence continue d'augmenter et il devient nécessaire de supprimer certains paquets d'entrée. La technique recommandée consiste à utiliser les simulateurs MediaPipe spécialement conçus à cet effet, tels que FlowLimiterCalculator, comme décrit dans How to process realtime input streams.