Slide 1

Slide 1 text

機械学習を用いたIRIAM顔認識機 能の改善の取り組み 地主 龍一 大矢 隆 竹村伸太郎

Slide 2

Slide 2 text

本日の構成 1. 本プロジェクト「SuperCV」の紹介 (地主) 1. IRIAMについて 2. 本プロジェクトの背景、目的 2 2. 高精度 & 高速な顔認識AIの開発 (大矢) 1. 活用した既存ツール 2. 学習のアプローチ、TFLite変換 3. 顔認識AIの実機組み込み (竹村) 1. サービスの動作要件から、使えるツールを絞り込む 2. 実機組み込みの最適化アプローチ

Slide 3

Slide 3 text

本プロジェクト「SuperCV」の紹介 地主 龍一

Slide 4

Slide 4 text

自己紹介 ● 地主 龍一 (じぬし りゅういち) ● Unity エンジニア ● エンジニアリング部エンジニアリング第二グループ ○ グループリーダー ● 2022 年に IRIAM に入社 ● 本プロジェクトの IRIAM 側の PM 4

Slide 5

Slide 5 text

5 IRIAMについて IRIAM(イリアム)は、スマホひとつで いつでも・どこでも「キャラクターのライブ配信」 を楽しめるアプリです。

Slide 6

Slide 6 text

モーションライブ方式 6

Slide 7

Slide 7 text

「SuperCV」プロジェクトの背景 7 ● 既存の顔認識システム on iPhone ○ Apple 製の ARKit を使用し、表情パラメタ (Blendshape 値) を取得 ○ 既に十分に高速かつ高精度 口の開き具合 : 0.689 左目の閉じ具合 : 0.865 ・・・

Slide 8

Slide 8 text

「SuperCV」プロジェクトの背景 8 ● 既存の顔認識システム on Android ○ OpenCV は ARKit に比べてパラメータが少なく表現力が低い ○ 海外では Android シェアが大きいため、精度を上げたい ■ ※そもそも ARKit への強い依存は避けたい ※ https://gs.statcounter.com/のデータを 用いて独自に作成 GDP上位10か国のモバイルOS市場シェア (2022)

Slide 9

Slide 9 text

「SuperCV」プロジェクトの目的 9 ● 高精度 & 高速で Android 上で動作する Face Tracking システムの開発 ○ 高速 (20 FPS 以上) かつ省サイズ ○ 事前に決めておいた表情パラメタを予測 ■ 実際は、表情パラメタに加えて位置と回転も必要 位置 X: -75 Y -20 回転 X: -13 Y:-6 Z:-2 口の開き具合 : 0.544 左目の閉じ具合 : 0.393 ・・・

Slide 10

Slide 10 text

「SuperCV」プロジェクトの目的 10 ● 取り扱う表情パラメタ ○ 27 個の表情パラメタを機械学習モデルで推定 ○ 値の範囲は 0 から 1 対象の表情パラメタの例 左目が閉じている度合い 右目が内側を向いている度合い 口が開いているか度合い 左の口角が上がっている度合い 右の頬が上がっている度合い 眉の内側が上がっている度合い 上唇が持ち上がっている度合い 唇をすぼめている度合い ・・・

Slide 11

Slide 11 text

Unity デモ動画 11 ● 「SuperCV」の Unity デモ (on M1 Mac)

Slide 12

Slide 12 text

高精度 & 高速な顔認識AIの開発 大矢 隆

Slide 13

Slide 13 text

自己紹介 ● 大矢 隆 (おおや たかし) ● 2022年にDeNAに新卒入社 ● データ本部AI技術開発部第一グループ ● Kaggle Grandmaster ○ 大規模な機械学習コンペで準優勝2回 ○ テーブルデータが得意 13

Slide 14

Slide 14 text

データ収集 14 ● 以下の動画のように、動きを指定して動画を撮影 ○ 被験者はDeNA内で募集して、合計で100人程度 ○ これによって、動画と表情パラメタのペアを作成

