Solución de problemas

Falta la ruta de 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 encontró el objeto binario local de Python. Para resolver Primero, busca dónde está el objeto binario de Python y, luego, agrega --action_env PYTHON_BIN_PATH=<path to python binary> al comando de Bazel Para Por ejemplo, puedes usar el binario python3 predeterminado del sistema por 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)

generalmente indica que Bazel no descarga los repositorios de dependencias necesarios. que necesita MediaPipe. MedaiPipe tiene varios repositorios de dependencias que son alojados en sitios de Google. En algunas regiones, es posible que debas configurar un proxy de red. o usar una VPN para acceder a ellos. También es posible que debas adjuntar --host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>" al comando de Bazel. Consulta este problema de GitHub para obtener más información.

Si crees que no se trata de un problema de red, otra posibilidad es que es posible que los 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 en GitHub con el mensaje de error detallado.

Configuración incorrecta de MediaPipe OpenCV

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. Por favor, consulta "Cómo instalar OpenCV y FFmpeg" secciones en Instalación para ver cómo modificar el WORKSPACE de MediaPipe y Archivos linux_opencv/macos_opencv/windows_opencv.BUILD para tu opencv local bibliotecas. Este problema de GitHub también puede ser útil.

Falla de instalación de pip en Python

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, por lo general, indica que no hay ningún MediaPipe Python calificado para tu sistema. Ten en cuenta que MediaPipe Python PyPI admite oficialmente la plataforma de 64 bits versión de Python 3.7 a 3.10 en el siguiente SO:

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

Si el SO es compatible y sigues viendo este error, asegúrate de que que los objetos binarios de Python y pip son para Python 3.7 a 3.10. De lo contrario, considera compilar el paquete MediaPipe Python de forma local siguiendo los pasos que se indican aquí.

Error de carga de 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 Windows local le falta Visual C++ paquetes redistribuibles o DLL en tiempo de ejecución de Visual C++. Esto se puede resolver ya sea instalar la aplicación vc_redist.x64.exe o instalar el comando "msvc-runtime" de Python con la ejecución

$ python -m pip install msvc-runtime

Ten en cuenta que el comando "msvc-runtime" El paquete de Python no se actualiza ni se mantiene por Microsoft.

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 no se actualizó una biblioteca nativa necesaria, como /libwickjni.so se cargó o no se incluyó en las dependencias de la app, o no se puede por alguna razón. Ten en cuenta que Java requiere que cada biblioteca nativa cargado 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 nombre en un CalculatorGraphConfig, pero el destino de la biblioteca de OurNewCalculator no no se ha vinculado al objeto binario de la aplicación. Cuando se agrega una nueva calculadora a un de tu calculadora, esa calculadora también debe agregarse como una dependencia de compilación las aplicaciones usando el gráfico de calculadora.

Este error se detecta en el tiempo de ejecución porque los gráficos de calculadora hacen referencia a su calculadoras por nombre en el campo CalculatorGraphConfig::Node:calculator. Cuando la biblioteca de una calculadora se vincula al objeto binario de una aplicación, el esta calculadora se registra automáticamente por nombre mediante el 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 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 acumulen demasiados paquetes en una que ejecuta el gráfico de MediaPipe. Esto puede ocurrir por varios motivos, como los siguientes:

  1. Algunas calculadoras del gráfico simplemente no pueden seguir el ritmo de la llegada de paquetes de 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.

Para el problema (1), puede ser necesario descartar algunos paquetes antiguos en procesar los paquetes más recientes. Para obtener algunas sugerencias, consulta: How to process realtime input streams

Para el problema (2), podría ser que a una transmisión de entrada le falten paquetes para algunas y por una buena razón. Un dispositivo o una calculadora pueden estar mal configurados o producir paquetes. solo esporádicamente. Esto puede provocar que las calculadoras descendentes esperen muchas paquetes que nunca llegarán, lo que, a su vez, hace que los paquetes se acumulen en algunos de sus flujos de entrada. MediaPipe aborda este tipo de problemas mediante “límites de marca de tiempo”. Para obtener sugerencias, consulta lo siguiente: How to process realtime input streams

La configuración de MediaPipe CalculatorGraphConfig::max_queue_size limita la la cantidad de paquetes en cola en cualquier transmisión de entrada regulando las entradas a gráfico. Para transmisiones de entrada en tiempo real, la cantidad de paquetes en cola en una de transmisión casi siempre debería 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 cause se ejecute para que falle y muestre el interbloqueo como un error, de modo que max_queue_size que sirva de límite de uso de memoria.

Bloqueos del gráfico

Muchas aplicaciones llamarán a CalculatorGraph::CloseAllPacketSources y CalculatorGraph::WaitUntilDone para finalizar o suspender la ejecución de un MediaPipe gráfico. El objetivo aquí es permitir que cualquier calculadora o paquete pendiente completar el procesamiento y apagar el grafo. Si todo sale bien, cada en el gráfico llegará a Timestamp::Done, y cada calculadora alcance CalculatorBase::Close y, luego, CalculatorGraph::WaitUntilDone se completará correctamente.

Si algunas calculadoras o transmisiones no pueden alcanzar el estado Timestamp::Done, o CalculatorBase::Close, entonces el método CalculatorGraph::Cancel se puede se llama para finalizar la ejecución del grafo sin esperar a todas las calculadoras pendientes. y paquetes para completarse.

Los tiempos de salida no son uniformes

Algunos gráficos de MediaPipe en tiempo real producen una serie de fotogramas para ver como un como efecto de video o como diagnóstico de video. A veces, un gráfico de MediaPipe produce estos marcos en clústeres, por ejemplo, cuando se transfieren varios fotogramas de salida extrapolada desde el 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 fotogramas en el mismo clúster, lo que hace que los resultados sean difíciles de ver y evaluar visualmente. En casos como este, la visualización de resultados puede mejorarse presentar los cuadros a intervalos uniformes 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 paquetes para que coincida con su y marcas de tiempo. Este tipo de calculadora ajusta el tiempo de los resultados de la siguiente manera:

  1. El tiempo entre salidas corresponde al tiempo entre marcas de tiempo, como de la mejor manera posible.
  2. Los resultados 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 admite el uso “canalizado” estilo de procesamiento paralelo para comenzar a procesar cada paquete lo antes posible. Por lo general, la latencia más baja posible es tiempo total requerido por cada calculadora a lo largo de una "ruta crítica" de fases sucesivas con calculadoras. La latencia de un gráfico de MediaPipe podría ser peor que la ideal debido a los retrasos que se introducen en los fotogramas de visualización en intervalos uniformes, como se describe en Los tiempos de salida no son uniformes.

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