Risoluzione dei problemi

Percorso binario Python mancante

Il 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 file binario Python locale. Per risolvere per questo problema, cerca prima dov'è il file binario Python, quindi aggiungi --action_env PYTHON_BIN_PATH=<path to python binary> al comando Bazel. Per Ad esempio, puoi passare a utilizzare il file binario python3 predefinito di sistema 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

Il messaggio di errore:

ImportError: No module named numpy
Is numpy installed?

indica in genere che alcuni pacchetti Python non sono installati. Esegui pip install o pip3 install, a seconda della versione binaria di Python installare i pacchetti.

Impossibile recuperare i repository di dipendenze remote

Il 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 di cui ha bisogno MediaPipe. 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. Consulta questo problema su GitHub per ulteriori informazioni.

Se ritieni che non si tratti di un problema di rete, un'altra possibilità è che le risorse potrebbero non essere al momento disponibili. Esegui bazel clean --expunge e riprova più tardi. Se il problema persiste, invia una segnalazione su GitHub a il messaggio di errore dettagliato.

Configurazione OpenCV MediaPipe non corretta

Il 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. Non dimenticare di apporre dai un'occhiata al link "Installa OpenCV e FFmpeg" sezioni in Installazione per scoprire come modificare WORKSPACE e linux_opencv/macos_opencv/windows_opencv.BUILD per il file cv aperto locale librerie. Questo problema di GitHub può essere utile.

Errore di installazione di Python pip

Il messaggio di errore:

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

dopo aver eseguito pip install mediapipe solitamente indica che non esiste un Python MediaPipe qualificato per il tuo sistema. Tieni presente che Python PyPI di MediaPipe supporta ufficialmente il protocollo a 64 bit di Python dalla 3.7 alla 3.10 sul seguente sistema operativo:

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

Se il sistema operativo è attualmente supportato, ma continui a visualizzare questo errore, assicurati che sia il binario Python che pip sono per Python dalla 3.7 alla 3.10. Altrimenti, considera la creazione del pacchetto Python MediaPipe in locale seguendo le istruzioni riportate in istruzioni qui.

Errore di caricamento della DLL Python su Windows

Il messaggio di errore:

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

di solito indica che nel sistema Windows locale manca Visual C++ pacchetti ridistribuibili e/o DLL di runtime Visual C++. Questo può essere risolto installando l'app vc_redist.x64.exe o installando "msvc-runtime" per il pacchetto Python eseguendo

$ python -m pip install msvc-runtime

Tieni presente che il valore di "msvc-runtime" Il pacchetto Python non è stato rilasciato o mantenuto Microsoft.

Metodo nativo non trovato

Il messaggio di errore:

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

indica di solito che la libreria nativa necessaria, come /libwickjni.so, non ha caricato o non è stato incluso nelle dipendenze dell'app o non può essere trovato per qualche motivo. Tieni presente che Java richiede che ogni libreria nativa caricato esplicitamente tramite la funzione System.loadLibrary.

Nessuna calcolatrice registrata trovata

Il messaggio di errore:

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

di solito indica che a OurNewCalculator viene fatto riferimento tramite il nome in una CalculatorGraphConfig ma che il target della libreria per OurNewCalculator ha non è stato collegato al file binario dell'applicazione. Quando una nuova calcolatrice viene aggiunta a un una calcolatrice, la quale deve essere aggiunta anche come dipendenza dalla build utilizzando il grafico della calcolatrice.

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

Errore memoria esaurita

L'esaurimento della memoria può essere un sintomo dell'accumulo di troppi pacchetti all'interno di un sul grafico MediaPipe. I motivi possono essere diversi, tra cui:

  1. Alcuni calcolatori nel grafico semplicemente non sono in grado di tenere il passo con l'arrivo di di pacchetti da un flusso di input in tempo reale, come una videocamera.
  2. Alcuni calcolatori sono in attesa di pacchetti che non arriveranno mai.

Per il problema (1), potrebbe essere necessario rilasciare alcuni vecchi pacchetti nei vecchi pacchetti per elaborare i pacchetti più recenti. Per alcuni suggerimenti, consulta: How to process realtime input streams

Per il problema (2), è possibile che in un flusso di input manchino pacchetti per alcune perché. Un dispositivo o una calcolatrice potrebbero non essere configurati correttamente o potrebbero produrre pacchetti solo sporadicamente. Questo può portare i calcolatori downstream ad attendere che non arrivano mai e che, a loro volta, ne causano l'accumulo alcuni dei loro flussi di input. MediaPipe risolve questo tipo di problema utilizzando "limiti timestamp". Per alcuni suggerimenti, vedi: How to process realtime input streams

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

Resolved a deadlock by increasing max_queue_size of input stream

Inoltre, è possibile configurare l'impostazione CalculatorGraphConfig::report_deadlock per causare l'esecuzione del grafico non riesce e restituisce il deadlock come errore, ad esempio max_queue_size come limite di utilizzo della memoria.

Il grafico si blocca

Molte applicazioni chiameranno CalculatorGraph::CloseAllPacketSources e CalculatorGraph::WaitUntilDone per terminare o sospendere l'esecuzione di un MediaPipe grafico. L'obiettivo è consentire a qualsiasi calcolatore o pacchetto in sospeso completare l'elaborazione e chiudere il grafico. Se tutto va bene, ogni flusso nel grafico raggiungerà Timestamp::Done e ogni calcolatore raggiungi CalculatorBase::Close e poi CalculatorGraph::WaitUntilDone verrà completata correttamente.

Se alcuni calcolatori o stream non riescono a raggiungere lo stato Timestamp::Done oppure CalculatorBase::Close, il metodo CalculatorGraph::Cancel può essere per terminare l'esecuzione del grafico senza attendere tutte le calcolatrici in sospeso e pacchetti da completare.

La tempistica di output è irregolare

Alcuni grafici MediaPipe in tempo reale producono una serie di fotogrammi video per la visualizzazione effetto video o come videodiagnostica. A volte, un grafico MediaPipe restituisce questi frame in cluster, ad esempio quando vengono visualizzati più frame di output estrapolati dallo stesso cluster di frame di input. Se gli output vengono presentati man mano che vengono prodotti, alcuni frame di output vengono immediatamente sostituiti 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 e presentare i frame a intervalli regolari in tempo reale.

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

  1. Il tempo tra gli output corrisponde al tempo tra i timestamp come il più vicino possibile.
  2. Gli output vengono prodotti con il minor 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 "pipelining" elaborazione parallela degli stili per iniziare il prima possibile. Di solito, la latenza più bassa possibile è tempo totale richiesto da ogni calcolatore lungo un "percorso critico" delle successive calcolatrici. La latenza di un grafico MediaPipe potrebbe essere inferiore all'ideale a causa di ritardi introdotti nei frame di visualizzazione a intervalli uniforme, come descritto I tempi di output non sono uniformi.

Se alcune calcolatrici nel grafico non sono in grado di tenere il passo con l'input in tempo reale gli stream, la latenza continuerà ad aumentare e diventa necessario alcuni pacchetti di input. La tecnica consigliata è quella di utilizzare MediaPipe calcolatrici progettate specificatamente per questo scopo, ad esempio FlowLimiterCalculator come descritto in How to process realtime input streams.