2017年11月9日 星期四

iPhoneX上的ARKit人臉識別

作者:Jimmy Alamparambil 原文
潤稿:Kelvin Lo


自從6月份在WWDC大會上首次發佈ARKit以來,它已經成為實現穩定商品等級AR的方法。最近在iPhone X發佈會上,Apple發表將會為ARKit加入一些只在iPhone X上可用的人臉辨識功能,這功能會用到iPhoneX上面的深度鏡頭的前置鏡頭組。

Unity一直與
Apple密切合作,在ARKit發佈的同時就提供了對應的Unity ARKit套件,確保Unity開發者可以在最短的時間內就可以開發出ARKit產品應用。我們與Apple公司緊密合作,把ARKit的人臉識別包入了Unity ARKit套件。

這些新功能的相關程式與範例已整合在Unity ARKit套件裡,你可以從BitBucketAsset Store找到它。

套件新增的API內容


如果你的產品會在iPhoneX執行,現在可以使用一個名為ARKitFaceTrackingConfiguration的設定資訊。新的RunWithConfig 和 RunWithConfigAndOptions方法可以使用ARKitFaceTrackingConfiguration設定資訊來啟動AR。

新增了用來增加、刪除或更新ARFaceAnchor的事件Callback。

人臉辨識功能

ARKit中的人臉辨識有四個主要功能。下面會一一介紹並展示範例。

臉部定位(Face Anchor)



人臉辨識的一個基本功能是當iPhoneX的前鏡頭偵測到人臉時提供一個定位錨點。這個定位錨點與ARKit通常回傳的平面錨點相似。當你移動頭部時,它會追蹤頭部中心的位置和方向。透過這種方式就可以使用臉部運動作為ARKit應用的輸入,同時也允許你使用這個錨點將物件附加到臉部或頭部,就能做到3D物件會隨著你頭部移動。
我們製作了一個展示場景FaceAnchorScene來展示這個功能。它裡面有一個附加了UnityARFaceAnchorManager元件的GameObject,這個元件會使用ARKitFaceTrackingConfiguration初始化ARKit。它還連接到FaceAnchor,建立、更新和移除事件,以便執行以下操作:

  1. 在建立臉部錨點時,它會啟用一個GameObject。在範例中是一個如上圖的三軸座標模型,會將這個模型移到由FaceAnchor給予的位置和方向上面。 
  2. 在臉部錨點更新時,它會更新GameObject的位置和方向。 
  3. 當移除臉部錨點時,它會關掉這個GameObject。 
這個場景還用了ARCameraTracker元件,這個元件透過FrameUpdateEvent更新Main Camera,和一般的ARKit應用程式一樣。

臉部網格Face Mesh Geometry



臉部辨識API還可以將檢測到的人臉形狀傳回一個網格。在Unity中使用這些網格點就可以建立一個臉部網格。然後與透明紋理一起使用就可以幫臉部做表面繪製。當我們這個網格放在上面提到臉部錨點時,賦予一個材質就能換臉。

展示場景FaceMeshScene展示了如何在你的臉上放一個用預設材質的臉部網格 。它有一個常見的ARCameraTracker物件,用在在場景中的鏡頭。還有一個ARFaceMeshManager物件,該物件有一個基本網格以及一個空的Mesh Filter元件。這個物件還有UnityARFaceMeshManager元件,用來執行以下操作:

  1. 設定臉部辨識 
  2. 根據錨點位置和旋轉,更新對應物件的transform資訊。
  3. 展出每幀錨點的網格資料,填充成一個網格,並將此網格賦予Mesh filter元件

變形 Blend Shapes





我們從臉部辨識得到的另一組資料是描述臉部表情的係數,將它們映射到一個虛擬面部,就可以模仿你的表情。

範例場景FaceBlendShapeScene展示了這個應用。在UI中它顯示了根據當下表情返回的不同混合形狀值的係數。看看它們在你改變表情時是如何變化的。

這個場景與FaceMeshScene擁有相同的物件,但是另外還有一個包含了BlendshapePrinter元件的BlendshapeOutput物件。該元件從臉部錨點中提取存在的Blend Shapes,並輸出到螢幕UI。

我們正在製作一個更詳細的例子,在這個例子中,這些值將被映射到虛擬頭部的臉部動畫中,以幫助你更好地瞭解它的用途。

定向光估計 Directional Light Estimate



使用臉部辨識還能獲取另一組有趣的資料,將你的臉當成場景裡的定向光偵測器,來產生場景的定向光推算 。產生的資料包含三個:

  1. 主光源方向 
  2. 主光源亮度 
  3. 預估的全向照明環境的球面調和係數 (Spherical harmonics coefficients)
最後一項在Unity中對我們來說很有意思,因為它剛好是我們標準渲染管線中用於動態全域照明的解決方法。瞭解這些資訊後,我們就可以在範例場景中使用。

FaceDirectionalLightEstimate場景有一個ARCameraTracker和一個ARFaceAnchorManager,它使一個灰色球體會隨你的臉四處移動。ARKitLightManager物件是新增的,它包含一個UnityARKitLightManager元件,用於從FrameUpdated事件獲取球面調和係數,並將它指到場景中所有的Unity光線探頭,包括環境光線探頭。這樣就能根據估計的環境光線,有效地為場景中的網格提供動態照明。

如果你希望使用自己的機制來提供場景照明,可以通過FrameUpdated事件,獲取以Unity坐標系統表示的原始球面調和係數,放到你的照明公式中。你也可能只是想使用主光源的方向和強度來照明,那麼同樣的方式也適用。

請注意:本文中所提供的範例場景,只有在從Bitbucket下載的套件裡才有。 


小結

正如你所看到的,在iPhone X上有一些和臉部辨識有關的ARKit功能。Unity的ARKit套件可以幫助你輕鬆地在你的應用中實現這些功能。iPhone X目前已正式發售,所以如果你是AR的開發者,趕緊研究如何在你的應用加入臉部辨識吧。

著作人