Machen Sie sich mit den folgenden Konzepten vertraut, bevor Sie das MediaPipe-Framework verwenden.
Grundlagen
Paket
Die grundlegende Datenflusseinheit. Ein Paket besteht aus einem numerischen Zeitstempel und einem gemeinsamen Zeiger auf eine unveränderliche Nutzlast. Die Nutzlast kann einen beliebigen C++-Typ haben. Der Typ der Nutzlast wird auch als Typ des Pakets bezeichnet. Pakete sind Wertklassen und können kostengünstig kopiert werden. Jede Kopie teilt sich die Eigentumsrechte der Nutzlast mit der Semantik zur Referenzzählung. Jede Kopie hat einen eigenen Zeitstempel. Siehe auch Paket.
Grafik
Die MediaPipe-Verarbeitung findet innerhalb eines Graphen statt, der Paketflusspfade zwischen Knoten definiert. Ein Diagramm kann eine beliebige Anzahl von Ein- und Ausgaben haben und der Datenfluss kann verzweigt und zusammengeführt werden. In der Regel fließen Daten vorwärts, es sind jedoch Rückwärtsschleifen möglich. Weitere Informationen finden Sie unter Grafiken.
Knoten
Knoten produzieren und/oder verarbeiten Pakete, auf denen der Großteil der Arbeit des Diagramms stattfindet. Aus historischen Gründen werden sie auch als „Taschenrechner“ bezeichnet. Die Schnittstelle jedes Knotens definiert eine Reihe von ports, die durch ein Tag und/oder einen Index identifiziert werden. Weitere Informationen
Streams
Ein Stream ist eine Verbindung zwischen zwei Knoten, die eine Folge von Paketen transportiert, deren Zeitstempel monoton ansteigen müssen.
Seitenpakete
Eine Nebenpaketverbindung zwischen Knoten überträgt ein einzelnes Paket (mit unbekanntem Zeitstempel). Sie kann verwendet werden, um einige Daten bereitzustellen, die konstant bleiben, während ein Stream einen Datenfluss darstellt, der sich im Laufe der Zeit ändert.
Paketports
Einem Port ist ein Typ zugeordnet. Pakete, die über den Port übertragen werden, müssen diesen Typ haben. Ein Ausgabestreamport kann mit einer beliebigen Anzahl von Eingabestreamports desselben Typs verbunden werden. Jeder Nutzer erhält eine separate Kopie der Ausgabepakete und hat eine eigene Warteschlange, sodass er sie in seinem eigenen Tempo verarbeiten kann. In ähnlicher Weise kann ein Ausgabeport für Nebenpakete mit beliebig vielen Nebenpaket-Eingabeports verbunden werden.
Ein Port kann erforderlich sein, d. h., eine Verbindung muss hergestellt werden, damit der Graph gültig ist, oder optional, d. h., er kann nicht verbunden bleiben.
Eingabe und Ausgabe
Der Datenfluss kann von Quellknoten stammen, die keine Eingabestreams haben und spontan Pakete erstellen, z.B. durch Lesen aus einer Datei, oder von Eingabestreams für Diagramme, mit denen eine Anwendung Pakete in eine Grafik einspeisen kann.
In ähnlicher Weise gibt es Senkenknoten, die Daten empfangen und in verschiedene Ziele (z. B. eine Datei, einen Speicherpuffer usw.) schreiben. Eine Anwendung kann außerdem mithilfe von Callbacks Ausgaben vom Graphen empfangen.
Laufzeitverhalten
Lebensdauer des Diagramms
Sobald eine Grafik initialisiert wurde, kann sie gestartet werden, um mit der Verarbeitung von Daten zu beginnen. Dabei kann sie einen Stream von Paketen verarbeiten, bis der jeweilige Stream geschlossen oder die Grafik abgebrochen wurde. Anschließend kann die Grafik gelöscht oder neu gestartet werden.
Knotenlebensdauer
Es gibt drei Hauptmethoden für die Lebensdauer, die das Framework auf einem Knoten aufruft:
- Öffnen: wird einmal vor den anderen Methoden aufgerufen. Wenn er aufgerufen wird, sind alle vom Knoten benötigten eingabeseitigen Pakete verfügbar.
- Prozess: Wird entsprechend der Eingaberichtlinie des Knotens mehrmals aufgerufen, wenn ein neuer Satz von Eingaben verfügbar ist.
- Close: einmal aufgerufen, am Ende.
Darüber hinaus kann jeder Rechner Konstruktor und Destruktor definieren, die zum Erstellen und Freigeben von Ressourcen nützlich sind, die von den verarbeiteten Daten unabhängig sind.
Eingaberichtlinien
Die Standardeingaberichtlinie ist die deterministische Sortierung von Paketen nach Zeitstempel. Ein Knoten erhält alle Eingaben für denselben Zeitstempel zur selben Zeit über die Methode "Process" (Verarbeitungsmethode) und die folgenden Eingabesätze werden in der Reihenfolge ihrer Zeitstempel empfangen. Dies kann dazu führen, dass die Verarbeitung einiger Pakete verzögert wird, bis ein Paket mit demselben Zeitstempel in allen Eingabestreams empfangen wird oder bis garantiert werden kann, dass ein Paket mit diesem Zeitstempel nicht in den Streams eingeht, die ihn nicht empfangen haben.
Es sind noch weitere Richtlinien verfügbar, die mit einer separaten Art von Komponente, einem sogenannten InputStreamHandler, implementiert werden.
Weitere Informationen finden Sie unter Synchronisierung.
Streams in Echtzeit
MediaPipe-Rechnerdiagramme werden häufig verwendet, um Streams von Video- oder Audioframes für interaktive Anwendungen zu verarbeiten. Normalerweise wird jeder Rechner ausgeführt, sobald alle Eingabepakete für einen bestimmten Zeitstempel verfügbar sind. In Echtzeitgrafiken verwendete Rechner müssen Grenzen für den Ausgabezeitstempel basierend auf den Grenzen der Eingabezeitstempel definieren, damit nachgelagerte Rechner schnell geplant werden können. Weitere Informationen findest du unter Streams in Echtzeit.