Przewodnik po wykrywaniu punktów orientacyjnych ustawiania pozycji w Pythonie

Zadanie MediaPipe Pose Markuper umożliwia wykrywanie punktów orientacyjnych 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 z pojedynczymi obrazami lub filmami. Zadanie generuje na obrazie punkty orientacyjne w pozycji ciała i trójwymiarowych współrzędnych świata.

Przykładowy kod opisany w tych instrukcjach jest dostępny na GitHub Więcej informacji o funkcjach, modelach i opcjach konfiguracji zapoznaj się z Przeglądem.

Przykładowy kod

Przykładowy kod punktu orientacyjnego zawiera pełną implementację tego w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać stworzyłam własny punkt orientacyjny pozy. Możesz wyświetlać, uruchamiać edytuj Przykładowy kod elementu Pose dostępna w Mapach tylko za pomocą przeglądarki.

Jeśli wdrażasz punkt orientacyjny pozycji dla Raspberry Pi, zapoznaj się z Przykład Raspberry Pi

Konfiguracja

W tej sekcji opisujemy najważniejsze czynności związane z konfigurowaniem środowiska programistycznego oraz w projektach kodu do użycia punktów orientacyjnych. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy, patrz Przewodnik po konfiguracji Pythona

Pakiety

Zadanie MediaPipe Pose Notebooker wymaga pakietu PyPI mediapipe. Możesz zainstalować i zaimportować te zależności przy użyciu:

$ python -m pip install mediapipe

Importy

Aby uzyskać dostęp do funkcji zadań punktów orientacyjnych, zaimportuj te klasy:

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

Model

Zadanie MediaPipe Pose Commiter wymaga wytrenowanego modelu zgodnego z tym zadanie. Więcej informacji o dostępnych wytrenowanych modelach z punktu orientacyjnego pose znajdziesz tutaj zapoznaj się z omówieniem zadania sekcją Modele.

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

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

Aby określić ścieżkę, użyj parametru model_asset_path obiektu BaseOptions wybranego modelu. Przykładowy kod znajdziesz w następnej sekcji.

Tworzenie zadania

Zadanie MediaPipe Pose Pointer używa funkcji create_from_options, aby: skonfigurować zadanie. Funkcja create_from_options akceptuje wartości obsługi opcji konfiguracyjnych. Więcej informacji: Opcje konfiguracji:

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

Przykłady pokazują również odmiany konstrukcji zadań dla obrazów, pliki wideo i transmisję 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.
  # ...
    

Aby zobaczyć pełny przykład tworzenia punktu orientacyjnego pozycji do użycia ze zdjęciem, zobacz przykładowego kodu.

Opcje konfiguracji

To zadanie zawiera te opcje konfiguracji aplikacji w Pythonie:

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 detektor wyników musi mieć wartość wywołano, aby skonfigurować detektor i otrzymywać wyniki asynchronicznie.
{IMAGE, VIDEO, LIVE_STREAM} 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

Przygotuj dane

Przygotuj dane wejściowe jako plik obrazu lub tablicę numpy, a potem przekonwertować go na obiekt mediapipe.Image. Jeśli dane wejściowe to plik wideo lub transmitowania na żywo z kamery internetowej, możesz użyć biblioteki zewnętrznej, OpenCV, który wczytuje klatki wejściowe w formacie numpy tablice.

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 pozycji używa tych elementów: detect, detect_for_video i detect_async w celu aktywowania zależności. Wyznaczenie umiejscowienia wymaga: wstępnego przetwarzania danych wejściowych i wykrywania póz na zdjęciach.

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)
    

Pamiętaj:

  • Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, podaj do zadania Punkty orientacyjnego sygnaturę czasową klatki wejściowej.
  • W przypadku działania na obrazie lub w modelu wideo zadanie Punkt orientacyjny umiejscowienia blokuje bieżący wątek do czasu zakończenia przetwarzania obrazu wejściowego lub ramki.
  • W trybie transmisji na żywo zadanie Pose Latitudeer powraca od razu i nie zablokuje bieżącego wątku. Wywoła wynik detektor z wynikiem wykrywania po każdym zakończeniu przetwarzania ramki wejściowej. Jeśli funkcja wykrywania jest wywoływana podczas zadania Punkt orientacyjny pozycji jest zajęty przetwarzaniem innej ramki, zadanie zignoruje nową ramkę wejściową.

Pełny przykład uruchomienia punktu orientacyjnego pozy na zdjęciu znajdziesz w przykładowy kod .

Obsługa i wyświetlanie wyników

Punkt orientacyjny pozycji zwraca obiekt poseLandmarkerResult przy każdym wykryciu wykrycia bieganie. Obiekt wynikowy 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 elementu orientacyjnego umiejscowienia pokazuje, jak wyświetlić wyników zwróconych przez zadanie, patrz przykładowy kod .