論文閱讀筆記 — 3D人體姿態辨識 XNect: Real-time Multi-Person 3D Motion Capture with a Single RGB Camera

Hung-Chih Chiu
14 min readDec 28, 2020

--

這周要分享的3維動作識別論文為XNect, 文章原始連結如下:

Youtube上面有模型運行的介紹:

這篇與VNect是同一團隊所發布新的模型, 關於VNect的介紹可以參閱我前面的文章:

這篇文章也是針對多人的三維動作預測模型, 依據論文的描述, 在512x320影像大小下, 多人模型的動作預測可以達到30fps的速度.

作者提到先前多人3維人體模型的推論速度多在10~15fps, 例如Multi-Person 3D Human Pose Estimation from Monocular Images或是LCR-Net++: Multi-person 2D and 3D Pose Detection in Natural Images, 或是進行離線的預測, 例如Camera Distance-aware Top-down Approach for 3D Multi-person Pose Estimation from a Single RGB Image, 這幾篇文章剛好在我前幾周的介紹裡都有提到, 有興趣的可以分別參閱下列連結.

而模型預測的結果如圖1所示, 可以及時執行多人3維動作辨識, 在複雜的場景與多人的環境下, 並能將虛擬的人物擬和在場景中.

圖1 XNect及時識別結果

模型架構如圖2所示, 從圖中可以看到XNect將整個流程分為3個Stage, Stage 1主要是得到影像中關鍵點2維與3維位置, Stage 2是全連接層的架構, 藉由Stage 1所得到的2維與3維關鍵點的資訊, 經全連接層組成每個區域座標下人體的骨幹, 並在Stage 3中組成全域座標空間中的位置.

圖2 XNect模型架構

在開始講解前要了解作者對於一些參數符號的定義, 輸入影像I的長寬分別包含w與h個像素, 產生的3維座標 P3Dk符號如下, 其中k代表影像中共有K個人物, 每個人物身上關鍵點的座標共有3xJ, J代表人體上面J個關鍵點, 這些關鍵點的座標是相對於人體骨盆中心(pelvis)表示.

在Stage 1下有一個核心網路, 核心網路最後的輸出分別為長h/16與寬w/16大小的feature map, 接著核心網路輸出的有兩個分支, 分別是2D Branch做關鍵點2維座標輸出, 以及3D Branch做3維座標輸出, 不管是2維還是3維的feature map, 最終輸出大小都是相同的w/8與h/8. 圖2 Stage 1中每個區塊內的數字代表輸出feature map的深度.

2D Branch的輸入是核心網路的輸出, 經後續1x1(綠色區塊)與3x3(藍色區塊) convolution layer與de-convolution layer(藍色區塊)之後輸出w/8與h/8大小的feature map. 輸出feature map的深度為J+2J, 其中第一個J代表J個關鍵點的confidence map, 以符號H表示

後面的2J則是Part Affinity Field, 代表影像中某個人體肢段的單位向量, 影像中的像素只要是在這個肢段內就會以該單位向量表示, 因為平面影像上分別有u與v兩個方向, 因此是2J, 符號以F表示.

以上這個概念來自OpenPose, 如果想要進一步了解OpenPose相關介紹可以參閱我先前的文章:

經由這個步驟得到的每個關鍵點的座標P2Dk是以影像的像素座標做為表示.

3D Branch的輸入除了核心網路的輸出外, 還包含了2D Branch前兩層convolution後的feature map. 3D Branch的輸出feature map以L表示, 深度為3xJ. 是以每個關鍵點以及與他連接關鍵點的相對位置來做表示.

而以兩點之間相對位置作為關鍵點標示的做法與先前的VNect類似, 只是VNect是以關鍵點與區域中心點(Pelvis)的偏移向量作為其座標的表示, XNect則是以與關鍵點相連關鍵點的偏移向量(由較遠的關鍵點相較於較近關鍵點的偏移)做為表示, 而表示的結果如圖3所示.

圖3 Stage1 3D Branch的輸出

