Руководство по распознаванию жестов для Python

Задача «Распознаватель жестов MediaPipe» позволяет распознавать жесты рук в реальном времени и предоставляет результаты распознанных жестов рук и ориентиры обнаруженных рук. В этих инструкциях показано, как использовать Распознаватель жестов с приложениями Python.

Вы можете увидеть эту задачу в действии, просмотрев веб-демо. Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

В примере кода Распознаватель жестов представлена ​​полная реализация этой задачи на Python. Этот код поможет вам протестировать эту задачу и приступить к созданию собственного распознавателя жестов рук. Вы можете просматривать, запускать и редактировать пример кода Распознаватель жестов, используя только веб-браузер.

Если вы внедряете Распознаватель жестов для Raspberry Pi, обратитесь к примеру приложения Raspberry Pi .

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки и проектов кода специально для использования Распознаватель жестов. Общие сведения о настройке среды разработки для использования задач MediaPipe, включая требования к версии платформы, см. в руководстве по настройке Python .

Пакеты

Для задачи Распознавателя жестов MediaPipe требуется пакет mediapipe PyPI. Вы можете установить и импортировать эти зависимости следующим образом:

$ python -m pip install mediapipe

Импорт

Импортируйте следующие классы для доступа к функциям задачи Распознавателя жестов:

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

Модель

Для задачи Распознавателя жестов MediaPipe требуется пакет обученной модели, совместимый с этой задачей. Дополнительную информацию о доступных обученных моделях для Распознаватель жестов см. в разделе «Модели » обзора задач.

Выберите и скачайте модель, а затем сохраните ее в локальном каталоге:

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

Укажите путь к модели в параметре «Имя модели», как показано ниже:

base_options = BaseOptions(model_asset_path=model_path)

Создать задачу

Задача Распознавателя жестов MediaPipe использует функцию create_from_options для настройки задачи. Функция create_from_options принимает значения для обрабатываемых параметров конфигурации. Дополнительные сведения о параметрах конфигурации см. в разделе Параметры конфигурации .

Следующий код демонстрирует, как создать и настроить эту задачу.

В этих примерах также показаны варианты построения задач для изображений, видеофайлов и прямых видеопотоков.

Изображение

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.
  # ...
    

Видео

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.
  # ...
    

Прямая трансляция

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.
  # ...
    

Варианты конфигурации

Эта задача имеет следующие параметры конфигурации для приложений Python:

Название опции Описание Диапазон значений Значение по умолчанию
running_mode Устанавливает режим выполнения задачи. Есть три режима:

ИЗОБРАЖЕНИЕ: Режим для ввода одного изображения.

ВИДЕО: Режим декодированных кадров видео.

