Upgrade to Pro — share decks privately, control downloads, hide ads and more …

機械学習を用いたIRIAM顔認識機能の改善の取り組み【DeNA TechCon 2023】

DeNA_Tech
March 02, 2023

機械学習を用いたIRIAM顔認識機能の改善の取り組み【DeNA TechCon 2023】

youtube:https://youtu.be/9ScrFVsIKd4

概要:
バーチャルライブ配信アプリIRIAMにおいて、配信者様に合わせてリアルタイムでキャラクターを動作させるためには、高速で高精度な顔認識が必要です。

iPhoneにおいてはApple製のARKitを用いることで高精度な顔認識を既に実現出来ていたのですが、Androidと一部のiOS端末では顔認識の精度が不十分という課題がありました。この問題を解決するため、データ本部とIRIAMが協力して、任意のプラットフォームで動作可能かつ高精度で高速な顔認識システムの開発に取り組みました。

本発表では、データの収集と機械学習モデルの設計指針、モデルの形式の変換の方法、Unity上で効率よく動作させる手段など、その開発過程で得られた知見を紹介します。

登壇内でのリンク集:
p8, https://gs.statcounter.com/
p15, https://google.github.io/mediapipe/solutions/face_mesh.html
p16-1, https://drive.google.com/file/d/1tV7EJb3XgMS7FwOErTgLU1ZocYyNmwlf/preview
p16-2, https://arxiv.org/abs/2006.10962
p17, https://github.com/yeemachine/kalidokit
p18, https://github.com/JimWest/MeFaMo
p21, https://commons.wikimedia.org/wiki/File:3D_Spherical_2.svg
p27-1, https://glaringlee.github.io/onnx.html?highlight=torch%20onnx%20export#torch.onnx.export
p27-2, https://github.com/onnx/onnx-tensorflow
p28-1, https://glaringlee.github.io/onnx.html?highlight=torch%20onnx%20export#torch.onnx.export
p28-2, https://docs.openvino.ai/latest/openvino_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html
p28-3, https://github.com/PINTO0309/openvino2tensorflow
p32, https://github.com/PINTO0309/onnx2tf
p41, https://events.unity3d.jp/sync/session/26/
p44, https://docs.unity3d.com/Packages/[email protected]/manual/index.html

◆ チャンネル登録はこちら↓
https://youtube.com/c/denatech?sub_confirmation=1

◆ Twitter
https://twitter.com/DeNAxTech

◆ DeNA Engineering
https://engineering.dena.com/

◆ DeNA Engineer Blog
https://engineering.dena.com/blog/

◆ DeNA TechCon 2023 公式サイト
https://techcon2023.dena.dev/

DeNA_Tech

March 02, 2023
Tweet

More Decks by DeNA_Tech

Other Decks in Technology

