論文まとめ：Two-Stream Adaptive Graph Convolutional Networks for Skeleton-Based Action Recognition

# はじめに
CVPR2019より以下の論文
[1] L. Shi, et. al."Two-Stream Adaptive Graph Convolutional Networks for Skeleton-Based Action Recognition".CVPR2019
のまとめ

CVF open access:
https://openaccess.thecvf.com/content_CVPR_2019/html/Shi_Two-Stream_Adaptive_Graph_Convolutional_Networks_for_Skeleton-Based_Action_Recognition_CVPR_2019_paper.html

github:
https://github.com/lshiwjx/2s-AGCN
pytorch実装、商用利用不可

# 概要
- 骨格から行動を推定するモデルのうち、graph convolutionを使う系
- グラフ構造を適応的にした
- また関節の位置のみでなく、四肢の長さや方向を情報として使用した


# 背景
骨格（関節）から行動を推定するという手法は、背景に影響されないなど汎用性の高さから近年注目を浴びている。この手法の旧来モデルはRNNや1d-convなどを使ったものだった。これに対し、Yanら[2]は2018年、最初にgraph convolutionを使ったモデルを提案し、高い精度を達成した。

しかし彼らのモデルはmanuelに決められた同一のグラフ構造を全ての層で使い、また関節の位置のみを情報として与えていた。よって以下の問題点があった。

問題点（１）manuelに与えたグラフ構造は行動推定に対して最適なものでないだろう 
問題点（２）さらに各層のグラフ構造は異ってしかるべきで、全ての層に対して同じグラフ構造を適応することは最適でないだろう
問題点（３）異なる行動においては、それを推定するグラフ構造は異なるだろう
問題点（４）関節の位置情報しか使用していない

本手法では問題点（１）、（２）に対しては各層でグラフ構造を適応的にすることで対応し、問題点（３）に対してはdata固有のグラフ構造とすることで対応する。また問題点（４）に対しては四肢の長さや方向を情報として利用する。

# 手法
## st-gcnのグラフ畳み込み
詳細は拙著
https://qiita.com/masataka46/items/78480b730df1326b883b
等参照

ここでは完結にst-gcnで提示されているグラフ畳み込みをおさらい。

${\bf f}\_{in}$ :入力のfeature map
${\bf f}\_{out}$ :出力のfeature map
${\bf W}\_k$ :partiton strategy k に対応する重み
$\bar{\bf A}\_k \in \mathbb{R}^{N \times N}$ :partiton strategy k に対応する隣接行列
${\bf A}\_k = {\bf \Lambda}\_k^{-\frac{1}{2}} \bar{\bf A}\_k {\bf \Lambda}\_k^{-\frac{1}{2}} \in \mathbb{R}^{N \times N}$ :隣接行列を正規化したもの
${\bf M}\_k \in \mathbb{R}^{N \times N}$ :partiton strategy k に対応するattention mapで、各関節の重要度を示す

として、グラフ畳み込みは

```math
{\bf f}_{out} = \sum_k^{K_v} {\bf W}_k ({\bf f}_{in} {\bf A}_{k} ) \odot {\bf M}_{k} \tag{2}
```

となる。

# Adaptive graph convolutional layer
本論文の特徴の１番目。先に述べたように、グラフ構造におけるconnectionを適応的に、かつ各層で異なるものにする。

以下はユニットの詳細図。

![2s_agcn_img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/f623c7db-2999-40a8-c247-a99480061d07.png)


具体的には（２）式を以下のように変更する。

```math
{\bf f}_{out} = \sum_k^{K_v} {\bf W}_k {\bf f}_{in}( {\bf A}_{k} + {\bf B}_{k} + {\bf C}_{k}) \tag{3}
```


以下、${\bf A}\_{k}, {\bf B}\_{k}, {\bf C}\_{k}$ の説明。

１）${\bf A}\_{k}$
（２）式と同じadjacency matrixで、学習において固定されてる

２）${\bf B}\_{k}$ 
学習によってパラメータが変更されるmatrix。図中では学習対象を意味するオレンジ色に塗られている。（２）式の ${\bf M}\_{k}$ と役割的に似てるが、maskをmultiplyするだけだと、adjacency matrixが０のconnectionは０のままなので、新たなconnectionを作ることはない。この点で異なる。

