3DMM之EOS 原理解析
一:簡介
eos: 一個輕量級的頭型3D Morphable面部模型擬合庫
GitHub - patrikhuber/eos: A lightweight 3D Morphable Face Model fitting library in modern C++14
1 目前支持以下三種3DMM
Surrey Face Model (SFM),
4D Face Model (4DFM)
Basel Face Model (BFM) 2009
2 使用到的計算相關庫 Eigen,glm
3 其中具體示例代碼對應的是一個低分辨率的SFM模型sfm_shape_3448.bin
3D 頂點數(shù): 3448個
三角形個數(shù):6736個
輸入特征點個數(shù):68個
PCA:
形狀PCA: 63 個特征向量 63 * (3448 * 3)
表情PCA: 6 個特征向量 6 * (3448 * 3)
提供了三個文件
1 ? 2D與3D特征點序號對應關系表:
landmarks 與 3D mesh頂點對應數(shù)據(jù):只有內部的50個頂點;不包含16個輪廓點。
下巴底部點有對應的3D頂點,1-8為右輪廓點,10-17位左輪廓點
2 ? 3D mesh 可能為邊緣輪廓點的序號,分左邊輪廓和右邊輪廓
3D mesh上可能的邊緣輪廓點序號,左輪廓有17個候選點,右輪廓有17個候選點;
3 ? ?相鄰面,相鄰頂點關系圖
根據(jù)三角形關系可以得到10184個邊,可以一個10184*2 的頂點相鄰關系矩陣
根據(jù)這10184個邊,每一個邊對應兩個三角形面,可以得到10184*2的三角形相鄰關系矩陣
圖1:2D與3D特征點序號對應關系表
圖2:3D mesh 可能為邊緣輪廓點的序號
圖3: 相鄰面?
?
最終X_projection 是三維模型投影到二維平面的點,其中
需要求解的參數(shù)有:形狀系數(shù) α以及表情系數(shù) β,旋轉矩陣R,位移t_2d 以及縮放參數(shù)s。
P_orth為一個已知的正交投影矩陣。
最終的目標就是最小化輸入的特征點X與投影到二維平面的X_projection的差。
1 求解旋轉矩陣相關參數(shù)[1]
基于黃金標準算法求相機仿射矩陣,然后進行分解得到R,S,T
2 求解形狀系數(shù) α以及表情系數(shù) β [2]
其中表情使用非負最小二乘法,形狀使用最小二乘求解系數(shù)
[1]: Gold Standard Algorithm for estimating an affine camera matrix from world to image correspondences
[2] O. Aldrian & W. Smith, Inverse Rendering of Faces with a 3D Morphable Model, PAMI 2013.
二 算法總體介紹
即使只進行一次迭代,結果也很好;
當用于單圖像擬合和,為了使所有參數(shù)完全收斂,最多需要300次迭代;
在實時跟蹤中,如果基于前一幀作為初始參數(shù),只需要迭代1-5次效果就很好;
這里的表情擬合和形狀擬合是交替的,其實理論上可以將他們進行堆疊,一次性求解,
當然這兩個特征向量很可能不是正交的。 但是在任何情況下,交替使用一般認為不會造成 任何傷害。
具體的算法大致流程:
1 獲得相機pose
2 計算表情系數(shù)
開始循環(huán)迭代
{
1 3Dmesh 輪廓點確定(可見邊+不可見邊);
2 計算仿射矩陣
3 形狀系數(shù)求解
4 表情系數(shù)求解
}
3DMM = mean + a * shape_pca + b * exp_pca
第一步:初始化 a和b均為0;沒有顏色pca
current_combined_shape = mean + a * shape_pca + b * exp_pca
current_mesh(current_combined_shape,uv坐標,三角形關系圖)
第二步:
vector model_points; // the points in the 3D shape model
vector vertex_indices; // their vertex indices 同樣對應的也不一定是68個
vector image_points; // the corresponding 2D landmark points 不一定是68個
根據(jù)配置表:
可以確定內部50個2D和3D特征點對應關系;左右16個輪廓特征點和嘴角里面2個沒有。
第三步:姿態(tài)初始估計:
基于上面對應的50個特征點求解R,S,t
基于黃金標準算法求相機仿射矩陣,然后基于SVD進行分解得到R,S,T,這里談到 QR(正交三角)分解法也應該可以。
具體代碼計算:旋轉矩陣會轉為四元數(shù),進而得到一個3*4 的仿射矩陣;
第四步:表情擬合,更新參數(shù)b
因為臉的形狀變化很大,取決于表情。(還是基于上面50對特征點)
因為表情是Blendshapes
fit_blendshapes_to_landmarks_nnls:morphablemodel::Blendshapes
fit_shape_to_landmarks_linear :morphablemodel::PcaModel
采用的非負數(shù)最小二乘法,不支持任何正則化;不是采用的pca向量基,而是采用 blendshape,也不是采用mean,而是當前的mean + a*shape_pca(但是其實好像還是mean)。感覺這了blendshape跟pca向量基沒啥區(qū)別;
第五步: 更新當前形狀和mesh
current_combined_shape = mean + a * shape_pca + b * exp_pca
current_mesh(current_combined_shape,uv坐標,三角形關系圖)
第六步:迭代
6.1 計算偏航角yaw:示例-29度,向左;
6.2 確定沒有遮擋的輪廓點點
6.2.1 確定可能的輪廓點
2D輪廓點有16個特征點,3D頂點提供了可能為輪廓點3D頂點序號34個。
尋找3D頂點中候選輪廓點,一共有左輪廓17個點,右輪廓17個點
根據(jù)閾值7.5度,當絕對值介于7.5,認為人臉朝正,34個輪廓點均被選中;
大于7.5,當臉部朝左,選中右邊的17個輪廓點,反之選中左邊的17個輪廓點;
6.2.2 配對2D輪廓點與3D候選頂點
例如示例為-29度,朝左,所以這一步只能確定右輪廓對應的3D頂點;
針對2D輪廓點右邊每一個特征點,計算3D頂點中與之最近的頂點,構成關系對;
這樣可以進一步確定8個3D頂點。
6.3 更新確定的2D特征點與3D頂點關系,增加右輪廓的8個頂點;
50 + 8
6.4 確定遮擋面輪廓點:進一步確定上面沒有找到對應點的左輪廓點
確定了42個3D頂點;這步是很關鍵的,需要仔細看。
6.5 更新確定的2D特征點與3D頂點關系,增加左輪廓的42個頂點;
50 + 8 + 42 (2D頂點存在重復)
6.6 姿態(tài)估計:基于上面對應的100個特征點求解R,S,t
6.7 形狀擬合:更新參數(shù)a
此時平均臉為mean + b * exp_pca
這里采用的擬合算法參考 Inverse Rendering of Faces with a 3D Morphable Model, PAMI 2013,它是一個線性的,封閉的解,有正則化;
6.8 表情擬合:更新參數(shù)b
此時平均臉為:mean + a * pca_shape
這里采用的擬合算法參考
6.9 整個算法注重得到參數(shù)a和b,并沒有確定最終對應的68個3D頂點;
7 輸出結果mesh
??
結論:
@1 難點還是在于遮擋面的輪廓點選擇;trade off關鍵點;
eos采取了一種接近全局搜索的方法;
eos:基于法向量,計算相鄰法向量是否同向;
頂點自檢,發(fā)出射線是否射中三角形;
基于2D頂點構建kd樹,距離在閾值以內的保留;
2 是否可優(yōu)化:內部點選擇都是直接基于映射表獲得;
3 目前的fitting C++ 在選擇遮擋輪廓點的時候比較簡單,沒有
考慮姿態(tài)的影響,應該是考慮到速度的平衡;
4 耗時情況:迭代一次,整體耗時254ms,其中尋找遮擋邊輪廓點223ms。
?@為什么先生2012
總結
以上是生活随笔為你收集整理的3DMM之EOS 原理解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决“第一次偶然出现的异常”问题
- 下一篇: 《大数据时代》摘录