人臉重建速覽,從3DMM到表情驅動動畫

歡迎關注收藏或分享,轉載請註明出處。
我的專欄算法


18.gif
人臉重建是計算機視覺比較熱門的一個方向,3d人臉相關應用也是近年來短視頻領域的新玩法。不論是Facebook收購的MSQRD,仍是Apple研發的Animoji,底層技術都與三維人臉重建有關。

同時,實現人臉重建及相關應用須要深刻了解優化算法等,工程量也不小,是學習cv的一個很好切入點。 app

01.jpg

▲ Apple推出Animoji[0]

02.jpg

▲ Facebook收購MSQRD[1]

這裏的人臉重建指,經過二維人臉圖像重建出該人臉的三維模型。 大概有如下幾種方法: 經過多視圖幾何來重建,這個須要採集不一樣角度的人臉,對設備的要求也比較高; 經過RGBD或RGB相機,用3D Morphable Model(3DMM)方法來重建。這種方法也有侷限性,因爲模型特色所致,沒法生成模型細節(皺紋等); 還有近年來出現的使用深度學習方法來重建(有的是結合傳統3DMM方法,訓練其人臉模型參數)。框架

本文主要講講單目RGB相機的3DMM方法。這種方法對設備要求低,算法簡單,易於移動端實現實時重建。這裏的前提是咱們已經有了圖像人臉檢測的關鍵點。輸入圖像及檢測到的人臉關鍵點,輸出人臉三維網格。iphone

概述

3DMM方法由Blanz[2]99年首次提出,日後的改進一般是基於他們的工做。這種方法有一個關於人臉模型的」先驗知識「,便可形變模型。所以無論人臉處於什麼角度,都能獲得較完整的人臉。ide

如今比較常見的人臉模型有Basel Face Model(BFM)、Surrey Face Model(SFM)、FaceWarehouse、Large Scale Facial Model (LSFM)等。其中,LSFM多是現在最精準的模型。BFM比較容易獲取,不少人用它進行實驗。SFM的開源框架也爲社區作出了巨大貢獻。同時,浙大團隊的FaceWarehouse以及一系列相關的文章都值得一讀。工具

03.png

▲1999年提出的3DMM方法[2]

首先須要瞭解參數化人臉模型blendshape模型兩個概念。學習

參數化人臉模型

在Blanz的方法中,他們掃描200張成年人的人頭模型,每一個模型包含大約70000個頂點。通過PCA處理,製做成參數化人臉模型,每張人臉模型的拓撲結構相同,只是頂點位置或顏色有所差別。你能夠把各個特徵向量看做是人臉不一樣的特徵,好比臉的長短,胖瘦等。優化

這裏人臉模型分紅兩個向量:動畫

形狀:S = (X_1, Y_1, Z_1, X_2, ..., Y_n, Z_n)^T \in R^{3n}
紋理:T = (R_1, G_1, B_1, R_2, ..., G_n, B_n)^T \in R^{3n}

所以任意新的一我的臉均可由這些特徵向量線性組合生成:設計

S = \bar S + \sum_{i=1}^{m}a_iS_i
T = \bar T + \sum_{i=1}^{m}b_iT_i
\sum_{i=1}^{m}a_i = \sum_{i=1}^{m}b_i = 1

04.png

▲參數化人臉模型[2]

blendshape表情模型

blendshape是3d軟件裏用來作模型形變的一種技術,經過調整權重,設計師能夠將目標模型變化成一系列預約義的模型,或者這些模型的任意線形組合。

05.gif

▲blendshape模型,調整權重造成新的表情

在數字製做行業,一般用blendshape來製做表情,即用一組臉部基本表情合成新表情。一樣,這些模型的拓撲結構一致,改變的只是頂點位置。爲了避免出現崩壞扭曲的表情,對權重作限制。

B = \sum_{i=0}^{m}w_iB_i; \sum_i = 1

在人臉重建時,一般會使用delta blendshape,即各個表情與正常表情的差值。

B = B_0 + \sum_{i=1}^mw_i(B_i - B_0) = B_0 + \sum_{i=1}^mw_iD_i

將blendshape和參數人臉模型結合起來就有:

S = \bar S + \sum_{i=1}^{m}a_iS_i + \sum_{i=1}^mw_iD_i

S表示一張有着某人臉特徵和某表情的臉部模型。

06.png

​ ▲包含形狀特徵和表情的人臉模型[3]

重建

根據給定圖像來「估計」人臉模型,有點像渲染的逆過程。所以,除了人臉模型,還得考慮相機參數。

