歡迎關注收藏或分享,轉載請註明出處。
我的專欄算法
同時,實現人臉重建及相關應用須要深刻了解優化算法等,工程量也不小,是學習cv的一個很好切入點。 app
這裏的人臉重建指,經過二維人臉圖像重建出該人臉的三維模型。 大概有如下幾種方法: 經過多視圖幾何來重建,這個須要採集不一樣角度的人臉,對設備的要求也比較高; 經過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以及一系列相關的文章都值得一讀。工具
首先須要瞭解參數化人臉模型和blendshape模型兩個概念。學習
在Blanz的方法中,他們掃描200張成年人的人頭模型,每一個模型包含大約70000個頂點。通過PCA處理,製做成參數化人臉模型,每張人臉模型的拓撲結構相同,只是頂點位置或顏色有所差別。你能夠把各個特徵向量看做是人臉不一樣的特徵,好比臉的長短,胖瘦等。優化
這裏人臉模型分紅兩個向量:動畫
所以任意新的一我的臉均可由這些特徵向量線性組合生成:設計
blendshape是3d軟件裏用來作模型形變的一種技術,經過調整權重,設計師能夠將目標模型變化成一系列預約義的模型,或者這些模型的任意線形組合。
在數字製做行業,一般用blendshape來製做表情,即用一組臉部基本表情合成新表情。一樣,這些模型的拓撲結構一致,改變的只是頂點位置。爲了避免出現崩壞扭曲的表情,對權重作限制。
在人臉重建時,一般會使用delta blendshape,即各個表情與正常表情的差值。
將blendshape和參數人臉模型結合起來就有:
S表示一張有着某人臉特徵和某表情的臉部模型。
根據給定圖像來「估計」人臉模型,有點像渲染的逆過程。所以,除了人臉模型,還得考慮相機參數。
這裏採用弱透視投影。
弱透視投影使用與正交投影相同的原則,但乘以一個縮放參數來實現近大遠小的效果。
可看做透視投影和正交投影的混合體。[4]
重建算法的關鍵在於找出合適的參數 ,使三維人臉模型在平面的投影儘量接近原圖像。若是不考慮紋理,可簡化爲**「令人臉模型關鍵點在平面上的投影與2d人臉關鍵點的位置儘量接近」**。
有一點須要注意,常見的人臉關鍵點檢測結果通常是二維點。也就是說,臉的朝向不一樣,檢測到的臉部邊緣點也會不同,2d人臉邊緣點並不在真正的臉頰邊緣線上。
詳情可看下圖。上排圖像的藍點是二維人臉檢測點(2d)。下排圖像藍點是模型關鍵點(3d),紅點是對應的2d點。能夠清楚看出,圖像檢測出的2d邊緣點與模型自己3d邊緣點不一樣。所以,在迭代過程當中,須要不斷更新模型的3d邊緣點索引,使兩者一一對應。
有不少方法能夠找出三維模型在當前視角下的邊緣點。
能夠用凸包算法求出邊緣線,也能夠根據法線與視線夾角,求出臉部切線。或者參考[5]中描述,在一組預先保存的臉部線條上求出最外側的點。
經過以上描述,咱們已經將重建問題轉爲最優化問題。
其中,S是人臉模型,s是縮放尺度,R是旋轉矩陣,t是位移向量,Y是人臉檢測點,n爲人臉關鍵點個數。和
分別是人臉圖像關鍵點及人臉三維模型點的索引。
因爲投影變化存在,這是個非線性最小二乘問題。能夠用Gauss-Newton ,Levenberg-Marquardt等算法求解,這裏不展開講。
還有另一種比較簡單的方法。
先利用2d與3d點集估計出模型的相機參數,帶入上式轉爲線性問題。而後分階段求出人臉參數和表情參數。整個迭代過程都是固定一部分參數,更新其餘參數。
人臉形狀特徵參數和表情參數都須要控制在必定範圍內(視模型而定),否則可能會出現不合理的模型形狀。在視頻場景中,還須要考慮幀間穩定性以及先後人臉特徵一致等問題。
完成重建後,咱們可得到人臉三維網格、模型在圖像中的位置,以及當前人臉的blendshape表情參數。 基於以上信息,能夠實現各類有意思的效果,下面根據這幾組參數分別舉一些例子。
三維網格和空間位置
有了三維模型和位置信息,咱們能夠在渲染時把人臉模型遮擋掉,作出三維貼紙的效果,諸如戴頭飾、眼鏡之類。
模型和紋理
繪製模型uv貼圖,再把人臉模型渲染出來。能夠利用這種方法給人臉加上鬍子、彩繪、面具等。
人臉模型參數與表情參數
能夠將計算出的表情權重遷移到相同設置的blendshape模型上,用人臉去驅動模型動畫,實現相似animoji的效果。也能夠改變人臉原有的表情參數,讓照片動起來。
大概寫到這,其餘方法或細節之後有機會再補充。
[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