Przewodnik po wykrywaniu punktów orientacyjnych na iOS

Zadanie Punkt orientacyjny umiejscowienia pozwala wykryć punkty orientacyjne ludzkich ciał na zdjęciach lub film. Możesz użyć tego zadania, aby zidentyfikować kluczowe lokalizacje ciała, przeanalizować postawę i kategoryzować ruchy. W tym zadaniu używane są modele systemów uczących się, które działają z pojedynczymi obrazami lub filmami. Zadanie generuje na obrazie punkty orientacyjne w pozycji ciała i trójwymiarowych współrzędnych świata.

Te instrukcje pokazują, jak korzystać z punktu orientacyjnego pose w aplikacjach na iOS. Kod przykład opisany w tych instrukcjach jest dostępny GitHub

Aby zobaczyć, jak działa to zadanie, wejdź na tę stronę wersji demonstracyjnej. Więcej informacji o funkcjach, modelach i opcjach konfiguracji zapoznaj się z Przegląd.

Przykładowy kod

Przykładowy kod MediaPipe Tasks to podstawowa implementacja punktu orientacyjnego Pozycja na iOS. W tym przykładzie używamy aparatu w fizycznym urządzeniu z iOS, aby wykryć Wykrywaj pozy w ciągłym strumieniu wideo. Aplikacja może też wykrywać pozy w obrazów i filmów z galerii urządzenia.

Możesz użyć tej aplikacji jako punktu wyjścia dla własnej aplikacji na iOS lub skorzystać z niej podczas modyfikowania istniejącej aplikacji. Przykładowy kod punktu orientacyjnego położenia jest hostowany GitHub

Pobieranie kodu

Poniżej znajdziesz instrukcje tworzenia lokalnej kopii przykładu. za pomocą narzędzia wiersza poleceń git.

Aby pobrać przykładowy kod:

  1. Sklonuj repozytorium git za pomocą tego polecenia:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opcjonalnie możesz skonfigurować instancję git tak, aby wykorzystywała rozproszony proces płatności, aby tylko pliki przykładowej aplikacji Pose Notebooker:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/pose_landmarker/ios/
    

Po utworzeniu lokalnej wersji przykładowego kodu możesz zainstalować w bibliotece zadań MediaPipe, otwórz projekt za pomocą Xcode i uruchom aplikację. Dla: więcej instrukcji znajdziesz w Przewodniku po konfiguracji na iOS.

Kluczowe elementy

Te pliki zawierają istotny kod przykładowego punktu orientacyjnego Pose Notebooker aplikacja:

  • PoseLandmarkerService.swift: Inicjuje punkt orientacyjny, obsługuje wybór modelu i uruchamia wnioskowanie na danych wejściowych.
  • CameraViewController: Implementuje interfejs trybu wprowadzania obrazu z kamery na żywo i wizualizuje punkty orientacyjne.
  • MediaLibraryViewController.swift: ma interfejs dla trybu wprowadzania zdjęć i filmów oraz umożliwia wizualizację punktów orientacyjnych.

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu, w których można używać punktów orientacyjnych. Ogólne informacje o konfigurowaniu środowisko programistyczne do używania zadań MediaPipe, w tym wersja platformy wymagania znajdziesz w przewodniku konfiguracji dla iOS.

Zależności

Punkt orientacyjny pozycji korzysta z biblioteki MediaPipeTasksVision, którą trzeba zainstalować za pomocą CocoaPods. Biblioteka jest zgodna z aplikacjami Swift i Objective-C. i nie wymaga żadnej dodatkowej konfiguracji.

Instrukcje instalowania CocoaPods w macOS znajdziesz w CocoaPods przewodnik instalacji. Aby dowiedzieć się, jak utworzyć Podfile z podami niezbędnymi dla Twojego aplikacji można znaleźć w sekcji Korzystanie CocoaPods.

Dodaj pod MediaPipeTasksVision w tabeli Podfile przy użyciu tego kodu:

target 'MyPoseLandmarkerApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

Jeśli Twoja aplikacja zawiera cele testów jednostkowych, zapoznaj się z przewodnikiem po konfiguracji iOS, gdzie znajdziesz dodatkowe informacje o konfigurowaniu Podfile.

Model

