Domande frequenti

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:

  1. Definisci più nodi della calcolatrice e invia i pacchetti di input a tutti i nodi.
  2. 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:

  1. Riavvia il grafico della calcolatrice con il valore CalculatorGraphConfig modificato.
  2. 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.