Animoji實現方案分享

寫在前面

由于之前在申請專利,所以文章不能發出來,現在發出來幫助有需要的人。

Animoji

蘋果在今年的十周年特別版iPhone X發布會上,推出了Animoji功能。該功能基于iPhone X的結構光傳感器,捕捉用戶的表情變化,生成相應的3D動畫表情。本文介紹了基于ARKit + SceneKit的Animoji實現方案。


圖1?發布會上的Animoji介紹

Animoji原理

???在人臉建模后,通過獲取人臉追蹤與表情捕捉的數據,更新到虛擬形象上,使虛擬形象與用戶人臉的位置與表情相同步。

(1)?人臉建模

在高端設備上,借助紅外攝像頭與結構光點陣投影儀,根據獲取的點云數據,結合利用泛光照明器得到的紅外圖像,通過隨機交替獲取二者數據,做3D人臉建模。

(2)人臉追蹤與表情捕捉

人臉追蹤:依據人臉檢測算法和SLAM(同步定位與地圖構建)算法,實時追蹤人臉在圖像中的位置變化,并計算人臉在3D空間中的位置。

表情捕捉:依據基于深度學習的表情識別算法,通過匹配用戶當前人臉數據到表情庫,識別出用戶當前表情。

(3)虛擬形象渲染

構建與真實世界相同坐標的虛擬世界,創建虛擬形象并實時計算它與人臉之間的位置映射關系,基于表情捕捉得到的數據來更新虛擬形象的動畫表情。

Animoji效果

視頻鏈接

Animoji方案

本方案使用?變形動畫+骨骼動畫+骨骼控制?來實現Animoji。

變形動畫:使用預先制作好的表情基作為變形目標,通過變形的方式來確定模型表面每個頂點最終的位置,使用SceneKit渲染的話,可以用SCNMorpher來實現。

骨骼控制:在設計師刷好骨骼對蒙皮的權重后,就可以通過骨骼控制或者加載骨骼動畫來實現非變形部分的動畫。

骨骼動畫

建立虛擬形象模型

(1)虛擬形象靜態模型

虛擬形象分為強表情部分和弱表情部分,以頭部舉例:臉部為強表情部分,眼睛牙齒耳朵等為弱表情部分。強表情部分用捕捉的表情數據更新,弱表情部分則根據用戶頭部的運動數據與表情變化來更新。


圖2?強表情部分和弱表情部分

例如:用戶邊轉頭邊做鬼臉,強表情部分,即臉部會更新為用戶的表情形象,而弱表情部分,如耳朵骨骼會根據用戶頭部轉動的速度變彎曲,舌頭會在嘴巴長到一定幅度伸出。

(2)制作表情基

表情基分為普通表情基與混合表情基。表情基與靜態模型的強表情部分的拓撲結構完全一致,且在同一個尺度空間下大小相同。不同表情基,模型的網格頂點數一樣,多邊形一一對應,不同的是頂點的位置不同(如大笑嘴部的頂點就會有位移)。

普通表情基是一些設計好的臉部模型,如圖3。普通表情基代表一些固定的人臉表情,如張嘴、眨眼,為了縮減大小,表情基除了幾何體沒有其他任何信息,并且分割為若干子部分。


圖3?不同的表情

混合表情基是若干特定的普通表情基的非線性組合,在運行時計算得出,用以擴展表情的豐富度,理論上有混合表情基的支持,虛擬形象能夠模擬無限多個表情,而不是只在普通表情基這個維度,混合表情基的計算方式如下式,?B( i )表示第i 個混合表情基,E( j )表示第j個普通表情基。


表情分割

本系統將表情分割成5部分,在加載表情時,只使用有效部分,(如眨眼就只加載眼部),縮小了表情的計算量。分割表情時,使用更平滑的頂點法線來避免分割后可能產生的裂縫。


表情權重分配機制

本系統對不同表情分配了不同的權重,在更新時,對于高權重的表情,會先加載先更新,提高每次更新表情的用戶體驗,縮短關鍵表情的等待時間,流程圖如下。


分包加載

本系統的加載方式采用分包加載的方式,首先將分割好的表情基分布存儲在若干文件中,在需要的時候分包加載,模型開始更新的時間是之前的20%。


建立骨骼

