文@970329

基於骨骼點的動作識別 (Skeleton-based Action Recognition) 旨在從一系列時間連續的人體骨骼點中識別正在執行的動作。相較於 RGB 幀或光流,人體骨骼這一模態與人體動作天然更密切,且更加緊湊。因此,人體骨骼模態在各類動作識別任務中有廣泛的應用,此模態往往具有比基於其他模態的演算法更輕量,更具泛化性的特點。

當然,由於骨骼點所包含資訊的侷限性,基於骨骼點的演算法很難對一些與物體或場景關係緊密的動作進行有效識別,可以說有利有弊。

目前對於基於骨骼點的動作識別這一任務, 主流的公開資料集有 NTURGB+D,NTURGB+D 120,Kinetics-400 等,下表總結了這些資料集的相關資訊及特點。 MMAction2 中提供了以下大部分資料集由 HRNet 提取的 2D 人體關鍵點,這種方式提取的人體骨骼質量較高,在各個資料集上都可以取得良好的效能。

資料集

動作類別

影片數量

骨骼點來源

資料集特點

NTURGB+D

60

57K

Kinect-V1 感測器採集 (3D) / HRNet 預測 (2D)

實驗室採集,骨骼點動作識別標準資料集,演算法效能接近飽和

NTURGB+D 120

120

114K

Kinect-V1 感測器採集 (3D) / HRNet 預測 (2D)

實驗室採集,骨骼點動作識別標準資料集

Kinetics400

400

260K

OpenPose 預測 (2D) / HRNet 預測 (2D)

通用影片資料集,非 human-centric

JHMDB

21

< 1K

2D ground truth

太小

FineGYM

99

29K

HRNet 預測 (2D)

體操方面細粒度資料集

UCF101

101

13K

OpenPose 預測 (2D) / HRNet 預測 (2D)

通用影片資料集,較小

HMDB51

51

7K

OpenPose 預測 (2D) / HRNet 預測 (2D)

通用影片資料集,較小

在骨骼動作識別中,GCN 一族的方法佔據主流地位。在基於 GCN 的方法出現之前,早期的深度學習方法將一段時間內的骨骼點座標構造為向量, 作為 RNN,LSTM 的輸入來預測行為類別。這類方法的能力較為有限,它們沒有顯式地利用骨骼點之間的空間關係,這些資訊對於理解人類動作非常重要。由於骨骼點屬於圖結構的輸入, 而圖卷積 (GCN) 比較擅長建模圖資料, 因此採用 GCN 的方法成為主流, 例如 ST-GCN, 2s-AGCN, ShiftGCN 等等。

ST-GCN

ST-GCN 是將 GCN 應用在基於骨骼點的動作識別的開山之作, 這裡首先介紹一下 ST-GCN 整體的網路結構, 如下圖所示, 首先對影片採用 OpenPose 等演算法進行姿態估計, 並構造骨骼點的時空圖。 接著利用多層時空圖卷積(ST-GCN)逐漸在圖上生成更高級別的特徵圖,最後透過 Softmax 啟用函式預測出屬於每類動作的機率大小。

超輕量更泛化!基於人體骨骼點的動作識別

資料預處理

OpenPose 是一個標註人體的關節(頸部,肩膀,肘部等),連線成骨骼,進而估計人體姿態的演算法。輸入網路的一個 batch 可以用一個5維矩陣(N, C, T, V, M)表示:

N 代表影片的數量,例如一個 batch 中有 32 個影片,則 N 等於 32

C 代表骨骼點的維度,通常一個骨骼點包含 3 個維度:

二維骨骼點:(x, y, score),其中 (x, y) 表示骨骼點座標,score 表示骨骼點的置信度(針對模型預測的骨骼點,若為 ground truth,score 可以預設)

三維骨骼點:(x, y, z),即為骨骼點的三維座標

T 代表一個樣本所採的幀數,對於 GCN 方法,這個值通常等於最長訓練影片的長度,如訓練集中最長影片含有 300 幀,則 T 設定為 300。對於更短的影片,通常採用迴圈的方式補齊幀數。

V 代表骨骼點的數量,如果是 NTU-RGB+D 資料集,V 等於 25,如果是使用 OpenPose 進行姿態估計,V 等於 18

M 代表一幀中的人數,根據情況選擇,對於 NTU-RGB+D 資料集一般為 2

上述資料在輸入 ST-GCN 之前需要先進行標準化操作,具體地說,就是標準化每個骨骼點在所有幀上的座標值。

N

C

T

V

M

=

x

size

()

# N 3 300 25(17) 2

x

=

x

permute

0

4

3

1

2

contiguous

()

# N M V C T

x

=

x

view

N

*

M

V

*

C

T

x

=

self

data_bn

x

x

=

x

view

N

M

V

C

T

x

=

x

permute

0

1

3

4

2

contiguous

()

x

=

x

view

N

*

M

C

T

V

