Solução de problemas

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:

  1. 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.
  2. 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:

  1. O tempo entre as saídas corresponde ao tempo entre os carimbos de data/hora como o mais próximo possível.
  2. 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