---
# System prepended metadata

title: Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition
tags: [Vision-based Motion Capture, Paper, 3D Computer Game]

---

###### tags: `Paper`、`3D Computer Game`、`Vision-based Motion Capture`
# **[Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition](https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/17135)**

本篇論文是 2018 年由 Sijie Yan, Yuanjun Xiong, Dahua Lin 發表於 AAAI 的 paper。

## 1. Introduction
在之前的關於動態骨架識別的論文中，是在固定的一段時間取得關節坐標，並且作時間分析。然而這種方法並沒有利用到關節間的空間關係。

> 所謂步長就是你將需要觀測的數值均勻分成若干個區間，每個區間的長度就叫步長。
>
> 時間步長法應該是以時間軸為主自變量，確定步長後定點測值，簡單來說就是每隔一段時間取一個值記錄下來。

> A feature vector is a specific observable phenomenon’s measurable property. 
> 
> 特徵向量是特定可觀察現象的可測量屬性。 人類類別中的身高和體重參數是一個明顯的例子，因為它是可觀察和可測量的。

<font color="red">由於骨架座標更適合用 graph 來表示，故這篇論文架構採用 graph neural network，並且延伸出一個名為 *Spatial-Temporal Graph Convolutional Network*(ST-GCN) 的 spatial temporal graph model，用以表示動作識別的骨架序列。</font>

<center>
    