# Nx2 3 300 25(17)

其中的 data_bn 定義如下

self

data_bn

=

nn

BatchNorm1d

in_channels

*

A

size

1

))

網路結構

ST-GCN 網路主要包括10個 block 和一個分類層, 每個 block 包括圖卷積 GCN 和時間卷積 TCN

self

st_gcn_networks

=

nn

ModuleList

((

st_gcn_block

in_channel

64

kernel_size

1

residual

=

False

**

kwargs0

),

st_gcn_block

6

64

kernel_size

1

**

kwargs

),

st_gcn_block

64

64

kernel_size

1

**

kwargs

),

st_gcn_block

64

64

kernel_size

1

**

kwargs

),

st_gcn_block

64

128

kernel_size

2

**

kwargs

),

st_gcn_block

128

128

kernel_size

1

**

kwargs

),

st_gcn_block

128

128

kernel_size

1

**

kwargs

),

st_gcn_block

128

256

kernel_size

2

**

kwargs

),

st_gcn_block

256

256

kernel_size

1

**

kwargs

),

st_gcn_block

256

256

kernel_size

1

**

kwargs

),

))

# initialize parameters for edge importance weighting

if

edge_importance_weighting

self

edge_importance

=

nn

ParameterList

([

nn

Parameter

torch

ones

self

A

size

()))

for

i

in

self

st_gcn_networks

])

else

self

edge_importance

=

1

*

len

self

st_gcn_networks

# fcn for prediction

self

fcn

=

nn

Conv2d

256

num_class

kernel_size

=

1

這裡簡單介紹一下圖卷積 GCN 的步驟,

根據圖結構建立一個鄰接矩陣

 A

,並對其進行歸一化, 得到

{\widehat{A}}

對圖輸入

X

進行普通的二維卷積,得到

XW

將歸一化的鄰接矩陣

A

和卷積提取的特徵

XW

進行聚合, 得到

 AXW

作為輸出。

def

forward

self

x

A

):

x

=

self

conv

x

n

kc

t

v

=

x

size

()

x

=

x

view

n

self

kernel_size

kc

//

self

kernel_size

t

v

x

=

torch

einsum

‘nkctv,kvw->nctw’

x

A

))

return

x

contiguous

()

作者結合運動分析研究, 將鄰接矩陣

 A

分解為 3 個子矩陣, 分別表達向心運動、離心運動和靜止的動作特徵。

具體地說,對於一個根節點,與它相連的邊可以分為 3 部分, 如下圖所示:

第 1 部分連線了空間位置上比本節點更遠離整個骨架重心的鄰居節點(黃色節點),包含了離心運動的特徵。

第 2 部分連線了更為靠近重心的鄰居節點(藍色節點),包含了向心運動的特徵。

第 3 部分連線了根節點本身(綠色節點),包含了靜止的特徵。

超輕量更泛化!基於人體骨骼點的動作識別

TCN 其實是一種普通的 CNN, 在時間維度上使用 kernel_size > 1 的卷積核進行時間維度資訊的聚合。

同時還引入殘差結構計算得到 res, 並與 tcn 的輸出相加作為一個 block 的輸出。

def

forward

self

x

A

):

res

=

self

residual

x

x

A

=

self

gcn

x

A

x

=

self

tcn

x

+

res

return

self

relu

x

),

A

在網路的最後, ST-GCN 使用全域性平均池化以及 1x1 卷積輸出預測類別

# global pooling

x

=

F

avg_pool2d

x

x

size

()[

2

:])

x

=

x

view

N

M

-

1

1

1

mean

dim

=

1

# prediction

x

=

self

fcn

x

x

=

x

view

x

size

0

),

-

1

return

x

2s-AGCN

2s-AGCN 是對 ST-GCN 的改進, 發表在 CVPR2019, 論文提出了一個雙流自適應圖卷積網路, 主要的創新點有兩個:

提出了自適應的圖卷積

使用雙流網路利用骨骼點的一階和二階資訊

先回顧一下 ST-GCN 的整體公式, 如下所示

超輕量更泛化!基於人體骨骼點的動作識別

{W_k}

是權重,

{A_k}

是鄰接矩陣,

{A_k}

是注意力掩碼,

 {K_v}

是子圖的個數, 一般為 3 (靜止,向心,離心)。

ST-GCN 的注意力掩碼是與鄰接矩陣直接相乘, 這會造成一個問題: 如果鄰接矩陣

{A_k}

裡面部分元素為 0, 無論

{M_k}

對應元素為何值, 最後結果都為 0。 對於類似“行走”動作,手和腿的聯絡很大,但是手和腿沒有直接相連,所以效果不好。其次, ST-GCN 只利用了骨骼點資料的一階特徵(骨骼點座標), 沒有利用骨骼點的二階特徵(關節的長度和方向)。

針對第一個問題, 2s-AGCN 提出的自適應圖卷積的整體公式如下:

