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

1. 概要

分類結果_screen.png

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

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

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

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

学習内容

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

必要なもの

  • Xcode 11(またはそれ以降)
  • CocoaPods 1.9.1 以降

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

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

Android アプリの作成経験について、どのように評価されますか。

初心者 中級者 上級者

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

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

  1. Firebase コンソールに移動します。
  2. [新しいプロジェクトを作成] を選択し、プロジェクトに「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

Podfile に Firebase を追加し、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 コンソールを開き、左側のナビゲーション パネルで [機械学習] をクリックします。初めて開く場合は、[使ってみる] をクリックしてください。[カスタム] に移動し、[モデルを追加] ボタンをクリックします。

プロンプトが表示されたら、モデルに 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 タスク ライブラリを使用すると、わずか数行のコードで TensorFlow Lite モデルをアプリに統合できます。Firebase からダウンロードした TensorFlow Lite モデルを使用して、TFLNLClassifier インスタンスを初期化します。次に、これを使用してアプリユーザーからのテキスト入力を分類し、結果を UI に表示します。

依存関係を追加する

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

pod 'TensorFlowLiteTaskText', '~> 0.2.0'

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

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

次に、タスク ライブラリの 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 ツールバーの実行アイコン(実行.png)をクリックします。

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

分類結果_screen.png

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

Firebase には、TFLite モデルのホスティング以外にも、ML のユースケースを強化する機能がいくつか用意されています。

  • Firebase Performance Monitoring を使用して、ユーザーのデバイスで実行されているモデルの推論速度を測定します。
  • Firebase Analytics でユーザーの反応を測定し、本番環境でのモデルのパフォーマンスを測定する。
  • Firebase A/B Testing でモデルの複数のバージョンをテストする
  • 以前に TFLite モデルの 2 つのバージョンをトレーニングしたことを覚えていますか?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 Analytics を使用してユーザー フィードバックを追跡します。
  • Firebase A/B Testing を使用して、平均単語ベクトルモデルと MobileBERT モデルの A/B テストを実施します。

詳細

質問がある場合

問題を報告する