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:
- Defina vários nós de calculadora e envie pacotes de entrada para todos os nós.
- 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:
- Reinicie o gráfico da calculadora com o atributo
CalculatorGraphConfig
modificado. - 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.