Slide 15

Slide 15 text

活用した既存ツール 15 ● MediaPipe FaceMesh ○ Google製のOSS (Apache V2 License) ○ 商用利用可能 ○ 478点の顔の特徴点の位置(x, y, z)を出力 ■ x, yは画像中の座標 ■ zは推定された深度

Slide 16

Slide 16 text

活用した既存ツール 16 ● MediaPipe FaceMeshの詳細 (Attention Mesh) ○ BlazeFaceという軽量なObject Detectorを使ってOBBを予測 ○ STNを使って顔や口の部分を切り出し、座標や深度を予測 参考にした論文:Grishchenko, I., Ablavatski A., Kartynnik, Y., Raveendran, K., Grundmann, M.: Attention Mesh: High-fidelity Face Mesh Prediction in Real-Time. arxiv preprint arxiv:2006.10962

Slide 17

Slide 17 text

余談:Mediapipeベースのblendshape solver 17 ● KalidoKit ○ OSS (MIT License) ○ ルールベースで、一部の表情パラメタにのみ対応 ○ お手軽にアバター体験が可能 対象のパラメタの例 左目が閉じている度合い 口のxy位置 口のa, i, u, e, oの度合い 顔の3次元位置 眉の上がり具合 瞳の位置 ・・・

Slide 18

Slide 18 text

余談:Mediapipeベースのblendshape solver 18 ● MeFaMo ○ OSS (MIT License) ○ ルールベースで、多数のBlendshape値に対応 対象の表情パラメタ 左目が閉じている度合い 顎を右に動かしている度合い 口が開いている度合い 「ウ」の口になっている度合い 左口角を下げている度合い 上唇を噛んでいるかどうか 右眉の内側を上げる度合い 左の頬を上げる度合い ・・・

Slide 19

Slide 19 text

学習のアプローチ 19 ● 1-1. 特徴量入力 MLP (Mediapipeベース) ○ 各表情パラメタ用の特徴量を結合して、一つのMLPで予測 ○ 様々な特徴量の計算が必要 ※実際はMediaPipe FaceMeshそのものは用いず、独自実装を使う

Slide 20

Slide 20 text

特徴量生成 20 ● MediaPipe Face Meshの出力 (478 x 3次元) を特徴量に変換 ○ 特徴量の例 (口の開閉の特徴量) ■ 点Aと点Bの距離 / 点Cと点Dの距離

Slide 21

Slide 21 text

特徴量生成 21 ● MediaPipe Face Meshの出力 (478 x 3次元) を特徴量に変換 ○ 特徴量の例 (口角の上がり具合の特徴量) ■ A→B: x軸、C→D: y軸、A→B × C→D:z軸とする座標系を考える ● このときのE→Fのφとθを特徴量にする 画像引用元:https://commons.wikimedia.org/wiki/File:3D_Spherical_2.svg

Slide 22

Slide 22 text

学習のアプローチ 22 ● 1-2. FaceMesh入力 MLP (Mediapipeベース) ○ 特徴量生成が不要 ○ 精度は特徴量入力よりも多少低下 ■ しかし、併用してHybridにすることで精度改善可能 ※実際はMediaPipe FaceMeshそのものは用いず、独自実装を使う

Slide 23

Slide 23 text

学習のアプローチ 23 ● 2. 画像入力 CNN ○ Mediapipeも特徴量生成も不要 ○ 表情パラメタの推定に特化

Slide 24

Slide 24 text

定量的な精度 & 速度 & サイズの比較 24 ● 評価用データにおける精度と速度の比較 ○ 精度 & 速度 & サイズで、画像入力 CNNが勝る 機械学習モデル 相関係数 平均処理時間 on M1 Mac (Unity/TFLite) 総モデルサイズ (fp16) 特徴量入力 MLP 0.788 2.2 + 0.2 = 2.4 ms 2.5 + 1.1 = 3.6 MB FaceMesh入力 MLP 0.767 2.2 + 0.3 = 2.5 ms 2.5 + 2.7 = 5.2 MB Hybrid MLP 0.798 2.2 + 0.5 = 2.7 ms 2.5 + 3.2 = 5.7 MB 画像入力 CNN 0.855 1.4 ms 3.1 MB ※ MediaPipe (Attention Mesh)の速度 (2.2ms)、サイズ (2.5MB) を用いて計算