這裏採用弱透視投影

弱透視投影使用與正交投影相同的原則,但乘以一個縮放參數來實現近大遠小的效果。

可看做透視投影和正交投影的混合體。[4]

07.gif

​ ▲三維模型的弱透視投影

重建算法的關鍵在於找出合適的參數 s, R, t, \vec a, \vec b, \vec w,使三維人臉模型在平面的投影儘量接近原圖像。若是不考慮紋理,可簡化爲**「令人臉模型關鍵點在平面上的投影與2d人臉關鍵點的位置儘量接近」**。

08.png

▲人臉圖像與模型關鍵點一一對應

有一點須要注意,常見的人臉關鍵點檢測結果通常是二維點。也就是說,臉的朝向不一樣,檢測到的臉部邊緣點也會不同,2d人臉邊緣點並不在真正的臉頰邊緣線上

詳情可看下圖。上排圖像的藍點是二維人臉檢測點(2d)。下排圖像藍點是模型關鍵點(3d),紅點是對應的2d點。能夠清楚看出,圖像檢測出的2d邊緣點與模型自己3d邊緣點不一樣。所以,在迭代過程當中,須要不斷更新模型的3d邊緣點索引,使兩者一一對應。

09.png

▲三維模型邊緣點與人臉檢測邊緣點不一樣[5]

有不少方法能夠找出三維模型在當前視角下的邊緣點。

能夠用凸包算法求出邊緣線,也能夠根據法線與視線夾角,求出臉部切線。或者參考[5]中描述,在一組預先保存的臉部線條上求出最外側的點。

經過以上描述,咱們已經將重建問題轉爲最優化問題。

E = \sum_{i=0}^n ||(s*R*S + t)_{i_{3d}} - Y_{i_{2d}}||_2^2

其中,S是人臉模型,s是縮放尺度,R是旋轉矩陣,t是位移向量,Y是人臉檢測點,n爲人臉關鍵點個數。i_{2d}i_{3d}分別是人臉圖像關鍵點及人臉三維模型點的索引。

因爲投影變化存在,這是個非線性最小二乘問題。能夠用Gauss-Newton ,Levenberg-Marquardt等算法求解,這裏不展開講。

還有另一種比較簡單的方法。

先利用2d與3d點集估計出模型的相機參數,帶入上式轉爲線性問題。而後分階段求出人臉參數和表情參數。整個迭代過程都是固定一部分參數,更新其餘參數。

人臉形狀特徵參數和表情參數都須要控制在必定範圍內(視模型而定),否則可能會出現不合理的模型形狀。在視頻場景中,還須要考慮幀間穩定性以及先後人臉特徵一致等問題。

10.gif

▲重建出人臉模型

應用

完成重建後,咱們可得到人臉三維網格、模型在圖像中的位置,以及當前人臉的blendshape表情參數。 基於以上信息,能夠實現各類有意思的效果,下面根據這幾組參數分別舉一些例子。

三維網格和空間位置

有了三維模型和位置信息,咱們能夠在渲染時把人臉模型遮擋掉,作出三維貼紙的效果,諸如戴頭飾、眼鏡之類。

11.GIF

▲在三維建模工具中建好模型,調整與人臉的相對位置

12.GIF

▲實時效果

模型和紋理

繪製模型uv貼圖,再把人臉模型渲染出來。能夠利用這種方法給人臉加上鬍子、彩繪、面具等。

13.png

▲模型的uv貼圖

14.png

​ ▲渲染出帶有貼圖的人臉模型

人臉模型參數與表情參數

能夠將計算出的表情權重遷移到相同設置的blendshape模型上,用人臉去驅動模型動畫,實現相似animoji的效果。也能夠改變人臉原有的表情參數,讓照片動起來。

15.jpg

▲模型的blendshape須要與人臉的blendshape一致(表情相同)[6]

16.GIF

▲人臉驅動模型動畫

17.gif

▲讓照片「活」起來

大概寫到這,其餘方法或細節之後有機會再補充。


參考

[0] Apple just unveiled 'Animoji' — emojis that talk and sync to your face
[1] Facebook buys popular face swapping app for silly selfies
[2] A Morphable Model For The Synthesis Of 3D Faces
[3] Face Transfer with Multilinear Models
[4] 3D projection
[5] High-Fidelity Pose and Expression Normalization for Face Recognition in the Wild
[6] iPhone X Facial Capture – Apple blendshapes

相關文章
相關標籤/搜索