您的位置:

ST-GCN:骨骼动作识别的图卷积神经网络

一、ST-GCN简介

ST-GCN(Spatial Temporal Graph Convolutional Network)是一种基于图卷积神经网络的动作分类算法,能够对通过骨骼传感器采集到的人体运动数据进行分类。ST-GCN的核心思想是将骨骼序列建模为图结构,并且在这个图结构上进行卷积操作,从而捕捉时间和空间的相关性。这个算法的出现,极大地提高了人体运动的识别精度。

ST-GCN最早由瑞士苏黎世联邦理工学院(ETH Zurich)的谭依桐(Yitong Tang)团队在2017年的论文《2s-AGCN: Two-Stream Adaptive Graph Convolutional Networks for Skeleton-Based Action Recognition》中提出。该论文提出了一种双流ST-GCN模型,能够更好地处理不同动作的分布差异性。

二、ST-GCN的核心思想

ST-GCN的最大特点是使用图卷积神经网络(GCN)对骨骼序列进行分类,通过空间和时间上的变化来预测不同动作。因此,ST-GCN面临的主要问题是如何构建一个能够很好地反映空间和时间相关性的图形结构。

在构建图形结构之前,需要确定关节数量。ST-GCN使用的是C3D网络方法,对每个关节进行自我的建模,这使得ST-GCN在保持运动数据连续性的同时,能够在不同动作的起点和停止点之间更精确地建立联系。

接下来,需要对每个关节之间的关系进行建模,ST-GCN使用骨骼连接结构来表示骨骼间的关系,从而构建图形结构。在这个骨骼连接结构中,每个骨骼都被视为一个节点,并通过边相互连接。这里需要注意的是,边的长度在不同场景中是不同的,因此ST-GCN使用了一种自适应空间关系的方法,通过将边的时间信息考虑在内来捕捉不同场景中的空间相关性。

三、ST-GCN的网络架构

import torch.nn as nn
import torch.nn.functional as F
from st_gcn import st_gcn, st_gcn_3d
from functools import partial
    
class Model(nn.Module):
    def __init__(self, graph_args, in_channels, num_classes):
        super(Model, self).__init__()
        self.graph = graph_args
        self.data_bn = nn.BatchNorm1d(in_channels * self.graph['num_nodes'])
        self.layer1 = self._make_layer(1, 64, 1)
        self.layer2 = self._make_layer(64, 64, 1)
        self.layer3 = self._make_layer(64, 64, 1)
        self.layer4 = self._make_layer(64, 128, 2)
        self.layer5 = self._make_layer(128, 128, 1)
        self.layer6 = self._make_layer(128, 128, 1)
        self.layer7 = self._make_layer(128, 256, 2)
        self.layer8 = self._make_layer(256, 256, 1)
        self.layer9 = self._make_layer(256, 256, 1)
        self.fc = nn.Linear(256, num_classes)
        self.dropout = nn.Dropout(p=0.5)

    def _make_layer(self, in_channels, out_channels, stride):
        layer = []

        layer.append(st_gcn_3d(in_channels, out_channels, self.graph, stride=stride))
        layer.append(nn.BatchNorm2d(out_channels))
        layer.append(nn.ReLU())
        layer.append(st_gcn_3d(out_channels, out_channels, self.graph, stride=1))
        layer.append(nn.BatchNorm2d(out_channels))
        layer.append(nn.ReLU())

        return nn.Sequential(*layer)

    def forward(self, x):
        N, C, T, V, M = x.size()
        x = x.permute(0, 4, 3, 1, 2).contiguous()
        x = x.view(N * M, V * C, T)
        x = self.data_bn(x)
        x = x.view(N * M, C, V, T)
        x = x.permute(0, 3, 2, 1).contiguous()
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        x = self.layer5(x)
        x = self.layer6(x)
        x = self.layer7(x)
        x = self.layer8(x)
        x = self.layer9(x)
        x = F.avg_pool2d(x, x.size()[2:])
        x = x.view(N, M, -1)
        ## Different pooling method according to taget task definition
        x = torch.mean(x, dim=1)
        x = self.dropout(x)
        x = self.fc(x)

        return x

上述代码为双流ST-GCN的实现。首先,我们定义了一个图形结构,并在构建模型时使用它。接下来,我们定义了一系列卷积层,这些卷积层对空间和时间上相关性进行建模。最后,我们使用全局平均池化层和全连接层对特征进行分类。

四、应用场景

ST-GCN的应用场景主要涉及人体运动数据的分类,例如动作识别等。除此之外,ST-GCN还可以应用到一些需要分类的动态图像数据上,例如手语识别等。

在工业应用方面,ST-GCN可以被应用到健康监测领域。通过安装骨骼连接传感器,ST-GCN可以对人体运动情况进行实时监测,预测并识别出一些不利于健康的运动行为,帮助人们更好地做出生活和运动上的决策。

五、总结

ST-GCN在动作分类领域取得了非常好的表现,成为目前最常用的骨骼动作识别算法之一。它的核心思想是通过构建图形结构,捕捉运动数据中的时间和空间相关性。ST-GCN的应用范围很广,对人体健康的监测也有很多潜在可行性。未来,ST-GCN还有许多可以改进的方向,例如优化图形结构、改进模型可解释性等。