Falta la ruta de acceso binaria de Python
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
Por lo general, indica que Bazel no encuentra el binario de Python local. Para resolver este problema, primero busca dónde está el binario de Python y, luego, agrega --action_env PYTHON_BIN_PATH=<path to python binary>
al comando Bazel. Por ejemplo, puedes cambiar para usar el 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
Mensaje de error:
ImportError: No module named numpy
Is numpy installed?
Por lo general, indica que ciertos paquetes de Python no están instalados. Ejecuta
pip install
o pip3 install
según la versión binaria de Python para
instalar esos paquetes.
No se pueden recuperar los repositorios de dependencias remotas.
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)
Por lo general, indica que Bazel no puede descargar los repositorios de dependencias necesarios que necesita MediaPipe. MediaPipe tiene varios repositorios de dependencias que alojan 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 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 el problema persiste, informa un error en GitHub con el mensaje de error detallado.
Configuración incorrecta de OpenCV de MediaPipe
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)'
Por lo general, indica que OpenCV no está configurado correctamente para MediaPipe. Consulta las secciones "Cómo instalar OpenCV y FFmpeg" en Instalación para ver cómo modificar los archivos WORKSPACE y linux_opencv/macos_opencv/windows_opencv.BUILD de MediaPipe para tus bibliotecas de opencv locales. Este problema de GitHub también puede ayudarte.
Error de instalación de pip de Python
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 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 los siguientes SO:
- Linux x86_64
- x86_64 macOS 10.15 y versiones posteriores
- Windows amd64
Si el SO es compatible actualmente y sigues viendo este error, asegúrate de que el binario de Python y pip sean para Python 3.7 a 3.10. De lo contrario, considera compilar el paquete de Python de MediaPipe de forma local. Para ello, sigue las instrucciones que se indican aquí.
No se pudo cargar la DLL de Python en Windows
Mensaje de error:
ImportError: DLL load failed: The specified module could not be found
Por lo general, indica que al sistema local de Windows le faltan paquetes redistribuibles de Visual C++ o DLLs del tiempo de ejecución de Visual C++. Para solucionar este problema, puedes instalar el vc_redist.x64.exe oficial o el paquete de Python “msvc-runtime” ejecutando
$ python -m pip install msvc-runtime
Ten en cuenta que Microsoft no publica ni mantiene el paquete de Python "msvc-runtime".
No se encontró el método nativo
Mensaje de error:
java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick
Por lo general, indica que no se cargó una biblioteca nativa necesaria, como /libwickjni.so
, o no se incluyó en las dependencias de la app, o no se puede 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
Mensaje de error:
No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"
Por lo general, indica que se hace referencia a OurNewCalculator
por nombre en un CalculatorGraphConfig
, pero que el destino de la biblioteca de OurNewCalculator no se vinculó al objeto binario de la aplicación. Cuando se agrega una calculadora nueva a un gráfico de calculadora, esa calculadora también se debe agregar como una dependencia de compilación de las aplicaciones que usan el gráfico de calculadora.
Este error se detecta durante el tiempo de ejecución porque los gráficos de la calculadora hacen referencia a sus calculadoras por 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 ocurrir por varios motivos, como los siguientes:
- Algunas calculadoras del gráfico simplemente no pueden seguir el ritmo de la llegada de paquetes de un flujo de entrada en tiempo real, como una cámara de video.
- Algunas calculadoras esperan paquetes que nunca llegarán.
Para el problema (1), es posible que debas descartar algunos paquetes antiguos para procesar los más recientes. Para obtener algunas sugerencias, consulta How to process realtime input streams
.
En el problema (2), es posible que a un flujo de entrada le falten paquetes por algún motivo. Es posible que un dispositivo o una calculadora estén mal configurados o que produzcan paquetes solo de forma 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 con los "límites de marca de tiempo". Para obtener 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 regulando las entradas al gráfico. En el caso de las transmisiones de entrada en tiempo real, la cantidad de paquetes en fila en una transmisión de entrada casi siempre debe ser cero o uno. Si no es así, es posible que veas
el siguiente mensaje de advertencia:
Resolved a deadlock by increasing max_queue_size of input stream
Además, el parámetro de configuración CalculatorGraphConfig::report_deadlock
se puede establecer para que la ejecución del gráfico falle y muestre el interbloqueo como un error, de modo que max_queue_size actúe como 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 aquí es permitir que las calculadoras o los paquetes pendientes completen el procesamiento y, luego, cerrar el grafo. Si todo sale bien, cada flujo del gráfico llegará a Timestamp::Done
y cada calculadora llegará a CalculatorBase::Close
, y luego CalculatorGraph::WaitUntilDone
se completará correctamente.
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.
El tiempo de salida es desigual
Algunos gráficos de MediaPipe en tiempo real producen una serie de fotogramas de video para verlos como un efecto de video o como un diagnóstico de video. A veces, un gráfico de MediaPipe producirá estos fotogramas en clústeres, por ejemplo, cuando se extrapolen varios fotogramas de salida del mismo clúster de fotogramas de entrada. Si los resultados se presentan a medida que se producen, algunos fotogramas de salida se reemplazan de inmediato por fotogramas posteriores en el mismo clúster, lo que dificulta ver y evaluar los resultados visualmente. En casos como este, se puede mejorar la visualización del resultado presentando los fotogramas 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 coincidan con sus marcas de tiempo. Este tipo de calculadora ajusta el tiempo de las salidas de modo que ocurra lo siguiente:
- El tiempo entre las salidas corresponde al tiempo entre las marcas de tiempo lo más cerca posible.
- Los resultados se producen con la menor demora 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 procesamiento paralelo de estilo "en cadena" 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 a lo largo de una "ruta crítica" de calculadoras sucesivas. La latencia de un gráfico de MediaPipe podría ser peor que la ideal debido a las demoras que se introducen para mostrar fotogramas en intervalos uniformes, como se describe en El tiempo de salida es desigual.
Si algunas de las calculadoras del gráfico no pueden seguir el ritmo de las transmisiones de entrada en tiempo real, la latencia seguirá aumentando y será necesario descartar algunos paquetes de entrada. La técnica recomendada es usar las calculadoras MediaPipe diseñadas específicamente para este propósito, como FlowLimiterCalculator
, como se describe en How to process realtime input streams
.
Supervisa las entradas de la calculadora y los acuerdos de marca de tiempo
La depuración de calculadoras de MediaPipe suele requerir un conocimiento profundo del flujo de datos y la sincronización de marcas de tiempo. Los paquetes entrantes a las calculadoras primero se almacenan en búfer en las colas de entrada por flujo para que el InputStreamHandler
asignado los sincronice. La tarea de InputStreamHandler
es determinar el paquete de entrada establecido para una marca de tiempo establecida, que pone la calculadora en un estado “listo” y, luego, activa una llamada a Calculator::Process con el paquete determinado establecido como entrada.
Se puede usar DebugInputStreamHandler
para hacer un seguimiento de los paquetes entrantes y las transacciones de marca de tiempo en tiempo real en el resultado LOG(INFO) de la aplicación. Se puede asignar a calculadoras específicas a través de input_stream_handler de Calculator o graficarse de forma global a través del campo input_stream_handler de CalculatorGraphConfig
.
Durante la ejecución del gráfico, los paquetes entrantes generan mensajes de LOG que revelan la marca de tiempo y el tipo del paquete, seguidos del estado actual de todas las colas de entrada:
[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
Además, permite supervisar los eventos de liquidación de marcas de tiempo (en caso de que se aplique DefaultInputStreamHandler
). Esto puede ayudar a revelar un aumento inesperado de la marca de tiempo en los flujos de entrada, lo que genera una llamada a Calculator::Process con un conjunto de entradas incompleto, lo que genera paquetes vacíos en los flujos de entrada (potencialmente obligatorios).
Situación de ejemplo:
node {
calculator: "SomeCalculator"
input_stream: "INPUT_A:a"
input_stream: "INPUT_B:b"
...
}
Dada una calculadora con dos entradas, recibe un paquete entrante con la marca de tiempo 1 en el flujo A, seguido de un paquete de entrada con la marca de tiempo 2 en el flujo B. El límite de marca de tiempo aumenta a 2 en el flujo B con un paquete de entrada pendiente en el flujo A en la marca de tiempo 1 activa la llamada Calculator::Process con un conjunto de entradas incompleto para la marca de tiempo 1. En este caso, DefaultInputStreamHandler
muestra lo siguiente:
[INFO] SomeCalculator: Filled input set at ts: 1 with MISSING packets in input streams: INPUT_B:0:input_b.
Los vlogs son tus amigos
MediaPipe usa VLOG
en muchos lugares para registrar eventos importantes con fines de depuración, sin afectar el rendimiento si no se habilita el registro.
Obtén más información sobre VLOG
en abseil VLOG
.
Ten en cuenta que VLOG
puede generar spam si lo habilitas de forma global, p.ej., (con la marca --v
). La marca --vmodule
de la solución que permite establecer diferentes niveles para diferentes archivos fuente
En los casos en que no se pueden usar --v
o --vmodule
(p.ej., cuando se ejecuta una app para Android), MediaPipe permite establecer anulaciones de marcas VLOG
--v
o --vmodule
para depuración, que se aplican cuando se crea CalculatorGraph
.
Anulaciones:
MEDIAPIPE_VLOG_V
: Define y proporciona el valor que proporcionas para--v
.MEDIAPIPE_VLOG_VMODULE
: Define y proporciona el valor que proporcionas para--vmodule
.
Para establecer anulaciones, agrega lo siguiente:
--copt=-DMEDIAPIPE_VLOG_VMODULE=\"*calculator*=5\"
con los patrones de módulos y los niveles de VLOG
deseados (consulta más detalles sobre --vmodule
en abseil VLOG
) a tu comando de compilación.
IMPORTANTE: Ten en cuenta que agregar lo anterior a tu comando de compilación activará la compilación nuevamente
de todo el objeto binario, incluidas las dependencias. Por lo tanto, dado que las anulaciones de VLOG
solo existen con fines de depuración, es más rápido simplemente modificar vlog_overrides.cc
y agregar MEDIAPIPE_VLOG_V/VMODULE
en la parte superior.
Marcas no admitidas durante la compilación
Si usas Clang 18 o versiones anteriores, es posible que debas inhabilitar algunas optimizaciones del compilador en nuestro backend de CPU.
Para inhabilitar la compatibilidad con avxvnniint8
, agrega lo siguiente a tu .bazelrc
:
build --define=xnn_enable_avxvnniint8=false