Slide 25

Slide 25 text

定性的な精度比較 25 ● 画像入力CNNだと、薄目が安定 ○ 左: Mediapipeベースのモデル、右: 画像入力CNN

Slide 26

Slide 26 text

定性的な精度比較 26 ● 画像入力CNNだと、眉を上げたときに安定 ○ 左: Mediapipeベースのモデル、右: 画像入力CNN

Slide 27

Slide 27 text

TFLite変換 27 ● MediapipeベースのモデルのTFLite変換 ○ 特徴量生成を行うPytorchの関数 & MLPを同時にTFLite化 ■ 特徴生成処理をUnity側で書かなくてOK ○ 以下のプロセスで変換 ■ 1. torch.onnx.exportでPytorch -> ONNX変換 ■ 2. ONNX-Tensorflowを使用して、ONNX -> TFLite変換 Pytorch ONNX TFLite

Slide 28

Slide 28 text

TFLite変換 28 ● 画像入力CNNのTFLite変換 ○ 以下のプロセスで変換 ■ 1. torch.onnx.exportでPytorch -> ONNX変換 ■ 2. Model OptimizerでONNX -> OpenVINOに変換 ■ 3. openvino2tensorflowでOpenVINO -> TFLiteに変換 ○ OpenVINOを経由して最適化することで大幅に高速化 ■ 後述のNCHW -> NHWC問題が原因 Pytorch ONNX OpenVINO TFLite

Slide 29

Slide 29 text

NCHW -> NHWC問題 29 ● ONNX (NCHW形式) → TFLite (NHWC)変換 ○ 普通に変換すると、大量の無駄なTranspose演算子が生成 ■ 推論速度に悪影響

Slide 30

Slide 30 text

NCHW -> NHWC問題 30 ● ONNX (NCHW形式) → TFLite (NHWC)変換 ○ OpenVINO経由で変換すれば、Transpose演算子を除去可能 ■ 推論速度が大幅に改善

Slide 31

Slide 31 text

推論速度の比較 31 ● 変換方法による推論速度の比較 ○ M1 Mac上でPythonを用いて計測 ○ 大幅に高速化 画像入力モデル 推論速度 (ONNX-Tensorflow使 用) 推論速度 (OpenVINO経由) MobileNetV2 20.0 ms 7.5 ms MobileNetV3Small 8.1 ms 2.3 ms

Slide 32

Slide 32 text

余談:その他のONNX -> TFLite変換ツール 32 ● onnx2tf ○ OSS (MIT License) ○ openvino2tensorflowと開発者は同じ ○ OpenVINOを経由せずに、最適化されたTFLite形式に直接変換 ○ 2022/9に開発開始され、現在もアクティブに開発中 Pytorch ONNX TFLite

Slide 33

Slide 33 text

顔認識AIの実機組み込み 竹村 伸太郎

Slide 34

Slide 34 text

自己紹介 ● 竹村 伸太郎 (たけむら しんたろう) ● データ本部データ基盤部MLエンジニアリング第二グループ ● 大手ゲーム開発会社を経て、2020年 DeNA 中途入社 ● 本プロジェクトではUnity組み込みや最適化を担当 ● 最近の発表 ○ CEDEC 2021 エンタメから社会課題、チームで乗り越えた音声AIの研究開発と実用化 ○ TechCon 2022 理想の声を目指して 〜七声ニーナの音声変換技術からライブ配信応用へ〜 ○ SYNC 2022 データサイエンスの知見をUnityでも活かそう! ライブ配信アプリIRIAMの顔認識改善の取り組み 34