超輕量更泛化!基於人體骨骼點的動作識別

相比ST-GCN, 2s-AGCN的鄰接矩陣是三個部分之和。

第一部分

{A_k}

ST-GCN 與 ST-GCN 的鄰接矩陣

Ak

相同,

第二部分

{B_k}

是一個可訓練的

{N \times N}

矩陣, 它不僅能表示兩個骨骼點之間是否存在聯絡, 而且能表示聯絡的強弱,

第三部分

{C_k}

是針對每個樣本學習一個特有的圖, 使用高斯嵌入函式來捕捉兩個骨骼點之間的相似性,透過 Softmax 處理生成 0-1 的機率。

超輕量更泛化!基於人體骨骼點的動作識別

針對上述第二個問題, 作者提出了雙流法, 一個分支輸入骨骼點的座標資訊, 另一個分支輸入骨骼 (bone) 的長度和方向。 長度和方向看起來比座標要複雜,其實很簡單。首先尋找一個人體骨骼的重心,就是人胸腔部分作為中心點,因為每個骨骼都有兩個點,把靠近中心點的骨骼點看做源骨骼點,遠離中心點的骨骼點看做目標骨骼點。骨骼就是從一個點指向另外一個點的向量,向量的長度就是骨骼的長度,向量的方向就是骨骼的方向。 因為骨骼 (bone) 是兩個骨骼點 (skeleton) 組成,而且沒有環狀的骨骼點圖,所以骨骼點數比骨骼數多 1 個。這裡新增一個值為 0 的空骨骼,這樣骨骼點數與骨骼數就相同,網路也相同。最後雙流法的框架如下圖。

超輕量更泛化!基於人體骨骼點的動作識別

除了基於 GCN 的方法外, 還有一些工作使用 CNN-based 的方法解決基於骨骼點的行為識別任務, 例如 PoTion(2D-CNN), PoseC3D(3D-CNN) 等。

PoTion

PoTion 是一種基於 2D-CNN 的骨骼點行為識別演算法, 基於實時姿態估計算法[4]提取每一幀的姿態資訊,獲得骨骼點的熱力圖, 接著根據幀所在的時間維度給熱力圖上色, 然後針對每一個關節 (joint), 把所有幀上的熱力圖相加作為輸入傳給一個包含 6 個卷積層和一個 FC 層的 2D-CNN 網路進行行為識別預測。 PoTion 方法還可以與傳統雙流網路 (RGB 和 Optical Flow) 相結合, 提高動作識別的效能。 但是不足的地方在於該演算法採用上色的聚合方式會帶來一定的資訊丟失。

超輕量更泛化!基於人體骨骼點的動作識別

PoseC3D

PoseC3D 是一種基於 3D-CNN 的骨骼點行為識別演算法。 跟基於 GCN 的方法不同的是, PoseC3D 基於提取好的 2D 姿態, 生成

{K\times H \times W}

的二維關鍵點熱圖 ( K 是骨骼點的數量), 再堆疊影片中T幀熱圖 構成

{K \times T \times H \times W}

的 3D 熱圖作為骨骼點模態的輸入。 同時, PoseC3D 還將骨骼點模態與其他模態(如 RGB 的特徵)進行融合, 從而得到更好的識別效果。PoseC3D 網路整體結構如下:

超輕量更泛化!基於人體骨骼點的動作識別

PoseC3D-SlowFast 包含兩個分支, 分別處理 RGB 和骨骼點模態, RGB 分支具有低幀率以及更大的網路寬度,骨骼點分支具有高幀率和更小的網路寬度。兩分支間存在雙向連線,以促進模態間的特徵融合。模型將兩分支的預測結果融合,作為最終的預測。

目前 MMAction2 中 skeleton-based 的行為識別演算法在各 benchmark 資料集上和 SOTA 的結果對比如下:

Dataset

MMAction2

previous SOTA

NTURGB+D 60 Xsub

94。1

91。5

NTURGB+D 60 XView

97。1

96。6

NTURGB+D 120 Xsub

86。9

86。9

NTURGB+D 120 XSet

90。3

88。4

FineGYM

94。3

25。2

UCF101

87。0

65。2

HMDB51

69。3

55。3

關注瞭解

MMAction2 現在已經支援 ST-GCN 和 PoseC3D 演算法, 後續還會支援更多行為識別演算法以及與 skeleton 相關的任務演算法, 敬請期待~~ 同時, 有興趣瞭解更多影片內容理解的內容, 可前往 Github, 歡迎關注 star, fork ~

Reference

[1] Spatial Temporal Graph Convolutional Networks for Skeleton-Based Action Recognition

[2] PoTion: Pose MoTion Representation for Action Recognition

[3] Two-Stream Adaptive Graph Convolutional Networks for Skeleton-Based Action Recognition

[4] Realtime multi-person 2D pose estimation using part affinity field

[5] Revisiting Skeleton-based Action Recognition