3DMM及eos人脸重建
3DMM是什么?
3DMM是一種人臉形狀和外觀的統計模型, 全稱是3D Morphable Face Model, 即可變性人臉模型. 首先利用高精度一起掃描多組人臉3D數據, 并進行對齊. 之后利用PCA從這些三維形狀和顏色數據中得到更低維的子空間.可變性體現在可以在這些PCA子空間進行組合變形, 將一個人臉的特性轉移到另外一個人臉, 或者生成新的人臉.
臉部PCA模型
2DMM本質是對對齊之后的人臉進行PCA. 人臉模型可以表示成一個向量 S∈R3N\bold{S} \in \mathbb{R}^{3N}S∈R3N, , 其中N代表頂點數量.同理顏色信息T∈R3N\bold{T} \in \mathbb{R}^{3N}T∈R3N. 將所有的訓練網格組成一個數據矩陣, 然后對這個數據矩陣運用PCA分解.注意形狀和顏色是區分開的.最終3DMM會包含兩個PCA模型, 分別對應形狀和顏色. 對于每一個PCA模型, 都有
M=(v?,σ,V)(1.1)M = ({\bold{\vec{v}}} , \sigma, \bold{V} ) \tag{1.1}M=(v,σ,V)(1.1)
其中v?{\bold{\vec{v}}}v是均值, V\bold{V}V是PCA得到的主成分, V=[v1,v2,...vm]∈R3N×m\bold{V} = [\bold{v_1}, \bold{v_2}, ...\bold{v_m}] \in \mathbb{R}^{3N \times m}V=[v1?,v2?,...vm?]∈R3N×m , σ∈Rm\sigma \in \mathbb{R}^{m}σ∈Rm代表標準差. m個主成分最好能夠原始數據99%的變化.n代表掃描數據, 例如Basel Face Model中是200.
基于上面的模型, 臉部模型可以表達成:
S=v?+∑i=1mαiσivi\bold{S} = {\bold{\vec{v}}} + \sum_{i=1}^{m} \alpha_i\sigma_i{\bold{v}_i} S=v+i=1∑m?αi?σi?vi?
上式中的α就是形狀參數\alpha就是形狀參數α就是形狀參數
表情建模
上面的是3DMM的形狀建模. 除此之外人臉還有表情. 對于表情有兩種方法:一種是類似形狀一樣, 掃描多種表情然后進行PCA, 得到表情基.但是這樣的一種缺點就是得到的表情基沒有實際語義, 很難拓展使用 ,但是這種方法可以使得不同人物的相同表情具有不同的自適應性;另外一種就是使用blendshape,這種在建模等領域廣泛使用. 無論哪種方法, 加入表情的3DMM呈現下面形式:
S=v?+∑i=1mαiσivi+∑j=1kψjBj\bold{S} = {\bold{\vec{v}}} + \sum_{i=1}^{m} \alpha_i\sigma_i{\bold{v}_i} + \sum_{j=1}^{k}\psi_j\bold{B}_jS=v+i=1∑m?αi?σi?vi?+j=1∑k?ψj?Bj?
其中k代表表情基或者blendshape的數量.
人臉模型擬合
接下來講述的方法是eos中的方法, 而非深度學習方法[在我看來, 深度學習相當于將許多之前需要人為努力設計的方法交給了神經網絡自己學習, 并非不好, 只是不太喜歡這種托付. 對應的, 非深度學習方法需要自己設計很多框架, 但是過程更清晰].想看深度學習的請繞道.eos中的人臉重建包括四個步驟:姿態估計, 形狀擬合, 表情擬合, 輪廓擬合.
正交相機模型
為了擬合3DMM和二維圖像, 必須需要一個顯式的相機模型,這個相機模型將三維模型從3D空間映射到圖像空間.這個過程可以表示為:
P(S,ρ):R3N→R2NP(\bold{S}, \rho): \mathbb{R}^{3N} \rightarrow \mathbb{R}^{2N} P(S,ρ):R3N→R2N
其中S\bold{S}S代表人臉形狀, ρ\rhoρ代表相機參數.
原則上, 這里可以選擇很多類型相機模型:例如透視相機模型, 政教相機模型或者仿射投影模型. 具體的, 從三維點到二維點的過程可以分解為兩步:
模型坐標系統到三維相機坐標系統
vc=[xc,yc,zc]T=Rv+t\bold{v}_c = [x_c, y_c, z_c]^T = \bold{R}\bold{v} + \bold{t}vc?=[xc?,yc?,zc?]T=Rv+t
R\bold{R}R代表3 *3的旋轉矩陣, t\bold{t}t代表三維平移向量
應用相機投影到二維空間
v′=π(ρintr,vc)\bold{v}' = \pi(\rho_{intr}, \bold{v}_c)v′=π(ρintr?,vc?)
其中ρintr\rho_{intr}ρintr?代表相機的內參.
例如對于可縮放的正交投影, 內參只有一個縮放因子sss, 這樣相機的所有參數就是
ρ=[s,R,tx,ty]\rho = [s,\bold{R}, t_x, t_y]ρ=[s,R,tx?,ty?]
我們在姿態估計的時候, 需要恢復這些參數.
相機的選擇
相機有很多種, 那么到底應該選擇哪種類型呢?首先, 仿射相機模型貌似是誘人的選擇. 經典算法Gold Standard Algorithm(以下簡稱GSA)提供了求解仿射相機矩陣的方法. 給定一系列2D和3D點的對應, GSA方法找到這些對應點的最小平方估計從而來估計仿射矩陣.之所以說誘人, 是因為這個算法有閉合解.然后這種方法有一個爭議點:它不包含相機變換的約束, 這會導致生成的人臉呈現傾斜特性., 以及x軸和y軸的不均勻縮放,這些都會導致不自然的人臉變形. 或者換句話說, 有一些原本應該由shape參數導致的人臉變形會被這里的仿射矩陣參數影響, 從而導致不正確的擬合結果, 如下圖左邊.
另外一個相機選擇就是可縮放的正交投影相機模型.可能你會想, 正交投影并不真實, 怎么能用來進行擬合過程的相機建模呢?確實不真實, 這里我個人考慮是, 人臉的縱深關系不是特別大, 透視效應沒有特別明顯, 所以正交投影可以近似認為是正確的. 另外一個重要的原因是, 它保留了歐拉空間的剛性運動以及縮放.上圖右邊是用可縮放正交投影的擬合結果.這個時候相機參數沒有擾亂shape參數.
最終選擇可縮放的正交投影模型
可縮放正交投影相機模型
這種模型需要加入旋轉矩陣R\bold{R}R的正交限制, 也就是列之間彼此垂直. 決定了采用這個模型之后如何求解呢?歷史上有過Levenberg-Marquardt等方法求解, 但是容易陷入局部最優, 從而導致最終效果不太好.eos采用一種迭代的方法求解相機參數.這個問題可以規范描述為:
將二維坐標點和三維對應坐標點用其次坐標表達, 分別為xi∈R3{x_i \in \mathbb{R}^3}xi?∈R3以及Xi∈R4{X_i \in \mathbb{R}^4}Xi?∈R4. 給定超過四組對應點, 希望找到相機矩陣A∈R3×4\bold{A} \in \mathbb{R}^{3 \times 4}A∈R3×4, 使得∑i∣∣xi?AXi∣∣\sum_{i}||\bold{x}_i - \bold{A}\bold{X}_i||∑i?∣∣xi??AXi?∣∣最小.這里先采用仿射相機的假設, 即A3=[0,0,0,1]\bold{A}_3 = [0, 0, 0, 1]A3?=[0,0,0,1]
[這里其實有我不能理解的點, 就是已經假定是可縮放正交投影了, 為什么這里還能采用仿射相機的假設?僅僅是為了可以求解的妥協嗎?如果是這樣的話就沒有任何道理了, 僅僅為了求解就隨便做假設? 或者是基于一定誤差范圍內的合理假設, 但是我自己不太明白這種合理性, 讀者有理解的歡迎交流]
這個迭代過程包括兩步:
將數據進行歸一化處理. 通過相似變換, 將2D圖像點的中心和3D模型的中心移動到各自坐標系的原點, 并縮放模型使得到原點的均方差距離分別是2\sqrt{2}2?以及3\sqrt{3}3?. 這個過程本質上平移和縮放, 所以可以用矩陣表示為:
x~i=Txi,T∈R3×3X~i=UXi,U∈R4×4\tilde{\bold{x}}_i= \bold{T}\bold{x}_i, \bold{T} \in \mathbb{R}^{3 \times 3} \\ \tilde{\bold{X}}_i= \bold{U}\bold{X}_i, \bold{U} \in \mathbb{R}^{4 \times 4} x~i?=Txi?,T∈R3×3X~i?=UXi?,U∈R4×4
之后估計歸一化的相機矩陣A~∈R3×4\tilde{\bold{A}} \in \mathbb{R}^{3 \times 4}A~∈R3×4. 每組都會貢獻兩個等式:
[X~i0T0TX~i][A1~TA2~T]=[x~iy~i]\begin{gathered} \begin{bmatrix} \tilde{\bold{X}}_i & \bold{0}^T \\ \bold{0}^T & \tilde{\bold{X}}_i \end{bmatrix} \quad \begin{bmatrix} \tilde{\bold{A_1}}^T \\ \tilde{\bold{A_2}}^T \end{bmatrix} \quad = \begin{bmatrix} \tilde{x}_i \\ \tilde{y}_i \end{bmatrix} \quad \end{gathered}[X~i?0T?0TX~i??][A1?~?TA2?~?T?]=[x~i?y~?i??]?
這個方程可以求解得到 A~\tilde{\bold{A}}A~, 最后得到仿射矩陣A=T?1A~U{\bold{A}} = \bold{T}^{-1}\tilde{\bold{A}}\bold{U}A=T?1A~U. 這個仿射矩陣很好求解, 但是如前面所說, 他的缺點說沒辦法保證歐拉空間的剛性運動特性.
約束姿態估計是剛性運動, 具體來說是可縮放正交投影. 從上面的仿射相機矩陣A\bold{A}A中, 根據相應算法, 運用SVD分解得到與原始仿射矩陣最接近的單位正交旋轉矩陣
最終的旋轉矩陣R=UWT\bold{R} = \bold{U}\bold{W}^TR=UWT. 上面的r1\bold{r}_1r1?等如何獲取? 根據上面估計得到的仿射矩陣A\bold{A}A獲取.縮放因子s=(∣∣r1∣∣+∣∣∣r2∣∣)/2s = (||\bold{r}_1|| + |||\bold{r}_2||) / 2s=(∣∣r1?∣∣+∣∣∣r2?∣∣)/2, 平移因子t=[A1,4,A2,4]\bold{t} = [\bold{A}_{1,4}, \bold{A}_{2,4}]t=[A1,4?,A2,4?]
最終得到的旋轉矩陣是單位正交列的. 這樣最終得到的可縮放正交投影參數ρ\bold{\rho}ρ 包含縮放因子sss, 旋轉矩陣R\bold{R}R, 以及平移矩陣t\bold{t}t
我們總結一下, 這個方法不同于以往直接用線性或者分線性優化策略求解約束問題來計算相機參數, 它分為兩個步驟: 第一個步驟, 假定仿射投影并利用GSA來求解仿射相機參數; 第二步,利用上面的仿射相機參數, 通過SVD分解得到一個最接近他的正交投影矩陣. 之后二哥步驟不斷迭代并最終求到收斂解.
個人的疑問有以下幾點:首先就是仿射矩陣的假設, 利用GSA來求解的合理性; 其次, 通過用正交投影來即使仿射投影的合理性是什么?僅僅是因為有這樣的兩個算法可以使用嗎?其次, 這種迭代的好處是什么?最后, eos也說了, 這種求解方法必須假設臉部模型沒有受到嚴重的透視效果影響.如果基于這種假設, 那么仿射投影或者正交投影應該都算作真實成像的一種為了計算方便的假設. 這里其實就是很多傳統方法的弊端了, 為了過程可以求解以及清晰, 就會做很多妥協, 然后用人類可想到的方法進行求解. 深度學習就不這樣, 他不會做妥協, 對應的, 內部的一些細節也只能丟失.
PCA形狀擬合
上面說了那么多, 實際僅僅解決了第一個姿態擬合的問題(不過這個也是非常重要和基礎的, 后面很多步驟都基于此).接下來就是第二步, 形狀擬合.
這個步驟給定第一步得到的相機姿態參數, 進行2D點和3D模型點的擬合.這一步的作用是估計形狀參數α\bold{\alpha}α, 采用的方法是最小化2D圖像點和3D模型的投影點的距離,損失函數如下:
E=∑i=13L(yp,i?yi)22σ2D,i2+λ∣∣α∣∣2(1.2)\mathbb{E} = \sum_{i=1}^{3L} \frac{(y_{p,i} - y_i)^2}{2\sigma_{2D, i}^2} + \lambda||\bold{\alpha}||^2 \tag{1.2}E=i=1∑3L?2σ2D,i2?(yp,i??yi?)2?+λ∣∣α∣∣2(1.2)
其中后面部分是對于形狀參數的先驗知識.LLL是關鍵點的個數, σ2D2\sigma_{2D}^2σ2D2?表示關鍵點的方差(從關鍵點檢測器的訓練中得到). y=[y1,y2,...,y3L]\bold{y} = [y_1, y_2, ...,y_{3L}]y=[y1?,y2?,...,y3L?]表示2D圖像點的齊次坐標形成的向量, 而yp=[yp,1,yp,2,...,yp,3L]\bold{y_p} = [y_{p,1}, y_{p,2},...,y_{p,3L}]yp?=[yp,1?,yp,2?,...,yp,3L?]表示對應于2D點的3DMM模型中的點經過投影形成的2D點的齊次坐標. 這種從3D到2D的對應關系通過相機矩陣C∈R3×4C \in \mathbb{R}^{3 \times 4}C∈R3×4完成
C=s[R~1txR2ty[0,0,0]1]\begin{gathered} C= s \begin{bmatrix} \tilde{\bold{R}}_1 & t_x \\ \bold{R}_2 & t_y \\ [0 , 0 , 0]& 1 \end{bmatrix} \quad \end{gathered}C=s???R~1?R2?[0,0,0]?tx?ty?1?????
然后我們將CCC的復制放到塊對角矩陣P∈R3N×4NP \in \mathbb{R}^{3N \times 4N}P∈R3N×4N. 理論上來說, 如果很精確的話, 那么CCC應該是唯一的吧? 因為是經過同一個攝像機視角拍下的照片.最終的投影之后的2D坐標為:
yp=P?(Vh^α+vˉ)\bold{y_p} = P \cdot(\hat{\bold{V_h}}\alpha + \bar{\bold{v}})yp?=P?(Vh?^?α+vˉ), 其中Vh^代表對應于關鍵點的PCA形狀基矩陣.\hat{\bold{V_h}}代表對應于關鍵點的PCA形狀基矩陣.Vh?^?代表對應于關鍵點的PCA形狀基矩陣..這些基向量會乘以各自的特征值的平方根,并且由于是齊次坐標, 會在每三行之后添加一個全為0的行.
這樣1.2中的方程可以表達為標準的正則二次項等式, 并最終可以求解α\alphaα的閉合解
線性表情擬合
形狀擬合完畢之后需要進行表情擬合.最終求解目標是表情參數ψ\psiψ… 采用的方法類似形狀擬合.這里的表情擬合采用和形狀擬合交替求解的方法, 即固定α\alphaα求解ψ\psiψ, 然后固定ψ\psiψ求解α\alphaα, 并且求解過程中不適用平均臉, 而是不斷更新臉部基準模型:
Sα=vˉ+∑i=1mαiσivi\bold{S}^\alpha = \bar{\bold{v}} + \sum_{i=1}^{m}\alpha_i\sigma_i \bold{v}_iSα=vˉ+i=1∑m?αi?σi?vi?
最終采用和形狀擬合類似的方法求解. 注意這里采用的是非負最小平方算法.因為表情基一般都是0~1之間, 負數會造成不可靠的擬合結果
在表情參數ψ\psiψ求到之后,利用這個參數形成身份中立的形狀Sψ\bold{S}^\psiSψ:
Sψ=vˉ+∑j=1kψjBj\bold{S}^\psi = \bar{\bold{v}} + \sum_{j=1}^{k}\psi_j \bold{B}_jSψ=vˉ+j=1∑k?ψj?Bj?
輪廓擬合
通常來說2D圖像的人臉外部輪廓不會唯一對應于3D模型中的輪廓, 但是其對于人臉模型匹配很重要
為了解決人臉輪廓匹配, eos提出了包含兩個獨立部分的擬合方法(eos給我最大的啟發就是, 多過程多步驟, 你干完我再干的迭代). 那么這里有事怎么樣用多個步驟的呢?首先, 給定當前的姿態估計(從所有非輪廓點中獲取), 當前人臉模型會有正面輪廓和背面輪廓, 如下圖. 二者會分開進行擬合.
正面輪廓擬合
總結
以上是生活随笔為你收集整理的3DMM及eos人脸重建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 娜塔莉波特曼2015哈佛毕业演讲
- 下一篇: javascript正则表达式入门