近日筆者在閱讀Shift-GCN[2]的文獻,Shift-GCN是在傳統(tǒng)的GCN的基礎(chǔ)上,用Shift卷積算子[1]取代傳統(tǒng)卷積算子而誕生出來的,可以用更少的參數(shù)量和計算量達到更好的模型性能,筆者感覺蠻有意思的,特在此筆記。 本文轉(zhuǎn)載自徐飛翔的“Shift-GCN網(wǎng)絡(luò)論文筆記”
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
Shift-GCN是用于骨骼點序列動作識別的網(wǎng)絡(luò),為了講明其提出的背景,有必要先對ST-GCN網(wǎng)絡(luò)進行一定的了解。
ST-GCN網(wǎng)絡(luò)
骨骼點序列數(shù)據(jù)是一種天然的時空圖結(jié)構(gòu)數(shù)據(jù),具體分析可見[5,6],針對于這類型的數(shù)據(jù),可以用時空圖卷積進行建模,如ST-GCN[4]模型就是一個很好的代表。簡單來說,ST-GCN是在空間域上采用圖卷積的方式建模,時間域上用一維卷積進行建模。
骨骼點序列可以形式化表達為一個時空圖,其中有著
個關(guān)節(jié)點和
幀。骨骼點序列的輸入可以表達為
,其中
表示維度。為了表示人體關(guān)節(jié)點之間的連接,我們用鄰接矩陣表達。按照ST-GCN原論文的策略,將人體的鄰接矩陣劃分為三大部分:1)離心群;2)向心群;3)根節(jié)點。具體的細節(jié)請參考論文[4]。每個部分都對應(yīng)著其特定的鄰接矩陣
,
其中
表示劃分部分的索引。用符號
和
分別表示輸入和輸出的特征矩陣,其中
和
是輸入輸出的通道維度。那么,根據(jù)我們之前在GCN系列博文[7,8,9]中介紹過的,我們有最終的人體三大劃分的特征融合為:
其中P = { 根 節(jié) 點 , 離 心 群 , 向 心 群 } ,是標準化后的鄰接矩陣,其中
,具體這些公式的推導(dǎo),見[7,8,9]。其中的
是每個人體劃分部分的1x1卷積核的參數(shù),需要算法學(xué)習(xí)得出。整個過程如Fig 1.1所示。
ST-GCN的缺點體現(xiàn)在幾方面:
- 計算量大,對于一個樣本而言,ST-GCN的計算量在16.2GFLOPs,其中包括4.0GFLOPs的空間域圖卷積操作和12.2GFLOPs的時間一維卷積操作。
- ST-GCN的空間和時間感知野都是固定而且需要人為預(yù)先設(shè)置的,有些工作嘗試采用可以由網(wǎng)絡(luò)學(xué)習(xí)的鄰接矩陣的圖神經(jīng)網(wǎng)絡(luò)去進行建模[10,11],即便如此,網(wǎng)絡(luò)的表達能力還是受到了傳統(tǒng)的GCN的結(jié)構(gòu)限制。
Shift-GCN針對這兩個缺點進行了改進。
Shift-GCN
這一章對Shift-GCN進行介紹,Shift-GCN對ST-GCN的改進體現(xiàn)在對于空間信息(也就是單幀的信息)的圖卷積改進,以及時序建模手段的改進(之前的工作是采用一維卷積進行建模的)。
Spatial Shift-GCN
Shift-GCN是對ST-GCN的改進,其啟發(fā)自Shift卷積算子[1],主要想法是利用1x1卷積算子結(jié)合空間shift操作,使得1x1卷積同時可融合空間域和通道域的信息,具體關(guān)于shift卷積算子的介紹見博文[12],此處不再贅述,采用shift卷積可以大幅度地減少參數(shù)量和計算量。如Fig 2.1所示,對于單幀而言,類似于傳統(tǒng)的Shift操作,可以分為Graph Shift和1x1 conv兩個階段。然而,和傳統(tǒng)Shift操作不同的是,之前Shift應(yīng)用在圖片數(shù)據(jù)上,這種數(shù)據(jù)是典型的歐幾里德結(jié)構(gòu)數(shù)據(jù)[7],數(shù)據(jù)節(jié)點的鄰居節(jié)點可以很容易定義出來,因此卷積操作也很容易定義。而圖數(shù)據(jù)的特點決定了其某個數(shù)據(jù)節(jié)點的鄰居數(shù)量(也即是“度”)都可能不同,因此傳統(tǒng)的卷積在圖數(shù)據(jù)上并不管用,傳統(tǒng)的shift卷積操作也同樣并不能直接在骨骼點數(shù)據(jù)上應(yīng)用。那么就需要重新在骨骼點數(shù)據(jù)上定義shift卷積操作。
作者在[2]中提出了兩種類型的骨骼點Shift卷積操作,分別是:
- 局部Shift圖卷積(Local Shift Graph Convolution)
- 全局Shift圖卷積(Global Shift Graph Convolution)
下文進行簡單介紹。
局部shift圖卷積
在局部shift圖卷積中,依然只是考慮了骨骼點的固有物理連接,這種連接關(guān)系與不同數(shù)據(jù)集的定義有關(guān),具體示例可見博文[13],顯然這并不是最優(yōu)的,因為很可能某些動作會存在節(jié)點之間的“超距”關(guān)系,舉個例子,“拍掌”和“看書”這兩個動作更多取決于雙手的距離之間的變化關(guān)系,而雙手在物理連接上并沒有直接相連。
盡管局部shift圖卷積只考慮骨骼點的固有連接,但是作為一個好的基線,也是一個很好的嘗試,我們開始討論如何定義局部shift圖卷積。如Fig 2.2所示,為了簡便,我們假設(shè)一個骨架的骨骼點只有7個,連接方式如圖所示,不同顏色代表不同的節(jié)點。對于其中某個節(jié)點 ,
而言,用
表示節(jié)點v vv的鄰居節(jié)點,其中
是
鄰居節(jié)點的數(shù)量。類似于傳統(tǒng)的Shift卷積中所做的,對于每一個節(jié)點的特征向量
,其中
是通道的數(shù)量,我們將通道均勻劃分為
份片區(qū),也即是每一份片區(qū)包含有
個通道。我們讓第一份片區(qū)保留本節(jié)點(也即是
節(jié)點本身)的特征,而剩下的
個片區(qū)分別從鄰居
中通過平移(shift)操作得到,如式子(2.1)所示。用
表示單幀的特征,用
表示圖數(shù)據(jù)shift操作之后的對應(yīng)特征,其中
表示節(jié)點的數(shù)量,
表示特征的維度,本例子中
。
整個例子的示意圖如Fig 2.2所示,其中不同顏色的節(jié)點和方塊代表了不同的節(jié)點和對應(yīng)的特征。以節(jié)點1和節(jié)點2的shift操作為例子,節(jié)點1的鄰居只有節(jié)點2,因此把節(jié)點1的特征向量均勻劃分為2個片區(qū),第一個片區(qū)保持其本身的特征,而片區(qū)2則是從其對應(yīng)的鄰居,節(jié)點2中的特征中平移過去,如Fig 2.2的Shift for node 1所示。類似的,以節(jié)點2為例子,節(jié)點2的鄰居有節(jié)點4,節(jié)點1,節(jié)點3,因此把特征向量均勻劃分為4個片區(qū),同樣第一個片區(qū)保持其本身的特征,其他鄰居節(jié)點按照序號升序排列,片區(qū)2則由排列后的第一個節(jié)點,也就是節(jié)點1的特征平移得到。類似的,片區(qū)3和片區(qū)4分別由節(jié)點3和節(jié)點4的對應(yīng)片區(qū)特征平移得到。如Fig 2.2的Shift for node 2所示。最終對所有的節(jié)點都進行如下操作后,我們有如Fig 2.2的The feature after shift所示。
全局shift圖卷積
局部shift圖卷積操作有兩個缺點:
- 只考慮物理固有連接,難以挖掘潛在的“超距”作用的關(guān)系。
- 數(shù)據(jù)有可能不能被完全被利用,如Fig 2.2的節(jié)點3的特征為例子,如Fig 2.3所示,節(jié)點3的信息在某些通道遺失了,這是因為不同節(jié)點的鄰居數(shù)量不同。
為了解決這些問題,作者提出了全局Shift圖卷積,如Fig 2.4所示。其改進很簡單,就是去除掉物理固有連接的限制,將單幀的骨骼圖變成完全圖,因此每個節(jié)點都會和其他任意節(jié)點之間存在直接關(guān)聯(lián)。給定特征圖,對于第i ii個通道的平移距離
。這樣會形成類似于螺旋狀的特征結(jié)構(gòu),如Fig 2.4的The feature after shift所示。
為了挖掘骨骼完全圖中的人體關(guān)鍵信息,把重要的連接給提取出來,作者在全局shift圖卷積基礎(chǔ)上還使用了注意力機制,如式子(2.2)所示。
Temporal Shift-GCN
在空間域上的shift圖卷積定義已經(jīng)討論過了,接下來討論在時間域上的shift圖卷積定義。如Fig 2.5所示,考慮到了時序之后的特征圖層疊結(jié)果,用符號表示時空特征圖,其中有
。這種特征圖可以天然地使用傳統(tǒng)的Shift卷積算子,具體過程見[12],我們稱之為naive temporal shift graph convolution。在這種策略中,我們需要將通道均勻劃分為
個片區(qū),每個片區(qū)有著偏移量為
。與[12]策略一樣,移出去的通道就被舍棄了,用0去填充空白的通道。這種策略需要指定u uu的大小,涉及到了人工的設(shè)計,因此作者提出了adaptive temporal shift graph convolution,是一種自適應(yīng)的時序shift圖卷積,其對于每個通道,都需要學(xué)習(xí)出一個可學(xué)習(xí)的時間偏移參數(shù)
。如果該參數(shù)是整數(shù),那么無法傳遞梯度,因此需要放松整數(shù)限制,將其放寬到實數(shù),利用線性插值的方式進行插值計算,如式子(2.3)所示。
其中是由于將整數(shù)實數(shù)化之后產(chǎn)生的余量,需要用插值的手段進行彌補,由于實數(shù)化后,錨點落在了
之間,因此在這個區(qū)間之間進行插值。
網(wǎng)絡(luò)
結(jié)合spatial shift-gcn和temporal shift-gcn操作后,其網(wǎng)絡(luò)基本單元類似于ST-GCN的設(shè)計,如Fig 2.6所示。
Update 20201130:來自一個知乎朋友的問題:
ID:fightingQ:好巧啊,又跟你看到同一篇論文了。不知道還記得我嗎。這里的naive temporal shift 寫的不詳細。不知道我理解的對不對,想跟你探討一下。對于每一個節(jié)點的c個通道,劃分為u個部分。每個部分分別替換為其第-u,,,0,1,u幀處的對應(yīng)特征,其中0指的是節(jié)點本身的這一部分特征。這樣每一個節(jié)點就會包含了2u+1幀的信息。在adaptive中,每個通道都設(shè)置了一個可學(xué)習(xí)的移動參數(shù),但是這個移動參數(shù)是怎么來學(xué)的。我隨意設(shè)置這樣一個學(xué)習(xí)的shift參數(shù),學(xué)習(xí)的依據(jù)是啥呢?
回答:正如原文所講的,其中的naive temporal shift完全是按照傳統(tǒng)的shift卷積算子操作進行計算的,具體見[1]。我們知道,進行通道上的shift操作的目的在于改變卷積的感知野,因此文中提到的超參數(shù)其實就是控制了每一層的時序感知野大小,但是這樣有幾個缺點:
- 卷積是具有層次結(jié)構(gòu)的,每一層的u uu如果都一樣,那么感知野理論上也是一樣的,這樣不合理,因此卷積的層次結(jié)構(gòu)意味著感知野大小不一定一致。
- 需要人工去設(shè)置這個超參數(shù)
,對于不同數(shù)據(jù)集的結(jié)果都不一樣,工作量大。
因此,引入了所謂的自適應(yīng)時序 shift,其出發(fā)點就是通過反向梯度傳播去學(xué)習(xí)每一層的感知野,也就是每一層都有一個,因為需要確保可以求導(dǎo),這個參數(shù)必須是保證為浮點數(shù)才能存在梯度,因此shift操作被泛化到插值操作,正如式子(2.3)所示。
其實原論文對這個自適應(yīng)學(xué)習(xí)出來的參數(shù)進行了可視化,如Fig a1所示,作者對于不同的數(shù)據(jù)集(NTU RGBD和NW-UCLA)上進行了adaptive temporal shift的每一層的結(jié)果的可視化(具體分析見原論文),簡單來說,頂層(top layer, 也即是輸出層)的值范圍都比較大(表現(xiàn)為值的范圍比較寬廣),意味著輸出層需要的時序感知野比較大,這一點很容易理解,因為輸出層需要更多的時序語義信息,因此感知野比較大是正常的;而底層(bottom layer,也即是輸入層)的值范圍都比較小,這一點也很好理解,輸入層更多的是單幀的底層信息建模(比如紋理,色彩,邊緣信息等),因此時序感知野比較小是正常的。
通過這種自適應(yīng)的學(xué)習(xí)手段,確保了對不同層的shift系數(shù)的獨立學(xué)習(xí),因此使得不同層具有不同的時序感知野。
以上。
Reference
[1]. Wu, B., Wan, A., Yue, X., Jin, P., Zhao, S., Golmant, N., … & Keutzer, K. (2018). Shift: A zero flop, zero parameter alternative to spatial convolutions. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (pp. 9127-9135).
[2]. Cheng, K., Zhang, Y., He, X., Chen, W., Cheng, J., & Lu, H. (2020). Skeleton-Based Action Recognition With Shift Graph Convolutional Network. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 183-192).
[3]. https://fesian.blog.csdn.net/article/details/109474701
[4]. Sijie Yan, Yuanjun Xiong, and Dahua Lin. Spatial temporal graph convolutional networks for skeleton-based action recognition. In Thirty-Second AAAI Conference on Artificial Intelligence, 2018.
[5]. https://fesian.blog.csdn.net/article/details/105545703
[6]. https://blog.csdn.net/LoseInVain/article/details/87901764
[7]. https://blog.csdn.net/LoseInVain/article/details/88373506
[8]. https://fesian.blog.csdn.net/article/details/90171863
[9]. https://fesian.blog.csdn.net/article/details/90348807
[10]. Lei Shi, Yifan Zhang, Jian Cheng, and Hanqing Lu. Skeleton-based action recognition with directed graph neural networks. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 7912–7921, 2019
[11]. Lei Shi, Yifan Zhang, Jian Cheng, and Hanqing Lu. Two stream adaptive graph convolutional networks for skeleton based action recognition. In The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), June 2019.
[12]. https://fesian.blog.csdn.net/article/details/109474701
[13]. https://fesian.blog.csdn.net/article/details/108242717