System Development распознавания жестов (Gesture Recognition)
Распознавание жестов — интерфейс «без прикосновений» для управления устройствами, доступности для людей с нарушениями, интерактивных инсталляций. Задача решается двумя подходами: через скелет руки (hand landmarks) и через классификацию изображений/видео жеста целиком. Первый подход интерпретируем и работает в реальном времени, второй точнее для сложных жестов.
MediaPipe Hands: детекция ключевых точек руки
Google MediaPipe Hands — стандарт для hand landmark detection. 21 точка на руку, работает в реальном времени на мобильных устройствах.
import mediapipe as mp
import cv2
import numpy as np
class GestureRecognizer:
def __init__(self, model_path: str):
self.mp_hands = mp.solutions.hands
self.hands = self.mp_hands.Hands(
static_image_mode=False,
max_num_hands=2,
min_detection_confidence=0.7,
min_tracking_confidence=0.5
)
# Классификатор жестов поверх landmarks
self.gesture_classifier = self._load_classifier(model_path)
self.gesture_names = ['open_hand', 'fist', 'ok', 'thumbs_up',
'thumbs_down', 'victory', 'pointing', 'none']
def predict(self, frame: np.ndarray) -> list[dict]:
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = self.hands.process(rgb)
gestures = []
if results.multi_hand_landmarks:
for hand_landmarks, handedness in zip(
results.multi_hand_landmarks,
results.multi_handedness
):
# Нормализуем coordinates относительно запястья
landmarks = self._normalize_landmarks(hand_landmarks)
gesture = self.gesture_classifier.predict([landmarks])[0]
gestures.append({
'gesture': self.gesture_names[gesture],
'hand': handedness.classification[0].label, # Left/Right
'landmarks': landmarks
})
return gestures
def _normalize_landmarks(self, hand_landmarks) -> list[float]:
"""Нормализация относительно ограничивающего прямоугольника"""
coords = [[lm.x, lm.y, lm.z] for lm in hand_landmarks.landmark]
coords = np.array(coords)
# Нормализация: wrist как origin, масштаб по max extent
wrist = coords[0]
coords -= wrist
scale = np.max(np.abs(coords))
if scale > 0:
coords /= scale
return coords.flatten().tolist()
Классификатор поверх landmarks
Для базовых статических жестов (8–20 классов) достаточно простого классификатора на признаках из landmarks:
from sklearn.ensemble import RandomForestClassifier
import joblib
# Training на записанных примерах
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train) # X: [N, 63] landmarks, y: gesture_id
joblib.dump(clf, 'gesture_classifier.pkl')
Для сложных жестов и динамических жестов (движений) — LSTM или 1D-CNN поверх последовательности landmarks:
import torch.nn as nn
class TemporalGestureClassifier(nn.Module):
def __init__(self, input_size=63, num_classes=20, seq_len=30):
super().__init__()
self.lstm = nn.LSTM(input_size, 128, num_layers=2,
batch_first=True, dropout=0.3)
self.classifier = nn.Linear(128, num_classes)
def forward(self, x): # x: [batch, seq_len, 63]
_, (hidden, _) = self.lstm(x)
return self.classifier(hidden[-1])
Динамические жесты и жесты жестового языка
Для жестового языка (ASL, РЖЯ) — более сложная задача. Отдельный раздел: AI-система распознавания жестового языка (id=1260). Для динамических жестов управления (swipe left/right, zoom in/out) нужна временная модель на последовательности 15–30 кадров.
Applications и примеры
Бесконтактное управление в медицинских учреждениях: хирург управляет PACS-системой (просмотр рентгена) без касания — актуально во время операции в стерильных условиях.
Интерактивные инсталляции: управление презентацией или медиаконтентом жестами перед большим экраном.
Accessibility: управление ПК для людей с ограниченными возможностями верхних конечностей.
Игровые интерфейсы: управление персонажем, VR-взаимодействие.
Performance
MediaPipe Hands на CPU (мобильный): 30+ FPS. На десктопном CPU: 60+ FPS. С GPU (CUDA): 200+ FPS — ограничивает захват камеры.
| Задача | Срок |
|---|---|
| 8–15 статических жестов, MediaPipe | 1–2 недели |
| 20–50 жестов включая динамические | 3–5 недель |
| Жестовый язык (50+ знаков) | 6–12 недель |







