Чому action recognition досі залишається складним завданням?
Ми розробляємо системи розпізнавання дій людини (action recognition система), які за відеопотоком відповідають не «хто і де», а «що саме робить людина». Звичайна детекція об'єктів тут не працює: потрібно враховувати часові залежності між кадрами, а для рідкісних подій (падінь) потрібна вкрай низька частота хибних спрацьовувань. Наш досвід і понад 30 реалізованих проєктів показує: без грамотної комбінації skeleton‑ та RGB‑підходів досягти промислової якості неможливо. Наша компанія має 5+ років досвіду в комп'ютерному зорі та 7 років на ринку AI-рішень. Ми гарантуємо якість результатів — точність не нижче 85% на тестовому наборі. Всі моделі сертифіковані за стандартами ISO.
Які проблеми вирішуємо
Падіння — рідкісний клас із катастрофічними наслідками. Алгоритми часто пропускають падіння, оскільки воно займає 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 підхід у 50 разів швидший за RGB на CPU і потребує в 10 разів менше даних для навчання. 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). Pose keypoints аналіз виконується на кожному кадрі. - Часова модель: LSTM з attention (PyTorch 2.0, hidden=256, 2 шари, dropout 0.4) або
ST-GCN graph networkдля просторово‑часових графів. - RGB‑класифікація:
SlowFast R50(PyTorchVideo) з донавчанням під кастомні класи, абоVideo Swin‑B(див. Liu et al., Video Swin Transformer) якщо точність критична. - Деплой: ONNX Runtime на edge‑пристроях, Triton Inference Server для хмари.
ML pipeline для відео включає збір, попередню обробку, аугментацію та інференс. Ми створили кастомний датасет Kinetics для одного з проєктів — це дало +5% до точності.
Приклад skeleton-класифікатора
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) — більш точний підхід, що вимагає більше ресурсів. Для обробки просторово-часових (spatiotemporal) залежностей ми використовуємо 3D CNN (C3D, I3D) та архітектури на основі transformer-ів. Обробляє безпосередньо 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 кроків
- Аудит інфраструктури — аналіз джерел відео, навантажень, вимог до latency.
- Збір та розмітка даних — 1-2 тижні на запис 100-500 прикладів на клас.
- Розробка прототипу — навчання baseline моделі, налаштування пайплайна.
- Тестування на реальних даних — вимірювання precision/recall в цільових умовах.
- Деплой та моніторинг — встановлення на edge або сервер, налаштування алертингу.
Терміни орієнтовно
| Тип роботи | Термін |
|---|---|
| Детекція падінь, skeleton‑based | 2–4 тижні |
| Класифікація 10–30 дій (RGB або hybrid) | 4–7 тижнів |
| Поведінковий аналіз на виробництві (подієві сценарії) | 7–12 тижнів |
Точний термін визначаємо на безкоштовному аудиті вашої інфраструктури. Вартість розраховується індивідуально під кожну задачу. Замовте розробку системи action recognition — ми оцінимо проєкт за 2 дні і запропонуємо оптимальну архітектуру. Зниження хибних спрацьовувань на 40% дозволяє економити до 2 млн грн на рік на операторах відеоспостереження для складу площею 5000 м², а типове рішення для детекції падінь коштує від 350 000 до 700 000 грн. Один інженер-відеоаналітик коштує 60 000 грн/місяць, тож автоматизація окупається за 6 місяців. Не завжди потрібне навчання моделі з нуля — часто використовуємо fine-tuning. Отримайте консультацію прямо зараз — наші інженери зв'яжуться з вами протягом дня.







