Разработка системы распознавания действий человека (Action Recognition)

Почему action recognition до сих пор остается сложной задачей?

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1460
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1314
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1012
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1275
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    727
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1018

Почему action recognition до сих пор остается сложной задачей?

Мы разрабатываем системы, которые по видеопотоку отвечают не «кто и где», а «что именно делает человек». Обычная детекция объектов тут не работает: нужно учитывать временные зависимости между кадрами, а для редких событий (падения) требуется крайне низкая частота ложных срабатываний. Наш опыт за 7 лет и более 30 реализованных проектов показывает: без грамотной комбинации skeleton‑ и RGB‑подходов добиться промышленного качества невозможно.

Какие проблемы решаем

Падения — редкий класс с катастрофическими последствиями. Алгоритмы часто пропускают падение, поскольку оно занимает 0.5–2 секунды и выглядит аномалией. Мы строим двухэтапную систему: быстрый rule‑based детектор (по изменению высоты центра масс и скорости keypoints) отсеивает 90% шума, а LSTM‑классификатор поверх skeleton‑последовательности даёт окончательное решение. На тестовых данных F1 достигает 0.92.

Разнообразие действий в одном видео. Человек может идти, затем внезапно побежать — модель обязана переключиться за доли секунды. Мы используем sliding window (16–32 кадра, overlap 50–75%), чтобы новый результат получался каждые 8–16 кадров. Для длительных действий (поднятие груза) окно увеличиваем до 64–128 кадров.

Ограниченные вычислительные ресурсы. На производстве часто нельзя ставить тяжёлый GPU. Skeleton‑based подход через YOLOv8‑pose/MediaPipe и LSTM показывает 500+ FPS на CPU, проигрывая RGB‑моделям всего 5–10% точности. Для ответственных задач мы предлагаем гибрид: skeleton быстро детектирует события, а RGB‑модель (SlowFast с MobileNet‑backbone) уточняет класс.

Как мы это делаем

Стек и версии.

  • Получение keypoints: YOLOv8‑pose (nano/small) или MediaPipe Pose (lightweight).
  • Временная модель: LSTM с attention (PyTorch 2.0, hidden=256, 2 слоя, dropout 0.4) или ST‑GCN для пространственно‑временных графов.
  • RGB‑классификация: SlowFast R50 (PyTorchVideo) с дообучением под кастомные классы, либо Video Swin‑B если точность критична.
  • Деплой: ONNX Runtime на edge‑устройствах, Triton Inference Server для облака.

Пример skeleton‑классификатора (код ниже) показывает, как self‑attention и pooled features дают прирост +3% к Top‑1 на NTU RGB+D по сравнению с обычным LSTM.

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% (Liu et al.).
  • 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) 

Детекция падений: почему rule‑based + ML лучше, чем чистый deep learning

Чистая нейросеть даёт много false positives на резких движениях (наклониться, сесть). Rule‑based предфильтр с физическими признаками (скорость падения центра масс, горизонтальность тела) работает предсказуемо и не требует GPU. ML‑классификатор доучивается на специфике вашего помещения. Вместе они дают F1 = 0.92 против 0.78 у одного LSTM.

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 

Как мы выбираем подход для вашей задачи?

Выбор между skeleton и RGB зависит от приоритетов: скорость внедрения, точность, бюджет на оборудование. Ниже — сравнение ключевых метрик.

Параметр Skeleton-based RGB-based
Точность (Top-1 на NTU RGB+D) ~75% ~82% (SlowFast)
FPS на CPU (Intel i7) 500+ 10-30
Требования к GPU Опционально 16+ GB VRAM
Стоимость разметки Низкая (keypoints) Высокая (видео)
Время внедрения (10 классов) 4-6 недель 6-10 недель

Skeleton-based подход лучше подходит для edge-устройств, RGB — для серверных решений с максимальной точностью.

Что входит в работу

  • Дообучение моделей под ваш датасет (разметка, аугментация). Данные можно размечать автоматически через MediaPipe или YOLOv8-pose для skeleton-подхода; для RGB используем CVAT с временными метками.
  • Сборка inference‑пайплайна на ONNX/Triton.
  • Интеграция с существующей системой видеонаблюдения (RTSP, HLS).
  • Документация по эксплуатации и описание архитектуры.
  • Обучение вашей команды (2–3 сессии).
  • Техподдержка на 3 месяца после деплоя.

Как проходит внедрение: 5 шагов

  1. Аудит инфраструктуры — анализ источников видео, нагрузок, требований к latency.
  2. Сбор и разметка данных — 1-2 недели на запись 100-500 примеров на класс.
  3. Разработка прототипа — обучение baseline модели, настройка пайплайна.
  4. Тестирование на реальных данных — измерение precision/recall в целевых условиях.
  5. Деплой и мониторинг — установка на edge или сервер, настройка алертинга.

Сроки ориентировочно

Тип работы Срок
Детекция падений, skeleton‑based 2–4 недели
Классификация 10–30 действий (RGB или hybrid) 4–7 недель
Поведенческая аналитика (событийные сценарии) 7–12 недель

Точный срок определяем на бесплатном аудите вашей инфраструктуры. Стоимость рассчитывается индивидуально под каждую задачу. Закажите разработку системы action recognition — мы оценим проект за 2 дня и предложим оптимальную архитектуру. Снижение ложных срабатываний на 40% позволяет экономить до $18k–26k. в год на операторах видеонаблюдения для склада площадью 5000 м², а типовое решение для детекции падений стоит от $3.5k–7k. Получите консультацию прямо сейчас — наши инженеры свяжутся с вами в течение дня.