寫在前面
由于之前在申請專利,所以文章不能發出來,現在發出來幫助有需要的人。
Animoji
蘋果在今年的十周年特別版iPhone X發布會上,推出了Animoji功能。該功能基于iPhone X的結構光傳感器,捕捉用戶的表情變化,生成相應的3D動畫表情。本文介紹了基于ARKit + SceneKit的Animoji實現方案。
Animoji原理
???在人臉建模后,通過獲取人臉追蹤與表情捕捉的數據,更新到虛擬形象上,使虛擬形象與用戶人臉的位置與表情相同步。
(1)?人臉建模
在高端設備上,借助紅外攝像頭與結構光點陣投影儀,根據獲取的點云數據,結合利用泛光照明器得到的紅外圖像,通過隨機交替獲取二者數據,做3D人臉建模。
(2)人臉追蹤與表情捕捉
人臉追蹤:依據人臉檢測算法和SLAM(同步定位與地圖構建)算法,實時追蹤人臉在圖像中的位置變化,并計算人臉在3D空間中的位置。
表情捕捉:依據基于深度學習的表情識別算法,通過匹配用戶當前人臉數據到表情庫,識別出用戶當前表情。
(3)虛擬形象渲染
構建與真實世界相同坐標的虛擬世界,創建虛擬形象并實時計算它與人臉之間的位置映射關系,基于表情捕捉得到的數據來更新虛擬形象的動畫表情。
Animoji效果
Animoji方案
本方案使用?變形動畫+骨骼動畫+骨骼控制?來實現Animoji。
變形動畫:使用預先制作好的表情基作為變形目標,通過變形的方式來確定模型表面每個頂點最終的位置,使用SceneKit渲染的話,可以用SCNMorpher來實現。
骨骼控制:在設計師刷好骨骼對蒙皮的權重后,就可以通過骨骼控制或者加載骨骼動畫來實現非變形部分的動畫。
骨骼動畫
建立虛擬形象模型
(1)虛擬形象靜態模型
虛擬形象分為強表情部分和弱表情部分,以頭部舉例:臉部為強表情部分,眼睛牙齒耳朵等為弱表情部分。強表情部分用捕捉的表情數據更新,弱表情部分則根據用戶頭部的運動數據與表情變化來更新。
例如:用戶邊轉頭邊做鬼臉,強表情部分,即臉部會更新為用戶的表情形象,而弱表情部分,如耳朵骨骼會根據用戶頭部轉動的速度變彎曲,舌頭會在嘴巴長到一定幅度伸出。
(2)制作表情基
表情基分為普通表情基與混合表情基。表情基與靜態模型的強表情部分的拓撲結構完全一致,且在同一個尺度空間下大小相同。不同表情基,模型的網格頂點數一樣,多邊形一一對應,不同的是頂點的位置不同(如大笑嘴部的頂點就會有位移)。
普通表情基是一些設計好的臉部模型,如圖3。普通表情基代表一些固定的人臉表情,如張嘴、眨眼,為了縮減大小,表情基除了幾何體沒有其他任何信息,并且分割為若干子部分。
混合表情基是若干特定的普通表情基的非線性組合,在運行時計算得出,用以擴展表情的豐富度,理論上有混合表情基的支持,虛擬形象能夠模擬無限多個表情,而不是只在普通表情基這個維度,混合表情基的計算方式如下式,?B( i )表示第i 個混合表情基,E( j )表示第j個普通表情基。
表情分割
本系統將表情分割成5部分,在加載表情時,只使用有效部分,(如眨眼就只加載眼部),縮小了表情的計算量。分割表情時,使用更平滑的頂點法線來避免分割后可能產生的裂縫。
表情權重分配機制
本系統對不同表情分配了不同的權重,在更新時,對于高權重的表情,會先加載先更新,提高每次更新表情的用戶體驗,縮短關鍵表情的等待時間,流程圖如下。
分包加載
本系統的加載方式采用分包加載的方式,首先將分割好的表情基分布存儲在若干文件中,在需要的時候分包加載,模型開始更新的時間是之前的20%。
建立骨骼
對于弱表情部分,他們是根據頭部的運動與表情變化來做更新,本系統對弱表情部分建立骨骼來控制它們。當用戶向右看時,控制眼球骨骼向右旋轉;當用戶張嘴時,控制下巴骨骼向下旋轉;當用戶向右轉頭時,耳朵會根據轉頭速度向左旋轉。
骨骼動畫
除了上一點所說的更新方式,本系統還使用骨骼動畫來來做更精致、可運營的表情。骨骼動畫與命中邏輯可動態下發。
基于人臉追蹤與表情捕捉數據更新虛擬形象
初始化之后,虛擬形象會添加到虛擬世界中,用戶人臉在真實世界中的運動會同步到虛擬形象在虛擬世界的運動。同時通過表情捕捉數據,拆解用戶表情為普通表情基和混合表情基的線性組合,利用此組合更新虛擬形象的強表情部分。如下式,?E(user)是用戶當前的表情,E是普通表情基,B是混合表情基。
更新方式是:遍歷表情基E的網格的每一個頂點,通過下式計算其最終的位置。其中V(i)表示第i?個頂點,V(E1)表示在表情基E1中相應的頂點,A(i)表示表情Ei的權重。
對于弱表情部分,本系統根據頭部的運動與表情的變化,通過骨骼控制它們。弱表情部分包括但不限于耳朵、下牙與舌頭、眼球。
對于耳朵:
當頭部轉動時,通過判斷轉頭的速度來控制耳朵骨骼的旋轉,從而彎曲耳朵。計算公式如下式,Ear(eulerAngles)為耳朵骨骼的歐拉角,V(x), V(y)?分別為頭部轉動的偏航角速度、俯仰角速度,A、B分別為計算所需的補償值,效果如圖6。
1)??當用戶張大嘴時,耳朵向內彎曲,彎曲幅度由云端控制。
2)??當用戶閑置時,耳朵部分播放骨骼動畫,動畫與觸發邏輯由云端下發。
對于下牙與舌頭:
1)??當用戶張嘴時,下牙與舌頭的骨骼配合張嘴表情向下旋轉。計算公式如下,Jaw為下牙與舌頭骨骼的歐拉角,H?為云端控制的最大俯仰角閾值,A為當前表情的張嘴表情系數。
2)??當用戶張嘴且下唇特征點出現特定變化,判斷用戶在張嘴伸舌頭,變形舌頭并伸出舌頭,效果如圖9。
3)??當用戶張嘴伸舌頭時,移動頭部,控制舌頭左右變形,以符合頭部的運動。
對于眼球:
1)??眼球的轉動主要根據眼部表情變化來控制,計算方式如下式,Eye為眼球骨骼的歐拉角,S為計算旋轉的方向值,H為云端控制的最大俯仰角與偏航角閾值,A為當前表情的眼部表情變化系數。
全景背景與粒子特效
通過下發不同的360全景圖片或視頻作為背景。當用戶做特殊表情或者特殊話語,觸發全景背景的更改與粒子特效,當用戶旋轉手機時,能看到不同的內容,豐富了產品的應用空間,效果如下圖。
更進一步
目前模型的體積較大,考慮采用運行時平滑、著色的方式,實現素材包的體積減少,使用運行時加頂點的平滑方式,可以讓素材包減小80%左右。
與TTS結合,讓用戶可以通過語音控制一些彩蛋邏輯。
結合圖像處理、深度學習算法,拓寬應用場景,實現更好玩的玩法。