對于弱表情部分,他們是根據頭部的運動與表情變化來做更新,本系統對弱表情部分建立骨骼來控制它們。當用戶向右看時,控制眼球骨骼向右旋轉;當用戶張嘴時,控制下巴骨骼向下旋轉;當用戶向右轉頭時,耳朵會根據轉頭速度向左旋轉。


圖4?用于控制弱表情部分的骨骼

骨骼動畫

除了上一點所說的更新方式,本系統還使用骨骼動畫來來做更精致、可運營的表情。骨骼動畫與命中邏輯可動態下發。

基于人臉追蹤與表情捕捉數據更新虛擬形象

初始化之后,虛擬形象會添加到虛擬世界中,用戶人臉在真實世界中的運動會同步到虛擬形象在虛擬世界的運動。同時通過表情捕捉數據,拆解用戶表情為普通表情基和混合表情基的線性組合,利用此組合更新虛擬形象的強表情部分。如下式,?E(user)是用戶當前的表情,E是普通表情基,B是混合表情基。


更新方式是:遍歷表情基E的網格的每一個頂點,通過下式計算其最終的位置。其中V(i)表示第i?個頂點,V(E1)表示在表情基E1中相應的頂點,A(i)表示表情Ei的權重。


對于弱表情部分,本系統根據頭部的運動與表情的變化,通過骨骼控制它們。弱表情部分包括但不限于耳朵、下牙與舌頭、眼球。

對于耳朵:

當頭部轉動時,通過判斷轉頭的速度來控制耳朵骨骼的旋轉,從而彎曲耳朵。計算公式如下式,Ear(eulerAngles)為耳朵骨骼的歐拉角,V(x), V(y)?分別為頭部轉動的偏航角速度、俯仰角速度,A、B分別為計算所需的補償值,效果如圖6。


圖6?頭部轉動時耳朵彎曲

1)??當用戶張大嘴時,耳朵向內彎曲,彎曲幅度由云端控制。

2)??當用戶閑置時,耳朵部分播放骨骼動畫,動畫與觸發邏輯由云端下發。

對于下牙與舌頭:

1)??當用戶張嘴時,下牙與舌頭的骨骼配合張嘴表情向下旋轉。計算公式如下,Jaw為下牙與舌頭骨骼的歐拉角,H?為云端控制的最大俯仰角閾值,A為當前表情的張嘴表情系數。


2)??當用戶張嘴且下唇特征點出現特定變化,判斷用戶在張嘴伸舌頭,變形舌頭并伸出舌頭,效果如圖9。


圖9?虛擬形象張嘴伸舌頭

3)??當用戶張嘴伸舌頭時,移動頭部,控制舌頭左右變形,以符合頭部的運動。

對于眼球:

1)??眼球的轉動主要根據眼部表情變化來控制,計算方式如下式,Eye為眼球骨骼的歐拉角,S為計算旋轉的方向值,H為云端控制的最大俯仰角與偏航角閾值,A為當前表情的眼部表情變化系數。


全景背景與粒子特效

通過下發不同的360全景圖片或視頻作為背景。當用戶做特殊表情或者特殊話語,觸發全景背景的更改與粒子特效,當用戶旋轉手機時,能看到不同的內容,豐富了產品的應用空間,效果如下圖。


圖?10?背景為360全景圖,用戶轉動手機可看到不同

更進一步

目前模型的體積較大,考慮采用運行時平滑、著色的方式,實現素材包的體積減少,使用運行時加頂點的平滑方式,可以讓素材包減小80%左右。

與TTS結合,讓用戶可以通過語音控制一些彩蛋邏輯。

結合圖像處理、深度學習算法,拓寬應用場景,實現更好玩的玩法。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 文章轉載自https://blog.csdn.net/n5/article/details/3105872 201...
    EternalSunLhx閱讀 7,443評論 0 2
  • 又是一個人,擁被而眠。睜開慵懶的眼睛,看著太陽一點點升起,我的心卻在一點點跌落:我想見的人,他沒有來。 總是這樣,...
    紫月砂雪閱讀 212評論 7 2
  • 親愛的一承 你好! 我在寫回信的時候,發寫信五的回信已經寫過了,這封應該是信六了,你自己更正一下吧。你看,記錄的好...
    尤承琪閱讀 666評論 5 2
  • 路盡終南 芳草碧連天重陽宮外 檀香繞聲聲泉聚水深淵 冰封古墓前可曾留步 問君寒 一場冷雨過 霹靂碎云端生死皆注定 ...
    夢飲千樽月閱讀 684評論 0 50