Konwertowanie ramek ImageFrame i GpuBuffers
Kalkulatory ImageFrameToGpuBufferCalculator
i GpuBufferToImageFrameCalculator
konwertują w obie strony pakiety typu ImageFrame
i GpuBuffer
. ImageFrame
odnosi się do danych obrazu w pamięci procesora w dowolnym z wielu formatów obrazu bitmapy. GpuBuffer
odnosi się do danych obrazu w pamięci GPU. Więcej informacji znajdziesz w sekcji Informacje o platformach GpuBuffer to ImageFrame Przykład możesz zobaczyć w:
Jak wizualizować wyniki percepcji
AnnotationOverlayCalculator
umożliwia nakładanie wyników percepcyjnych, takich jak ramki ograniczające, strzałki i owale, na klatki wideo wyrównane z rozpoznanymi obiektami. Wyniki mogą być wyświetlane w oknie diagnostycznym podczas uruchamiania na stacji roboczej lub w ramce tekstury, gdy działa na urządzeniu. Przykład użycia AnnotationOverlayCalculator
znajdziesz tutaj:
Jak uruchomić kalkulatory równolegle
Na wykresie kalkulatora MediaPipe rutynowo uruchamia równoległe węzły kalkulatora. MediaPipe utrzymuje pulę wątków i uruchamia każdy kalkulator w miarę pojawiania się wątku i wszystkich jego danych wejściowych. Każda instancja kalkulatora jest uruchamiana tylko dla 1 zestawu danych wejściowych naraz, więc większość z nich musi być tylko zgodna z wątkami, a nie bezpieczna dla wątków.
Jeśli chcesz, aby jeden kalkulator mógł przetwarzać równolegle wiele danych wejściowych, masz 2 możliwości:
- Zdefiniuj wiele węzłów kalkulatora i wysyłaj pakiety wejściowe do wszystkich węzłów.
- Przekształć kalkulator w wątek i skonfiguruj jego ustawienie
max_in_flight
.
W pierwszej kolejności możesz używać kalkulatorów przeznaczonych do rozprowadzania pakietów między innymi kalkulatorami, np. RoundRobinDemuxCalculator
. Pojedynczy zasób RoundRobinDemuxCalculator
może rozprowadzać następujące pakiety między kilka identycznie skonfigurowanych węzłów ScaleImageCalculator
.
Drugie podejście umożliwia wywołanie metody CalculatorBase::Process
do max_in_flight
w tym samym węźle kalkulatora. Pakiety wyjściowe z obszaru CalculatorBase::Process
są automatycznie uporządkowane według sygnatury czasowej, zanim zostaną przekazane do kalkulatorów.
Pamiętaj, że w obu przypadkach musisz pamiętać, że kalkulator działający równolegle nie może utrzymać stanu wewnętrznego tak samo jak zwykły kalkulator sekwencyjny.
Generuj sygnatury czasowe w przypadku użycia usługi ImmediateInputStreamHandler
ImmediateInputStreamHandler
wysyła każdy pakiet, gdy tylko dotrze do strumienia wejściowego. W efekcie może dostarczyć pakiet z wyższą sygnaturą czasową z jednego strumienia wejściowego, zanim dostarczyć pakiet o niższej sygnaturze czasowej z innego strumienia. Jeśli te wejściowe sygnatury czasowe są używane w przypadku pakietów wysyłanych do 1 strumienia wyjściowego, strumień ten zgłasza, że sygnatury czasowe nie wzrastają monotonicznie. Aby temu zaradzić, kalkulator musi zwrócić pakiet, dopiero gdy zakończy się przetwarzanie jego sygnatury czasowej.
Można to zrobić, oczekując, aż pakiety wejściowe zostaną odebrane ze wszystkich strumieni wejściowych dla danej sygnatury czasowej, lub ignorując pakiet z sygnaturą czasową, która została już przetworzona.
Jak zmieniać ustawienia w czasie działania aplikacji
Ustawienia wykresu kalkulatora można zmienić na 2 główne sposoby, gdy aplikacja jest uruchomiona:
- Uruchom ponownie wykres kalkulatora ze zmodyfikowanym
CalculatorGraphConfig
. - Wysyłaj nowe opcje kalkulatora w postaci pakietów na wykresach wejściowych.
Pierwsza metoda ma tę zaletę, że korzysta z narzędzi do przetwarzania CalculatorGraphConfig
, takich jak „subgrafiki”. Drugie podejście ma tę zaletę, że umożliwia pozostawianie aktywnych kalkulatorów i pakietów podczas zmiany ustawień. Współtwórcy Mediapipe badają obecnie alternatywne
metody, które pozwolą osiągnąć obie te korzyści.
Jak przetwarzać strumienie danych wejściowych w czasie rzeczywistym
Platforma Mediapipe może służyć do przetwarzania strumieni danych online lub offline. Do przetwarzania offline pakiety są przekazywane do wykresu, gdy tylko kalkulatory są gotowe do przetworzenia tych pakietów. W przypadku przetwarzania online jeden pakiet na każdą klatkę jest przesyłany na wykres w trakcie rejestrowania tej ramki.
Platforma MediaPipe wymaga tylko przypisywania kolejnych pakietów do monotonicznie rosnących sygnatur czasowych. Zgodnie z konwencją kalkulatory i wykresy w czasie rzeczywistym używają czasu nagrywania lub prezentacji jako sygnatury czasowej każdego pakietu, gdzie każda sygnatura czasowa reprezentuje mikrosekundy od Jan/1/1970:00:00:00
. Dzięki temu pakiety z różnych źródeł mogą być przetwarzane w spójnej globalnie kolejności.
Normalnie w przypadku przetwarzania offline każdy pakiet wejściowy jest przetwarzany, a przetwarzanie trwa tak długo, jak to konieczne. W przypadku przetwarzania online często konieczne jest usunięcie pakietów wejściowych, aby dostosować się do napływających ramek danych wejściowych.
Jeśli dane wejściowe pojawiają się zbyt często, zalecaną metodą pomijania pakietów jest użycie kalkulatorów MediaPipe przeznaczonych do tego celu, np. FlowLimiterCalculator
i PacketClonerCalculator
.
W przypadku przetwarzania online należy również niezwłocznie określić, kiedy można kontynuować przetwarzanie. MediaPipe obsługuje to przez propagację granic sygnatury czasowej między kalkulatorami. Progi sygnatury czasowej wskazują przedziały sygnatury czasowej, które nie będą zawierać żadnych pakietów wejściowych, i umożliwiają kalkulatorom natychmiastowe rozpoczęcie przetwarzania tych sygnatur czasowych. Kalkulatory zaprojektowane do przetwarzania w czasie rzeczywistym powinny starannie obliczać granice sygnatur czasowych, aby jak najszybciej rozpocząć przetwarzanie. Na przykład MakePairCalculator
używa interfejsu API SetOffset
do rozpowszechniania granic sygnatur czasowych ze strumieni danych wejściowych do strumieni wyjściowych.
Czy mogę uruchomić MediaPipe w systemie MS Windows?
Obecnie funkcja przenoszenia MediaPipe obsługuje systemy Debian Linux, Ubuntu Linux, macOS, Android i iOS. Podstawą platformy MediaPipe jest biblioteka C++ zgodną ze standardem C++11, dzięki czemu można ją stosunkowo łatwo przenieść na dodatkowe platformy.