Zadanie MediaPipe Pose Markuper wymaga wytrenowanego pakietu, który jest zgodny w tym zadaniu. Więcej informacji o dostępnych wytrenowanych modelach dla Punkt orientacyjny pozycjonowania, zobacz omówienie zadania Modele .

Skorzystaj z funkcji download_models.sh skrypt aby pobrać modele i dodać je do katalogu projektu za pomocą Xcode. Dla: instrukcje dodawania plików do projektu Xcode znajdziesz w sekcji Zarządzanie plikami i folderów w Xcode projekt.

Użyj właściwości BaseOptions.modelAssetPath, aby określić ścieżkę do modelu w pakiecie aplikacji. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Działanie punktu orientacyjnego możesz utworzyć, wywołując jeden z jego inicjatorów. Inicjator PoseLandmarker(options:) akceptuje wartości konfiguracji .

Jeśli nie potrzebujesz punktu orientacyjnego Pose zainicjowanego z niestandardową konfiguracją możesz użyć inicjatora PoseLandmarker(modelPath:) do utworzenia Ustaw punkt orientacyjny z domyślnymi opcjami. Więcej informacji o konfiguracji Więcej informacji znajdziesz w artykule Omówienie konfiguracji.

Zadanie „Punkt orientacyjny pozycji” obsługuje 3 typy danych wejściowych: obrazy i pliki wideo i transmisje wideo na żywo. Domyślnie PoseLandmarker(modelPath:) inicjuje dla nieruchomych obrazów. Jeśli chcesz, aby zadanie zostało zainicjowane do przetworzenia filmu plików lub transmisji wideo na żywo, użyj właściwości PoseLandmarker(options:), aby określić wideo. czy w trybie biegowym transmisji na żywo. Tryb transmisji na żywo wymaga też dodatkowych poseLandmarkerLiveStreamDelegate, która włącza Ustaw punkt orientacyjny, aby przekazać przedstawicielowi wyniki wykrywania punktu orientacyjnego ułożenia asynchronicznie.

Wybierz kartę odpowiadającą Twojemu trybowi biegowemu, aby zobaczyć, jak utworzyć zadanie i prowadź wnioskowanie.

Swift

Obraz

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "pose_landmarker",
                                      ofType: "task")

let options = PoseLandmarkerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image
options.minPoseDetectionConfidence = minPoseDetectionConfidence
options.minPosePresenceConfidence = minPosePresenceConfidence
options.minTrackingConfidence = minTrackingConfidence
options.numPoses = numPoses

let poseLandmarker = try PoseLandmarker(options: options)
    

Wideo

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "pose_landmarker",
                                      ofType: "task")

let options = PoseLandmarkerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video
options.minPoseDetectionConfidence = minPoseDetectionConfidence
options.minPosePresenceConfidence = minPosePresenceConfidence
options.minTrackingConfidence = minTrackingConfidence
options.numPoses = numPoses

let poseLandmarker = try PoseLandmarker(options: options)
    

Transmisja na żywo

import MediaPipeTasksVision

// Class that conforms to the `PoseLandmarkerLiveStreamDelegate` protocol and
// implements the method that the pose landmarker calls once it finishes
// performing pose landmark detection in each input frame.
class PoseLandmarkerResultProcessor: NSObject, PoseLandmarkerLiveStreamDelegate {

  func poseLandmarker(
    _ poseLandmarker: PoseLandmarker,
    didFinishDetection result: PoseLandmarkerResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the pose landmarker result or errors here.

  }
}

let modelPath = Bundle.main.path(forResource: "pose_landmarker",
                                      ofType: "task")

let options = PoseLandmarkerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream
options.minPoseDetectionConfidence = minPoseDetectionConfidence
options.minPosePresenceConfidence = minPosePresenceConfidence
options.minTrackingConfidence = minTrackingConfidence
options.numPoses = numPoses

// Assign an object of the class to the `poseLandmarkerLiveStreamDelegate`
// property.
let processor = PoseLandmarkerResultProcessor()
options.poseLandmarkerLiveStreamDelegate = processor

let poseLandmarker = try PoseLandmarker(options: options)
    

Objective-C

Obraz

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker"
                                                      ofType:@"task"];

MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;
options.minPoseDetectionConfidence = minPoseDetectionConfidence;
options.minPosePresenceConfidence = minPosePresenceConfidence;
options.minTrackingConfidence = minTrackingConfidence;
options.numPoses = numPoses;

MPPPoseLandmarker *poseLandmarker =
  [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
    

Wideo

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker"
                                                      ofType:@"task"];

MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;
options.minPoseDetectionConfidence = minPoseDetectionConfidence;
options.minPosePresenceConfidence = minPosePresenceConfidence;
options.minTrackingConfidence = minTrackingConfidence;
options.numPoses = numPoses;

MPPPoseLandmarker *poseLandmarker =
  [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
    

Transmisja na żywo

@import MediaPipeTasksVision;

// Class that conforms to the `MPPPoseLandmarkerLiveStreamDelegate` protocol
// and implements the method that the pose landmarker calls once it finishes
// performing pose landmarks= detection in each input frame.

@interface APPPoseLandmarkerResultProcessor : NSObject 

@end

@implementation APPPoseLandmarkerResultProcessor

-   (void)poseLandmarker:(MPPPoseLandmarker *)poseLandmarker
    didFinishDetectionWithResult:(MPPPoseLandmarkerResult *)poseLandmarkerResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the pose landmarker result or errors here.

}

@end

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker"
                                                      ofType:@"task"];

MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;
options.minPoseDetectionConfidence = minPoseDetectionConfidence;
options.minPosePresenceConfidence = minPosePresenceConfidence;
options.minTrackingConfidence = minTrackingConfidence;
options.numPoses = numPoses;

// Assign an object of the class to the `poseLandmarkerLiveStreamDelegate`
// property.
APPPoseLandmarkerResultProcessor *processor =
  [APPPoseLandmarkerResultProcessor new];
options.poseLandmarkerLiveStreamDelegate = processor;

MPPPoseLandmarker *poseLandmarker =
  [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
    

Uwaga: jeśli używasz trybu wideo lub transmisji na żywo, śledzenie w celu uniknięcia uruchomienia modelu wykrywania dłoni w każdej ramce, co pomaga i zmniejszyć opóźnienia.

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji na iOS:

Nazwa opcji Opis Zakres wartości Wartość domyślna
running_mode Ustawia tryb działania zadania. Są trzy tryby:

IMAGE: tryb wprowadzania pojedynczego obrazu.

WIDEO: tryb zdekodowanych klatek filmu.

LIVE_STREAM: tryb transmisji danych wejściowych na przykład z kamery. W tym trybie zasada poseLandmarkerLiveStreamDelegate musi mieć wartość instancję klasy, która implementuje funkcję PoseLandmarkerLiveStreamDelegate, aby otrzymać wyniki asynchronicznego wykrywania punktów orientacyjnych
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
num_poses Maksymalna liczba pozycji, które może wykryć Punkt orientacyjny. Integer > 0 1
min_pose_detection_confidence Minimalny wskaźnik ufności, z którego ustala się pozycję została uznana za udaną. Float [0.0,1.0] 0.5
min_pose_presence_confidence Minimalny wskaźnik ufności obecności pozycji podczas wykrywania punktów orientacyjnych. Float [0.0,1.0] 0.5
min_tracking_confidence Minimalny wynik ufności dla śledzenia pozycji można uznać za udany. Float [0.0,1.0] 0.5
output_segmentation_masks Określa, czy punkt orientacyjny położenia wyświetla maskę segmentacji dla wykrytego w pozycji. Boolean False
result_callback Konfiguruje detektor wyników tak, aby otrzymywał wyniki z punktu orientacyjnego asynchronicznie wtedy, gdy Pose Notebooker jest w trybie transmisji na żywo. Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na LIVE_STREAM ResultListener N/A

Konfiguracja transmisji na żywo

Gdy tryb biegowy jest ustawiony na transmisję na żywo, punkt orientacyjny pozycji wymaga parametru dodatkową opcję konfiguracji poseLandmarkerLiveStreamDelegate, która umożliwia zarysowanie położenia punktów orientacyjnych przy użyciu punktów orientacyjnych asynchronicznie. Przedstawiciel musi zaimplementować poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:), które nazywa się punkt orientacyjny pozy po przetworzeniu wyników pozycji wykrywanie punktów orientacyjnych w każdej ramce.

