Solución de problemas

Falta la ruta de acceso del objeto binario de Python

Este es el mensaje de error:

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

generalmente indica que Bazel no pudo encontrar el objeto binario local de Python. Para resolver este problema, primero busca el objeto binario de Python y, luego, agrega --action_env PYTHON_BIN_PATH=<path to python binary> al comando de Bazel. Por ejemplo, puedes optar por usar el objeto binario python3 predeterminado del sistema con el siguiente comando:

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

Faltan los paquetes de Python necesarios

Este es el mensaje de error:

ImportError: No module named numpy
Is numpy installed?

generalmente indica que ciertos paquetes de Python no están instalados. Ejecuta pip install o pip3 install según tu versión binaria de Python para instalar esos paquetes.

No se pudieron recuperar los repositorios de dependencias remotas

Este es el mensaje de error:

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)

suele indicar que Bazel no puede descargar los repositorios de dependencias necesarios que necesita MediaPipe. MedaiPipe tiene varios repositorios de dependencias alojados en sitios de Google. En algunas regiones, es posible que debas configurar un proxy de red o usar una VPN para acceder a esos recursos. Es posible que también debas agregar --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" al comando de Bazel. Consulta este problema de GitHub para obtener más detalles.

Si crees que no es un problema de red, otra posibilidad es que algunos recursos no estén disponibles temporalmente, ejecuta bazel clean --expunge y vuelve a intentarlo más tarde. Si aún no funciona, informa un problema de GitHub con el mensaje de error detallado.

Configuración incorrecta de OpenCV de MediaPipe

Este es el mensaje de error:

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

generalmente indica que OpenCV no está configurado correctamente para MediaPipe. Consulta las secciones "Instala OpenCV y FFmpeg" en Instalación para ver cómo modificar los archivos WORKSPACE de MediaPipe y linux_opencv/macos_opencv/windows_opencv.BUILD para tus bibliotecas opencv locales. Este problema de GitHub también puede ayudar.

Falla de la instalación de Python con pip

Este es el mensaje de error:

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

Después de ejecutar pip install mediapipe, suele indicar que no hay un MediaPipe Python calificado para tu sistema. Ten en cuenta que MediaPipe Python PyPI es compatible oficialmente con la versión de 64 bits de Python 3.7 a 3.10 en el siguiente SO:

  • Linux x86_64
  • x86_64 macOS 10.15 y versiones posteriores
  • Windows de amd64

Si el SO es compatible actualmente y todavía ves este error, asegúrate de que los objetos binarios de Python y pip sean para Python 3.7 a 3.10. De lo contrario, considera compilar el paquete de MediaPipe para Python de forma local siguiendo las instrucciones que se indican aquí.

Error de carga de la DLL de Python en Windows

Este es el mensaje de error:

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

generalmente indica que al sistema local de Windows le faltan paquetes redistribuibles de Visual C++ o DLL de tiempo de ejecución de Visual C++. Para solucionar este problema, puedes instalar el vc_redist.x64.exe oficial o el paquete "msvc-runtime" de Python

$ python -m pip install msvc-runtime

Ten en cuenta que Microsoft no lanzó ni mantiene el paquete "msvc-runtime" de Python.

No se encontró el método nativo

Este es el mensaje de error:

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

generalmente indica que una biblioteca nativa necesaria, como /libwickjni.so, no se cargó, no se incluyó en las dependencias de la app o no se pudo encontrar por algún motivo. Ten en cuenta que Java requiere que cada biblioteca nativa se cargue de forma explícita con la función System.loadLibrary.

No se encontró ninguna calculadora registrada

Este es el mensaje de error:

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

generalmente indica que se hace referencia a OurNewCalculator por su nombre en un CalculatorGraphConfig, pero que el destino de la biblioteca de OurNewCalculator no se vinculó con el objeto binario de la aplicación. Cuando se agrega una nueva calculadora a un gráfico de calculadora, también se debe agregar esa calculadora como dependencia de compilación de las aplicaciones que usan ese gráfico.

Este error se detecta en el tiempo de ejecución porque los gráficos de la calculadora hacen referencia a sus calculadoras por su nombre a través del campo CalculatorGraphConfig::Node:calculator. Cuando la biblioteca de una calculadora se vincula a un objeto binario de la aplicación, la calculadora se registra automáticamente por nombre a través de la macro REGISTER_CALCULATOR con la biblioteca registration.h. Ten en cuenta que REGISTER_CALCULATOR puede registrar una calculadora con un prefijo de espacio de nombres, idéntico a su espacio de nombres de C++. En este caso, el gráfico de la calculadora también debe usar el mismo prefijo de espacio de nombres.

Error de memoria insuficiente

