Flutter でカスタム TensorFlow Lite モデルを使用する

アプリでカスタム TensorFlow Lite モデルを使用する場合は、Firebase ML を使用してモデルをデプロイできます。Firebase でモデルをデプロイすることで、アプリの初期ダウンロード サイズを減少し、アプリの新しいバージョンをリリースすることなくアプリの ML モデルを更新できます。また、Remote Config と A/B Testing では、異なるモデルを異なるユーザー グループに動的に提供できます。

TensorFlow Lite モデル

TensorFlow Lite モデルは、モバイル デバイス上での実行に最適化された ML モデルです。TensorFlow Lite モデルを取得するには、次のようにします。

Dart 用に維持されている TensorFlow Lite ライブラリがない場合は、ご利用のプラットフォーム用のネイティブ TensorFlow Lite ライブラリと統合する必要があります。この統合については、ここで説明しません。

始める前に

  1. Flutter 用の Firebase SDK をインストールして初期化します(まだ行っていない場合)。

  2. Flutter プロジェクトのルート ディレクトリから、次のコマンドを実行して ML モデル ダウンローダー プラグインをインストールします。

    flutter pub add firebase_ml_model_downloader
    
  3. プロジェクトを再ビルドします。

    flutter run
    

1. モデルをデプロイする

Firebase コンソールまたは Firebase Admin Python と Node.js SDK を使用して、カスタム TensorFlow モデルをデプロイします。カスタムモデルをデプロイして管理するをご覧ください。

Firebase プロジェクトにカスタムモデルを追加した後は、指定した名前を使用してアプリ内でモデルを参照できます。新しい TensorFlow Lite モデルのデプロイと、ユーザーのデバイスへの新しいモデルのダウンロードは、getModel() を呼び出すことでいつでも行うことができます(下記参照)。

2. モデルをデバイスにダウンロードして TensorFlow Lite インタープリタを初期化する

TensorFlow Lite モデルをアプリで使用するには、モデル ダウンローダーを使用して、最新バージョンのモデルをデバイスにダウンロードします。次に、モデルを使用して TensorFlow Lite インタープリタをインスタンス化します。

モデルのダウンロードを開始するには、モデル ダウンローダーの getModel() メソッドを呼び出し、モデルをアップロードしたときに割り当てた名前、常に最新モデルをダウンロードするかどうか、ダウンロードを許可する条件を指定します。

以下の 3 種類のダウンロードの動作から選択できます。

ダウンロードの種類 説明
localModel デバイスからローカルモデルを取得します。使用できるローカルモデルがない場合は、latestModel と同じ動作を行います。このダウンロードの種類は、モデルの更新の確認を行わなくてもいい場合に使用します。たとえば、Remote Config を使用してモデル名を取得し、常に新しい名前でモデルをアップロードする場合です(推奨)。
localModelUpdateInBackground デバイスからローカルモデルを取得し、バックグラウンドでモデルの更新を開始します。使用できるローカルモデルがない場合は、latestModel と同じ動作を行います。
latestModel 最新のモデルを取得します。ローカルモデルが最新バージョンの場合は、ローカルモデルを返します。それ以外の場合は最新のモデルをダウンロードします。その際に、最新バージョンがダウンロードされるまで処理がブロックされます(非推奨)。この動作は、明らかに最新バージョンが必要な場合にのみ使用してください。

モデルがダウンロード済みであることを確認するまで、モデルに関連する機能を無効にする必要があります(UI の一部をグレー表示または非表示にするなど)。

FirebaseModelDownloader.instance
    .getModel(
        "yourModelName",
        FirebaseModelDownloadType.localModel,
        FirebaseModelDownloadConditions(
          iosAllowsCellularAccess: true,
          iosAllowsBackgroundDownloading: false,
          androidChargingRequired: false,
          androidWifiRequired: false,
          androidDeviceIdleRequired: false,
        )
    )
    .then((customModel) {
      // Download complete. Depending on your app, you could enable the ML
      // feature, or switch from the local model to the remote model, etc.

      // The CustomModel object contains the local path of the model file,
      // which you can use to instantiate a TensorFlow Lite interpreter.
      final localModelPath = customModel.file;

      // ...
    });

多くのアプリは、初期化コードでモデルのダウンロード タスクを開始しますが、モデルを使用する前に開始することもできます。

3. 入力データの推論を行う

デバイス上にモデルファイルが揃ったので、次に、そのファイルを使って TensorFlow Lite インタープリタで推論を行います。Dart 用に維持されている TensorFlow Lite ライブラリがない場合は、iOS および Android 用のネイティブ TensorFlow Lite ライブラリと統合する必要があります。

付録: モデルのセキュリティ

TensorFlow Lite モデルを Firebase ML で利用可能にした方法に関係なく、Firebase ML は標準のシリアル化された protobuf 形式でモデルをローカル ストレージに格納します。

理論上、これは誰でもモデルをコピーできることを意味します。ただし、実際には、ほとんどのモデルはアプリケーションに固有であり、最適化により難読化されています。このため、リスクは、競合他社がコードを逆アセンブルして再利用する場合と同程度です。そうであっても、アプリでカスタムモデルを使用する前に、このリスクを認識しておく必要があります。