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
iy
: 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 funkcjax
.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
iz
: 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 .