由圖3右側可以看出共有J列, 代表J個關鍵點, 而每列中共有3xJ行, 3為(x, y, z)的組合, 代表的不是座標, 而是關鍵點相較於鄰近點的偏移向量, 如果我們以右肩膀 (圖3左側的點3)為例, 因為點3與點2還有點4連結, 因此在l3的列向量中只有(x3, y3, z3)與(x4, y,4, z4)等位移向量會有ground truth, 可經由訓練資料進行監督式學習, 其中(x3, y3, z3)代表點3相對於點2的向量, (x4, y,4, z4)則代表點4相對於點3的向量, 依據前面的定義, 我覺得圖3右側列出可做監督式學習的標註有些問題.以l1的向量表示式, 依據前面的定義, (x1, y1, z1)應該是點1相對於點0 (中心點或root joint??)的向量, 而點1的向量表示式應該描述成點2相對於點1, 因此應該放在(x2, y2, z2)向量裡, 這部分不知道是我理解錯誤還是l1, l2, l3等裡面的位置定義有誤, 會需要進一步確認程式的寫法才可以確認.

Stage 1的最終輸出如圖4所示, 2D Branch會輸出2維關鍵點的座標P2Dk以及關鍵點的confidence map C, 3D Branch會輸出關鍵點與鄰近點的相對向量座標L. 這兩個輸出組合成K x J x (3+3*J)維資料. K代表影像內的K個人, J為每個人身上全部的關鍵點, 而每個關鍵點內包含3組2維的資料 (2個影像的u, v座標與1個confidence map值), 以及3*J組3維的座標向量如圖3所描述.

圖4 Stage 1的輸出

而Stage 1中的核心網路與2D Branch是透過MPII與LSP先做單人2維資料的訓練, 接著再在多人的MS-COCO資料集下進行訓練, 之後再把3D Branch加入, 並用MS-COCO以及MuCo-3DHP資料集進行訓練.

Stage 1得到的2維人體座標P2Dk會轉換成以脖子為中心點的座標送入Stage 2, Stage 2是5層全連接層的架構, 架構如圖5所示, 最後輸出以root joint為中心點的人體3維座標P3Dk.

圖5 Stage2 fully connected架構

Stage 2的模型訓練採用的是MuCo-3DHP資料集, 經Stage 1得到2維與3維的人體資料, 送入Stage 2再與資料集中的ground truth比對進行訓練, 使用的是smooth-L1的loss function.

有了Stage 1與Stage 2預測所得到張影像中人體2維與3維座標, 在Stage 3中會針對前面兩個階段得到的座標做每個人的人物追蹤(identity tracking), 並利用肢段的長度或人體的高度做3維空間中的定位, 並為了確保3維運動骨架模型(kinematic skeleton)在空間中穩定度, 加入了限制條件以確保3維骨架的穩定度. 以下將針對這幾項各別進行說明.

首先是做人物追蹤的部分, 針對每個時間frame t裡面的ID P是參考前一個時間t-1的ID, 如下面的定義 Pi[t]與Pk[t-1]

要比對前後兩個frame之間的ID是否代表同一個人物, 作者採用了3個條件分別有1. 2D平面關鍵點座標的差異, 2. 3D關鍵點座標的差異與3. 外觀是否有差異. 第1項與第2項容易理解, 而外觀的部分採用的是辨識出人體影像的上半身部分, 上半身影像採用HSV的色彩空間, HSV是將RGB的色彩空間改以Hue(色相), Saturation(飽和度), Value(明度)等3個變數並以圓柱座標的方式表示如圖6所示.

圖6 HSV表示方式

針對每一個人體上半部的影像, 作者將色相與飽和度各區分出30個維度, 並以影像內共60維度的分布作為這個區塊的外觀代表Ai[t].

而ID是否相同則是判斷當前frame t與上一個frame t-1的外觀相似度如下:

以及2維關鍵點的相似度如下:

還有3維關鍵點的相似度如下:

