TensorFlow Lite と Firebase を使用してアプリにオンデバイスのテキスト分類を追加する - iOS Codelab

1. 概要

classification_result_screen.png

TensorFlow Lite と Firebase によるテキスト分類の Codelab へようこそ。この Codelab では、TensorFlow Lite と Firebase を使用してテキスト分類モデルをトレーニングし、アプリにデプロイする方法を学びます。この Codelab は、この TensorFlow Lite のサンプルに基づいています。

テキスト分類は、テキストの内容に応じてタグまたはカテゴリを割り当てるプロセスです。これは、感情分析、トピックのラベル付け、スパム検出、インテント検出など、幅広いアプリケーションを持つ自然言語処理(NLP)の基本的なタスクの一つです。

感情分析とは、テキスト分析手法を使用してテキストデータ内の感情(ポジティブ、ネガティブ、ニュートラル)を解釈し、分類することです。感情分析を使用すると、オンラインでの会話やフィードバックから、商品、ブランド、サービスに対する顧客の感情を特定できます。

このチュートリアルでは、感情分析用の機械学習モデルを構築する方法について説明します。具体的には、テキストをポジティブまたはネガティブに分類します。これは、バイナリ(2 クラス)分類の例です。これは、広範囲に適用できる重要な機械学習の問題です。

学習内容

  • TF Lite Model Maker を使用して TF Lite 感情分析モデルをトレーニングする
  • TF Lite モデルを Firebase ML にデプロイし、アプリからアクセスする
  • Firebase アナリティクスでユーザー フィードバックをトラッキングしてモデルの精度を測定する
  • Firebase Performance Monitoring でモデルのパフォーマンスをプロファイリングする
  • デプロイされた複数のモデルのどれを Remote Config から読み込むかを選択する
  • Firebase A/B Testing でさまざまなモデルをテストする

必要なもの

  • Xcode 11(以降)
  • CocoaPods 1.9.1(以降)

このチュートリアルをどのように使用されますか?

通読のみ 通読して演習を行う

Android アプリ作成のご経験についてお答えください。

初心者 中級者 上級者

2. Firebase コンソール プロジェクトを作成する

プロジェクトに Firebase を追加する

  1. Firebase コンソールに移動します。
  2. [Create New Project] を選択し、プロジェクトに「Firebase ML iOS Codelab」という名前を付けます。

3. サンプル プロジェクトを入手する

コードのダウンロード

まず、サンプル プロジェクトのクローンを作成し、プロジェクト ディレクトリで pod update を実行します。

git clone https://github.com/FirebaseExtended/codelab-textclassification-ios.git
cd codelab-textclassification-ios
pod install --repo-update

git をインストールしていない場合は、GitHub ページから、または こちらのリンクをクリックしてサンプル プロジェクトをダウンロードすることもできます。プロジェクトをダウンロードしたら、Xcode で実行し、テキスト分類を試して動作を確認します。

Firebase を設定する

ドキュメントに沿って、新しい Firebase プロジェクトを作成します。プロジェクトを作成したら、Firebase コンソールからプロジェクトの GoogleService-Info.plist ファイルをダウンロードし、Xcode プロジェクトのルートにドラッグします。

9efb62a92f27e939.png

Firebase を Podfile に追加し、pod install を実行します。

pod 'FirebaseMLModelDownloader', '9.3.0-beta'

AppDelegatedidFinishLaunchingWithOptions メソッドで、ファイルの先頭に Firebase をインポートします。

import FirebaseCore

Firebase を構成する呼び出しを追加します。

FirebaseApp.configure()

プロジェクトを再度実行して、アプリが正しく設定され、起動時にクラッシュしないことを確認します。

4. 感情分析モデルをトレーニングする

TensorFlow Lite Model Maker を使用して、特定のテキストの感情を予測するテキスト分類モデルをトレーニングします。

このステップは、Google Colab で開くことができる Python ノートブックとして示されています。

Colab で開く

この手順を完了すると、モバイルアプリにデプロイできる TensorFlow Lite 感情分析モデルが作成されます。

5. モデルを Firebase ML にデプロイする

モデルを Firebase ML にデプロイする主な理由は 2 つあります。

  1. アプリのインストール サイズを小さく抑え、必要な場合にのみモデルをダウンロードできる
  2. モデルは定期的に更新でき、アプリ全体とは異なるリリース サイクルで更新できます

モデルは、コンソールから、または Firebase Admin SDK を使用してプログラムでデプロイできます。このステップでは、コンソールからデプロイします。

まず、Firebase コンソールを開き、左側のナビゲーション パネルで [Machine Learning] をクリックします。初めて開く場合は、[使ってみる] をクリックします。[カスタム] に移動し、[モデルを追加] ボタンをクリックします。

プロンプトが表示されたら、モデルに sentiment_analysis という名前を付け、前の手順で Colab からダウンロードしたファイルをアップロードします。

3c3c50e6ef12b3b.png

6. Firebase ML からモデルをダウンロードする

TFLite モデルは比較的大きくなるため、Firebase からアプリにリモートモデルをダウンロードするタイミングを選択するのは難しい場合があります。理想的には、アプリの起動時にモデルをすぐに読み込まないようにします。モデルが 1 つの機能にのみ使用され、ユーザーがその機能を使用しない場合は、無駄に大量のデータをダウンロードすることになります。Wi-Fi に接続されているときにのみモデルを取得するなど、ダウンロード オプションを設定することもできます。ネットワーク接続がなくてもモデルを使用できるようにするには、アプリなしのバックアップとしてモデルをバンドルすることも重要です。

わかりやすくするため、デフォルトのバンドルモデルを削除し、アプリが初めて起動したときに常に Firebase からモデルをダウンロードします。これにより、感情分析を実行するときに、Firebase から提供されたモデルで推論が実行されていることを確認できます。

