3DMM是什麼?
3DMM是一種人臉形狀和外觀的統計模型, 全稱是3D Morphable Face Model, 即可變性人臉模型. 首先利用高精度一起掃描多組人臉3D數據, 並進行對齊. 之後利用PCA從這些三維形狀和顏色數據中得到更低維的子空間.可變性體現在可以在這些PCA子空間進行組合變形, 將一個人臉的特性轉移到另外一個人臉, 或者生成新的人臉.
臉部PCA模型
2DMM本質是對對齊之後的人臉進行PCA. 人臉模型可以表示成一個向量 , , 其中N代表頂點數量.同理顏色信息. 將所有的訓練網格組成一個數據矩陣, 然後對這個數據矩陣運用PCA分解.注意形狀和顏色是區分開的.最終3DMM會包含兩個PCA模型, 分別對應形狀和顏色. 對於每一個PCA模型, 都有
其中是均值, 是PCA得到的主成分, , 代表標準差. m個主成分最好能夠原始數據99%的變化.n代表掃描數據, 例如Basel Face Model中是200.
基於上面的模型, 臉部模型可以表達成:
上式中的
表情建模
上面的是3DMM的形狀建模. 除此之外人臉還有表情. 對於表情有兩種方法:一種是類似形狀一樣, 掃描多種表情然後進行PCA, 得到表情基.但是這樣的一種缺點就是得到的表情基沒有實際語義, 很難拓展使用 ,但是這種方法可以使得不同人物的相同表情具有不同的自適應性;另外一種就是使用blendshape,這種在建模等領域廣泛使用. 無論哪種方法, 加入表情的3DMM呈現下面形式:
其中k代表表情基或者blendshape的數量.
人臉模型擬合
接下來講述的方法是eos中的方法, 而非深度學習方法[在我看來, 深度學習相當於將許多之前需要人爲努力設計的方法交給了神經網絡自己學習, 並非不好, 只是不太喜歡這種託付. 對應的, 非深度學習方法需要自己設計很多框架, 但是過程更清晰].想看深度學習的請繞道.eos中的人臉重建包括四個步驟:姿態估計, 形狀擬合, 表情擬合, 輪廓擬合.
正交相機模型
爲了擬合3DMM和二維圖像, 必須需要一個顯式的相機模型,這個相機模型將三維模型從3D空間映射到圖像空間.這個過程可以表示爲:
其中代表人臉形狀, 代表相機參數.
原則上, 這裏可以選擇很多類型相機模型:例如透視相機模型, 政教相機模型或者仿射投影模型. 具體的, 從三維點到二維點的過程可以分解爲兩步:
-
模型座標系統到三維相機座標系統
代表3 *3的旋轉矩陣, 代表三維平移向量 -
應用相機投影到二維空間
其中代表相機的內參.例如對於可縮放的正交投影, 內參只有一個縮放因子, 這樣相機的所有參數就是
我們在姿態估計的時候, 需要恢復這些參數.
相機的選擇
相機有很多種, 那麼到底應該選擇哪種類型呢?首先, 仿射相機模型貌似是誘人的選擇. 經典算法Gold Standard Algorithm(以下簡稱GSA)提供了求解仿射相機矩陣的方法. 給定一系列2D和3D點的對應, GSA方法找到這些對應點的最小平方估計從而來估計仿射矩陣.之所以說誘人, 是因爲這個算法有閉合解.然後這種方法有一個爭議點:它不包含相機變換的約束, 這會導致生成的人臉呈現傾斜特性., 以及x軸和y軸的不均勻縮放,這些都會導致不自然的人臉變形. 或者換句話說, 有一些原本應該由shape參數導致的人臉變形會被這裏的仿射矩陣參數影響, 從而導致不正確的擬合結果, 如下圖左邊.
另外一個相機選擇就是可縮放的正交投影相機模型.可能你會想, 正交投影並不真實, 怎麼能用來進行擬合過程的相機建模呢?確實不真實, 這裏我個人考慮是, 人臉的縱深關係不是特別大, 透視效應沒有特別明顯, 所以正交投影可以近似認爲是正確的. 另外一個重要的原因是, 它保留了歐拉空間的剛性運動以及縮放.上圖右邊是用可縮放正交投影的擬合結果.這個時候相機參數沒有擾亂shape參數.
最終選擇可縮放的正交投影模型
可縮放正交投影相機模型
這種模型需要加入旋轉矩陣的正交限制, 也就是列之間彼此垂直. 決定了採用這個模型之後如何求解呢?歷史上有過Levenberg-Marquardt等方法求解, 但是容易陷入局部最優, 從而導致最終效果不太好.eos採用一種迭代的方法求解相機參數.這個問題可以規範描述爲:
將二維座標點和三維對應座標點用其次座標表達, 分別爲以及. 給定超過四組對應點, 希望找到相機矩陣, 使得最小.這裏先採用仿射相機的假設, 即
[這裏其實有我不能理解的點, 就是已經假定是可縮放正交投影了, 爲什麼這裏還能採用仿射相機的假設?僅僅是爲了可以求解的妥協嗎?如果是這樣的話就沒有任何道理了, 僅僅爲了求解就隨便做假設? 或者是基於一定誤差範圍內的合理假設, 但是我自己不太明白這種合理性, 讀者有理解的歡迎交流]
這個迭代過程包括兩步:
-
將數據進行歸一化處理. 通過相似變換, 將2D圖像點的中心和3D模型的中心移動到各自座標系的原點, 並縮放模型使得到原點的均方差距離分別是以及. 這個過程本質上平移和縮放, 所以可以用矩陣表示爲:
之後估計歸一化的相機矩陣. 每組都會貢獻兩個等式:
這個方程可以求解得到 , 最後得到仿射矩陣. 這個仿射矩陣很好求解, 但是如前面所說, 他的缺點說沒辦法保證歐拉空間的剛性運動特性.
-
約束姿態估計是剛性運動, 具體來說是可縮放正交投影. 從上面的仿射相機矩陣中, 根據相應算法, 運用SVD分解得到與原始仿射矩陣最接近的單位正交旋轉矩陣
最終的旋轉矩陣. 上面的等如何獲取? 根據上面估計得到的仿射矩陣獲取.縮放因子, 平移因子
最終得到的旋轉矩陣是單位正交列的. 這樣最終得到的可縮放正交投影參數 包含縮放因子, 旋轉矩陣, 以及平移矩陣
我們總結一下, 這個方法不同於以往直接用線性或者分線性優化策略求解約束問題來計算相機參數, 它分爲兩個步驟: 第一個步驟, 假定仿射投影並利用GSA來求解仿射相機參數; 第二步,利用上面的仿射相機參數, 通過SVD分解得到一個最接近他的正交投影矩陣. 之後二哥步驟不斷迭代並最終求到收斂解.
個人的疑問有以下幾點:首先就是仿射矩陣的假設, 利用GSA來求解的合理性; 其次, 通過用正交投影來即使仿射投影的合理性是什麼?僅僅是因爲有這樣的兩個算法可以使用嗎?其次, 這種迭代的好處是什麼?最後, eos也說了, 這種求解方法必須假設臉部模型沒有受到嚴重的透視效果影響.如果基於這種假設, 那麼仿射投影或者正交投影應該都算作真實成像的一種爲了計算方便的假設. 這裏其實就是很多傳統方法的弊端了, 爲了過程可以求解以及清晰, 就會做很多妥協, 然後用人類可想到的方法進行求解. 深度學習就不這樣, 他不會做妥協, 對應的, 內部的一些細節也只能丟失.
PCA形狀擬合
上面說了那麼多, 實際僅僅解決了第一個姿態擬合的問題(不過這個也是非常重要和基礎的, 後面很多步驟都基於此).接下來就是第二步, 形狀擬合.
這個步驟給定第一步得到的相機姿態參數, 進行2D點和3D模型點的擬合.這一步的作用是估計形狀參數, 採用的方法是最小化2D圖像點和3D模型的投影點的距離,損失函數如下:
其中後面部分是對於形狀參數的先驗知識.是關鍵點的個數, 表示關鍵點的方差(從關鍵點檢測器的訓練中得到). 表示2D圖像點的齊次座標形成的向量, 而表示對應於2D點的3DMM模型中的點經過投影形成的2D點的齊次座標. 這種從3D到2D的對應關係通過相機矩陣完成
然後我們將的複製放到塊對角矩陣. 理論上來說, 如果很精確的話, 那麼應該是唯一的吧? 因爲是經過同一個攝像機視角拍下的照片.最終的投影之後的2D座標爲:
, 其中.這些基向量會乘以各自的特徵值的平方根,並且由於是齊次座標, 會在每三行之後添加一個全爲0的行.
這樣1.2中的方程可以表達爲標準的正則二次項等式, 並最終可以求解的閉合解
線性表情擬合
形狀擬合完畢之後需要進行表情擬合.最終求解目標是表情參數… 採用的方法類似形狀擬合.這裏的表情擬合採用和形狀擬合交替求解的方法, 即固定求解, 然後固定求解, 並且求解過程中不適用平均臉, 而是不斷更新臉部基準模型:
最終採用和形狀擬合類似的方法求解. 注意這裏採用的是非負最小平方算法.因爲表情基一般都是0~1之間, 負數會造成不可靠的擬合結果
在表情參數求到之後,利用這個參數形成身份中立的形狀:
輪廓擬合
通常來說2D圖像的人臉外部輪廓不會唯一對應於3D模型中的輪廓, 但是其對於人臉模型匹配很重要
爲了解決人臉輪廓匹配, eos提出了包含兩個獨立部分的擬合方法(eos給我最大的啓發就是, 多過程多步驟, 你幹完我再幹的迭代). 那麼這裏有事怎麼樣用多個步驟的呢?首先, 給定當前的姿態估計(從所有非輪廓點中獲取), 當前人臉模型會有正面輪廓和背面輪廓, 如下圖. 二者會分開進行擬合.