![The spatial temporal graph of a skeleton sequence.](https://i.imgur.com/MQz1Raf.png)
    
</center>

如上圖，藍點為關節點，邊分為兩種，藍色為 spatial edges，綠色則為連接相同關節在不同時間的 temporal edges。這個模型的輸入值為關節坐標。

## 2. Releted Work

## 3. Spatial Temporal Graph ConvNet

### 3.1 Pipeline Overview
<center>

![Pipeline.](https://i.imgur.com/bI1Kmyn.png)
    
<!--![Pipeline](https://i.imgur.com/15PnF0t.png)-->

</center>

從 motion-capture 設備或是對影片進行姿勢預測(pose estimation) 取得骨架資訊，取得的數據是一系列的幀，每一幀都會有一組關節坐標，從這些 2D 或 3D 的坐標得出的骨架關節序列，並且建構出一個時空圖(spatial temporal graph) ，再將這些關節點的向量做為 input 輸入到 ST-GCN 模型中。輸入的數據經過運算後會在圖上形成 feature map，並且用 standard SoftMax classifier 分類到相應的動作類別。

<font color="red">簡單來說就是最終輸入到 ST-GCN model 的要是骨架資訊，且不限關節數量，而在這之前的處理方式可以有很多種，而這篇論文裡的 data set 有兩個 1) Kinetics 2) NTU-RGB+D，具體細節在後面會講。最終 model 會將輸入的 motion clip 分類到對應的 class。</font>

### 3.2 Skeleton Graph Construction
首先在每一幀取得每個關節點的坐標訊息，並且連接起來。而在本篇論文的工作，就是用時空圖將這些骨架序列進行分層表示。本篇論文在這個骨架序列上建構了一個含有 $N$ 個 關節點及 $T$ 幀的無向時空圖 $G = (V, E)$。

在此圖中，<font color="red">點集合可表示為 $V = \{v_{ti} \ | \ t = 1, ..., T, i = 1, ..., N \}$。</font>時空圖將分為兩個步驟建構出來，首先將相同幀內的所有關節點用邊，以符合人體結構的方式連接起來，然後將每個關節點與連續幀的同一關節點用邊連接起來。在這裡可以看到<font color="red">邊可分為兩個子集合，首先是連接同一幀的邊(intra-skeleton connection)，可表示為</font> <font color="blue">$E_S = \{ v_{ti}v_{tj} \ | \ (i, j) \in H \}$</font>，<font color="red">另一個則是連接連續幀中的相同關節的邊(inter-skeleton)，可表示為</font> <font color="green">$E_F = \{ v_{ti}v_{(t+1)i}\}$。</font>

### 3.3 Spatial Graph Convolutional Neural Network
論文這邊在看 ST_GCN 之前，先從單一幀的 graph CNN model 開始。在時間 $\tau$ 時，會有 $N$ 個關節點組成的集合 $V_t$，因此骨架的邊可以表示成 $E_s(\tau) = \{ v_{ti}v_{tj} \ | \ t = \tau, (i, j) \in H \}$，因為在單一幀，所以不會有 $E_F$ 這種邊。

~~先從在單一幀的 graph CNN model，假設 kernel 大小為 $K \times K$，輸入的特徵圖為 $f_{in}$，且 channel 為 $c$，輸出的值在空間位置 $\mathbf{x}$ 為~~

下面這行公式是一般 CNN convolution function，因為 GCN 就是 based on CNN，所以基本上就要先從這邊下手

$$f_{out}(\mathbf{x}) \ = \ \sum^K_{h=1} \sum^K_{w=1} {f_{in}(\mathbf{p}(\mathbf{x}, h, w)) \cdot \mathbf{w} (h,w)} \tag{1}$$

可以看到這行公式分為 sampling 跟 weight 兩個部分

**sampling function $\mathbf{p}$:** $Z^2 \times Z^2 \to Z^2$

**weight function $\mathbf{w}$:** $Z^2 \to \Bbb{R}^c$

再來將上述公式延伸到輸入特徵圖 spatial graph $V_t$，則特徵圖為 $f^t_{in} : V_t \to R^c$，接著重新定義 sampling function $\mathbf{p}$ 和 weight function $\mathbf{w}$。

**Sampling function:** 在 graph 中，對於 node $v_{ti}$，將其鄰近點的子集重新定義為 $B(v_{ti}) = \{v_{tj} | d(v_{tj}, v_{ti}) \leq D \}$，因此 sampling function $\mathbf{p} : B(v_{ti} \to V)$ 可以寫成

$$\mathbf{p}(v_{ti}, v_{tj}) = v_{tj} \tag{2}$$

<font color ="red">首先，先考慮在 image 上，image 會以 grid 的方式來考慮，因此以 $\mathbf{x}$ 為中心的相鄰的 (neighbor) 九宮格的點，都會被納入計算，將概念帶入到 graph 上，以 $v_{ti}$ 為中心，相鄰的點則可以定義為 $B(v_{ti}) = \{ v_{tj} \ | \ d(v_{tj}, v_{ti}) \leq D \}$，也就是說，兩點之間距離小於等於 $D$ 時，可以將 $v_{tj}$ 視為 $v_{ti}$ 的 neighbor，這裡的 $d(v_{tj}, v_{vi})$ 指的不是實際距離，而是 step，且在這篇論文中，$D$ 設為 1，也就是說在 one ring 內的點，皆為 neighbor。</font>

**Weight function:** $l_{ti} : B(v_{ti}) \to \{ 0, ..., K - 1 \}$，weight function $\mathbf{w}(v_{ti}, v_{tj}): B(v_{ti}) \to R^c$

$$\mathbf{w}(v_{ti}, v_{tj}) = \mathbf{w}'(l_{ti}(v_{tj})) \tag{3}$$

<font color = "red">這邊作者考慮到不要給各個關節點固定的 labeling，而是以 $v_{ti}$ 的相鄰集劃分為 $K$ 個子集，因此每個子集皆有一個 label。label 細節在 Section 3.4。</font>

**Spatial Graph Convolution.**
將公式 1，重新寫過後可得

$$f_{out}(v_{ti}) \ = \ \sum_{v_{tj} \in B(v_{ti})} {\frac{1}{Z_{ti}(v_{tj})} f_{in}(\mathbf{p}(v_{ti}, v_{tj})) \cdot \mathbf{w} (v_{ti}, v_{tj})} \tag{4}$$

其中 normalizing term $Z_{ti} = |\{ v_{tk}|l_{ti}(v_{tj}) \}|$。

將公式 2 及公式 3 代入後可得 <font color = "red">spatial graph convolution 的最終公式：

$$f_{out}(v_{ti}) \ = \ \sum_{v_{tj} \in B(v_{ti})} {\frac{1}{Z_{ti}(v_{tj})} f_{in}(v_{tj}) \cdot \mathbf{w} (l_{ti}(v_{tj}))} \tag{5}$$
</font>

**Spatial Temporal Modeling.**
上面公式完成了 spatial 的部分，現在將 temporal 以同樣概念再帶入公式中，首先，sampling function 重新定義成

$$B(v_{ti}) = \{ v_{qj} = | d(v_{tj}, v_{ti}) \leq K, |q - t| \leq \lfloor \Gamma / 2 \rfloor \} \tag{6}$$

其中 $\Gamma$ 控制幀數，而 weight function 則變成 label map $l_{ST}$

$$l_{ST}(v_{qi}) = l_{ti}(v_{tj}) + (q - t + \lfloor \Gamma / 2 \rfloor) \times K) \tag{7}$$

