Najczęstsze pytania

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:

  1. Zdefiniuj wiele węzłów kalkulatora i wysyłaj pakiety wejściowe do wszystkich węzłów.
  2. 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:

  1. Uruchom ponownie wykres kalkulatora ze zmodyfikowanym CalculatorGraphConfig.
  2. 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.