Human Action 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
Human Action Recognition System Development
Medium
from 1 week to 3 months
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • 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
    823
  • image_logo-aider_0.jpg
    AIDER company logo development
    762
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    848

System Development распознавания действий человека (Action Recognition)

Action Recognition — классификация действий человека на видео: ходьба, бег, падение, драка, работа с инструментом, занятие спортом. В отличие от pose estimation (что за поза?), action recognition отвечает на вопрос «что делает человек?» и использует временную последовательность кадров как входные данные.

Подходы к классификации действий

Skeleton-based (через pose keypoints) — лёгкий и быстрый. Keypoints извлекаются через YOLOv8-pose / MediaPipe, затем последовательность keypoints классифицируется LSTM/GRU или ST-GCN (Spatial-Temporal Graph Convolutional Network):

import torch
import torch.nn as nn

class ActionLSTM(nn.Module):
    """Классификатор действий по последовательности keypoints"""
    def __init__(self, input_size=34,   # 17 keypoints * 2 координаты
                 hidden_size=256,
                 num_classes=10,
                 seq_len=30):           # 30 кадров = 1 сек при 30fps
        super().__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers=2,
                            batch_first=True, dropout=0.4)
        self.attention = nn.MultiheadAttention(hidden_size, num_heads=4)
        self.classifier = nn.Sequential(
            nn.Linear(hidden_size, 128),
            nn.GELU(),
            nn.Dropout(0.3),
            nn.Linear(128, num_classes)
        )

    def forward(self, x):  # [batch, seq_len, 34]
        lstm_out, _ = self.lstm(x)
        # Self-attention по временной оси
        attn_out, _ = self.attention(lstm_out, lstm_out, lstm_out)
        # Global average pooling по времени
        pooled = attn_out.mean(dim=1)
        return self.classifier(pooled)

Video-based (RGB frames) — более точный, требует больше ресурсов. Обрабатывает напрямую RGB-кадры:

  • SlowFast — два потока с разной частотой дискретизации (медленный для семантики, быстрый для движения)
  • Video Swin Transformer — лучший на Kinetics-400: Top-1 84.9%
  • TimeSformer — temporal attention через transformers
import torch
from torchvision.models.video import r3d_18, R3D_18_Weights

# R3D-18 — лёгкий 3D CNN для action recognition
model = r3d_18(weights=R3D_18_Weights.KINETICS400_V1)

# Для кастомных классов
model.fc = nn.Linear(model.fc.in_features, num_custom_classes)

Система детекции падений

Детекция падений — высокоприоритетное применение для систем безопасности пожилых людей и производственного контроля. Специфика: класс «падение» очень редкий и занимает 0.5–2 секунды. Решение:

  • Skeleton-based детекция (быстро, работает на edge)
  • Признаки: изменение высоты центра масс, угол наклона тела, скорость движения keypoints
  • Threshold-based rule + ML классификатор для снижения false positives
def detect_fall_rule_based(prev_keypoints, curr_keypoints) -> bool:
    """Быстрая rule-based детекция падения"""
    # Высота центра масс (нормализованная)
    prev_hip_y = (prev_keypoints['left_hip']['y'] +
                  prev_keypoints['right_hip']['y']) / 2
    curr_hip_y = (curr_keypoints['left_hip']['y'] +
                  curr_keypoints['right_hip']['y']) / 2

    # Угол тела (вертикальность)
    head_y = curr_keypoints['nose']['y']
    feet_y = max(curr_keypoints['left_ankle']['y'],
                 curr_keypoints['right_ankle']['y'])
    body_height = abs(feet_y - head_y)

    # Признаки падения: тело горизонтально И быстрое снижение ЦМ
    sudden_drop = (curr_hip_y - prev_hip_y) > 0.15  # нормализованные координаты
    horizontal_body = body_height < 0.3

    return sudden_drop and horizontal_body

Датасеты

Датасет Классы Видео Специфика
Kinetics-400/700 400/700 650k Общий, YouTube
UCF-101 101 13k Спорт, активности
HMDB-51 51 7k Разнообразные
NTU RGB+D 120 114k Skeleton-based, RGBD
FallDetection 5 500 Детекция падений

Временное окно и задержка детекции

Длина временного окна: 16–32 кадра (0.5–1 секунда при 30fps) — стандарт для большинства действий. Для длительных действий (рубка дров, поднятие груза): 64–128 кадров.

Sliding window inference: новый результат каждые 8–16 кадров при overlap 50–75%.

Metrics Top-1 Kinetics-400 FPS
R3D-18 63.8% 120
SlowFast R50 76.8% 40
Video Swin-B 82.7% 15
Skeleton LSTM ~75% (NTU) 500+
Применение Срок
Детекция падений, skeleton-based 2–4 недели
Классификация 10–30 действий 4–7 недель
Сложная аналитика поведения 7–12 недель