Przewodnik po wykrywaniu punktów orientacyjnych ustawiania pozycji w Pythonie

Zadanie MediaPipe Pose pointer umożliwia wykrywanie na zdjęciach lub filmach punktów orientacyjnych ludzkich ciał. Możesz używać tego zadania do identyfikowania kluczowych lokalizacji ciała, analizowania postawy i kategoryzowania ruchów. To zadanie wykorzystuje modele systemów uczących się, które działają z pojedynczymi obrazami lub filmami. Zadanie wyprowadza punkty orientacyjne ustalania pozycji ciała we współrzędnych zdjęcia i w trójwymiarowych współrzędnych świata.

Przykładowy kod opisany w tych instrukcjach jest dostępny na GitHub. Więcej informacji o możliwościach, modelach i opcjach konfiguracji tego zadania znajdziesz w sekcji Omówienie.

Przykładowy kod

Przykładowy kod modułu Pose pointer zawiera pełną implementację tego zadania w Pythonie. Ten kod pomoże Ci przetestować to zadanie i rozpocząć tworzenie własnego punktu orientacyjnego Pozycje. Możesz wyświetlać, uruchamiać i edytować przykładowy kod Pose pointer w przeglądarce internetowej.

Jeśli wdrażasz aplikację Pose Side Markuper dla Raspberry Pi, zapoznaj się z przykładową aplikacją Raspberry Pi.

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności, jakie należy wykonać podczas konfigurowania środowiska programistycznego i projektów kodowania, tak aby można było używać aplikacji Pose pointer. Ogólne informacje o konfigurowaniu środowiska programistycznego na potrzeby zadań MediaPipe, w tym o wymaganiach dotyczących wersji platformy, znajdziesz w przewodniku konfiguracji dla Pythona.

Pakiety

Zadanie MediaPipe Pose pointer wymaga pakietu Mediapipe PyPI. Możesz zainstalować i zaimportować te zależności za pomocą:

$ python -m pip install mediapipe

Importowane dane

Aby uzyskać dostęp do funkcji zadania Punkt orientacyjny pozycji, zaimportuj te klasy:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Model

Zadanie MediaPipe Pose pointer wymaga wytrenowanego modelu zgodnego z tym zadaniem. Więcej informacji o dostępnych wytrenowanych modelach dla funkcji Punkt orientacyjny pozycji znajdziesz w omówieniem zadań w sekcji dotyczącej modeli.

Wybierz i pobierz model, a następnie zapisz go w katalogu lokalnym:

model_path = '/absolute/path/to/pose_landmarker.task'

Użyj parametru model_asset_path obiektu BaseOptions, aby określić ścieżkę modelu, który ma zostać użyty. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Zadanie MediaPipe Pose Pointer korzysta z funkcji create_from_options do konfigurowania zadania. Funkcja create_from_options akceptuje wartości opcji konfiguracji. Więcej informacji znajdziesz w artykule Opcje konfiguracji.

Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie.

W tych przykładach widać też różne wersje konstrukcji zadań dla obrazów, plików wideo i transmisji na żywo.

