Prima di utilizzare MediaPipe Framework, acquisisci familiarità con i seguenti concetti.
Nozioni di base
Pacchetto
L'unità di flusso di dati di base. Un pacchetto è costituito da un timestamp numerico e da un puntatore condiviso a un payload immutabile. Il payload può essere di qualsiasi tipo C++ e il tipo di payload è indicato anche come tipo di pacchetto. I pacchetti sono classi di valore e possono essere copiati in modo economico. Ogni copia condivide la proprietà del payload, con la semantica del conteggio dei riferimenti. Ogni copia ha il proprio timestamp. Vedi anche Pacchetto.
Grafico
L'elaborazione di MediaPipe avviene all'interno di un grafico, che definisce i percorsi di flusso dei pacchetti tra i nodi. Un grafico può avere un numero illimitato di input e output e il flusso di dati può diramarsi e unire. In genere i dati fluiscono in avanti, ma sono possibili loop all'indietro. Per i dettagli, vedi i Grafici.
Nodi
I nodi producono e/o consumano pacchetti ed è qui che avviene la maggior parte del lavoro del grafico. Sono noti anche come "calcolatori" per motivi storici. L'interfaccia di ogni nodo definisce un numero di ports di input e di output, identificate da un tag e/o da un indice. Per informazioni dettagliate, vedi Calcolatrici.
Stream
Un flusso è una connessione tra due nodi che trasporta una sequenza di pacchetti, i cui timestamp devono essere crescenti monotonicamente.
Pacchetti laterali
Una connessione di pacchetti laterale tra nodi trasporta un singolo pacchetto (con timestamp non specificato). Può essere utilizzato per fornire dati che rimarranno costanti, mentre un flusso rappresenta un flusso di dati che cambia nel tempo.
Porte pacchetti
A una porta è associato un tipo; i pacchetti in transito attraverso la porta devono essere di quel tipo. Una porta di flusso di output può essere collegata a un numero qualsiasi di porte di flusso di input dello stesso tipo; ogni consumer riceve una copia separata dei pacchetti di output e ha una propria coda, in modo da poterli utilizzare al proprio ritmo. Analogamente, una porta di output del pacchetto laterale può essere collegata a tutte le porte di input laterali dei pacchetti che desideri.
Può essere obbligatoria una porta, il che significa che è necessario stabilire una connessione affinché il grafico sia valido o facoltativo, il che significa che il grafico potrebbe rimanere scollegato.
Input e output
Il flusso di dati può provenire da nodi di origine, che non hanno flussi di input e producono pacchetti spontaneamente (ad es. leggendo da un file), oppure da stream di input dei grafici, che consentono a un'applicazione di alimentare i pacchetti in un grafico.
Analogamente, esistono nodi sink che ricevono dati e li scrivono in varie destinazioni (ad esempio un file, un buffer di memoria e così via) e un'applicazione può anche ricevere output dal grafico utilizzando i callback.
Comportamento di runtime
Durata del grafico
Una volta inizializzato un grafico, puoi avviarlo per iniziare a elaborare i dati e puoi elaborare un flusso di pacchetti fino alla chiusura di ogni flusso o fino all'annullamento del grafico. Successivamente, è possibile eliminare o riavviare il grafico.
Durata del nodo
Esistono tre metodi principali per la durata che il framework chiama su un nodo:
- Aperta: chiamata una volta, prima degli altri metodi. Quando viene chiamato, sono disponibili tutti i pacchetti lato di input richiesti dal nodo.
- Processo: chiamato più volte, quando è disponibile un nuovo insieme di input, in base al criterio di input del nodo.
- Chiusura: chiamata una volta, alla fine.
Inoltre, ogni calcolatrice può definire il costruttore e il distruttore, utili per creare e distribuire risorse indipendenti dai dati elaborati.
Criteri di input
Il criterio di input predefinito prevede le regole di confronto deterministiche dei pacchetti per timestamp. Un nodo riceve contemporaneamente tutti gli input per lo stesso timestamp, richiamando il metodo Process, e i set di input successivi vengono ricevuti nell'ordine dei timestamp. Ciò può richiedere un ritardo nell'elaborazione di alcuni pacchetti fino a quando un pacchetto con lo stesso timestamp non viene ricevuto su tutti i flussi di input o fino a quando non è possibile garantire che un pacchetto con quel timestamp non arriverà sui flussi che non l'hanno ricevuto.
Sono inoltre disponibili altri criteri, implementati utilizzando un tipo di componente separato noto come InputStreamHandler.
Per ulteriori dettagli, consulta la sezione Sincronizzazione.
Stream in tempo reale
I grafici della calcolatrice MediaPipe vengono spesso utilizzati per elaborare flussi di frame video o audio per applicazioni interattive. Normalmente, ogni Calcolatrice viene eseguita non appena sono disponibili tutti i pacchetti di input per un determinato timestamp. I calcolatori utilizzati nei grafici in tempo reale devono definire i limiti del timestamp di output in base ai limiti del timestamp di input al fine di consentire la pianificazione immediata dei calcolatori downstream. Per maggiori dettagli, vedi Stream in tempo reale.