LIVE_STREAM: режим прямой трансляции входных данных, например с камеры. В этом режиме необходимо вызвать resultListener, чтобы настроить прослушиватель на асинхронное получение результатов.
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
num_hands Максимальное количество рук может быть обнаружено с помощью GestureRecognizer . Any integer > 0 1
min_hand_detection_confidence Минимальный показатель достоверности, позволяющий считать обнаружение рук успешным в модели обнаружения ладоней. 0.0 - 1.0 0.5
min_hand_presence_confidence Минимальный показатель достоверности оценки присутствия руки в модели обнаружения ориентиров рук. В режиме «Видео» и режиме прямой трансляции Распознаватель жестов, если показатель достоверности присутствия руки по модели ориентира руки ниже этого порога, активируется модель обнаружения ладони. В противном случае для определения местоположения руки (рук) для последующего обнаружения ориентиров используется упрощенный алгоритм отслеживания рук. 0.0 - 1.0 0.5
min_tracking_confidence Минимальный показатель достоверности, позволяющий считать отслеживание рук успешным. Это порог IoU ограничивающей рамки между руками в текущем кадре и последнем кадре. В режиме «Видео» и «Потоковый режим» Распознаватель жестов, если отслеживание не удается, Распознаватель жестов запускает обнаружение руки. В противном случае обнаружение руки пропускается. 0.0 - 1.0 0.5
canned_gestures_classifier_options Параметры настройки поведения классификатора стандартных жестов. Стандартные жесты: ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"]
  • Язык отображаемых имен: языковой стандарт, используемый для отображаемых имен, указанных в метаданных модели TFLite, если таковые имеются.
  • Максимальное количество результатов: максимальное количество возвращаемых результатов классификации с наибольшим количеством баллов. Если < 0, будут возвращены все доступные результаты.
  • Порог оценки: балл, ниже которого результаты отклоняются. Если установлено значение 0, будут возвращены все доступные результаты.
  • Список разрешенных категорий: список разрешенных названий категорий. Если поле не пусто, результаты классификации, категории которых нет в этом наборе, будут отфильтрованы. Взаимоисключающие со списком запретов.
  • Список запрещенных категорий: список запрещенных имен категорий. Если не пусто, результаты классификации, категория которых находится в этом наборе, будут отфильтрованы. Взаимоисключающее со списком разрешений.
    • Локаль отображаемых имен: any string
    • Максимальное количество результатов: any integer
    • Порог оценки: 0.0-1.0
    • Список разрешенных категорий: vector of strings
    • Список запрещенных категорий: vector of strings
    • Язык отображаемых имен: "en"
    • Максимальное количество результатов: -1
    • Порог оценки: 0
    • Белый список категорий: пусто
    • Список запрещенных категорий: пустой
    custom_gestures_classifier_options Параметры настройки поведения классификатора пользовательских жестов.
  • Язык отображаемых имен: языковой стандарт, используемый для отображаемых имен, указанных в метаданных модели TFLite, если таковые имеются.
  • Максимальное количество результатов: максимальное количество возвращаемых результатов классификации с наибольшим количеством баллов. Если < 0, будут возвращены все доступные результаты.
  • Порог оценки: балл, ниже которого результаты отклоняются. Если установлено значение 0, будут возвращены все доступные результаты.
  • Список разрешенных категорий: список разрешенных названий категорий. Если значение не пусто, результаты классификации, категории которых нет в этом наборе, будут отфильтрованы. Взаимоисключающее со списком запретов.
  • Список запрещенных категорий: список запрещенных имен категорий. Если значение не пусто, результаты классификации, категория которых находится в этом наборе, будут отфильтрованы. Взаимоисключающее со списком разрешений.
    • Локаль отображаемых имен: any string
    • Максимальное количество результатов: any integer
    • Порог оценки: 0.0-1.0
    • Список разрешенных категорий: vector of strings
    • Список запрещенных категорий: vector of strings
    • Язык отображаемых имен: "en"
    • Максимальное количество результатов: -1
    • Порог оценки: 0
    • Белый список категорий: пусто
    • Список запрещенных категорий: пустой
    result_callback Настраивает прослушиватель результатов на асинхронное получение результатов классификации, когда распознаватель жестов находится в режиме прямого потока. Может использоваться только в том случае, если для режима работы установлено значение LIVE_STREAM ResultListener Н/Д Н/Д

    Подготовьте данные

    Подготовьте входные данные в виде файла изображения или массива numpy, а затем преобразуйте их в объект mediapipe.Image . Если ваши входные данные представляют собой видеофайл или прямую трансляцию с веб-камеры, вы можете использовать внешнюю библиотеку, такую ​​как OpenCV, для загрузки входных кадров в виде числовых массивов.

    Изображение

    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)
        

    Видео

    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)
        

    Прямая трансляция

    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)
        

    Запустить задачу

    Распознаватель жестов использует функции распознавания, распознавания_для_видео и распознавания_async для запуска логических выводов. Для распознавания жестов это включает предварительную обработку входных данных, обнаружение рук на изображении, обнаружение ориентиров рук и распознавание жестов рук по ориентирам.

    Следующий код демонстрирует, как выполнить обработку с помощью модели задачи.

    Изображение

    # 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)
        

    Видео

    # 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)
        

    Прямая трансляция

    # 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)
        

    Обратите внимание на следующее:

    • При работе в режиме видео или режиме прямой трансляции необходимо также предоставить задаче Распознавателя жестов временную метку входного кадра.
    • При запуске изображения или видеомодели задача «Распознаватель жестов» блокирует текущий поток до тех пор, пока он не завершит обработку входного изображения или кадра.
    • При работе в режиме прямой трансляции задача «Распознаватель жестов» не блокирует текущий поток, а немедленно возвращается. Он будет вызывать свой прослушиватель результатов с результатом распознавания каждый раз, когда завершает обработку входного кадра. Если функция распознавания вызывается, когда задача «Распознаватель жестов» занята обработкой другого кадра, задача будет игнорировать новый входной кадр.

    Полный пример запуска распознавателя жестов на изображении см. в примере кода .

    Обработка и отображение результатов

    Распознаватель жестов генерирует объект результата обнаружения жестов для каждого запуска распознавания. Объект результата содержит ориентиры рук в координатах изображения, ориентиры рук в мировых координатах, направление руки (левая/правая рука) и категории жестов обнаруженных рук.

    Ниже показан пример выходных данных этой задачи:

    Полученный результат GestureRecognizerResult содержит четыре компонента, каждый из которых представляет собой массив, где каждый элемент содержит обнаруженный результат одной обнаруженной руки.

    • Рукава

      Handedness показывает, являются ли обнаруженные руки левыми или правыми.

    • Жесты

      Распознанные категории жестов обнаруженных рук.

    • Достопримечательности

      Имеется 21 ручной ориентир, каждый из которых состоит из координат x , y и z . Координаты x и y нормализуются на [0,0, 1,0] по ширине и высоте изображения соответственно. Координата z представляет глубину ориентира, при этом глубина на запястье является началом координат. Чем меньше значение, тем ближе ориентир к камере. Величина z использует примерно тот же масштаб, что и x .

    • Достопримечательности мира

      21 ориентир также представлен в мировых координатах. Каждый ориентир состоит из x , y и z , представляющих реальные трехмерные координаты в метрах с началом координат в геометрическом центре руки.

    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)
    

    На следующих изображениях показана визуализация результатов задачи:

    Пример кода Распознавателя жестов демонстрирует, как отображать результаты распознавания, возвращаемые задачей, подробности см. в примере кода .