Caminho binário do Python ausente
Mensagem de erro:
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
geralmente indica que o Bazel não consegue encontrar o binário Python local. Para resolver
problema, encontre onde está o binário Python e adicione
--action_env PYTHON_BIN_PATH=<path to python binary>
, que é o comando do Bazel. Para
Por exemplo, é possível passar a usar o binário python3 padrão do sistema pelo
seguinte comando:
bazel build -c opt \
--define MEDIAPIPE_DISABLE_GPU=1 \
--action_env PYTHON_BIN_PATH=$(which python3) \
mediapipe/examples/desktop/hello_world
Estão faltando os pacotes Python necessários
Mensagem de erro:
ImportError: No module named numpy
Is numpy installed?
geralmente indica que certos pacotes Python não estão instalados. Execute
pip install
ou pip3 install
, dependendo da versão binária do Python para
para instalar esses pacotes.
Falha ao buscar repositórios de dependência remota
Mensagem de erro:
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)
geralmente indica que o Bazel não faz o download dos repositórios de dependências necessários.
que o MediaPipe precisa. O MedaiPipe tem vários repositórios de dependência que são
hospedados por sites do Google. Em algumas regiões, talvez seja necessário configurar um proxy de rede
ou usar uma VPN para acessá-los. Talvez também seja necessário anexar
--host_jvm_args "-DsocksProxyHost=<ip address> -DsocksProxyPort=<port number>"
ao comando do Bazel. Consulte
este problema no GitHub
para mais detalhes.
Se você acredita que não se trata de um problema de rede, outra possibilidade é que alguns
os recursos podem estar temporariamente indisponíveis. Execute bazel clean --expunge
.
e tente novamente mais tarde. Se ainda não funcionar, registre um problema no GitHub com
a mensagem de erro detalhada.
Configuração incorreta do MediaPipe OpenCV
Mensagem de erro:
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)'
geralmente indica que o OpenCV não está configurado corretamente para o MediaPipe. Não se esqueça consulte o artigo "Instalar o OpenCV e o FFmpeg" seções em Instalação para ver como modificar o espaço de trabalho do MediaPipe e linux_opencv/macos_opencv/windows_opencv.BUILD arquivos para seu opencv local bibliotecas. Este problema no GitHub (link em inglês) também pode ajudar.
Falha na instalação do pip Python
Mensagem de erro:
ERROR: Could not find a version that satisfies the requirement mediapipe
ERROR: No matching distribution found for mediapipe
depois de executar pip install mediapipe
, geralmente indica que não há MediaPipe Python qualificado para o sistema.
O MediaPipe Python PyPI é compatível oficialmente com a versão de 64 bits
do Python 3.7 a 3.10 no seguinte SO:
- x86_64 Linux
- x86_64 macOS 10.15 ou mais recente
- amd64 Windows
Se o sistema operacional for compatível no momento e esse erro persistir, verifique se que os binários Python e pip são para Python 3.7 a 3.10. Caso contrário, crie o pacote MediaPipe Python localmente seguindo as instruções aqui.
Falha de carregamento de DLL do Python no Windows
Mensagem de erro:
ImportError: DLL load failed: The specified module could not be found
geralmente indica que o sistema local Windows não tem o Visual C++ pacotes redistribuíveis e/ou DLLs de tempo de execução do Visual C++. Isso pode ser resolvido pela instalando a versão oficial vc_redist.x64.exe ou instalar o "msvc-runtime" para o pacote Python executando
$ python -m pip install msvc-runtime
Observe que o arquivo "msvc-runtime" O pacote Python não é lançado nem mantido da Microsoft.
Método nativo não encontrado
Mensagem de erro:
java.lang.UnsatisfiedLinkError: No implementation found for void com.google.wick.Wick.nativeWick
geralmente indica que uma biblioteca nativa necessária, como /libwickjni.so
, não
carregado, não foi incluído nas dependências do app ou não pode ser
encontrados por algum motivo. O Java exige que todas as bibliotecas nativas sejam
carregado explicitamente usando a função System.loadLibrary
.
Nenhuma calculadora registrada foi encontrada
Mensagem de erro:
No registered object with name: OurNewCalculator; Unable to find Calculator "OurNewCalculator"
geralmente indica que OurNewCalculator
é referenciado pelo nome em um
CalculatorGraphConfig
, mas que o destino da biblioteca para OurNewCalculator tem
foi vinculado ao binário do aplicativo. Quando uma nova calculadora é adicionada
gráfico da calculadora, essa calculadora também deve ser adicionada como uma dependência do build do
os aplicativos usando o gráfico da calculadora.
Esse erro é capturado no tempo de execução porque os gráficos da calculadora fazem referência ao
calculadoras por nome no campo CalculatorGraphConfig::Node:calculator
.
Quando a biblioteca de uma calculadora está vinculada a um binário do aplicativo, a
calculadora, é registrado automaticamente pelo nome por meio do
REGISTER_CALCULATOR
usando a biblioteca registration.h
. Observe que
REGISTER_CALCULATOR
pode registrar uma calculadora com um prefixo de namespace.
idêntico ao namespace C++. Nesse caso, o gráfico da calculadora também deve usar
o mesmo prefixo de namespace.
Erro de falta de memória
A exaustão de memória pode ser um sintoma de excesso de pacotes acumulando-se em um executando o gráfico do MediaPipe. Isso pode ocorrer por vários motivos, como:
- Algumas calculadoras no gráfico simplesmente não conseguem acompanhar a chegada de pacotes de um stream de entrada em tempo real, como uma câmera de vídeo.
- Algumas calculadoras estão aguardando pacotes que nunca chegarão.
Para o problema (1), pode ser necessário descartar alguns pacotes antigos em
e processar os pacotes mais recentes. Para ver algumas dicas, consulte:
How to process realtime input streams
Para o problema (2), pode ser que um fluxo de entrada esteja sem pacotes para alguns
e por um bom motivo. Um dispositivo ou uma calculadora pode estar configurado incorretamente ou produzir pacotes
esporadicamente. Isso pode fazer com que calculadoras downstream esperem por muitos
pacotes que nunca chegarão, o que, por sua vez, fará com que os pacotes se acumulem no
alguns de seus fluxos de entrada. O MediaPipe aborda esse tipo de problema usando
"limites de carimbo de data/hora". Para ver algumas dicas, consulte:
How to process realtime input streams
A configuração do MediaPipe CalculatorGraphConfig::max_queue_size
limita o
número de pacotes enfileirados em qualquer fluxo de entrada limitando as entradas
gráfico. Para streams de entrada em tempo real, o número de pacotes na fila em uma entrada
stream quase sempre será zero ou um. Se esse não for o caso, você poderá ver
esta mensagem de aviso:
Resolved a deadlock by increasing max_queue_size of input stream
Além disso, a configuração CalculatorGraphConfig::report_deadlock
pode ser definida para causar
a execução do gráfico falhar e mostrar o impasse como um erro, de modo que max_queue_size
funciona como um limite de uso de memória.
O gráfico trava
Muitos aplicativos chamarão CalculatorGraph::CloseAllPacketSources
e
CalculatorGraph::WaitUntilDone
para finalizar ou suspender a execução de um MediaPipe.
gráfico. O objetivo aqui é permitir que calculadoras ou pacotes pendentes
processar a consulta e, em seguida, encerrar o gráfico. Se tudo correr bem, todas
fluxo no gráfico alcançará Timestamp::Done
, e todas as calculadoras
alcançar CalculatorBase::Close
e depois CalculatorGraph::WaitUntilDone
será concluída com sucesso.
Se algumas calculadoras ou fluxos não atingirem o estado Timestamp::Done
ou
CalculatorBase::Close
, o método CalculatorGraph::Cancel
poderá ser
chamado para encerrar a execução do gráfico sem esperar por todas as calculadoras pendentes
e pacotes para serem concluídos.
O tempo de saída é desigual
Alguns gráficos em tempo real do MediaPipe produzem uma série de frames de vídeo para visualização efeito de vídeo ou como diagnóstico de vídeo. Às vezes, um gráfico do MediaPipe produz esses frames em clusters, por exemplo, quando vários frames de saída extrapoladas do mesmo grupo de frames de entrada. Se as saídas forem apresentadas à medida que são produzidos, alguns frames de saída são imediatamente substituídos por frames no mesmo cluster, o que dificulta a visualização e avaliação dos resultados visualmente. Nesses casos, a visualização de saída pode ser melhorada apresentando os frames em intervalos uniformes em tempo real.
O MediaPipe aborda esse caso de uso mapeando carimbos de data/hora para pontos em tempo real.
Cada carimbo de data/hora indica um horário em microssegundos e uma calculadora como
LiveClockSyncCalculator
pode atrasar a saída de pacotes para corresponder à
carimbos de data/hora. Esse tipo de calculadora ajusta o tempo dos resultados de modo que:
- O tempo entre as saídas corresponde ao tempo entre os carimbos de data/hora como o mais próximo possível.
- As saídas são produzidas com o menor atraso possível.
O CalculatorGraph fica atrasado nas entradas
Para muitos gráficos em tempo real do MediaPipe, a baixa latência é um objetivo. MediaPipe oferece suporte a "pipelined" o processamento paralelo para iniciar o processamento cada pacote o mais cedo possível. Normalmente, a menor latência possível tempo total exigido por cada calculadora ao longo de um "caminho crítico" de sucessivas calculadoras. A latência do gráfico do MediaPipe pode ser pior do que o ideal devido aos atrasos introduzidos para exibir frames em intervalos uniformes, conforme descrito em O tempo de saída é desigual.
Se algumas das calculadoras no gráfico não acompanharem a entrada em tempo real
a latência continuará aumentando, e será necessário
e descartar alguns pacotes de entrada. A técnica recomendada é usar o MediaPipe
calculadoras projetadas especificamente para essa finalidade, como
FlowLimiterCalculator
, conforme descrito nas
How to process realtime input streams