5.1K Views
October 25, 22
スライド概要
IRIAMではライバーの顔をUnityアプリ上でリアルタイムに認識し、視聴側でキャラクターを表情付きで再構築することで低遅延のネットワーク配信を実現しています。一方で端末スペックに起因する認識精度の差異が従来からの課題となっており、問題解決にむけDeNAはデータサイエンスとエッジAIの知見を活かした新しい顔認識の開発に取り組みました。
本発表ではその開発過程で得られた知見、具体的には教師データの制約や使途によって異なる機械学習モデルの設計指針、Barracudaなどの推論ランタイムを活かすためのモデル変換ノウハウ、そしてUnityとAIを実機上で効率良く連携するための周辺実装を中心にお伝えします。
こんな人におすすめ:
・純粋に、ライブ配信アプリIRIAMに興味のある方
・PyTorchやLightGBMを各種制約や使途に応じて使い分け、AIを実用化したい方
・Barracuda、ONNXRuntime、TFLiteをUnityで動かす上での課題と解決策を知りたい方
受講者が得られる知見:
・データサイエンスの知見を活かした機械学習フレームワークの活用およびモデルの設計指針
・機械学習モデルをBarracudaなどで動かすためのノード書き換えといったML寄りドメイン知識
・Native PluginsやComputeShaderを通じて実機上で効率よくAIを動かすための実装実装技術
出演:
竹村 伸太郎 (株式会社ディー・エヌ・エー)
大矢 隆 (株式会社ディー・エヌ・エー)
--
初出: SYNC 2022 #UnitySYNC
https://events.unity3d.jp/sync/
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
データサイエンスの知見をUnityでも活かそう! ライブ配信アプリIRIAMの顔認識改善の取り組み 竹村伸太郎 大矢隆 株式会社ディー・エヌ・エー © DeNA Co.,Ltd.
目次 1 はじめに 2 IRIAMって何? 3 機械学習編 4 Unity組み込み編 2
1. はじめに 3
1 本発表の流れ 「IRIAM」の顔認識改善を担当した大矢と竹村が、下記の技術的側面から解説します 大矢 隆 機械学習編 竹村 伸太郎 Unity組み込み編 4
2. IRIAMって何? 手短に紹介させてください 5
6
7
3. 機械学習編 スモールスタートで始める、機械学習モデルの設計指針 8
1 取り組みの背景 「モーションライブ方式」実現のため → 実機上でリアルタイムに顔画像から表情パラメータ (BlendShape値)を求めたい ※ 正確には、顔のTransform(位置+回転)推定も含む 位置 X: -75 Y -20 回転 X: -13 Y:-6 Z:-2 口の開き具合 : 0.544 左目の閉じ具合 : 0.393 ・・・ 9
2 ● ● 解決すべき課題 従来よりIRIAMでは自前の顔認識モジュールを用意していた ○ しかし、Apple製のARKitに比べて精度面で課題があった ○ ARKitはAndroidはもちろん、すべてのiOS端末で使えるわけではない 機能要件を整理すると ○ 動作プラットフォームを限定せず ○ 高速かつ省サイズで ○ 高精度な顔認識システムが必要 10
3 ● ● 顔認識システムの定義 前準備 ○ 教師データ用に、一定のルールで様々な表情の顔画像を収録 ○ 機械学習モデルを設計し、その学習済みモデルをアセットとして格納 実行内容 ○ Smile 実機上で動く何らかの推論ランタイムでBlendShape値を推定 MouthOpen EyeBlink training data trained ML model file e.g., ONNX On-device face tracking e.g., with Unity Barracuda 11
4 2つの学習アプローチ ● End-to-Endの機械学習モデル ● ○ ドメイン知識を必要としない✓ ○ 必要な教師データが多く、スモールスタートに不向き × 学習済みモデルとドメイン知識ベースで特徴抽出し、PyTorch/LightGBMで学習 ○ ドメイン知識を活かすことで、高精度でロバストなモデルが作れる ✓ ○ 少ない学習データでも学習可能 ✓ ○ End-to-Endと比べ、特徴抽出のための作業が多い × → 本取り組みでは後者の特徴抽出 + PyTorch/LightGBMを採用 約20名の収録でPoCを実施し、従来手法を上回る精度を達成 12
5 ● ● ポータブルな機械学習モデルを目指して PyTorchやLightGBMは、ONNXという汎用フォーマットで出力可能 ○ この時点でONNX Runtime上で動作させることは出来る ○ が、それ以外の例えば Unity Barracudaでは制限のため多くは動作しない 例えば、以下のような工夫が必要 ○ ONNX出力時、互換性に配慮したopsetを指定 (target_opset = 9など) ○ 未対応のoperatorは、他のoperatorを使って代用 ■ ● register_custom_op_symbolic の使用など 開発初期では、LightGBMを用いて必要な特徴量を探る ○ LightGBMをBarracuda用に変換する実装例を、次スライドで掲載 13
6 LightGBM学習モデルをBarracuda用に変換する実装例 @symbolic_helper.parse_args("v", "i", "v", "v") def gather_alt(g, self, dim, index, sparse_grad=False): dtype = self.type().scalarType() values = g.op("Constant", value_t=torch.LongTensor([0, 1])) # Barracudaでは動的な入力を受け付けないため、計算済みの固定値を代入 depth = torch.asarray([42]) # size(g, self, g.op("Constant", value_t=torch.LongTensor([dim]))) # BarracudaのOneHot operatorはaxis_iが設定できないため、Transposeで代用 index = g.op("Cast", g.op("OneHot", index, depth, values, axis_i=-1), # axis_i=dim to_i=symbolic_helper.cast_pytorch_to_onnx[dtype]) index = g.op("Transpose", index, perm_i=[0, 2, 1]) mul = g.op("Mul", symbolic_helper._unsqueeze_helper(g, self, [dim + 1]), index) return symbolic_helper._reducesum_helper(g, mul, axes_i=[dim], keepdims_i=0) register_custom_op_symbolic('::gather', gather_alt, 9) model = lgb.LGBMRegressor(num_leaves=8) X = np.array(np.random.rand(10000, 28), dtype=np.float32) y = np.random.uniform(size=10000) model.fit(X, y) onnx_model = hummingbird.ml.convert(model, "onnx", X, extra_config=dict(onnx_target_opset=9)) 14
4. Unity組み込み編 実機上でAIを効率よく動かすための、実装技術 15
1 ● AI組み込み前に確認すべきこと 推論コストの概算 ○ ● 導入アプリのCPU/GPU負荷 ○ ● PCのCPUで推論時間を計測する ProfilerやSRDebuggerの活用 動作対象となる端末の最低要件 ○ Androidであれば 64bit専用か ○ iPhoneなら6S以降(Mem 2GB+)か ○ OpenGL ESなら3.1以降か ○ Vulkan前提に出来るか 16
2 AI組み込みに必要なスキル どのプロセッサで動かすかで、組み込み担当者に必要なスキルは変わる ● CPU ● GPU ● ANE/DSP/NPU (端末独自プロセッサ) MLモデルの量子化技法 iOSネイティブ実装 GPUリソースの扱い Androidネイティブ実装 Unity/C#の理解 Unity/C#の理解 Unity/C#の理解 MLモデルの取り扱い MLモデルの取り扱い MLモデルの取り扱い CPU GPU 難 易 度 ANE/DSP/NPU 17
3 AI組み込みに必要なツール(推論ランタイム) Win CPU GPU CUDA Tensoflow ✓ Tensorflow Lite ✓ LibTorch ✓ macOS CPU DirectM L ✓ GPU ✓ Unity Barracuda ✓ GPU Android ANE Metal ✓ ✓ GPU DSP NPU OpenG L ES Vulkan ✓ nightly ✓ ✓ *1 ✓ ✓ *1 *1 ✓ nightly *1 ✓ *1 *1 *1 *1 ✓ *1 *1 *1 ✓ ✓ ✓ ✓ *1 ✓ ✓ ✓ ✓ ✓ ✓ ✓ Android NNAPI Apple CoreML CPU ✓ ✓ ✓ CPU Metal PyTorch mobile ONNX Runtime iOS ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ *1 NNAPIまたはCoreMLを内部的に呼び出すことで対応を謳っているもの 18
4 ● PoCフェーズで推奨するアプローチ 初手Tensorflow Lite(以下 TFlite)でCPU推論がお勧め。理由は以下。 ○ ONNXRuntimeやBarracudaと比較して多くのケースで推論が最速 ○ LightGBMからhummingbirdとonnx_tf経由でTFlite形式に簡単に出力可能 ○ ○ ■ https://github.com/microsoft/hummingbird ■ https://github.com/onnx/onnx-tensorflow ■ Barracudaのように特定のオペレータを書き換える必要はない Koki Ibukuro氏が作られたtf-lite-unity-sampleのおかげで、Unity導入が容易 ■ https://github.com/asus4/tf-lite-unity-sample ■ Windows/macOS/Android/iOS用のビルド済みUnity Native Pluginsを含む 補足:XNNPACK delegateは高速化のため必ず有効にしよう 19
5 ● ● PoCで振り返るべきこと ボトルネックを洗い出す 1. 推論そのもののコスト 2. 推論を挟む、GPU ⇄ CPUリソース変換のコスト ボトルネックが1か2のどちらかで、打ち手が変わる ○ 2の場合、前処理・後処理がShader化できればGPU推論は有望な選択肢 空いたCPUをアプリ側に回せる 推論 CPU 前処理 後処理 GPU ○ 前処理 推論 後処理 1で前後をShader化出来ないケースは要注意。リソース変換が足枷になる CPU 前処理 推論 後処理 前処理 GPU 後処理 推論 20
6 ● ● さらなる応用へ ~Barracudaの活用~ 大前提としてGPU推論は、Barracudaに限らず機械学習モデルの制約が大きい ○ 発表時間の都合で詳細割愛するが、端末独自プロセッサも同様に制約大 ○ まずはTFLiteで大局を掴み、シンプルなモデルに移行出来るか検討 BarracudaはUnity上のGPUリソースとの親和性が最も高い推論ランタイム ○ 入出力テンソルがTexture or ComputeBuffer上にある時、真価を発揮する ○ WorkerFactory.Typeを指定して必ずCPU/GPU双方でProfilingしよう ComputeBuffer Execute(tensor as input) ReferenceComputeOps ComputeBuffer .buffer Tensor IWorker Tensor Pin(tensor as input) Texture2D .PeekOutput() Texture2D .ToRenderTexture() 21
© DeNA Co.,Ltd. 22