綜合以上3個相似度的條件以判斷影像中的人物是否屬於同一ID. 而每一個ID的前10個frame可以用來計算該人物的平均的骨頭長度與高度, 計算這個的目的用於Stage 3下運動骨架的擬合.

運動骨架模型以下列式子表示, θk代表骨架關節的自由度, 維度為D, 共有29個, 前6個為root joint與世界座標的位移與旋轉.

而骨架模型的θk利用下列式子進行計算

式子中第一項為E3D為骨架模型關鍵點3維位置與模型預測得到的3維關鍵點P3Dk,j取L2 norm, 式子如下, 其中P3Dk,j是經模型在Stage 2預測得到的3維關鍵點位置, P-(θk,bk)則是骨架模型透過肢段長度bk與骨架關節角度θk所回推得到關鍵點的3維位置. E3D的乘數ω3D為9e-1.

第2項為E2D為骨架模型關鍵點2維位置與經模型在Stage 1預測得到的2維關鍵點P2Dk,j取L2 norm如下, 其中P2Dk,j是經模型Stage 1預測得到的2維關鍵點位置, ω2Dj是每個關鍵點各自的超參數, 下肢關鍵點的權重都是採用1.7, 手肘是1.5, 手腕是2.0, 其他軀幹的關鍵點如肩膀, 脖子, 髖關節等都取1. cj,k則是每個關鍵點的2維信心分數, П是投影到攝影機平面的轉換矩陣, 因為P(θk,bk)的模型輸出是單位高度, 需再藉由hk還原為影像座標. E2D的乘數ω2D為1e-5.

第3項為Elim用來限制每個關節的角度如下, 如果關節角度在θmin與θmax之間則該項為0, 反之如果低於θmin或是大於θmax, 則會計算多出的角度做為懲罰, 式子中可以看到j是從7開始, 因為前6項是與世界座標的平移與旋轉. Elim的乘數ωlim為5e-1.

第4項為Etemp用來確保動作的平順度, 取這次frame t與前一個時間點t-1的關節角度變化量▽θ的L2差異. Etemp的乘數ωtemp為1e-7.

最後一項Edepth同樣用來確保動作的平順度, 定義如下, 其中θk,2為貢獻根位置z分量的自由度(the degree of freedom that derives the z-component of the root position), 同樣是前後frame的差異. Edepth的乘數ωdepth為8e-6.

最終求取對θk的偏微如下, 透過gradient descent以計算出θk.

核心網路的部分, 作者將其命名為SelecSLS, 模型架構如表1所示, 表中k代表feature深度, n0是每個SelecSLS module的輸出 (feature 深度??).

表1 SelecSLS模型架構

SelecSLS的模型是由多個模組組合而成, 模組架構如下, 圖7 b)的架構應該是表1中的L3, 後3層的輸入都有第一層的Module輸出 (虛線的部分).

圖7 SelecSLS模組架構

核心網路的使用作者也比較了SelecSLS與ResNet-34和ResNet-50, 發現使用SelecSLS可較ResNet-50快約1.3~1.8倍, 並維持與ResNet-50相同的準度如表2所示.

表2 核心網路架構比較

在記憶體的使用上, SelecSLS所需的記憶體也僅只有ResNet-50需求的50%~80%.

模型的運算速度在Intel i7–8780H搭配1080-MaxQ的筆記型電腦上面, 以512x320像素的webcam作為影像輸入, 可以達到接近27fps的推論速度, 其中Stage 1需要21.5mS, Stage 2需要1mS, Stage 3需要9mS(包含ID確認的2.4mS以及骨架貼合的6.8mS).

而與其他模型在MuPoTS-3D資料集下比較結果如表3所示, 其中分為All與Matched兩大列, All代表所有標註關鍵點位置都進行比較, Matched則只有比對本模型有識別到的人體關鍵點的誤差, 在準確度中只有落後我們前幾個禮拜介紹的Camera Distance-aware Top-down Approach for 3D Multi-person Pose Estimation from a Single RGB Image.

表3 與其他模型在MuPoTS-3D資料集下比較結果

--

--