Narzędzie do rozpoznawania gestów MediaPipe umożliwia rozpoznawanie gestów w czasie rzeczywistym. udostępnia rozpoznane gesty i punkty orientacyjne wykrytego gestu dłoni ręce. Te instrukcje pokazują, jak korzystać z rozpoznawania gestów z aplikacjami w języku Python.
Aby zobaczyć, jak to zadanie działa, wejdź na stronę wersji demonstracyjnej więcej informacji o możliwościach, modelach i opcjach konfiguracji to zadanie znajdziesz w Przeglądzie.
Przykładowy kod
Przykładowy kod aplikacji do rozpoznawania gestów zapewnia pełną implementację tego parametru w Pythonie. Ten kod pomoże Ci przetestować to zadanie i uzyskać rozpoczął tworzenie własnego modułu do rozpoznawania gestów. Możesz wyświetlać, uruchamiać edytuj Rozpoznawanie gestów przykład kod tylko za pomocą przeglądarki.
Jeśli wdrażasz rozpoznawanie gestów 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 w których ma być używane narzędzie do rozpoznawania gestów. Ogólne informacje na temat: skonfigurować środowisko programistyczne do korzystania z zadań MediaPipe, w tym wymagań wersji platformy znajdziesz w przewodniku konfiguracji dla Pythona.
Pakiety
Zadanie rozpoznawania gestów MediaPipe wymaga pakietu PyPI mediapipe. Możesz zainstalować zaimportuj te zależności z tym kodem:
$ python -m pip install mediapipe
Importy
Aby uzyskać dostęp do funkcji rozpoznawania gestów, zaimportuj te klasy:
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
Model
Zadanie MediaPipe Migrate Diagnosticr wymaga wytrenowanego pakietu modeli zgodnego z w tym zadaniu. Więcej informacji na temat dostępnych wytrenowanych modeli rozpoznawania gestów 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/gesture_recognizer.task'
Określ ścieżkę modelu w parametrze Nazwa modelu, jak pokazano poniżej:
base_options = BaseOptions(model_asset_path=model_path)
Tworzenie zadania
Zadanie rozpoznawania gestów MediaPipe używa funkcji create_from_options
do konfigurowania
zadanie. Funkcja create_from_options
akceptuje wartości konfiguracji
różnych opcji. Więcej informacji o opcjach konfiguracji znajdziesz w artykule
Opcje konfiguracji:
Poniższy kod pokazuje, jak skompilować i skonfigurować to zadanie.
Przykłady pokazują również odmiany konstrukcji zadań dla obrazów, plików wideo i transmisji wideo na żywo.
Obraz
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions GestureRecognizer = mp.tasks.vision.GestureRecognizer GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a gesture recognizer instance with the image mode: options = GestureRecognizerOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.IMAGE) with GestureRecognizer.create_from_options(options) as recognizer: # The detector is initialized. Use it here. # ...
Wideo
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions GestureRecognizer = mp.tasks.vision.GestureRecognizer GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions VisionRunningMode = mp.tasks.vision.RunningMode # Create a gesture recognizer instance with the video mode: options = GestureRecognizerOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.VIDEO) with GestureRecognizer.create_from_options(options) as recognizer: # The detector is initialized. Use it here. # ...
Transmisja na żywo
import mediapipe as mp BaseOptions = mp.tasks.BaseOptions GestureRecognizer = mp.tasks.vision.GestureRecognizer GestureRecognizerOptions = mp.tasks.vision.GestureRecognizerOptions GestureRecognizerResult = mp.tasks.vision.GestureRecognizerResult VisionRunningMode = mp.tasks.vision.RunningMode # Create a gesture recognizer instance with the live stream mode: def print_result(result: GestureRecognizerResult, output_image: mp.Image, timestamp_ms: int): print('gesture recognition result: {}'.format(result)) options = GestureRecognizerOptions( base_options=BaseOptions(model_asset_path='/path/to/model.task'), running_mode=VisionRunningMode.LIVE_STREAM, result_callback=print_result) with GestureRecognizer.create_from_options(options) as recognizer: # The detector is initialized. Use it here. # ...
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_hands |
Maksymalną liczbę rąk może wykryć
GestureRecognizer .
|
Any integer > 0 |
1 |
|
min_hand_detection_confidence |
Minimalny wskaźnik ufności, jaki musi osiągnąć wykrywanie ręki uznane za udane w modelu wykrywania dłoni. | 0.0 - 1.0 |
0.5 |
|
min_hand_presence_confidence |
Minimalny wynik ufności dłoni na ręce model wykrywania punktów orientacyjnych. W trybie wideo i trybie transmisji na żywo modułu rozpoznawania gestów jeśli wynik pewności obecności ręki z modelu punktu orientacyjnego ręki jest poniżej ten próg aktywuje model wykrywania dłoni. W przeciwnym razie lekki algorytm śledzenia dłoni jest używany do określania lokalizacji ręce do późniejszego wykrycia punktu orientacyjnego. | 0.0 - 1.0 |
0.5 |
|
min_tracking_confidence |
Minimalny wskaźnik ufności, z którego można korzystać podczas śledzenia dłoni udało się. Jest to wartość progowa współczynnika podobieństwa między dłońmi bieżącej i ostatniej klatki. W trybie wideo i w trybie strumienia Moduł rozpoznawania gestów, jeśli śledzenie nie działa, moduł rozpoznawania gestów uruchamia dłoń wykrywaniem zagrożeń. W przeciwnym razie wykrywanie rąk zostanie pominięte. | 0.0 - 1.0 |
0.5 |
|
canned_gestures_classifier_options |
Opcje konfiguracji działania klasyfikatora gestów bazujących na szablonach. Gotowe gesty: ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"] |
|
|
|
custom_gestures_classifier_options |
Opcje konfigurowania działania klasyfikatora gestów niestandardowych. |
|
|
|
result_callback |
Konfiguruje detektor wyników, aby otrzymywać wyniki klasyfikacji
asynchronicznie, gdy moduł rozpoznawania gestów działa w trybie transmisji na żywo.
Tej opcji można używać tylko wtedy, gdy tryb działania jest ustawiony na LIVE_STREAM |
ResultListener |
Nie dotyczy | Nie dotyczy |
Przygotuj dane
Przygotuj dane wejściowe jako plik graficzny lub tablicę numpy, a następnie przekonwertuj je na
mediapipe.Image
obiekt. 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, 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
Moduł do rozpoznawania gestów używa następujących elementów w celu aktywowania zależności. Rozpoznawanie gestów wymaga: wstępne przetwarzanie danych wejściowych, wykrywanie rąk na zdjęciu, wykrywanie dłoni za punkty orientacyjne i rozpoznawanie gestów dłoni z nich.
Poniższy kod ilustruje, jak wykonywać przetwarzanie za pomocą modelu zadań.
Obraz
# Perform gesture recognition on the provided single image. # The gesture recognizer must be created with the image mode. gesture_recognition_result = recognizer.recognize(mp_image)
Wideo
# Perform gesture recognition on the provided single image. # The gesture recognizer must be created with the video mode. gesture_recognition_result = recognizer.recognize_for_video(mp_image, frame_timestamp_ms)
Transmisja na żywo
# Send live image data to perform gesture recognition. # The results are accessible via the `result_callback` provided in # the `GestureRecognizerOptions` object. # The gesture recognizer must be created with the live stream mode. recognizer.recognize_async(mp_image, frame_timestamp_ms)
Pamiętaj:
- Gdy pracujesz w trybie wideo lub w trybie transmisji na żywo, musisz też udostępnić do zadania Rozpoznawanie gestów sygnaturę czasową ramki wejściowej.
- Podczas wykonywania działania na obrazie lub w modelu wideo zadanie Rozpoznawanie gestów będzie zablokuj bieżący wątek do czasu zakończenia przetwarzania obrazu wejściowego lub ramki.
- W trybie transmisji na żywo zadanie rozpoznawania gestów nie blokuje w bieżącym wątku, ale wraca natychmiast. Wywoła swój wynik detektor z wynikiem rozpoznawania po każdym zakończeniu przetwarzania ramki wejściowej. Jeśli funkcja rozpoznawania jest wywoływana, gdy moduł rozpoznawania gestów zadanie jest zajęte przetwarzaniem innej ramki, zadanie zignoruje nowe dane wejściowe ramki.
Pełny przykład zastosowania modułu do rozpoznawania gestów na obrazie znajdziesz w kodzie przykład .
Obsługa i wyświetlanie wyników
Moduł rozpoznawania gestów generuje obiekt wyniku wykrywania gestów dla każdego podczas rozpoznawania. Obiekt wynikowy zawiera punkty orientacyjne we współrzędnych obrazu, punkty orientacyjne we współrzędnych świata, leworęczność(lewa/prawa ręka) i ręka kategorie gestów wykrytych rąk.
Poniżej znajdziesz przykładowe dane wyjściowe tego zadania:
Wynik GestureRecognizerResult
zawiera 4 komponenty, a każdy z nich to tablica, w której każdy element zawiera wykryty wynik 1 wykrytej dłoni.
Ręka dominująca
Ręka wskazuje, czy wykryte ręce są lewe czy prawa.
Gesty
Kategorie rozpoznanych gestów wykrytych rąk.
Punkty orientacyjne
Dostępnych jest 21 punktów orientacyjnych rozmieszczonych na dłoni, a każdy z nich składa się ze współrzędnych
x
,y
iz
. Współrzędnex
iy
są normalizowane do wartości [0,0, 1,0] przez szerokość obrazu i wysokości. Współrzędnaz
reprezentuje głębokość punktu orientacyjnego, a przy tym jest ich głębia na nadgarstku. Im mniejsza wartość, tym bliższa jest punktem orientacyjnym.z
– magnituda ma mniej więcej taką samą skalę jakx
Punkty orientacyjne na świecie
Współrzędne świata przedstawiają również 21 ręcznych punktów orientacyjnych. Każdy punkt orientacyjny składa się z elementów
x
,y
iz
, reprezentujących rzeczywiste współrzędne 3D w m, którego punkt początkowy znajduje się w środku geometrycznym dłoni.
GestureRecognizerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Gestures:
Categories #0:
score : 0.76893
categoryName : Thumb_Up
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
Te obrazy przedstawiają wizualizację danych wyjściowych zadania:
Przykładowy kod modułu do rozpoznawania gestów pokazuje, jak wyświetlić rozpoznawanie gestów wyników zwróconych przez zadanie, patrz kod przykład .