ModelLoader.swift の上部で、Firebase モジュールをインポートします。

import FirebaseCore
import FirebaseMLModelDownloader

次に、次のメソッドを実装します。

static func downloadModel(named name: String,
                          completion: @escaping (CustomModel?, DownloadError?) -> Void) {
  guard FirebaseApp.app() != nil else {
    completion(nil, .firebaseNotInitialized)
    return
  }
  guard success == nil && failure == nil else {
    completion(nil, .downloadInProgress)
    return
  }
  let conditions = ModelDownloadConditions(allowsCellularAccess: false)
  ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
          switch (result) {
          case .success(let customModel):
                  // Download complete.
                  // The CustomModel object contains the local path of the model file,
                  // which you can use to instantiate a TensorFlow Lite classifier.
                  return completion(customModel, nil)
          case .failure(let error):
              // Download was unsuccessful. Notify error message.
            completion(nil, .downloadFailed(underlyingError: error))
          }
  }
}

ViewController.swiftviewDidLoad で、loadModel() の呼び出しを新しいモデル ダウンロード メソッドに置き換えます。

// Download the model from Firebase
print("Fetching model...")
ModelLoader.downloadModel(named: "sentiment_analysis") { (customModel, error) in
  guard let customModel = customModel else {
    if let error = error {
      print(error)
    }
    return
  }

  print("Model download complete")

  // TODO: Initialize an NLClassifier from the downloaded model
}

アプリを再実行します。数秒後、リモートモデルが正常にダウンロードされたことを示すログが Xcode に表示されます。テキストを入力して、アプリの動作が変更されていないことを確認します。

7. モデルをアプリに統合する

Tensorflow Lite Task Library を使用すると、数行のコードで TensorFlow Lite モデルをアプリに統合できます。Firebase からダウンロードした TensorFlow Lite モデルを使用して TFLNLClassifier インスタンスを初期化します。次に、このモデルを使用して、アプリ ユーザーからのテキスト入力を分類し、結果を UI に表示します。

依存関係を追加する

アプリの Podfile に移動し、アプリの依存関係に TensorFlow Lite タスク ライブラリ(テキスト)を追加します。依存関係は target 'TextClassification' 宣言の下に追加してください。

pod 'TensorFlowLiteTaskText', '~> 0.2.0'

pod install を実行して、新しい依存関係をインストールします。

テキスト分類器を初期化する

次に、Task Library の NLClassifier を使用して、Firebase からダウンロードした感情分析モデルを読み込みます。

ViewController.swift

TFLNLClassifier インスタンス変数を宣言しましょう。ファイルの上部で、新しい依存関係をインポートします。

import TensorFlowLiteTaskText

前の手順で変更したメソッドの上に、次のコメントを見つけます。

// TODO: Add a TFLNLClassifier property.

TODO を次のコードに置き換えます。

private var classifier: TFLNLClassifier?

Firebase からダウンロードした感情分析モデルを使用して、textClassifier 変数を初期化します。前の手順で追加した次のコメントを見つけます。

// TODO: Initialize an NLClassifier from the downloaded model

TODO を次のコードに置き換えます。

let options = TFLNLClassifierOptions()
self.classifier = TFLNLClassifier.nlClassifier(modelPath: customModel.path, options: options)

テキストを分類する

classifier インスタンスを設定したら、1 回のメソッド呼び出しで感情分析を実行できます。

ViewController.swift

classify(text:) メソッドで、TODO コメントを見つけます。

// TODO: Run sentiment analysis on the input text

コメントを次のコードに置き換えます。

guard let classifier = self.classifier else { return }

// Classify the text
let classifierResults = classifier.classify(text: text)

// Append the results to the list of results
let result = ClassificationResult(text: text, results: classifierResults)
results.append(result)

8. 最終的なアプリを実行する

感情分析モデルをアプリに統合したので、テストしてみましょう。iOS デバイスを接続し、Xcode ツールバーで [Run](execute.png)をクリックします。

入力した映画レビューの感情をアプリが正しく予測できるはずです。

classification_result_screen.png

9. Firebase のその他の機能を使用してアプリを強化する

Firebase には、TFLite モデルをホストする以外にも、機械学習のユースケースを強化するための機能がいくつか用意されています。

  • Firebase Performance Monitoring: ユーザーのデバイスで実行されるモデル推論速度を測定します。
  • Firebase アナリティクス: ユーザーの反応を測定して、モデルが本番環境でどれだけ優れているかを測定します。
  • Firebase A/B Testing を使用してモデルの複数のバージョンをテストする
  • 前のセクションで、2 つのバージョンの TFLite モデルをトレーニングしたことを覚えていますか?A/B テストは、本番環境でパフォーマンスが優れているバージョンを特定するのに適した方法です。

アプリでこれらの機能を活用する方法について詳しくは、以下の Codelab をご覧ください。

10. 完了

この Codelab では、感情分析 TFLite モデルをトレーニングし、Firebase を使用してモバイルアプリにデプロイする方法を学習しました。TFLite と Firebase の詳細については、他の TFLite サンプルと Firebase のスタートガイドをご覧ください。

学習した内容

  • TensorFlow Lite
  • Firebase ML

次のステップ

  • Firebase Performance Monitoring を使用してモデルの推論速度を測定する。
  • Firebase ML Model Management API を介して、Colab から Firebase にモデルを直接デプロイします。
  • 予測結果についてユーザーがフィードバックできるようにするメカニズムを追加し、Firebase アナリティクスを使用してユーザー フィードバックをトラッキングします。
  • Firebase A/B Testing を使用して、平均単語ベクトルモデルと MobileBERT モデルの A/B テストを実施します。

詳細

質問がある場合

問題を報告する