Risoluzione dei problemi

Percorso binario Python mancante

Messaggio di errore:

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

di solito indica che Bazel non riesce a trovare il programma binario Python locale. Per risolvere il problema, individua innanzitutto dov'è il programma binario Python, quindi aggiungi --action_env PYTHON_BIN_PATH=<path to python binary> al comando Bazel. Ad esempio, puoi passare all'utilizzo del programma binario python3 predefinito di sistema utilizzando il seguente comando:

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

Pacchetti Python necessari mancanti

Messaggio di errore:

ImportError: No module named numpy
Is numpy installed?

di solito indica che alcuni pacchetti Python non sono installati. Esegui pip install o pip3 install a seconda della versione binaria di Python per installare questi pacchetti.

Impossibile recuperare i repository di dipendenze remote

Messaggio di errore:

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)

di solito indica che Bazel non riesce a scaricare i repository di dipendenze necessari. MedaiPipe ha diversi repository di dipendenze ospitati da siti Google. In alcune regioni, potrebbe essere necessario configurare un proxy di rete o utilizzare una VPN per accedere a queste risorse. Potresti anche dover aggiungere --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" al comando Bazel. Per ulteriori dettagli, consulta questo problema su GitHub.

Se ritieni che non si tratti di un problema di rete, un'altra possibilità è che alcune risorse siano temporaneamente non disponibili, esegui bazel clean --expunge e riprova più tardi. Se il problema persiste, segnala un problema su GitHub con il messaggio di errore dettagliato.

Configurazione MediaPipe OpenCV errata

Messaggio di errore:

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

di solito indica che OpenCV non è configurato correttamente per MediaPipe. Dai un'occhiata alle sezioni"Installa OpenCV e FFmpeg" in Installazione per scoprire come modificare i file WORKSPACE e linux_opencv/macos_opencv/windows_opencv.Build per le librerie opencv locali di MediaPipe. Anche questo problema su GitHub potrebbe essere utile.

Errore di installazione pip Python

Messaggio di errore:

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

dopo l'esecuzione di pip install mediapipe, di solito indica che non esiste un linguaggio Python MediaPipe qualificato per il tuo sistema. Tieni presente che MediaPipe Python PyPI supporta ufficialmente la versione a 64 bit di Python da 3.7 a 3.10 sui seguenti sistemi operativi:

  • x86_64 Linux
  • x86_64 macOS 10.15 e versioni successive
  • amd64 Windows

Se il sistema operativo è attualmente supportato e continui a visualizzare questo errore, assicurati che i programmi binari Python e pip siano compatibili con Python da 3.7 a 3.10. In caso contrario, valuta la possibilità di creare il pacchetto Python MediaPipe in locale seguendo le istruzioni qui.

Errore di caricamento DLL Python su Windows

Messaggio di errore:

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

di solito indica che nel sistema Windows locale mancano i pacchetti ridistribuibili di Visual C++ e/o le DLL di runtime di Visual C++. Questo problema può essere risolto installando il pacchetto Python ufficiale vc_redist.x64.exe o installando il pacchetto Python "msvc-runtime" eseguendo

$ python -m pip install msvc-runtime

Tieni presente che il pacchetto Python "msvc-runtime" non è rilasciato o gestito da Microsoft.

Metodo nativo non trovato

Messaggio di errore:

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

di solito indica che una libreria nativa necessaria, come /libwickjni.so, non è stata caricata o non è stata inclusa nelle dipendenze dell'app o non è stata trovata per qualche motivo. Tieni presente che Java richiede che ogni libreria nativa venga caricata esplicitamente con la funzione System.loadLibrary.

Nessun calcolatore registrato trovato

Messaggio di errore:

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

di solito indica che in CalculatorGraphConfig viene fatto riferimento a OurNewCalculator, ma che la destinazione della libreria per OurNewCalculator non è stata collegata al programma binario dell'applicazione. Quando si aggiunge una nuova calcolatrice a un grafico, questa deve essere aggiunta anche come dipendenza per la build delle applicazioni utilizzando il grafico della calcolatrice.

Questo errore viene rilevato in fase di runtime perché i grafici delle calcolatrici fanno riferimento ai rispettivi calcolatori per nome nel campo CalculatorGraphConfig::Node:calculator. Quando la libreria di una calcolatrice è collegata a un programma binario dell'applicazione, la calcolatrice viene registrata automaticamente per nome tramite la macro REGISTER_CALCULATOR utilizzando la libreria registration.h. Tieni presente che REGISTER_CALCULATOR può registrare una calcolatrice con un prefisso dello spazio dei nomi, identico allo spazio dei nomi C++. In questo caso, anche il grafico della calcolatrice deve utilizzare lo stesso prefisso dello spazio dei nomi.

Errore di esaurimento della memoria

