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