Nazwa opcji Opis Zakres wartości Wartość domyślna
poseLandmarkerLiveStreamDelegate Włącza punkt orientacyjny umiejscowienia, aby otrzymać wyniki określonej pozycji asynchroniczne wykrywanie punktów orientacyjnych w trybie transmisji na żywo. Klasa, której instancji jest ustawiona na tę właściwość, musi implementować poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) . Nie dotyczy Nie ustawiono

Przygotuj dane

Musisz przekonwertować obraz lub ramkę wejściową na obiekt MPImage przed i przekazujemy ją do punktu orientacyjnego pozycji. MPImage obsługuje różne typy obrazów z iOS formatów i używać ich w dowolnym trybie działania do wnioskowania. Więcej informacje na temat marki MPImage znajdziesz w Interfejs MPImage API

Wybierz format obrazu na iOS na podstawie swojego przypadku użycia i trybu uruchamiania wymagane jest zgłoszenie.MPImage akceptuje UIImage, CVPixelBuffer i CMSampleBuffer Formaty obrazów w iOS.

UIImage

Format UIImage sprawdza się w tych trybach biegu:

  • Obrazy: obrazy z pakietu aplikacji, galerii użytkownika lub systemu plików w formacie Obrazy (UIImage) można przekonwertować na obiekt MPImage.

  • Filmy: użyj narzędzia AVAssetImageGenerator. aby wyodrębnić klatki wideo do CGImage a potem przekonwertuj je na UIImage obrazy.

Swift

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(uiImage: image)
    

Objective-C

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

Ten przykład inicjuje MPImage z domyślną wartością UIImage.Orientation.Up orientacji ekranu. Możesz zainicjować MPImage przy użyciu dowolnej z obsługiwanych UIImage.Orientation . Punkt orientacyjny pozycji nie obsługuje odbicia lustrzanego orientacji, np. .upMirrored, .downMirrored, .leftMirrored, .rightMirrored.

Więcej informacji o UIImage znajdziesz na stronie UIImage dla deweloperów Apple Dokumentacja.

CVPixelBuffer

Format CVPixelBuffer sprawdza się w przypadku aplikacji generujących ramki. i zastosuj CoreImage na iOS platformy przetwarzania danych.

Format CVPixelBuffer sprawdza się w tych trybach biegu:

  • Obrazy: aplikacje, które po przetworzeniu generują CVPixelBuffer obrazy. przy użyciu platformy CoreImage systemu iOS można wysłać do punktu orientacyjnego pozycji w trybie uruchamiania obrazu.

  • Filmy: klatki wideo można konwertować do formatu CVPixelBuffer dla a następnie przesłany do punktu orientacyjnego pozy w trybie wideo.

  • transmisja na żywo: aplikacje korzystające z aparatu w iOS do generowania klatek mogą być konwertowane w formacie CVPixelBuffer do przetworzenia przed wysłaniem do Ustaw punkt orientacyjny w trybie transmisji na żywo.

Swift

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(pixelBuffer: pixelBuffer)
    

Objective-C

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

Więcej informacji o CVPixelBuffer znajdziesz tutaj: CVPixelBuffer Apple Dla programistów Dokumentacja.

CMSampleBuffer

Format CMSampleBuffer przechowuje próbki multimediów jednolitego typu mediów i jest co sprawdza się w trybie biegowym transmisji na żywo. Klatki na żywo z aparatów z iOS są asynchronicznie dostarczone w formacie CMSampleBuffer przez iOS AVCaptureVideoDataOutput (Wyjście AVCaptureVideoDataOutput).

Swift

// Obtain a CMSampleBuffer.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(sampleBuffer: sampleBuffer)
    

Objective-C

// Obtain a `CMSampleBuffer`.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
    

Więcej informacji o CMSampleBuffer znajdziesz tutaj: CMSampleBuffer Apple Dla programistów Dokumentacja.

Uruchamianie zadania

Aby uruchomić punkt orientacyjny pozycji, użyj metody detect() specyficznej dla przypisanego tryb działania:

  • Zdjęcie: detect(image:)
  • Film: detect(videoFrame:timestampInMilliseconds:)
  • Transmisja na żywo: detectAsync(image:timestampInMilliseconds:)