### <font color = "red">3.4 Partition Strategies
<center>

![](https://i.imgur.com/kU02uOc.png)

</center>

對於動作識別，上圖展示了三種 labeling 規則：
- **Uni-labeling:** 將所有相鄰的節點劃分為同一子集(綠色)。
- **Distance partitioning:** 具有兩個子集，root 本身為一子集(綠色)，其餘相鄰的節點為同一子集(藍色)。
- **Spatial configuration partitioning:** 將該點本身集相鄰節點分為三種子集：1) root 本身，2) 比 root 更靠近骨架重心的相鄰節點，3) 較 root 遠離骨架重心的相鄰節點。

其中，第二種分法，考慮到了關節點之間的相對關係，而第三種則是考量到肌肉收縮與伸長對動作產生的不同影響。</font>

### 3.5 Learnable edge importance weighting

### 3.6 Implementing ST-GCN
**Network architecture and training.**
<center>

![Network architecture.](https://i.imgur.com/wNxvmvo.png)
    
From [YouTube: Spatial-Temporal Graph Convolution Networks for skeleton-based Action Recognition](https://www.youtube.com/watch?v=JJZUvhIuvOQ)

</center>

## 4. Experiments
在這篇論文中，作者用到了兩種 dataset，分別是 **Kenetics** 和 **NTU-RGB+D**，在 Section 4.1 中回詳細介紹。

### 4.1 Dataset & Evaluation Metrics 
**Kenetics：**
* 300,000 video clips
* 400 human action classes
* at least 600 video clips for each action class
* Each clip of duration 10 seconds
* Sampled at 30 fps
* Feature vector per frame pre person
    - 18 nodes or joint locations
    - $(X, Y, C)$, where $(X, Y)$ are spatial coordinates and $C$ is xonfidence score
    - Multi-person cases
    
<font color = "blue">這邊有一點比較要注意的是，這個 dataset 出來的只有影片沒有骨架資訊，所以若要套進 ST-GCN，則需先透過 [OpenPose](https://ieeexplore.ieee.org/document/8765346) 辨識出骨架資訊，大概是 18 個關節點。</font>

**NTU-RGB+D：**
* 56,000 action clips
* 60 human action class
* Two benchmark：
    1) cross-subject (X-sub)：
        - 40, 320 training
        - 16, 560 evaluation
    2) cross-view (X-view)：
        - 37, 920 training
        - 18, 960 evaluation
* Kinect depth sensors
    - 3D joint locations $(X, Y, Z)$
    
<font color= "blue">這邊比較特別的部分是兩個 benchmark，一個是同一動作，不同人來做，另一個是同一個人，做不同動作。</font>

### 4.2 Ablation Study

### 4.3 Comparison with State of Arts
下表是作者以 Kinetics 為輸入，與其他論文做比較，可以看到，ST-GCN 相對其他論文，有更好的辨識準確率，且若增加 RGB 或 Optical Flow 資訊後，準確率可以有更大程度的提升。

<center>

![Kinetics.](https://i.imgur.com/XnxGFbB.png)

</center>

下表是作者以 NTU-RGB+D 為輸入，與其他論文做比較後的結果，可以看到 ST-GCN 在此也有不錯的表現。

<center>

![NTU-RGB+D.](https://i.imgur.com/xR3tg1G.png)

</center>

## 5. Conclusion
本篇論文的核心貢獻為有別於傳統骨架辨識時，僅依靠單一幀的空間資訊，作者將時間資訊同時也納入考量點，創造出名為 *Spatial-Temporal Graphic Neural Networks* (*ST-GCN*) 的新 model，顯示出若將時間資訊，也納入做為動作辨識的一項依據時，對於生成結果也較為理想。