ST-GCN (Пространственно-временная графовая сверточная сеть)
Архитектура нейросети, предназначенная для анализа последовательностей, представленных в виде графов, чаще всего — скелетонов человека во времени
ST-GCN (англ. Spatial-Temporal Graph Convolutional Network — Пространственно-временная графовая сверточная сеть) — это архитектура нейросети, предназначенная для анализа последовательностей, представленных в виде графов, чаще всего — скелетонов человека во времени.ST-GCN — это модель, которая анализирует, как двигается скелет человека во времени.
Во многих задачах компьютерного зрения сначала применяется:
- Pose Estimation → получаем ключевые точки (суставы)
- затем нужно понять движение
Проблема:
- обычные модели (CNN, LSTM) не учитывают структуру скелета
- суставы связаны между собой (граф), это не просто набор точек
ST-GCN решает это так:
- представляет скелет как граф
- применяет графовые свёртки
- добавляет временное измерение
Скелет человека — это граф:
- вершины (nodes / keypoints) → суставы (локти, колени, плечи)
- рёбра (edges) → связи между суставами
Ключевая идея ST-GCN
ST-GCN объединяет два типа зависимостей:
Пространственные (Spatial)
- как суставы связаны между собой
- структура тела
Временные (Temporal)
- как положение суставов меняется во времени
- движение
Как работает ST-GCN
Модель делает следующее:
- принимает последовательность скелетов
- применяет графовые свёртки (по структуре тела)
- применяет временные свёртки (по времени)
- извлекает признаки движения
- делает предсказание (например, действие)
Где используется ST-GCN
- распознавание действий (Action Recognition)
- анализ спорта (удары, техника)
- реабилитация
- биомеханика
- системы безопасности
- взаимодействие человек-компьютер
Почему ST-GCN лучше обычных подходов
- учитывает структуру тела (граф)
- устойчив к шуму в изображении
- не зависит от фона
- работает только с координатами точек
Минимальный пример на PyTorch
Ниже — упрощённая реализация ST-GCN блока.
Импортируем необходимые библиотеки:
import torch
import torch.nn as nn
Создадим графовую свёртку:
class GraphConv(nn.Module):
def __init__(self, in_channels, out_channels, A):
super().__init__()
self.A = A # матрица смежности (adjacency matrix)
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1)
def forward(self, x):
# x: (batch, channels, time, nodes)
x = torch.einsum(nctv,vw-