Chemin d'accès au binaire Python manquant
Message d'erreur:
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, veuillez d'abord trouver l'emplacement du binaire Python, puis ajouter --action_env PYTHON_BIN_PATH=<path to python binary>
à la commande Bazel. Par exemple, vous pouvez passer à l'utilisation du binaire python3 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
Message d'erreur:
ImportError: No module named numpy
Is numpy installed?
indique généralement que certains packages Python ne sont pas installés. Veuillez exécuter pip install
ou pip3 install
en fonction de votre version binaire de Python pour installer ces packages.
Échec de la récupération des dépôts de dépendances distants
Message d'erreur:
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 à MediaPipe. MediaPipe 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 cette demande sur GitHub.
Si vous pensez qu'il ne s'agit pas d'un problème de réseau, il est possible que certaines ressources soient temporairement indisponibles. Veuillez exécuter bazel clean --expunge
et réessayer plus tard. Si le problème n'est toujours pas résolu, veuillez signaler un problème sur GitHub en indiquant le message d'erreur détaillé.
Configuration OpenCV MediaPipe incorrecte
Message d'erreur:
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. Veuillez consulter les sections "Installer OpenCV et FFmpeg" dans la section Installation pour savoir comment modifier les fichiers WORKSPACE et linux_opencv/macos_opencv/windows_opencv.BUILD de MediaPipe pour vos bibliothèques OpenCV locales. Cette demande sur GitHub peut également vous aider.
Échec de l'installation de pip Python
Message d'erreur:
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
indique généralement qu'il n'existe pas de MediaPipe Python qualifié pour votre système. Veuillez noter que MediaPipe Python PyPI est officiellement compatible avec la version 64 bits de Python 3.7 à 3.10 sur les OS suivants:
- Linux x86_64
- x86_64 macOS 10.15 ou version ultérieure
- Windows amd64
Si l'OS est actuellement compatible et que cette erreur persiste, veuillez vous assurer que les binaires Python et pip sont compatibles avec Python 3.7 à 3.10. Sinon, envisagez de créer le package Python MediaPipe localement en suivant les instructions ici.
Échec du chargement de la DLL Python sous Windows
Message d'erreur:
ImportError: DLL load failed: The specified module could not be found
indique généralement que le système Windows local ne dispose pas des packages redistribuables Visual C++ et/ou des DLL d'exécution Visual C++. Pour résoudre ce problème, vous pouvez installer le vc_redist.x64.exe officiel ou le package Python "msvc-runtime" en exécutant
$ python -m pip install msvc-runtime
Veuillez noter que le package Python "msvc-runtime" n'est pas publié ni géré par Microsoft.
Méthode native introuvable
Message d'erreur:
java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick
indique généralement qu'une bibliothèque native requise, telle que /libwickjni.so
, n'a pas été chargée ou n'a pas été incluse dans les dépendances de l'application, ou qu'elle ne peut pas être trouvée pour une raison quelconque. Notez que Java exige que chaque bibliothèque native soit chargée explicitement à l'aide de la fonction System.loadLibrary
.
Aucune calculatrice enregistrée trouvée
Message d'erreur:
No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"
indique généralement que OurNewCalculator
est référencé par nom dans un CalculatorGraphConfig
, mais que la cible de bibliothèque pour OurNewCalculator n'a pas été associée au binaire de l'application. Lorsqu'un nouveau calculateur est ajouté à un graphique de calculatrice, ce calculateur doit également être ajouté en tant que dépendance de compilation des applications qui utilisent le graphique de calculatrice.
Cette erreur est détectée au moment de l'exécution, car les graphiques de calculatrice font référence à leurs calculatrices par nom via le champ CalculatorGraphConfig::Node:calculator
.
Lorsque la bibliothèque d'une calculatrice est associée à un binaire d'application, la calculatrice 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 une calculatrice avec un préfixe d'espace de noms, identique à son espace de noms C++. Dans ce cas, le graphique de la calculatrice 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 un symptôme d'un trop grand nombre de paquets accumulés dans un graphique MediaPipe en cours d'exécution. Plusieurs raisons peuvent expliquer cette situation:
- Certaines calculatrices du graphique ne peuvent tout simplement pas suivre l'arrivée des paquets d'un flux d'entrée en temps réel, comme une caméra vidéo.
- Certaines calculatrices attendent des paquets qui n'arriveront jamais.
Pour le problème 1, il peut être nécessaire de supprimer certains anciens paquets pour traiter les paquets 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 une calculatrice peuvent être mal configurés ou ne produire des paquets que de manière sporadique. Cela peut entraîner l'attente de nombreux paquets qui n'arriveront jamais, ce qui entraîne à son tour l'accumulation de paquets sur certains de leurs flux d'entrée. MediaPipe résout ce type de problème à l'aide de "bornes de code temporel". Pour obtenir des conseils, consultez la page 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 au graphique. Pour les flux d'entrée en temps réel, le nombre de paquets mis en file d'attente dans un flux d'entrée doit presque toujours être nul ou un. Si ce n'est pas le cas, 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 pour que l'exécution du graphique échoue et que l'erreur de blocage apparaisse en tant qu'erreur, de sorte que max_queue_size agisse comme une limite d'utilisation de la mémoire.
Graphique bloqué
De nombreuses applications appellent CalculatorGraph::CloseAllPacketSources
et CalculatorGraph::WaitUntilDone
pour terminer ou suspendre l'exécution d'un graphique MediaPipe. L'objectif ici est de permettre à tous les calculatrices ou paquets en attente de terminer le traitement, puis d'arrêter le graphique. Si tout se passe bien, chaque flux du graphique atteint Timestamp::Done
, chaque calculatrice atteint CalculatorBase::Close
, puis CalculatorGraph::WaitUntilDone
se termine correctement.
Si certains calculatrices 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 graphique sans attendre la fin de tous les calculatrices et paquets en attente.
La synchronisation des sorties est inégale
Certains graphiques MediaPipe en temps réel produisent une série de frames vidéo à afficher en tant qu'effet vidéo ou diagnostic vidéo. Parfois, un graphique MediaPipe produit ces images dans des clusters, par exemple lorsque plusieurs images de sortie sont extrapolées à partir du même cluster d'images d'entrée. Si les sorties sont présentées au fur et à mesure de leur production, 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 ce cas, la visualisation de la sortie 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 sur des points en temps réel.
Chaque code temporel indique une heure en microsecondes, et une calculatrice telle que LiveClockSyncCalculator
peut retarder la sortie des paquets pour qu'elle corresponde à leurs codes temporels. Ce type de calculatrice ajuste le timing des sorties de sorte que:
- Le temps entre les sorties correspond au temps entre les codes temporels le plus précisément possible.
- Les sorties sont produites avec le délai le plus court possible.
CalculatorGraph est en retard par rapport aux entrées
Pour de nombreux graphiques MediaPipe en temps réel, une faible latence est un objectif. MediaPipe accepte le traitement parallèle de type "pipeline" afin de commencer le traitement de chaque paquet dès que possible. Normalement, la latence la plus faible possible correspond au temps total requis par chaque calculatrice sur un "chemin critique" de calculatrices successives. La latence d'un graphique MediaPipe peut être pire que l'idéal en raison des retards introduits pour afficher les frames à des intervalles réguliers, comme décrit dans la section Le timing de sortie est inégal.
Si certains des calculatrices du graphique ne peuvent pas suivre le rythme des flux d'entrée en temps réel, la latence continuera d'augmenter, et il deviendra nécessaire d'abandonner certains paquets d'entrée. La technique recommandée consiste à utiliser les calculatrices MediaPipe conçues spécifiquement à cet effet, telles que FlowLimiterCalculator
, comme décrit dans How to process realtime input streams
.
Surveiller les entrées de la calculatrice et les règlements avec code temporel
Le débogage des calculatrices MediaPipe nécessite souvent une compréhension approfondie du flux de données et de la synchronisation des codes temporels. Les paquets entrants vers les calculatrices sont d'abord mis en mémoire tampon dans les files d'attente d'entrée par flux pour être synchronisés par le InputStreamHandler
attribué. La tâche InputStreamHandler
consiste à déterminer l'ensemble de paquets d'entrée pour un code temporel défini, ce qui met la calculatrice en état "prête", puis à déclencher un appel Calculator::Process avec l'ensemble de paquets déterminé comme entrée.
DebugInputStreamHandler
peut être utilisé pour suivre les paquets entrants et les règlements avec horodatage en temps réel dans la sortie LOG(INFO) de l'application. Il peut être attribué à des calculatrices spécifiques via le champ input_stream_handler de la calculatrice ou graphé globalement via le champ input_stream_handler de CalculatorGraphConfig
.
Lors de l'exécution du graphique, les paquets entrants génèrent des messages LOG qui révèlent le code temporel et le type du paquet, suivis de l'état actuel de toutes les files d'attente d'entrée:
[INFO] SomeCalculator: Adding packet (ts:2, type:int) to stream INPUT_B:0:input_b
[INFO] SomeCalculator: INPUT_A:0:input_a num_packets: 0 min_ts: 2
[INFO] SomeCalculator: INPUT_B:0:input_b num_packets: 1 min_ts: 2
De plus, il permet de surveiller les événements de règlement du code temporel (au cas où le DefaultInputStreamHandler
est appliqué). Cela peut aider à révéler une augmentation inattendue de la limite de code temporel sur les flux d'entrée, ce qui entraîne un appel Calculator::Process avec un ensemble d'entrée incomplet, ce qui génère des paquets vides sur les flux d'entrée (potentiellement requis).
Exemple de scénario :
node {
calculator: "SomeCalculator"
input_stream: "INPUT_A:a"
input_stream: "INPUT_B:b"
...
}
Étant donné une calculatrice avec deux entrées, recevant un paquet entrant avec un code temporel 1 sur le flux A, suivi d'un paquet d'entrée avec un code temporel 2 sur le flux B. La limite de code temporel passe à 2 sur le flux B avec un paquet d'entrée en attente sur le flux A au code temporel 1, ce qui déclenche l'appel Calculator::Process avec un ensemble d'entrée incomplet pour le code temporel 1. Dans ce cas, DefaultInputStreamHandler
renvoie:
[INFO] SomeCalculator: Filled input set at ts: 1 with MISSING packets in input streams: INPUT_B:0:input_b.
Les vlogs sont vos alliés
MediaPipe utilise VLOG
à de nombreux endroits pour consigner des événements importants à des fins de débogage, sans affecter les performances si la journalisation n'est pas activée.
En savoir plus sur VLOG
sur abseil VLOG
N'oubliez pas que VLOG
peut générer du spam si vous l'activez globalement (par exemple, à l'aide de l'option --v
). L'indicateur --vmodule
de la solution permet de définir différents niveaux pour différents fichiers sources.
Lorsque --v
/ --vmodule
ne peut pas être utilisé (par exemple, lors de l'exécution d'une application Android), MediaPipe permet de définir des forçages de drapeaux VLOG
--v
/ --vmodule
à des fins de débogage, qui sont appliqués lors de la création de CalculatorGraph
.
Remplacements:
MEDIAPIPE_VLOG_V
: définissez et fournissez la valeur que vous fournissez pour--v
.MEDIAPIPE_VLOG_VMODULE
: définissez et fournissez la valeur que vous fournissez pour--vmodule
.
Vous pouvez définir des forçages en ajoutant :
--copt=-DMEDIAPIPE_VLOG_VMODULE=\"*calculator*=5\"
avec les modèles de modules et les niveaux VLOG
souhaités (pour en savoir plus sur --vmodule
, consultez abseil VLOG
) à votre commande de compilation.
IMPORTANT: N'oubliez pas que l'ajout de la commande ci-dessus à votre commande de compilation déclenchera la recompilation de l'ensemble du binaire, y compris des dépendances. Étant donné que les forçages VLOG
existent uniquement à des fins de débogage, il est plus rapide de simplement modifier vlog_overrides.cc
en ajoutant MEDIAPIPE_VLOG_V/VMODULE
tout en haut.
Options non compatibles lors de la compilation
Si vous utilisez Clang 18 ou une version antérieure, vous devrez peut-être désactiver certaines optimisations du compilateur dans notre backend de processeur.
Pour désactiver la prise en charge de avxvnniint8
, ajoutez ce qui suit à votre .bazelrc
:
build --define=xnn_enable_avxvnniint8=false