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
iy
: 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ścix
.visibility
: prawdopodobieństwo, że punkt orientacyjny będzie widoczny na zdjęciu.
Dane wyjściowe zawierają te współrzędne świata (WorldLandmarks
):
x
,y
iz
: 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.