Slide 35

Slide 35 text

本章で持ち帰って欲しいこと 35 ● 同じ計算内容でも組み込み方次第で、実行時間は数倍〜数10倍と変わる ○ キーポイント ■ 適切な推論ランタイムとプロセッサの選定 ■ Shader及びSSBOを活用したGPU計算資源の有効活用 ● 計算負荷の大小は、バッテリー消費量や発熱といった実用性に直結 ○ フレームレートが一定以上なら良しというシンプルな問題ではない ● つまり、実機へのAI組み込みは ○ 教師データ収集や機械学習モデル設計と同様に重要なテーマ! ○ 本章では、AI組み込みに必要な技術をコンパクトにお伝えします

Slide 36

Slide 36 text

AIを組み込む前に 36 ● AIは概して計算負荷が高い ○ 一方で、スマートフォン特にAndroidは端末ごとの性能差が激しい ○ すべてのデバイスは救えないことを覚悟して現実的な制約を設けよう ● AI開発前にサービス側にヒアリングすべきこと ○ CPUとGPU どちらに処理負荷が偏りがちか ○ 動作環境(対応OSのバージョン下限や対応ABIの種類) ○ Android版のGraphics API (OpenGL/ESかVulkanか) ○ Multithreaded Renderingは利用できるか ○ 利用中のUnity Editorのバージョンとアップデート計画

Slide 37

Slide 37 text

IRIAMの場合はどうだったか? 37 ● 描画アセット次第だが、基本的にCPUバウンド ○ CPU負荷が高いユースケースがある一方で、GPU負荷は低い 🙆 ● 配信側の動作端末は良い意味で絞られている ○ Android 8.0以上 arm64-v8a限定 → NEONが使える 🙆 ○ iOS11以上 iPhone6s以降 → 2GB以上のメモリ前提可 🙆 ● Multithreaded Renderingが利用可 ○ メインスレッドとは独立したレンダースレッドが容易に確保できる 🙆 ○ 独立スレッドへの移譲により、メインスレッドの負荷集中を防げる 🙆 ● この結果を受けて、担当者に求められるスキルと機能要件を整理しよう

Slide 38

Slide 38 text

AI組み込みに必要なスキル 38 ● どのプロセッサで動かすかで、担当者に求められるスキルは変わる ○ CPU ○ GPU ○ ANE / DSP / NPU (端末独自プロセッサ) ANE/DSP/NPU GPU CPU MLモデルの取り扱い Unity/C#の理解 MLモデルの取り扱い MLモデルの取り扱い Unity/C#の理解 Unity/C#の理解 GPUリソースの扱い MLモデルの量子化技法 Androidネイティブ実装 iOSネイティブ実装 難 易 度

Slide 39

Slide 39 text

AI組み込みに必要な機能要件 39 Win macOS iOS Android CPU GPU CPU GPU CPU GPU ANE CPU GPU DSP NPU CUDA DirectM L Metal Metal OpenGL ES Vulkan Tensoflow ✓ ✓ ✓ Tensorflow Lite ✓ ✓ ✓ ✓ ✓ *1 ✓ ✓ *1 *1 LibTorch ✓ ✓ ✓ nightly PyTorch mobile ✓ nightly *1 ✓ *1 *1 *1 ONNX Runtime ✓ ✓ ✓ ✓ ✓ ✓ *1 *1 ✓ *1 *1 *1 Unity Barracuda ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓ Android NNAPI ✓ ✓ ✓ ✓ Apple CoreML ✓ ✓ ✓ ✓ ✓ *1 NNAPIまたはCoreMLを内部的に呼び出すことで対応を謳っているもの ● どのハードやソフトを重視するかで、使える推論ランタイムは絞られる

Slide 40

Slide 40 text