Poniższe przykładowe fragmenty kodu pokazują, jak uruchomić punkt orientacyjny pozycji w różnych trybach:

Swift

Obraz

let result = try poseLandmarker.detect(image: image)
    

Wideo

let result = try poseLandmarker.detect(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

Transmisja na żywo

try poseLandmarker.detectAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

Obraz

MPPPoseLandmarkerResult *result =
  [poseLandmarker detectImage:image error:nil];
    

Wideo

MPPPoseLandmarkerResult *result =
  [poseLandmarker detectVideoFrame:image
           timestampInMilliseconds:timestamp
                             error:nil];
    

Transmisja na żywo

BOOL success =
  [poseLandmarker detectAsyncImage:image
           timestampInMilliseconds:timestamp
                             error:nil];
    

Przykładowy kod punktu orientacyjnego pozy pokazuje implementacje każdego z tych trybów więcej informacji: detect(image:), detect(videoFrame:timestampInMilliseconds:), i detectAsync(image:timestampInMilliseconds:). Ten przykładowy kod umożliwia użycie funkcji przełączać się między trybami przetwarzania, które mogą nie być wymagane tych kwestii.

Pamiętaj:

  • Korzystając z trybu wideo lub transmisji na żywo, musisz też podać: sygnatura czasowa klatki wejściowej do zadania Pose Pointer.

  • W trybie obrazu lub filmu zadanie Pose Notebooker blokuje w bieżącym wątku aż do zakończenia przetwarzania obrazu lub ramki wejściowej. Do unikaj blokowania bieżącego wątku, uruchamiaj przetwarzanie w tle w iOS na iOS Dispatch lub NSOperation zasad.

  • W trybie transmisji na żywo zadanie Pose Pointer jest natychmiast przywracane i nie blokuje bieżącego wątku. Wywołuje on metodę poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) metoda z wynikiem punktu orientacyjnego położenia po przetworzeniu każdej klatki wejściowej. Punkt orientacyjny pozycji wywołuje tę metodę asynchronicznie na dedykowanym kolejki wysyłki. Aby wyświetlić wyniki w interfejsie, wyślij do głównej kolejki po przetworzeniu wyników. Jeśli detectAsync funkcja jest wywoływana, gdy zadanie punktu orientacyjnego jest zajęte przetwarzaniem kolejnego , punkt orientacyjny pozycji zignoruje nową klatkę wejściową.

Obsługa i wyświetlanie wyników

Po przeprowadzeniu wnioskowania zadanie punktu orientacyjnego zwraca wartość PoseLandmarkerResult który zawiera współrzędne każdego punktu orientacyjnego pozycji.

Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

Dane wyjściowe zawierają zarówno znormalizowane współrzędne (Landmarks), jak i świat (WorldLandmarks) każdego punktu orientacyjnego.

Dane wyjściowe zawierają następujące znormalizowane współrzędne (Landmarks):

  • x i y: współrzędne punktu orientacyjnego znormalizowane między 0,0 a 1,0 przez szerokość (x) i wysokość (y) obrazu.

  • z: głębokość punktu orientacyjnego, której głębia znajduje się w połowie bioder pochodzeniu danych. Im mniejsza wartość, tym punkt orientacyjny jest bliżej kamery. magnituda wielkości z używa mniej więcej takiej samej skali jak funkcja x.

  • visibility: prawdopodobieństwo, że punkt orientacyjny jest widoczny na zdjęciu.

Dane wyjściowe zawierają następujące współrzędne świata (WorldLandmarks):

  • x, y i z: rzeczywiste, trójwymiarowe współrzędne w metrach, punktu środkowego bioder jako punktu początkowego.

  • visibility: prawdopodobieństwo, że punkt orientacyjny jest widoczny na zdjęciu.

Ten obraz przedstawia wizualizację danych wyjściowych zadania:

Opcjonalna maska segmentacji odpowiada prawdopodobieństwu przynależności każdego piksela wykrytej osobie. Na tej ilustracji widać maskę segmentacji wynik zadania:

Przykładowy kod punktu orientacyjnego pozycji pokazuje, jak wyświetlić punkt orientacyjny pozycji wyników.