Come convertire ImageFrames e GpuBuffers
Le Calcolatrici ImageFrameToGpuBufferCalculator
e GpuBufferToImageFrameCalculator
effettuano la conversione tra pacchetti di tipo ImageFrame
e GpuBuffer
e viceversa. ImageFrame
fa riferimento ai dati di immagine nella memoria della CPU in uno qualsiasi di uno dei seguenti formati di immagine bitmap. GpuBuffer
si riferisce ai dati immagine nella memoria GPU. Puoi trovare ulteriori dettagli nella sezione Concetti del framework Convertitori da GPU a ImageFrame. Puoi vederne un esempio in:
Come visualizzare i risultati delle percezioni
L'elemento AnnotationOverlayCalculator
consente di sovrapporre risultati di percezione, ad esempio riquadri di delimitazione, frecce e ovali, sui frame video allineati con gli oggetti riconosciuti. I risultati possono essere visualizzati in una finestra di diagnostica durante l'esecuzione su una workstation o in un frame di texture durante l'esecuzione sul dispositivo. Puoi
vedere un esempio di utilizzo di AnnotationOverlayCalculator
in:
Come eseguire calcolatrici in parallelo
All'interno di un grafico di una calcolatrice, MediaPipe esegue regolarmente dei nodi della calcolatrice separati in parallelo. MediaPipe gestisce un pool di thread ed esegue ogni calcolatore non appena è disponibile un thread e tutti i suoi input sono pronti. Ogni istanza di calcolatrice viene eseguita per un solo set di input alla volta, quindi la maggior parte delle calcolatrici deve essere solo compatibile con i thread e non thread-safe.
Per consentire a una calcolatrice di elaborare più input in parallelo, esistono due possibili approcci:
- Definisci più nodi della calcolatrice e invia i pacchetti di input a tutti i nodi.
- Rendi la calcolatrice sicura per i thread e configura l'impostazione
max_in_flight
corrispondente.
Il primo approccio può essere seguito utilizzando le calcolatrici progettate per distribuire pacchetti su altre calcolatrici, ad esempio RoundRobinDemuxCalculator
. Un singolo RoundRobinDemuxCalculator
può distribuire pacchetti successivi su diversi nodi ScaleImageCalculator
configurati in modo identico.
Il secondo approccio consente fino a max_in_flight
chiamate del metodo CalculatorBase::Process
sullo stesso nodo della calcolatrice. I pacchetti di output da CalculatorBase::Process
vengono ordinati automaticamente per timestamp prima di essere trasferiti ai calcolatori downstream.
Con entrambi i casi, devi tenere presente che la calcolatrice in esecuzione in parallelo non può mantenere lo stato interno come una normale calcolatrice sequenziale.
Timestamp di output quando si utilizza ImmediateInputStreamHandler
Il campo ImmediateInputStreamHandler
recapita ogni pacchetto non appena arriva a un flusso di input. Di conseguenza, può consegnare un pacchetto con un timestamp più alto da un flusso di input prima di consegnare un pacchetto con un timestamp più basso da un flusso di input diverso. Se questi timestamp di input vengono utilizzati entrambi per i pacchetti inviati a un flusso di output, quel flusso di output lamenta del fatto che i timestamp non aumentano monotonicamente. Per risolvere il problema, la calcolatrice deve fare attenzione a generare un pacchetto solo dopo che l'elaborazione è stata completata per il timestamp.
A questo scopo, attendi che vengano ricevuti i pacchetti di input
da tutti i flussi di input per quel timestamp oppure ignora un pacchetto che arriva con un timestamp
già elaborato.
Come modificare le impostazioni in fase di runtime
Per modificare le impostazioni di un grafico di una calcolatrice mentre è in esecuzione l'applicazione esistono due approcci principali:
- Riavvia il grafico della calcolatrice con il valore
CalculatorGraphConfig
modificato. - Invia nuove opzioni di calcolatrice tramite pacchetti su flussi di input dei grafici.
Il primo approccio presenta il vantaggio di sfruttare gli strumenti di elaborazione di CalculatorGraphConfig
come i "sottografi". Il secondo approccio presenta il vantaggio di lasciare che le calcolatrici e i pacchetti attivi rimangano in esecuzione mentre le impostazioni cambiano. I collaboratori di Mediapipe stanno attualmente studiando
approcci alternativi per ottenere entrambi questi vantaggi.
Come elaborare i flussi di input in tempo reale
Il framework Mediapipe può essere utilizzato per elaborare gli stream di dati online o offline. Per l'elaborazione offline, i pacchetti vengono inviati al grafico non appena le calcolatrici sono pronte per elaborare i pacchetti. Per l'elaborazione online, un pacchetto per ogni frame viene inviato al grafico man mano che viene registrato.
Il framework MediaPipe richiede solo l'assegnazione di timestamp con incrementi monotonici a pacchetti successivi. Per convenzione, i grafici e le calcolatrici in tempo reale utilizzano il tempo di registrazione o il tempo di presentazione come timestamp per ogni pacchetto e ogni timestamp rappresenta i microsecondi a partire dal giorno Jan/1/1970:00:00:00
. Ciò consente di elaborare i pacchetti
di varie origini in modo coerente a livello globale.
Normalmente, nell'elaborazione offline, ogni pacchetto di input viene elaborato e l'elaborazione prosegue per il tempo necessario. Nell'elaborazione online, spesso è necessario rilasciare pacchetti di input per tenere il passo con l'arrivo dei frame di dati di input.
Quando gli input arrivano troppo spesso, la tecnica consigliata per rilasciare pacchetti è utilizzare i calcolatori MediaPipe progettati appositamente per questo scopo, come FlowLimiterCalculator
e PacketClonerCalculator
.
Per l'elaborazione online, è inoltre necessario determinare tempestivamente quando
l'elaborazione può procedere. MediaPipe supporta questa operazione propagando i limiti di timestamp tra le calcolatrici. I limiti di timestamp indicano gli intervalli di timestamp che
non conterranno pacchetti di input e consentono alle calcolatrici di iniziare immediatamente l'elaborazione di
questi timestamp. I calcolatori progettati per l'elaborazione in tempo reale
devono calcolare con attenzione i limiti dei timestamp per poter iniziare l'elaborazione
il più rapidamente possibile. Ad esempio, MakePairCalculator
utilizza l'API SetOffset
per propagare i limiti di timestamp dai flussi di input ai flussi di output.
Posso eseguire MediaPipe su MS Windows?
Attualmente la portabilità di MediaPipe supporta Debian Linux, Ubuntu Linux, MacOS, Android e iOS. Il cuore del framework MediaPipe è una libreria C++ conforme allo standard C++11, quindi è relativamente facile eseguire il trasferimento su altre piattaforme.