はじめに

前回はAndroidプラグインの基本的な作り方についての記事を書きました。

今回は応用編として、MLKitで顔をリアルタイムで検出して、その位置にマスクをかけるアプリを作ります。

UnityのWebCamTextureを使ってカメラから画像を取得する方法だと、リアルタイムで検出を行うには処理に時間がかかり過ぎてします。
そのため、カメラ画像の取得、テクスチャ変換、顔検出を全てAndroidプラグインで行うことにしました。

本当はもっとふざけたかったのですが、ランドマーク(顔パーツ)の検出まで行うのがリアルタイムだとキツかったので、顔を隠すだけの真面目な記事になりました。

開発環境

  • Unity 2019.3.5f1
  • Android Studio 3.6.1
  • Android SDK Android9.0(Pie)
  • Firebase Unity SDK 6.13.0
  • Firebase ML 24.0.0
  • Pixel 3a

やりたいこと

  • リアルタイムで人間の顔を隠したい。

アプリ構成

  • Androidプラグイン(Java)
    • カメラから画像を取得する。(Camera2API)
    • 取得した画像を OpenGL ES 2 テクスチャに変換、テクスチャIDを確保する。(OpenGL ES)
    • 取得した画像の中の顔を検出する。(MLKit For Firebase)
    • 検出した顔の情報をUnityに送信する。
  • Unity(C#)
    • Androidプラグインから受信したテクスチャIDでカメラプレビューを描画する。 
    • Androidプラグインから受信した顔情報を元に顔マスクを作成する。

重要な処理はすべてAndroidプラグインで行います。Unityでは単に描画するだけになります。

Androidプラグインを作る準備

MLKit For Firebaseを使う準備をする

今回は、Firebaseが提供するMLKitを使って顔を検出します。
なので、予めGoogleアカウントを用意してください。

Firebaseのコンソールにプロジェクトを追加します

下記URL先を開き、用意したGoogleアカウントでログインします。
https://console.firebase.google.com/

プロジェクトを追加して、作成中のアプリを登録します。プロジェクト名は自分がわかる任意の名前でOKです。(今回は「FaceMask」にしました。)

画面の指示に従ってプロジェクトを作成すると以下の画面になります。
今回はAndroidプラグインでFirebaseを使用するので左から2番目のAndroidのアイコンをクリック。

任意のAndroidパッケージ名を登録します。Android StudioでAndroidプラグイン用のモジュールを作る時にこのパッケージ名を指定することになります。

google-services.jsonをダウンロードします。
ダウンロードしたgoogle-services.jsonを画面の指示通りにモジュールフォルダ直下に追加します。

次にFirebase SDKをプロジェクトに追加します。
基本は画面の指示通りですが、モジュールレベルのGradleが一部Androidプラグイン用の変更が必要です。
モジュールレベルのGradleは以下のようになります。

Gradleに使用するFirebaseのライブラリを追加する

これでFirebaseを利用する準備ができました。

今回使うライブラリをModuleレベルのGradleに追加します。

JavaをJSONにシリアライズするライブラリを追加する

UnitySendMessageでは文字列しか送信できないため、Unity側に伝える情報をJSONシリアライズする必要があります。
今回は、GoogleのGSONを使っていきます。

ビルド設定を変更する

ModuleレベルのGradleのminSdkVersionを確認します。
Firebase Unity SDKAPI Level 29に対応していないようなので、minSdkVersion29になっている場合は28に変更します。

Gradleの変更を反映する

右上のSync NowをクリックするとGradleの変更が反映されます。Sync Nowが出ていない場合は、File -> Sync Project with Gradle Filesでも同様のことができます。

Unityプロジェクトの準備

プロジェクトを作成する

UnityプロジェクトにFirebase Unity SDKをインポートする

Firebase Unity SDKをインポートします。
ここからUnityパッケージの入ったzipファイルがダウンロードできます。
zipファイルの中には複数のUnityパッケージが入っていますが、/{解凍済みフォルダ}/dotnet4/FirebaseAnalytics.unitypackageをインポートします。

Unityプロジェクトに顔検出用ライブラリを追加する

Assets¥Firebase¥Editor¥AppDependencies.xmlに顔検出用のライブラリを追加します。

UnityプロジェクトにGSONライブラリを追加する

Assets¥Firebase¥Editor¥AppDependencies.xmlにGSONライブラリを追加します。

ライブラリの依存関係を解決する

Firebase Unity SDKのUnityパッケージに含まれていたExternalDependencyManager(旧PlayServicesResolver)を使いライブラリの依存関係を解決します。

準備完了

これで顔検出の準備が完了しました。
次回はいよいよ実装に入っていきます。