Perguntas frequentes

Como converter ImageFrames e GpuBuffers

As calculadoras ImageFrameToGpuBufferCalculator e GpuBufferToImageFrameCalculator fazem a conversão entre pacotes do tipo ImageFrame e GpuBuffer. ImageFrame se refere a dados de imagem na memória da CPU em qualquer um dos vários formatos de imagem de bitmap. GpuBuffer refere-se aos dados de imagem na memória da GPU. Confira mais detalhes na seção GpuBuffer to ImageFrame Converters (link em inglês) dos conceitos de framework. Confira um exemplo em:

Como visualizar os resultados da percepção

O AnnotationOverlayCalculator permite que os resultados de percepção, como caixas delimitadoras, setas e ovais, sejam sobrepostos aos frames de vídeo alinhados aos objetos reconhecidos. Os resultados podem ser exibidos em uma janela de diagnóstico quando executados em uma estação de trabalho ou em um frame de textura ao serem executados no dispositivo. Confira um exemplo de uso de AnnotationOverlayCalculator:

Como executar calculadoras em paralelo

Em um gráfico de calculadora, o MediaPipe executa rotineiramente nós de calculadora separados em paralelo. O MediaPipe mantém um pool de linhas de execução e executa cada calculadora assim que uma linha de execução é disponibilizada e todas as entradas dela estão prontas. Cada instância de calculadora é executada apenas para um conjunto de entradas por vez. Portanto, a maioria das calculadoras precisa ser compatível com linhas de execução, e não segura para linhas de execução.

Para permitir que uma calculadora processe várias entradas em paralelo, há duas abordagens possíveis:

  1. Defina vários nós de calculadora e envie pacotes de entrada para todos os nós.
  2. Torne a calculadora segura para as linhas de execução e defina a configuração max_in_flight.

A primeira abordagem pode ser seguida usando as calculadoras projetadas para distribuir pacotes em outras calculadoras, como RoundRobinDemuxCalculator. Um único RoundRobinDemuxCalculator pode distribuir pacotes sucessivos em vários nós ScaleImageCalculator configurados de maneira idêntica.

A segunda abordagem permite até max_in_flight invocações do método CalculatorBase::Process no mesmo nó de calculadora. Os pacotes de saída de CalculatorBase::Process são ordenados automaticamente por carimbo de data/hora antes de serem passados para calculadoras downstream.

Seja qual for a abordagem, esteja ciente de que a calculadora que é executada em paralelo não pode manter o estado interno da mesma maneira que uma calculadora sequencial normal.

Carimbos de data/hora de saída ao usar InstantInputStreamHandler

O ImmediateInputStreamHandler entrega cada pacote assim que ele chega a um stream de entrada. Como resultado, ele pode entregar um pacote com carimbo de data/hora mais alto de um stream de entrada antes de entregar um pacote com carimbo de data/hora menor de um fluxo de entrada diferente. Se esses carimbos de data/hora de entrada forem usados nos pacotes enviados para um stream de saída, o stream de saída vai informar que os carimbos de data/hora não estão aumentando monotonicamente. Para resolver isso, a calculadora precisa ter o cuidado de gerar um pacote somente depois que o processamento do carimbo de data/hora for concluído. Isso pode ser feito ao aguardar até que os pacotes de entrada tenham sido recebidos de todos os streams de entrada para esse carimbo de data/hora ou ignorando um pacote que chega com um carimbo de data/hora que já foi processado.

Como mudar as configurações no momento da execução

Há duas abordagens principais para alterar as configurações de um gráfico de calculadora enquanto o aplicativo está em execução:

  1. Reinicie o gráfico da calculadora com o atributo CalculatorGraphConfig modificado.
  2. Enviar novas opções de calculadora por pacotes nos streams de entrada do gráfico.

A primeira abordagem tem a vantagem de aproveitar as ferramentas de processamento de CalculatorGraphConfig, como "subgráficos". A segunda abordagem tem a vantagem de permitir que calculadoras e pacotes ativos permaneçam em andamento enquanto as configurações são alteradas. Os colaboradores do Mediapipe estão investigando abordagens alternativas para alcançar essas duas vantagens.

Como processar streams de entrada em tempo real

O framework mediapipe pode ser usado para processar fluxos de dados on-line ou off-line. Para processamento off-line, os pacotes são enviados ao gráfico assim que a calculadora está pronta para processar esses pacotes. Para processamento on-line, um pacote para cada frame é enviado ao gráfico à medida que o frame é gravado.

O framework MediaPipe exige apenas que pacotes sucessivos sejam atribuídos usando carimbos de data/hora com crescimento monotônico. Por convenção, calculadoras e gráficos em tempo real usam o tempo de gravação ou o tempo de apresentação como carimbo de data/hora de cada pacote, com cada carimbo de data/hora representando microssegundos desde Jan/1/1970:00:00:00. Assim, pacotes de várias origens são processados em uma ordem globalmente consistente.

Normalmente, para o processamento off-line, cada pacote de entrada é processado e o processamento continua pelo tempo necessário. No processamento on-line, muitas vezes é necessário descartar pacotes de entrada para acompanhar a chegada dos data frames. Quando as entradas chegam com muita frequência, a técnica recomendada para descartar pacotes é usar as calculadoras do MediaPipe projetadas especificamente para essa finalidade, como FlowLimiterCalculator e PacketClonerCalculator.

Para o processamento on-line, também é necessário determinar imediatamente quando ele pode prosseguir. O MediaPipe oferece suporte a isso propagando limites de carimbo de data/hora entre calculadoras. Os limites de carimbo de data/hora indicam intervalos que não conterão pacotes de entrada e permitem que as calculadoras comecem o processamento para esses carimbos de data/hora imediatamente. As calculadoras projetadas para processamento em tempo real precisam calcular cuidadosamente os limites de carimbo de data/hora para iniciar o processamento o mais rápido possível. Por exemplo, o MakePairCalculator usa a API SetOffset para propagar os limites de carimbo de data/hora de fluxos de entrada para fluxos de saída.

Posso executar o MediaPipe no MS Windows?

Atualmente, a portabilidade do MediaPipe oferece suporte para Debian Linux, Ubuntu Linux, MacOS, Android e iOS. O núcleo do framework MediaPipe é uma biblioteca C++ em conformidade com o padrão C++11. Por isso, é relativamente fácil fazer a portabilidade para outras plataformas.