３）${\bf C}\_{k}$ 
前者２つが入力データによらず一定であるのに対して、${\bf C}\_{k}$ は入力データによって値が変わる。図では、attention的に値が決められている。

具体的には、図のようにshape（C, T, N）の入力データに対してパラメータ $\theta\_k$ で 1x1 convを行ない、transposeとreshapeして（N , C x T）を生成する。

一方で同じshape（C, T, N）の入力データに対してパラメータ $\phi\_k$ の 1x1 convを行い、reshapeして（C x T, N）を生成する。

この両者のドット積を計算して（N, N）のtensorを生成するが、各要素は対応するconnectionの強度のようなものを想定する。これにsoftmaxをかけて0-1に正規化し、${\bf C}\_{k}$ とすると、隣接行列のようなものが生成されるだろう。

```math
{\bf C}_{k} = softmax({\bf f}_{in}^T {\bf W}_{\theta k}^T {\bf W}_{\phi k} {\bf f}_{in})
```

ここで「２つのconvからドット積を計算する」という部分の解釈を考える。θ で特徴量化したある $n$ とφで特徴量化した別の n' とで類似性を計算していることになる。仮にθを上側への速度の強度、φを下側への速度の強度と考えると、上側への速度の強度が高い n と下側への速度の強度が高い n' の組み合わせがドット積の結果高くなり、最終的に隣接行列上の高い値として与えられることになる。

# Two-stream networks
本論文の特徴の２番目。先に述べたように、関節の位置のみでなく、四肢の長さや方向も情報として加える。具体的には、体の中心側の関節から、末端側の関節への四肢のベクトルによって長さと方向を表現する。つまり
${\bf v}\_1 = (x\_1, y\_1, z\_1)$ :体の中心側の関節の位置
${\bf v}\_2 = (x\_2, y\_2, z\_2)$ :体の中心側の関節の位置
として、

```math
{\bf e_{v_1, v_2}} = (x_2 - x_1, y_2 - y_1, z_2 - z_1)
```

とする。

またネットワークはこの図のように

![2s_agcn_img05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/d1e0d88d-e391-4684-9c68-5d5ccff2eb5b.png)

関節を入力する系統と四肢の長さ・向きを入力する系統とで完全に分ける。

# 学習方法
- 最適化：momentum(0.9)
- batch size:64 -> これは4つのGPUを使う場合で、手元の1080Ti(11GB)１枚だと16が限界だった
- loss: 交差エントロピー
- leraning rate: 0.1
- weight decay掛け率: 0.0001

# 実験と結果
## ablation study
A, B, Cの効果を測定した。

![2s_agcn_img08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/928fea84-18dc-1c6f-e89a-db832ed27600.png)

上から、ST-GCNそのもの、ST-GCNからmaskを無くしたもの、AGCN（本手法）からAを無くしたもの、AGCNからBを無くしたもの、AGCNからCを無くしたもの、AGCNそのもの（つまりABC全て入ったもの）。全て入ったものが一番よい。

また以下は左がAで、右が学習後のB（？）。

![2s_agcn_img07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/37ca0a66-1c3c-8e1e-fb3b-ee468827ed1b.png)

Aにないconnectionに対して、関係性を学習している。

また以下は2 streamの効果を見たもの。

![2s_agcn_img11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/b58ec30d-5684-029c-470d-9d051e9f51ad.png)

上から入力データがjoint位置単体、入力データが四肢の長さと向き、両方使った2-stream。もちろん2-streamがよい。

## NTU-RGB+D 60 を用いた定量的評価
以下はNTU-RGB+D 60 datasetを用いた場合の他のモデルとのaccuracy比較。

![2s_agcn_img12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/c70f3770-6068-8653-9d4b-2117a400fc41.png)

2019年時点でSOTAだった他のモデルと比較してもかなりよい。

## Kinetics-Skeleton を用いた定量的比較
Kinetics-Skeleton を用いた場合の他のモデルとのaccuracy比較。

![2s_agcn_img13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/89a45aed-569c-f0f1-1396-7ad5fe9c3c6d.png)

こちらも同様に精度がよい。

# reference
[2] Sijie Yan, Yuanjun Xiong, and Dahua Lin. Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition. In AAAI, 2018