Transcript

  1. 本日の構成 1. 本プロジェクト「SuperCV」の紹介 (地主) 1. IRIAMについて 2. 本プロジェクトの背景、目的 2 2.

    高精度 & 高速な顔認識AIの開発 (大矢) 1. 活用した既存ツール 2. 学習のアプローチ、TFLite変換 3. 顔認識AIの実機組み込み (竹村) 1. サービスの動作要件から、使えるツールを絞り込む 2. 実機組み込みの最適化アプローチ
  2. 自己紹介 • 地主 龍一 (じぬし りゅういち) • Unity エンジニア •

    エンジニアリング部エンジニアリング第二グループ ◦ グループリーダー • 2022 年に IRIAM に入社 • 本プロジェクトの IRIAM 側の PM 4
  3. 「SuperCV」プロジェクトの背景 7 • 既存の顔認識システム on iPhone ◦ Apple 製の ARKit

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

    に比べてパラメータが少なく表現力が低い ◦ 海外では Android シェアが大きいため、精度を上げたい ▪ ※そもそも ARKit への強い依存は避けたい ※ https://gs.statcounter.com/のデータを 用いて独自に作成 GDP上位10か国のモバイルOS市場シェア (2022)
  5. 「SuperCV」プロジェクトの目的 9 • 高精度 & 高速で Android 上で動作する Face Tracking

    システムの開発 ◦ 高速 (20 FPS 以上) かつ省サイズ ◦ 事前に決めておいた表情パラメタを予測 ▪ 実際は、表情パラメタに加えて位置と回転も必要 位置 X: -75 Y -20 回転 X: -13 Y:-6 Z:-2 口の開き具合 : 0.544 左目の閉じ具合 : 0.393 ・・・
  6. 「SuperCV」プロジェクトの目的 10 • 取り扱う表情パラメタ ◦ 27 個の表情パラメタを機械学習モデルで推定 ◦ 値の範囲は 0

    から 1 対象の表情パラメタの例 左目が閉じている度合い 右目が内側を向いている度合い 口が開いているか度合い 左の口角が上がっている度合い 右の頬が上がっている度合い 眉の内側が上がっている度合い 上唇が持ち上がっている度合い 唇をすぼめている度合い ・・・
  7. 自己紹介 • 大矢 隆 (おおや たかし) • 2022年にDeNAに新卒入社 • データ本部AI技術開発部第一グループ

    • Kaggle Grandmaster ◦ 大規模な機械学習コンペで準優勝2回 ◦ テーブルデータが得意 13
  8. 活用した既存ツール 15 • MediaPipe FaceMesh ◦ Google製のOSS (Apache V2 License)

    ◦ 商用利用可能 ◦ 478点の顔の特徴点の位置(x, y, z)を出力 ▪ x, yは画像中の座標 ▪ zは推定された深度
  9. 活用した既存ツール 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
  10. 余談:Mediapipeベースのblendshape solver 17 • KalidoKit ◦ OSS (MIT License) ◦

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

    ルールベースで、多数のBlendshape値に対応 対象の表情パラメタ 左目が閉じている度合い 顎を右に動かしている度合い 口が開いている度合い 「ウ」の口になっている度合い 左口角を下げている度合い 上唇を噛んでいるかどうか 右眉の内側を上げる度合い 左の頬を上げる度合い ・・・
  12. 学習のアプローチ 19 • 1-1. 特徴量入力 MLP (Mediapipeベース) ◦ 各表情パラメタ用の特徴量を結合して、一つのMLPで予測 ◦

    様々な特徴量の計算が必要 ※実際はMediaPipe FaceMeshそのものは用いず、独自実装を使う
  13. 特徴量生成 20 • MediaPipe Face Meshの出力 (478 x 3次元) を特徴量に変換

    ◦ 特徴量の例 (口の開閉の特徴量) ▪ 点Aと点Bの距離 / 点Cと点Dの距離
  14. 特徴量生成 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
  15. 学習のアプローチ 22 • 1-2. FaceMesh入力 MLP (Mediapipeベース) ◦ 特徴量生成が不要 ◦

    精度は特徴量入力よりも多少低下 ▪ しかし、併用してHybridにすることで精度改善可能 ※実際はMediaPipe FaceMeshそのものは用いず、独自実装を使う
  16. 定量的な精度 & 速度 & サイズの比較 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) を用いて計算
  17. TFLite変換 27 • MediapipeベースのモデルのTFLite変換 ◦ 特徴量生成を行うPytorchの関数 & MLPを同時にTFLite化 ▪ 特徴生成処理をUnity側で書かなくてOK

    ◦ 以下のプロセスで変換 ▪ 1. torch.onnx.exportでPytorch -> ONNX変換 ▪ 2. ONNX-Tensorflowを使用して、ONNX -> TFLite変換 Pytorch ONNX TFLite
  18. 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
  19. NCHW -> NHWC問題 29 • ONNX (NCHW形式) → TFLite (NHWC)変換

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

    ◦ OpenVINO経由で変換すれば、Transpose演算子を除去可能 ▪ 推論速度が大幅に改善
  21. 推論速度の比較 31 • 変換方法による推論速度の比較 ◦ M1 Mac上でPythonを用いて計測 ◦ 大幅に高速化 画像入力モデル

    推論速度 (ONNX-Tensorflow使 用) 推論速度 (OpenVINO経由) MobileNetV2 20.0 ms 7.5 ms MobileNetV3Small 8.1 ms 2.3 ms
  22. 余談:その他のONNX -> TFLite変換ツール 32 • onnx2tf ◦ OSS (MIT License)

    ◦ openvino2tensorflowと開発者は同じ ◦ OpenVINOを経由せずに、最適化されたTFLite形式に直接変換 ◦ 2022/9に開発開始され、現在もアクティブに開発中 Pytorch ONNX TFLite
  23. 自己紹介 • 竹村 伸太郎 (たけむら しんたろう) • データ本部データ基盤部MLエンジニアリング第二グループ • 大手ゲーム開発会社を経て、2020年

    DeNA 中途入社 • 本プロジェクトではUnity組み込みや最適化を担当 • 最近の発表 ◦ CEDEC 2021 エンタメから社会課題、チームで乗り越えた音声AIの研究開発と実用化 ◦ TechCon 2022 理想の声を目指して 〜七声ニーナの音声変換技術からライブ配信応用へ〜 ◦ SYNC 2022 データサイエンスの知見をUnityでも活かそう! ライブ配信アプリIRIAMの顔認識改善の取り組み 34
  24. 本章で持ち帰って欲しいこと 35 • 同じ計算内容でも組み込み方次第で、実行時間は数倍〜数10倍と変わる ◦ キーポイント ▪ 適切な推論ランタイムとプロセッサの選定 ▪ Shader及びSSBOを活用したGPU計算資源の有効活用

    • 計算負荷の大小は、バッテリー消費量や発熱といった実用性に直結 ◦ フレームレートが一定以上なら良しというシンプルな問題ではない • つまり、実機へのAI組み込みは ◦ 教師データ収集や機械学習モデル設計と同様に重要なテーマ! ◦ 本章では、AI組み込みに必要な技術をコンパクトにお伝えします
  25. AIを組み込む前に 36 • AIは概して計算負荷が高い ◦ 一方で、スマートフォン特にAndroidは端末ごとの性能差が激しい ◦ すべてのデバイスは救えないことを覚悟して現実的な制約を設けよう • AI開発前にサービス側にヒアリングすべきこと

    ◦ CPUとGPU どちらに処理負荷が偏りがちか ◦ 動作環境(対応OSのバージョン下限や対応ABIの種類) ◦ Android版のGraphics API (OpenGL/ESかVulkanか) ◦ Multithreaded Renderingは利用できるか ◦ 利用中のUnity Editorのバージョンとアップデート計画
  26. IRIAMの場合はどうだったか? 37 • 描画アセット次第だが、基本的にCPUバウンド ◦ CPU負荷が高いユースケースがある一方で、GPU負荷は低い 🙆 • 配信側の動作端末は良い意味で絞られている ◦

    Android 8.0以上 arm64-v8a限定 → NEONが使える 🙆 ◦ iOS11以上 iPhone6s以降 → 2GB以上のメモリ前提可 🙆 • Multithreaded Renderingが利用可 ◦ メインスレッドとは独立したレンダースレッドが容易に確保できる 🙆 ◦ 独立スレッドへの移譲により、メインスレッドの負荷集中を防げる 🙆 • この結果を受けて、担当者に求められるスキルと機能要件を整理しよう
  27. 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ネイティブ実装 難 易 度
  28. 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を内部的に呼び出すことで対応を謳っているもの • どのハードやソフトを重視するかで、使える推論ランタイムは絞られる
  29. 必要なスキルと機能要件の定義 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 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
  30. 使える推論ランタイムの絞り込み 41 • Tensorflow Lite ◦ 検証の結果、採用決定 ◦ GPU推論への対応や、汎用性の高さなど弱点が少ないのが決め手 •

    Unity Barracuda ◦ 検証した上で、採用見送り ◦ 機械学習モデルの制限が著しいのが主因 ▪ 結果として、モデル設計者の負担が大変なものとなる ▪ 詳しくは SYNC 2022 収録動画 参照
  31. 組み込み時の工夫ポイント #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
  32. 組み込み時の工夫ポイント #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);
  33. 組み込み時の工夫ポイント #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<float>(1024, Allocator.Persistent); var ptr = buf.GetUnsafePtr(); // return unsafe void* var buf4 = buf.Reinterpret<float, float4>(); // return NativeArray<float4> buf.Dispose();
  34. まとめ 45 • Android上で高精度に動作する表情認識モジュール「SuperCV」の開発 ◦ 表情認識AIの開発 ▪ 表情パラメタを推定 • MediapipeベースのMLP

    or 画像入力のCNN ▪ 適切なTFLite変換 ◦ 実機組み込み ▪ 機能要件・要求スキルの整理 ▪ TFLiteやGPUの効率的な活用