私たち Firebase チームは、Hanley Weng さんの「
CoreML-in-ARKit」プロジェクトの進展を楽しみにしてきました。このプロジェクトでは、シーン内で検出された画像の上に 3D のラベルを表示することができます。オンデバイス検出の応答は高速ですが、チームでは、このオンデバイス モデルのスピードに、クラウドベースのソリューションから得られる正確さを加えた新たなソリューションを開発したいと考えました。それが、私たちの「MLKit-ARKit」プロジェクトで開発したアプリです。今回は、このアプリをどのように実現したかについてご紹介します。
全体の仕組み
Firebase 向け ML Kit は、Google Cloud の持つ機械学習(ML)の専門知識を、高機能と使いやすさを兼ね備えたパッケージにして Android アプリや iOS アプリに提供するモバイル SDK です。使いやすい Base API が揃っており、独自のカスタム TFLite モデルを作成する機能もあります。
ARKit は Apple が提供するフレームワークです。デバイスのモーション トラッキング、カメラによるシーン キャプチャ、高度なシーン処理といった機能に加えて表示も手軽であることから、AR アプリ開発を簡略化できるツールとなっています。これらのテクノロジーを基に、iOS デバイスの前面または背面カメラを使用するさまざまな AR アプリを開発することができます。
このプロジェクトでは、背面カメラで撮影した ARKit フレームをキューにプッシュします。そのフレーム内のオブジェクトを検出する処理を ML Kit で実行します。
ユーザーが画面をタップすると、検出されたラベルの中で信頼度が最大値のものが ML Kit から返されます。そしてそれを元に 3D のふきだしテキストが作成されて、ユーザーのシーンに追加されます。
ML Kit が果たす役割
ML Kit は、機械学習の利用経験を問わず、すべてのモバイル デベロッパーが簡単に機械学習を導入できるツールです。より高度な使用状況に対応する必要がある場合、ML Kit で独自の TFLite モデルを作成することも可能ですが、一般的なユースケースの場合は使いやすい Base API を実装できます。テキスト認識、画像のラベル付け、顔検出などのユースケースに対応できるこれらの API は、Google Cloud でトレーニングされたモデルを利用しています。私たちのサンプルアプリでは、画像のラベル付けを使用します。
Base API は、オンデバイスとクラウドベースという 2 種類の方法で利用できます。オンデバイスの API は無料で使用でき、ローカルで実行されます。クラウドベースの場合はより正確で精度の高い応答が得られます。クラウドベースの Cloud Vision API は、最初の API 呼び出し 1,000 ユニットについては無料で利用でき、それ以上になると利用料金が発生します。Google の Cloud Vision API に基づくフルサイズ モデルの機能を利用できます。
両者を活かした方法
私たちのアプローチでは、画像にラベル付けする ML Kit のオンデバイス API を使用して、60 fps のフレームレートを維持しながら結果のライブフィードを取得することにします。ユーザーが画面をタップしたときに、現在の画像でクラウドの画像ラベル付け用 API に対し非同期呼び出しを起動します。より精度の高いこのモデルから応答を受け取ると、3D ラベルがすぐに更新されます。つまり、オンデバイス API を継続的に実行し、その結果を最初の情報源として使用しながら、より正確な Cloud API をオンデマンドで呼び出して、その結果を後からオンデバイスのラベルと置き換えるのです。
どちらの結果が表示されるか
オンデバイス API ではすべての処理がリアルタイムでローカルに実行されます。一方、Cloud Vision API では Google Cloud バックエンドへのネットワーク リクエストを実行し、大規模で精度の高いモデルを活用します。私たちはこちらの方がより正確な応答だと考えて、アプリでは、オンデバイス API で提供されたラベルを、Cloud Vision API から結果が返され次第、その結果に置き換えています。
試してみましょう
1. プロジェクトのクローンを作成します。
$ git clone https://github.com/FirebaseExtended/MLKit-ARKit.git
2. ポッドをインストールし、.xcworkspace ファイルを開いて Xcode でプロジェクトを確認します。
1.
$ cd MLKit-ARKit
2.
$ pod install --repo-update
3.
$ open MLKit-ARKit.xcworkspace
3. サンプルアプリに Firebase ML Kit を設定します。
1.
アプリに Firebase を追加する手順を行います。
2. iOS プロジェクトのバンドル ID として「com.google.firebaseextended.MLKit-ARKit」を指定します。
3. アプリに Firebase を追加する際に生成された
GoogleService-Info.plist ファイルをダウンロードします。
4. Xcode で、アプリに
GoogleService-Info.plist ファイルを(
Info.plist の次に)追加します。
この時点で、アプリはオンデバイスの認識を利用できるようになるはずです。
4. (省略可能)サンプルアプリに Cloud Vision API を設定します。
1.Firebase プロジェクトを Blaze プランに切り替えます。
Cloud Vision API を使用できるのは Blaze レベルのプロジェクトのみです。以下の手順でプロジェクトを Blaze プランに切り替えて従量課金制のお支払いを有効にしてください。
- Firebase コンソールでプロジェクトを開きます。
- 左下で現在選択されている Spark プランの横にある [変更] リンクをクリックします。
- Blaze プランを選択し、Firebase コンソールに表示される手順に沿って請求先アカウントを追加します。
★ クラウドのラベル検出機能は、1 か月あたり最初の 1,000 ユーザーまで無料で利用できます。料金設定について詳しくは、こちらをクリックしてください。
2.Firebase コンソールの [ML Kit] セクションに移動し、上部にある [クラウドベースの API を有効化] をオンにします。
以上の設定で、アプリでは Cloud Vision API から得られたより正確な結果をラベルに適用できるようになります。