SMPL模型是一種參數化人體模型,是馬普所提出的一種人體建模方法,該方法可以進行任意的人體建模和動畫驅動。這種方法與傳統的LBS的最大的不同在於其提出的人體姿態影像體表形貌的方法,這種方法可以模擬人的肌肉在肢體運動過程中的凸起和凹陷。因此可以避免人體在運動過程中的表面失真,可以精準的刻畫人的肌肉拉伸以及收縮運動的形貌。
該方法中β和θ是其中的輸入參數,其中β代表是個人體高矮胖瘦、頭身比等比例的10個參數,θ是代表人體整體運動位姿和24個關節相對角度的75個參數。
β參數是ShapeBlendPose參數,可以通過10個增量模板控制人體形狀變化: 具體而言:每個參數控制人體形態的變化可以通過動圖來刻畫:
PoseBlendShape參數是給出肌肉的凸起與凹下去與人體姿態,但是一般都優化算法都不採用poseBlendShape參數,因爲PoseBlendShape項的懲罰能量的Landscape不利於非線性優化算法的迭代優化。
但是如果要與Kinect給出的25個參數進行匹配直接進行是不夠的,因爲兩者的關節節點是不匹配的。其中原因在於SMPL不但需要考慮基本的人體構型,還需要考慮關節密度能否控制點的運動,因此胸部並無明顯關節的情況下,增加了幾個關節,而手上的關節數量較少。此外需要注意因爲SMPL爲了較好的人體模型表達,因此較爲精細的部位增加了較多的點數,如手指部分,按照正常人面積應該點數較少,但這對於SMPL模型不利。
按照doublefusion的思路可以用測地線距離(geodesic distance)爲度量進行簡化,簡化後的模型爲了保證關節的正確性,需要額外加入關節附近的頂點索引,此外由於頂點的抽離,在weights、Jregressor、Shape_Tensor、Mean-vertices都應該相應變化,並重新利用Python等語言的腳本進行處理寫成新的模型文件(.pkl或Json)。
在實際的關節運動中,由於是級聯的鉸鏈的運動(Articulated),因此在CPU或者GPU中都需要進行順序運算,類似於Ai=Ai-1*Bi,從根節點出發到肢體關節點遍歷類似於比遍歷一棵特定深度的樹,而樹的深度決定順序運算的最長鏈,樹深度越長並行性越差,按照SMPL原始定義從尾骨位置出發的三叉樹深度爲9,在此種情況下GPU的單個warp最後的兩個if會出問題,樹的葉子節點深度分別爲6,9,9, 5,5,而修改根節點爲原來3號節點後,葉子節點的深度變爲4,7,7,7,7,因此樹深度下降,樹平衡性增加,求解節點旋轉平移的並行性提高。有望提高節點RT計算速度以及提高後續雅各比矩陣的稀疏性。
Json的索引需要重新排布,
對照表:
smpl [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
new: [ 3 7 8 1 12 13 0 16 17 2 20 21 4 5 6 9 10 11 14 15 18 19 22 23 ]
之前寫錯成了:(21號重複了兩遍)
new: [ 3 7 8 1 12 13 0 16 17 2 20 21 4 5 6 9 10 11 14 21 18 19 22 23 ]
GMM的默認的8箇中心姿態:
更改後的關節點編號 原始的關節點編號
Kinect關節點 SMPL模型關節點
我整理的kinect與SMPL模型關節點對應關係如上圖和下表所示, 但並非嚴格的對應關係。
Table = [ 0 16 12 1 17 13 18 14 15 19 20 4 8 9 10 5 6 7 11 ; %% Kinect
0 1 2 3 4 5 7 8 11 10 12 17 16 18 20 19 21 23 24 ]; %% SMPL
此外從Kinect中人體姿態爲T-pose時候可以直接推出人體的部分β參數,如關於人體高矮、頭身比例、肢體相關的比例等,但是不能得到胖瘦相關的參數,根據實際實驗可以得到前五個參數,後面五個參數較難獲得,甚至會因爲無法獲得而取得較大數值,導致人體模型嚴重失真。
爲了對人體模型進行約束,作者還給了人體姿態的GMM模型參數,該模型由八個中心構成。 其中最大概率的GMM的並非爲人站成T-pose狀態下。 在利用GMM作爲非線性優化重建人體模型相關研究中,GMM一般以對數的形式出現,但是此時需要注意的是目標懲罰函數並非以原始的概率密度的對數作爲優化項,而是有一個constant項,甚至爲了符合一般性,會先計算出貢獻最大的多分佈中在特定姿態下概率密度最大的分佈,然後乘以相應的固定常數,然後進行優化。