Gesture Recognition System Development

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
Gesture Recognition System Development
Medium
from 1 week to 3 months
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1212
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    822

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 недель