L'esaurimento della memoria può essere un sintomo di troppi pacchetti che si accumulano all'interno di un grafico MediaPipe in esecuzione. Ciò può accadere per una serie di motivi, tra cui:

  1. Alcune calcolatrici nel grafico non riescono a tenere il passo con l'arrivo dei pacchetti da uno stream di input in tempo reale come una videocamera.
  2. Alcune calcolatrici sono in attesa di pacchetti che non arriveranno mai.

Per il problema (1), potrebbe essere necessario eliminare alcuni pacchetti precedenti per elaborare quelli più recenti. Per alcuni suggerimenti, vedi: How to process realtime input streams.

Per il problema (2), potrebbe essere che in un flusso di input manchino pacchetti per qualche motivo. Un dispositivo o una calcolatrice potrebbero essere configurati in modo errato o generare pacchetti solo sporadicamente. Di conseguenza, le calcolatrici downstream possono attendere molti pacchetti che non arriveranno mai e, a loro volta, i pacchetti si accumulano su alcuni dei loro flussi di input. MediaPipe risolve questo tipo di problema utilizzando i "limiti del timestamp". Per alcuni suggerimenti, vedi: How to process realtime input streams.

L'impostazione MediaPipe CalculatorGraphConfig::max_queue_size limita il numero di pacchetti accodati su qualsiasi flusso di input limitando gli input al grafico. Per i flussi di input in tempo reale, il numero di pacchetti in coda in un flusso di input dovrebbe essere quasi sempre zero o uno. In caso contrario, potresti visualizzare il seguente messaggio di avviso:

Resolved a deadlock by increasing max_queue_size of input stream

Inoltre, l'impostazione CalculatorGraphConfig::report_deadlock può essere impostata in modo che l'esecuzione del grafico non vada a buon fine e che il deadlock venga visualizzato come errore, in modo che max_queue_size funga da limite di memoria utilizzata.

Il grafico si blocca

Molte applicazioni chiameranno CalculatorGraph::CloseAllPacketSources e CalculatorGraph::WaitUntilDone per terminare o sospendere l'esecuzione di un grafico MediaPipe. L'obiettivo qui è consentire alle calcolatrici o ai pacchetti in attesa di completare l'elaborazione e quindi di arrestare il grafico. Se tutto va bene, ogni stream nel grafico raggiungerà Timestamp::Done e ogni calcolatore raggiungerà CalculatorBase::Close, dopodiché CalculatorGraph::WaitUntilDone verrà completato correttamente.

Se alcuni flussi di calcolo o flussi di dati non possono raggiungere lo stato Timestamp::Done o CalculatorBase::Close, è possibile chiamare il metodo CalculatorGraph::Cancel per terminare l'esecuzione del grafico senza attendere il completamento di tutti i calcolatori e i pacchetti in attesa.

Il tempo di output non è uniforme

Alcuni grafici MediaPipe in tempo reale producono una serie di frame video da visualizzare come effetto video o come diagnostica video. A volte, un grafico MediaPipe produce questi frame in cluster, ad esempio quando diversi frame di output vengono estrapolati dallo stesso cluster di frame di input. Se gli output vengono presentati così come sono prodotti, alcuni frame di output vengono immediatamente sostituiti da frame successivi nello stesso cluster, il che rende i risultati difficili da visualizzare e valutare visivamente. In casi come questo, la visualizzazione dell'output può essere migliorata presentando i frame a intervalli regolari in tempo reale.

MediaPipe affronta questo caso d'uso mappando i timestamp ai punti in tempo reale. Ogni timestamp indica un'ora in microsecondi e una calcolatrice come LiveClockSyncCalculator può ritardare l'output dei pacchetti in modo che corrisponda ai rispettivi timestamp. Questo tipo di calcolatrice regola la tempistica degli output in modo che:

  1. Il tempo che intercorre tra gli output corrisponde all'intervallo di tempo tra i timestamp il più vicino possibile.
  2. Gli output vengono prodotti con il minimo ritardo possibile.

Il grafico di Calcolatrice è in ritardo rispetto agli input

Per molti grafici MediaPipe in tempo reale, la bassa latenza è un obiettivo. MediaPipe supporta l'elaborazione parallela in stile "pipeline" per iniziare l'elaborazione di ogni pacchetto il prima possibile. Di solito, la latenza più bassa possibile corrisponde al tempo totale richiesto da ogni calcolatore lungo un "percorso critico" alle calcolatrici successive. La latenza di un grafico MediaPipe potrebbe essere inferiore a quella ideale a causa dei ritardi introdotti per visualizzare i frame a intervalli regolari come descritto in Il tempo di output non è uniforme.

Se alcune calcolatrici nel grafico non riescono a tenere il passo con i flussi di input in tempo reale, la latenza continuerà ad aumentare e sarà necessario eliminare alcuni pacchetti di input. La tecnica consigliata prevede l'utilizzo dei calcolatori MediaPipe progettati appositamente per questo scopo, come FlowLimiterCalculator come descritto in How to process realtime input streams.