ARKit の Face Tracking で顔にマスクをつける for iPhone X - 概要編
iPhone X では端末前面に従来の FaceTime HD カメラやセンサーの横へ、Microsoft Kinect のようなドットプロジェクタや赤外線カメラを追加しており、 これらのセンサーユニットの総称して TrueDepth カメラと呼ばれている。
TrueDepth カメラは、背面の iSight Duo カメラのように空間の深度情報を取得して顔の奥行きを認識し、
Face ID の認証に使用されているが、
ARKit の Face Tracking では、ドットプロジェクタや赤外線カメラを使用しておらず FaceTime HD カメラのみ使用している。
2017/03/06 追記
iOS 11.3 の Animoji ではドットプロジェクタを使用している可能性があり、
ARKit の Face Tracking も仕様変更が行われるかもしれません。
WWDC 2017 のキーノートで Face Tracking の技術が発表され、Apple のソフトウエアのバイスプレジデントである Craig Federighi が AR のマスクをつけるデモをしたり、Animoji (アニ文字)でが使われたりしている。
Face Tracking の概要
FaceTime HD カメラの画像から、 おそらく Vision Framework の Face Detection や Face Landmarks、もしくは何らかの CoreML からの学習データから、 顔の位置と50を超えるの筋肉の動きを表す変化量を表すパラメータをリアルタイムで作成している。
Vision Framework の Face Landmarks
また、顔の筋肉は片面で20もないはずなので、部分的な動きの情報や Face Tracking では使用していない情報などを取得している可能性がある。
取得できる情報
顔の位置は ARKit の平面認識と同様にアンカーとして渡され、表情を表す情報は Blend Shape (morph) の値が入った Dictionary が返える。
基本的にはこれしか行えない。
画像でも認識するのか?
FaceTime HD カメラで認識しているということで気づいた人はいるかもしれないが、顔の写真やモナリザなどの絵画でも Face Tracking は認識する。
試したところ、FaceTime HD カメラで映るある程度特徴点が取れる大きな顔を取得して認識し、複数は取れないような感じではある。
(未確認なのでもしかして複数取れるかも?)
また、試してはいないが多分動画とかでも認識すると思われる。
深度情報
一応、ARKit の Face Tracking では深度情報が取得でき、 ARFrame から取得できる画像は 360px × 640px と小さい。
見た感じだとグレイスケールの色の勾配がかなり緩やか。
ARKit 自体が端末上限の FPS で動作しているが、深度画像は 15 FPS でしか取得することはできないため、 もし表情で使用する場合はソフトウエアで処理しないとかなり難しいのではないかと思われる。
ついでに Animoji について
動作
AvatarKit、Animoji というプライベートフレームワーク(API)と、iMessage のエクステンションである Jellyfish.app が使用されて動作されていると予想され、Animoji は AvatarKit と Jellyfish.app をつなげる役割をしているように見える。
AvatarKit には Animoji のキャラクタ(Puppet)の操作を含まれている模様。
ちなみに GitHub で AvatarKit と検索すると AvatarKit 使用したサンプルがいくつあり、
プライベート API なので申請はできないが、Animoji の振る舞いを確かめたり、iMessage ではない自前のアプリで試すことができる。
キャラクターデータ
iPhone X のレストアファイル .ipsw の中にある。
zip なので解凍し、中にある dmg の System/Library/PrivateFrameworks/AvatarKit.framework の puppets に圧縮されたシーンファイルである scnz いくつか存在している。
各パペットの scnz はリファレンスとしてカメラとアンビエントライト、ディレクショナルライトが設定されたシーンの scnz を読み込んでおり、 顔の回転以外は、全て Blend Shape (morph) で設定されている。
顔が動いた時、耳や鶏冠などが揺れるがどのように動作しているかは不明。
顔にボーンが仕込まれていて、その先には Kinematic に設定された Physics Body が設定されており、
プログラムで何らかの Dynamic のジオメトリか物理フィールドなどから Blend Shape 動かしているのではないかと予想。
また、一部キャラクターには API 上取得できない舌の動きの Blend Shape があったり、現状存在していない動作を行おうとした痕跡があり。
Kiss というパラメータもあった。
長くなってきたので、次回の記事で Face Tracking のコードを書いていこうと思う。