Obraz

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Wideo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a pose landmarker instance with the video mode:
options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Transmisja na żywo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
PoseLandmarker = mp.tasks.vision.PoseLandmarker
PoseLandmarkerOptions = mp.tasks.vision.PoseLandmarkerOptions
PoseLandmarkerResult = mp.tasks.vision.PoseLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a pose landmarker instance with the live stream mode:
def print_result(result: PoseLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('pose landmarker result: {}'.format(result))

options = PoseLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with PoseLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Pełny przykład tworzenia punktu orientacyjnego Pozycje do wykorzystania z obrazem znajdziesz w przykładowym kodzie.

Opcje konfiguracji

To zadanie ma następujące opcje konfiguracji aplikacji w Pythonie:

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

IMAGE: tryb wprowadzania pojedynczych obrazów.

WIDEO: tryb dekodowanych klatek filmu.

TRANSMISJA NA ŻYWO: tryb transmisji danych wejściowych na żywo, np. z kamery. W tym trybie należy wywołać metodę resultListener, aby skonfigurować odbiornik, który będzie odbierał wyniki asynchronicznie.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_poses Maksymalna liczba pozycji, które może wykryć Punkt orientacyjny pozycji. Integer > 0 1
min_pose_detection_confidence Minimalny poziom ufności, że wykrywanie pozycji zostanie uznane za udane. Float [0.0,1.0] 0.5
min_pose_presence_confidence Minimalny wskaźnik ufności dotyczący obecności pozycji podczas wykrywania punktu orientacyjnego pozycji. Float [0.0,1.0] 0.5
min_tracking_confidence Minimalny wskaźnik ufności pozwalający na uznanie śledzenia pozycji za udane. Float [0.0,1.0] 0.5
output_segmentation_masks Określa, czy Kreator elementów budowy pozycji generuje maskę podziału na segmenty dla wykrytej pozycji. Boolean False
result_callback Ustawia detektor wyników tak, aby asynchronicznie otrzymywał wyniki dotyczące punktów orientacyjnych, gdy kreator pozycji jest w trybie transmisji na żywo. Tego ustawienia można używać tylko wtedy, gdy tryb biegowy jest ustawiony na LIVE_STREAM ResultListener N/A

Przygotuj dane

Przygotuj dane wejściowe jako plik graficzny lub tablicę numpy, a następnie przekonwertuj je na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmisja na żywo z kamery internetowej, możesz użyć zewnętrznej biblioteki, takiej jak OpenCV, aby wczytać klatki wejściowe jako tablice numeryczne.

Obraz

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

Wideo

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Transmisja na żywo

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Uruchamianie zadania

Punkt orientacyjny Pozycje wyzwala wnioskowanie za pomocą funkcji detect, detect_for_video i detect_async. Obejmuje to wstępne przetwarzanie danych wejściowych i wykrywanie póz na zdjęciu.

Poniższy kod pokazuje, jak wykonać przetwarzanie za pomocą modelu zadań.

Obraz

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the image mode.
pose_landmarker_result = landmarker.detect(mp_image)
    

Wideo

# Perform pose landmarking on the provided single image.
# The pose landmarker must be created with the video mode.
pose_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

Transmisja na żywo

# Send live image data to perform pose landmarking.
# The results are accessible via the `result_callback` provided in
# the `PoseLandmarkerOptions` object.
# The pose landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

Uwaga:

  • Gdy działasz w trybie wideo lub transmisji na żywo, podaj też zadanie Znacznika pozycji razem z sygnaturą czasową klatki wejściowej.
  • Gdy działasz w obrazie lub modelu wideo, zadanie Punkt orientacyjny do ustawiania pozycji blokuje bieżący wątek do momentu zakończenia przetwarzania obrazu wejściowego lub klatki.
  • W trybie transmisji na żywo zadanie Punkt orientacyjny pozycji wraca natychmiast i nie blokuje bieżącego wątku. Wywoła on detektor wyników z wynikiem wykrywania za każdym razem, gdy zakończy przetwarzanie ramki wejściowej. Jeśli funkcja wykrywania zostanie wywołana, gdy zadanie Punkt orientacyjny do wyznaczania pozycji jest zajęte przetwarzaniem innej klatki, zadanie zignoruje nową ramkę wejściową.

Pełny przykład uruchomienia na zdjęciu elementu orientacyjnego Pose pointer znajdziesz w przykładowym kodzie.

Obsługa i wyświetlanie wyników

Punkt orientacyjny pozycji zwraca obiekt poseLandmarkerResult przy każdym uruchomieniu wykrywania. Wynikowy obiekt zawiera współrzędne każdego punktu orientacyjnego umiejscowienia.

Poniżej znajdziesz przykład danych wyjściowych z 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)

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

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

  • x i y: współrzędne punktu orientacyjnego znormalizowane od 0,0 do 1,0 według szerokości obrazu (x) i wysokości (y).

  • z: głębokość punktu orientacyjnego, której początek znajduje się w połowie bioder. Im mniejsza wartość, tym bliżej kamery znajduje się punkt orientacyjny. Wielkość „z” jest mniej więcej taka sama jak w przypadku właściwości x.

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

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

  • x, y i z: rzeczywiste trójwymiarowe współrzędne w metrach, gdzie punktem początkowym jest środek bioder.

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

Poniższy obraz przedstawia wizualizację wyników zadania:

Opcjonalna maska podziału na segmenty reprezentuje prawdopodobieństwo, że każdy piksel należy do wykrytej osoby. Ten obraz przedstawia maskę podziału danych wyjściowych zadania:

Przykładowy kod Pozycje punktu orientacyjnego pokazuje, jak wyświetlać wyniki zwrócone z zadania. Szczegółowe informacje znajdziesz w przykładowym kodzie.