FAQs

So konvertieren Sie ImageFrames und GpuBuffers

Die Rechner ImageFrameToGpuBufferCalculator und GpuBufferToImageFrameCalculator konvertieren zwischen Paketen vom Typ ImageFrame und GpuBuffer hin und her. ImageFrame bezieht sich auf die Bilddaten im CPU-Speicher in einem beliebigen Bitmapbildformat. GpuBuffer bezieht sich auf Bilddaten im GPU-Arbeitsspeicher. Weitere Informationen finden Sie im Abschnitt zu den Framework-Konzepten unter GpuBuffer zu ImageFrame-Convertern. Ein Beispiel finden Sie hier:

Ergebnisse der Wahrnehmung visualisieren

Mit AnnotationOverlayCalculator können Wahrnehmungsergebnisse wie Begrenzungsrahmen, Pfeile und Ovale die Videoframes überlagern, die an den erkannten Objekten ausgerichtet sind. Die Ergebnisse können beim Ausführen auf einer Workstation in einem Diagnosefenster oder beim Ausführen auf einem Gerät in einem Texturframe angezeigt werden. Ein Beispiel für die Verwendung von AnnotationOverlayCalculator finden Sie hier:

Rechner parallel ausführen

Innerhalb einer Taschenrechnergrafik führt MediaPipe regelmäßig separate Rechnerknoten parallel aus. MediaPipe verwaltet einen Pool von Threads und führt jeden Rechner aus, sobald ein Thread verfügbar ist und alle zugehörigen Eingaben bereit sind. Da jede Taschenrechnerinstanz jeweils nur für einen Satz von Eingaben ausgeführt wird, müssen die meisten Rechner nur threadkompatibel und nicht threadsicher sein.

Es gibt zwei Möglichkeiten, damit ein Rechner mehrere Eingaben parallel verarbeiten kann:

  1. Definieren Sie mehrere Rechnerknoten und senden Sie Eingabepakete an alle Knoten.
  2. Machen Sie den Rechner Thread-sicher und konfigurieren Sie die Einstellung max_in_flight.

Im ersten Ansatz können Rechner verwendet werden, die Pakete auf andere Rechner wie RoundRobinDemuxCalculator verteilen. Ein einzelnes RoundRobinDemuxCalculator kann aufeinanderfolgende Pakete auf mehrere identisch konfigurierte ScaleImageCalculator-Knoten verteilen.

Bei der zweiten Methode sind bis zu max_in_flight-Aufrufe der Methode CalculatorBase::Process auf demselben Rechnerknoten möglich. Die Ausgabepakete von CalculatorBase::Process werden automatisch nach Zeitstempel sortiert, bevor sie an nachgelagerte Rechner weitergeleitet werden.

In beiden Fällen müssen Sie beachten, dass der parallel ausgeführte Rechner den internen Zustand nicht auf dieselbe Weise wie ein normaler sequenzieller Rechner aufrechterhalten kann.

Ausgabezeitstempel bei Verwendung von SofortInputStreamHandler

Der ImmediateInputStreamHandler liefert jedes Paket, sobald es in einem Eingabestream eintrifft. Dadurch kann er ein Paket mit einem höheren Zeitstempel aus einem Eingabestream liefern, bevor ein Paket mit einem niedrigeren Zeitstempel aus einem anderen Eingabestream ausgeliefert wird. Wenn diese Eingabezeitstempel beide für Pakete verwendet werden, die an einen Ausgabestream gesendet werden, meldet dieser Ausgabestream, dass sich die Zeitstempel nicht kontinuierlich erhöhen. Um dies zu beheben, muss der Rechner darauf achten, dass ein Paket erst dann ausgegeben wird, wenn die Verarbeitung des Zeitstempels abgeschlossen ist. Dies kann erreicht werden, indem Sie warten, bis Eingabepakete von allen Eingabestreams für diesen Zeitstempel empfangen wurden, oder indem Sie ein Paket ignorieren, das mit einem Zeitstempel eintrifft, der bereits verarbeitet wurde.

Einstellungen zur Laufzeit ändern

Es gibt zwei Hauptansätze, um die Einstellungen einer Taschenrechnergrafik zu ändern, während die Anwendung ausgeführt wird:

  1. Starten Sie die Taschenrechnergrafik mit geänderter CalculatorGraphConfig neu.
  2. Neue Taschenrechneroptionen durch Pakete an Grafikeingabestreams senden.

Der erste Ansatz bietet den Vorteil, dass CalculatorGraphConfig-Verarbeitungstools wie „subgraphs“ verwendet werden. Der zweite Ansatz hat den Vorteil, dass aktive Rechner und Pakete aktiv bleiben, während sich die Einstellungen ändern. Die Mitwirkenden an Mediapipe suchen derzeit nach alternativen Ansätzen, um diese beiden Vorteile zu erzielen.

Echtzeit-Eingabestreams verarbeiten

Mit dem Mediapipe-Framework können Datenstreams entweder online oder offline verarbeitet werden. Für die Offlineverarbeitung werden Pakete in die Grafik übertragen, sobald die Rechner für die Verarbeitung dieser Pakete bereit sind. Bei der Online-Verarbeitung wird ein Paket für jeden Frame in die Grafik eingefügt, während dieser Frame aufgezeichnet wird.

Das MediaPipe-Framework erfordert nur, dass aufeinanderfolgende Pakete monoton ansteigende Zeitstempel zugewiesen werden. Konventionsgemäß verwenden Echtzeitrechner und Grafiken die Aufzeichnungszeit oder die Präsentationszeit als Zeitstempel für jedes Paket, wobei jeder Zeitstempel Mikrosekunden seit Jan/1/1970:00:00:00 darstellt. Dadurch können Pakete aus verschiedenen Quellen in einer global konsistenten Reihenfolge verarbeitet werden.

Bei der Offlineverarbeitung wird normalerweise jedes Eingabepaket verarbeitet und die Verarbeitung so lange wie nötig fortgesetzt. Bei der Online-Verarbeitung ist es häufig erforderlich, Eingabepakete zu verwerfen, um mit dem Eintreffen von Eingabe-Dataframes Schritt zu halten. Wenn Eingaben zu häufig eingehen, wird zum Löschen von Paketen die Verwendung der speziell für diesen Zweck entwickelten MediaPipe-Rechner wie FlowLimiterCalculator und PacketClonerCalculator empfohlen.

Bei der Onlineverarbeitung muss außerdem umgehend ermittelt werden, wann die Verarbeitung fortgesetzt werden kann. MediaPipe unterstützt dies durch die Weitergabe von Zeitstempelgrenzen zwischen Rechnern. Zeitstempelgrenzen geben Zeitstempelintervalle an, die keine Eingabepakete enthalten, und ermöglichen es Taschenrechnern, die Verarbeitung für diese Zeitstempel sofort zu beginnen. Für die Echtzeitverarbeitung vorgesehene Taschenrechner sollten die Zeitstempelgrenzen sorgfältig berechnen, um mit der Verarbeitung so schnell wie möglich zu beginnen. MakePairCalculator verwendet beispielsweise die SetOffset API, um Zeitstempelgrenzen von Eingabestreams an Ausgabestreams weiterzugeben.

Kann ich MediaPipe unter MS Windows ausführen?

Derzeit unterstützt die MediaPipe-Portabilität Debian Linux, Ubuntu Linux, MacOS, Android und iOS. Der Kern des MediaPipe-Frameworks ist eine C++-Bibliothek, die dem C++11-Standard entspricht, sodass die Portierung auf zusätzliche Plattformen relativ einfach ist.