El agotamiento de la memoria puede ser un síntoma de que se acumulan demasiados paquetes dentro de un gráfico de MediaPipe en ejecución. Esto puede deberse a varios motivos, como los siguientes:

  1. Algunas calculadoras en el gráfico simplemente no pueden seguir el ritmo de la llegada de paquetes desde una transmisión de entrada en tiempo real, como una cámara de video.
  2. Algunas calculadoras están esperando paquetes que nunca llegarán.

En el caso del problema (1), puede ser necesario descartar algunos paquetes antiguos en uno más antiguo para procesar los paquetes más recientes. Para ver algunas sugerencias, consulta How to process realtime input streams.

Para el problema (2), podría ser que a una transmisión de entrada le faltan paquetes por algún motivo. Un dispositivo o una calculadora pueden estar mal configurados o producir paquetes solo de manera esporádica. Esto puede hacer que las calculadoras descendentes esperen muchos paquetes que nunca llegarán, lo que, a su vez, hace que los paquetes se acumulen en algunas de sus transmisiones de entrada. MediaPipe aborda este tipo de problema mediante “límites de marca de tiempo”. Para ver algunas sugerencias, consulta How to process realtime input streams.

El parámetro de configuración de MediaPipe CalculatorGraphConfig::max_queue_size limita la cantidad de paquetes en cola en cualquier flujo de entrada mediante la regulación de las entradas del gráfico. Para transmisiones de entrada en tiempo real, la cantidad de paquetes en cola en una transmisión de entrada casi siempre debe ser cero o uno. Si este no es el caso, es posible que veas el siguiente mensaje de advertencia:

Resolved a deadlock by increasing max_queue_size of input stream

Además, se puede establecer la configuración CalculatorGraphConfig::report_deadlock para que falle la ejecución del gráfico y muestre el interbloqueo como un error, de modo que max_queue_size sea un límite de uso de memoria.

El gráfico se bloquea

Muchas aplicaciones llamarán a CalculatorGraph::CloseAllPacketSources y CalculatorGraph::WaitUntilDone para finalizar o suspender la ejecución de un gráfico de MediaPipe. El objetivo es permitir que cualquier calculadora o paquete pendiente complete el procesamiento y, luego, apagar el grafo. Si todo sale bien, todas las transmisiones del gráfico alcanzarán Timestamp::Done, todas las calculadoras llegarán a CalculatorBase::Close y, luego, CalculatorGraph::WaitUntilDone se completarán de forma correcta.

Si algunas calculadoras o transmisiones no pueden alcanzar el estado Timestamp::Done o CalculatorBase::Close, se puede llamar al método CalculatorGraph::Cancel para finalizar la ejecución del gráfico sin esperar a que se completen todas las calculadoras y paquetes pendientes.

La sincronización de los resultados no es uniforme

Algunos gráficos de MediaPipe en tiempo real producen una serie de fotogramas de video para ver como un efecto de video o un diagnóstico de video. A veces, un gráfico de MediaPipe producirá estos fotogramas en clústeres, por ejemplo, cuando se extrapolen varios marcos de salida del mismo clúster de marcos de entrada. Si los resultados se presentan a medida que se producen, algunos marcos de salida se reemplazan de inmediato por marcos posteriores en el mismo clúster, lo que hace que los resultados sean difíciles de ver y evaluar visualmente. En casos como este, se puede mejorar la visualización de resultados si se presentan los fotogramas en intervalos pares en tiempo real.

MediaPipe aborda este caso de uso asignando marcas de tiempo a puntos en tiempo real. Cada marca de tiempo indica una hora en microsegundos, y una calculadora como LiveClockSyncCalculator puede retrasar la salida de los paquetes para que coincidan con sus marcas de tiempo. Este tipo de calculadora ajusta el tiempo de los resultados de modo que se cumpla lo siguiente:

  1. El tiempo entre las salidas corresponde al tiempo entre las marcas de tiempo que se acerca lo más posible.
  2. Las salidas se producen con el menor retraso posible.

CalculatorGraph se retrasa con respecto a las entradas

Para muchos gráficos de MediaPipe en tiempo real, la latencia baja es un objetivo. MediaPipe es compatible con el procesamiento paralelo de estilo "canalizado" para comenzar a procesar cada paquete lo antes posible. Por lo general, la latencia más baja posible es el tiempo total que requiere cada calculadora en una “ruta crítica” de calculadoras sucesivas. La latencia de un gráfico de MediaPipe podría ser peor que la ideal debido a los retrasos que se presentan para mostrar los fotogramas en intervalos pares, como se describe en El tiempo de salida es desigual.

Si algunas de las calculadoras del gráfico no pueden seguir el ritmo de los flujos de entrada en tiempo real, la latencia seguirá aumentando y se hace necesario descartar algunos paquetes de entrada. La técnica recomendada es usar las calculadoras de MediaPipe diseñadas específicamente para este propósito, como FlowLimiterCalculator, como se describe en How to process realtime input streams.