###### 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>

</center>
如上圖,藍點為關節點,邊分為兩種,藍色為 spatial edges,綠色則為連接相同關節在不同時間的 temporal edges。這個模型的輸入值為關節坐標。
## 2. Releted Work
## 3. Spatial Temporal Graph ConvNet
### 3.1 Pipeline Overview
<center>

<!---->
</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>

</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>

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>

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

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