必要なスキルと機能要件の定義 40 ● CPUバウンドだからこそ、端末のGPU性能を最大限活用する ○ 組み込み担当者は、GPU制御やShaderスキルが求められる ○ ツールとして、iOS/Android上でGPU推論可能なランタイムが必要 ● iOS/Android固有のAPIは下記理由で採用見送り ○ NNAPIはAndroid 8.1以上必須のため、動作を前提にできない ○ CoreMLはターゲット端末(*1)のANE性能が弱く、メリットが活きない *1 ARKitが使えない端末に限定されるため、iPhone6s ~ 8 ● この時点で選択は下記の2択に絞られた Win macOS iOS Android CPU GPU CPU GPU CPU GPU ANE CPU GPU DSP Tensorflow Lite ✓ ✓ ✓ ✓ ✓ *1 ✓ ✓ *1 *1 Unity Barracuda ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓

Slide 41

Slide 41 text

使える推論ランタイムの絞り込み 41 ● Tensorflow Lite ○ 検証の結果、採用決定 ○ GPU推論への対応や、汎用性の高さなど弱点が少ないのが決め手 ● Unity Barracuda ○ 検証した上で、採用見送り ○ 機械学習モデルの制限が著しいのが主因 ■ 結果として、モデル設計者の負担が大変なものとなる ■ 詳しくは SYNC 2022 収録動画 参照

Slide 42

Slide 42 text

組み込み時の工夫ポイント #1 42 ● Shader/SSBO でCPUとGPUの間をまたぐリソースの同期を極力減らす ○ GPUリソースからGPUリソースへの変換はShaderが基本 ■ 例:WebCamTextureからComputeBufferへの変換 ■ Android端末でもComputeShader対応が近年は浸透している ○ 極力SSBOでComputeBufferを直接テンソルとして扱う ■ GetNativeBufferPtr() の結果 *1をnative pluginsに引き渡す *1 MetalのMtlBufferや、OpenGL/ESのGLuintに相当 前処理 後処理 CPU GPU 前処理 推論 後処理 避けるべき処理フロー 推論 同期 同期 あるべき処理フロー CPU GPU SSBO SSBO

Slide 43

Slide 43 text

組み込み時の工夫ポイント #2 43 ● Unity.Mathematics の演算機能で処理速度とポータビリティを高める ○ 処理速度の向上 ■ Burstコンパイル有効化で、C#のままでSIMD最適化が入る ■ CoreModule のVector/Matrix系の演算機能は、ほぼ網羅 *1 *1 例えばオイラー角変換機能はないが、多くはOSSの参考実装あり ○ ポータビリティの向上 ■ Shaderに酷似した記法で実装できるため、CPU/GPU両対応が容易 using static Unity.Mathematics.math; namespace DeNA { using Unity.Mathematics; public class TechCon { public static void Sample(){ var date = float3(2023,3,2); date = normalize(techcon.yzx);

Slide 44

Slide 44 text

組み込み時の工夫ポイント #3 44 ● 動的なメモリの確保は、極力NativeArrayを使いGCの発動を抑制する ○ C++同様にMemory Allocatorを制御下における ■ GCを抑えられるだけではなく、Burstによる高速化の恩恵もあり ■ Native Pluginsへのポインタ引き渡し時にも威力を発揮 ○ もちろん、C++同様にメモリリークには注意しましょう ● UPMからImportできる Unity Collections Package の併用もお勧め ○ 標準機能では乏しい、キャスト周りを強化できる using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; ~~~ var buf = new NativeArray(1024, Allocator.Persistent); var ptr = buf.GetUnsafePtr(); // return unsafe void* var buf4 = buf.Reinterpret(); // return NativeArray buf.Dispose();

Slide 45

Slide 45 text

まとめ 45 ● Android上で高精度に動作する表情認識モジュール「SuperCV」の開発 ○ 表情認識AIの開発 ■ 表情パラメタを推定 ● MediapipeベースのMLP or 画像入力のCNN ■ 適切なTFLite変換 ○ 実機組み込み ■ 機能要件・要求スキルの整理 ■ TFLiteやGPUの効率的な活用