Cómo convertir ImageFrames y GpuBuffers
Las calculadoras ImageFrameToGpuBufferCalculator
y GpuBufferToImageFrameCalculator
convierten entre paquetes de tipo ImageFrame
y GpuBuffer
. ImageFrame
hace referencia a datos de imagen en la memoria de la CPU en cualquiera de los formatos de imagen de mapa de bits. GpuBuffer
hace referencia a datos de imágenes en la memoria de la GPU. Puedes obtener más detalles en la sección de conceptos del framework GpuBuffer to ImageFrame converters. Puedes ver un ejemplo en las siguientes secciones:
Cómo visualizar los resultados de percepción
El objeto AnnotationOverlayCalculator
permite que los resultados de percepción, como cuadros delimitadores, flechas y óvalos, se superpongan en los fotogramas de video alineados con los objetos reconocidos. Los resultados se pueden mostrar en una ventana de diagnóstico cuando se ejecuta en una estación de trabajo o en un marco de textura cuando se ejecuta en el dispositivo. Puedes ver un ejemplo de uso de AnnotationOverlayCalculator
en:
Cómo ejecutar calculadoras en paralelo
En un gráfico de calculadora, MediaPipe ejecuta de forma rutinaria nodos de calculadora separados en paralelo. MediaPipe mantiene un grupo de subprocesos y ejecuta cada calculadora en cuanto un subproceso está disponible y todas sus entradas están listas. Cada instancia de la calculadora solo se ejecuta para un conjunto de entradas a la vez, por lo que la mayoría de las calculadoras solo deben ser compatibles con subprocesos y no seguras para subprocesos.
Para habilitar una calculadora para que procese varias entradas en paralelo, existen dos enfoques posibles:
- Define varios nodos de la calculadora y envía paquetes de entrada a todos los nodos.
- Establece que la calculadora sea segura para los subprocesos y establece su configuración de
max_in_flight
.
El primer enfoque se puede seguir con calculadoras diseñadas para distribuir paquetes en otras calculadoras, como RoundRobinDemuxCalculator
. Un solo RoundRobinDemuxCalculator
puede distribuir paquetes sucesivos en varios nodos ScaleImageCalculator
configurados de forma idéntica.
El segundo enfoque permite hasta max_in_flight
invocaciones del método CalculatorBase::Process
en el mismo nodo de calculadora. Los paquetes de salida de CalculatorBase::Process
se ordenan automáticamente por marca de tiempo antes de pasar a las calculadoras posteriores.
Con cualquiera de los enfoques, debes tener en cuenta que la calculadora que se ejecuta en paralelo no puede mantener el estado interno de la misma manera que una calculadora secuencial normal.
Marcas de tiempo de salida cuando se usa AdsInputStreamHandler
ImmediateInputStreamHandler
entrega cada paquete en cuanto llegan a una transmisión de entrada. Como resultado, puede entregar un paquete con una marca de tiempo más alta desde una transmisión de entrada antes de entregar un paquete con una marca de tiempo más baja desde una transmisión de entrada diferente. Si estas marcas de tiempo de entrada se usan para paquetes enviados a una transmisión de salida, esa transmisión de salida se reclamará que las marcas de tiempo no aumentan monótonamente. Para solucionar este problema, la calculadora debe asegurarse de generar un paquete solo después de que se complete el procesamiento de la marca de tiempo.
Esto se puede lograr si se espera hasta que se reciban los paquetes de entrada de todos los flujos de entrada para esa marca de tiempo, o si se ignora un paquete que llega con una marca de tiempo que ya se procesó.
Cómo cambiar la configuración durante el tiempo de ejecución
Existen dos enfoques principales para cambiar la configuración de un gráfico de la calculadora mientras se ejecuta la aplicación:
- Reinicia el gráfico de la calculadora con
CalculatorGraphConfig
modificado. - Enviar opciones de calculadora nuevas a través de paquetes en flujos de entrada de gráficos
El primer enfoque tiene la ventaja de aprovechar las herramientas de procesamiento de CalculatorGraphConfig
, como "subgrafos". El segundo enfoque tiene la ventaja de permitir que las calculadoras y los paquetes activos permanezcan en tránsito mientras cambia la configuración. Actualmente, los colaboradores de Mediapipe están investigando enfoques alternativos para lograr ambas ventajas.
Cómo procesar transmisiones de entradas en tiempo real
El framework mediapipe se puede usar para procesar transmisiones de datos en línea o sin conexión. Para el procesamiento sin conexión, los paquetes se envían al gráfico en cuanto las calculadoras están listas para procesarlos. Para el procesamiento en línea, se envía un paquete por cada fotograma al grafo a medida que se registra ese fotograma.
El framework de MediaPipe solo requiere que se asignen marcas de tiempo que aumenten monótonamente a los paquetes sucesivos. Por convención, las calculadoras y los gráficos en tiempo real usan el tiempo de registro o de presentación como la marca de tiempo para cada paquete, y cada marca de tiempo representa los microsegundos desde Jan/1/1970:00:00:00
. Esto permite que los paquetes de diversas fuentes
se procesen en un orden coherente a nivel global.
Por lo general, para el procesamiento sin conexión, cada paquete de entrada se procesa y el procesamiento continúa el tiempo necesario. Para el procesamiento en línea, a menudo es necesario descartar paquetes de entrada para seguir el ritmo de la llegada de marcos de datos de entrada.
Cuando las entradas llegan con demasiada frecuencia, la técnica recomendada para descartar paquetes es usar las calculadoras de MediaPipe diseñadas específicamente para este propósito, como FlowLimiterCalculator
y PacketClonerCalculator
.
Para el procesamiento en línea, también es necesario determinar de inmediato cuándo se puede continuar. MediaPipe admite esto mediante la propagación de los límites de marca de tiempo entre calculadoras. Los límites de las marcas de tiempo indican intervalos de marca de tiempo que no contendrán paquetes de entrada y permiten que las calculadoras comiencen a procesar esas marcas de tiempo de inmediato. Las calculadoras diseñadas para el procesamiento en tiempo real deben calcular cuidadosamente los límites de la marca de tiempo para comenzar a procesar lo antes posible. Por ejemplo, MakePairCalculator
usa la API de SetOffset
para propagar los límites de marca de tiempo desde las transmisiones de entrada hasta las de salida.
¿Puedo ejecutar MediaPipe en MS Windows?
Actualmente, la portabilidad de MediaPipe es compatible con Debian Linux, Ubuntu Linux, MacOS, Android y iOS. El núcleo del framework de MediaPipe es una biblioteca de C++ que cumple con el estándar C++11, por lo que es relativamente fácil realizar la portabilidad a plataformas adicionales.