Android で TensorFlow Lite を使用して花を認識する

1. はじめに

657431be3173fa86.png android.png

注: この Codelab では、テストに実機が必要です。

TensorFlow は多目的の機械学習フレームワークです。TensorFlow は、クラウド内のクラスタをまたがる巨大モデルのトレーニングから、スマートフォンなどの組み込みシステムにおけるモデルのローカルな実行まで、あらゆることに使用できます。

この Codelab では、TensorFlow Lite を使用して、Android デバイスで画像認識モデルを実行します。

Android Studio 4.1 以降をインストールする

まだインストールしていない場合は、TensorFlow Lite モデルをトレーニングするときに Android Studio 4.1 以降をダウンロードしてインストールします。

学習内容

  • TensorFlow Lite Model Maker を使用して独自のカスタム画像分類ツールをトレーニングする方法。
  • Android Studio を使用して TensorFlow Lite モデルをインポートし、CameraX を使用してカスタムモデルを Android アプリに統合する方法。
  • スマートフォンの GPU を使用してモデルを高速化する方法。

作業内容

TensorFlow 画像認識プログラムを実行して花を識別するシンプルなカメラアプリ。

f11c2821f2c8311d.png

ライセンス: 無料で利用できる

2. Colab を使用して花認識ツールをトレーニングする

モデルのトレーニングを開始する前に、Android Studio 4.1 以降のダウンロードとインストールを開始します。

Colab を開きます。ここでは、TensorFlow Lite 転移学習を使用して花を認識するように Keras で分類子をトレーニングする方法について説明します。

3. 作業ディレクトリを設定する

Git リポジトリのクローンを作成する

次のコマンドを実行すると、この Codelab に必要なファイルを含む Git リポジトリのクローンを作成できます。

git clone https://github.com/hoitab/TFLClassify.git

次に、リポジトリのクローンを作成したディレクトリに移動します。この Codelab の残りの部分では、次のファイルを使用します。

cd TFLClassify

4. Android スケルトンアプリを設定する

android.png

Android Studio 4.1 以降をインストールする

まだインストールしていない場合は、Android Studio 4.1 以降をインストールします。

Android Studio でプロジェクトを開く

Android Studio でプロジェクトを開くには、次の操作を行います。

  1. Android Studio 7f2480ded53a193b.png を開きます。読み込まれたら、このポップアップから [Open an Existing project] を選択します。

f3b8bea7e3b39376.png

  1. ファイル選択画面で、作業ディレクトリから TFLClassify/build.gradle を選択します。
  1. プロジェクトを初めて開く場合、Gradle ラッパーの使用について尋ねる [Gradle Sync] ポップアップが表示されます。[OK] をクリックします。

d68b4d7189e6c1e4.png

  1. まだ有効になっていない場合は、スマートフォンでデベロッパー モードと USB デバッグを有効にします。これは 1 回限りの設定です。こちらの手順に沿って対応してください。
  2. プロジェクトとスマートフォンの準備が整ったら、TFL_Classify.start を選択し、ツールバーの実行ボタン 86934b7b01ad7565.png を押して、実際のデバイスで実行できます。

60a77ef126c1373d.png

  1. 次に、TensorFlow デモにカメラへのアクセスを許可します。

b63cba02bb36b7e3.png

  1. スマートフォンに次の画面が表示されます。実際の結果が表示される部分には、ランダムな数値が表示されます。

82c603596afa35f1.png

5. Android アプリに TensorFlow Lite を追加する

  1. 左側のプロジェクト エクスプローラで start モジュールを選択します。

cede7f2b8b23c1a7.png

  1. start モジュールを右クリックするか、File をクリックして、New > Other > TensorFlow Lite Model の順にクリックします。

bf243d9fdd27e20a.png

  1. 前にカスタム トレーニング済みの FlowerModel.tflite をダウンロードしたモデルの場所を選択します。

cfee18cc6674a408.png

  1. [Finish] をクリックします。
  2. 最後に次のように表示されます。FlowerModel.tflite が正常にインポートされ、モデルに関する概要情報(入力 / 出力など)と、すぐに使用できるサンプルコードが表示されます。

82840065f0d59def.png

6. 省略可: すべての ToDo リストのチェックアウト

TODO リストを使用すると、Codelab を更新する必要がある正確な場所に簡単に移動できます。Android プロジェクトで使用して、今後の作業をリマインダーとして表示することもできます。コードコメントを使用して ToDo アイテムを追加し、キーワード TODO を入力できます。TODO のリストにアクセスするには、次の方法があります。

  1. 今後の予定については、TODO リストをご覧ください。これを行うには、上部のメニューバーから View > Tool Windows > TODO を選択します。

5de29b413574f25c.png

  1. デフォルトでは、すべてのモジュールのすべての TODO が一覧表示されるため、少しわかりづらい場合があります。TODO パネルの横にあるグループ条件ボタンをクリックして Modules を選択すると、開始 TODO のみを並べ替えることができます。

5d8fe7b102340208.png

  1. 開始モジュールの下のすべての項目を開きます。

8d0f14a039995b20.png

7. TensorFlow Lite でカスタムモデルを実行する

  1. TODO リストの TODO 1 をクリックするか、MainActivity.kt ファイルを開いて TODO 1 を見つけ、次の行を追加してモデルを初期化します。
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. CameraX Analyzer の分析メソッドでは、カメラ入力 ImageProxyBitmap に変換し、推論プロセス用の TensorImage オブジェクトを作成する必要があります。
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. 画像を処理し、結果に対して次の操作を行います。
  • 属性 score の確率で結果を降順に並べ替え、確率が最も高い結果を先頭に表示します。
  • 定数 MAX_RESULT_DISPLAY で定義されている上位 k 件の結果を取得します。必要に応じて、この変数の値を変更して、結果の表示数を増減できます。
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. 並べ替えとフィルタリングを行った結果を、データ バインディングを介して RecyclerView で使用できるデータ オブジェクト Recognition に変換します。
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. 以前に表示された偽の結果を生成するために必要な次の行をコメントアウトするか削除します。
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. TFL_Classify.start を選択し、ツールバーの実行ボタン 86934b7b01ad7565.png を押して、実際のデバイスでアプリを実行します。

60a77ef126c1373d.png

  1. スマートフォンに次の画面が表示されます。実際の結果が表示される部分には、ランダムな数値が表示されます。

f11c2821f2c8311d.png

8. 省略可: GPU デリゲートを使用して推論を高速化する

TensorFlow Lite は、モバイル デバイスでの推論を高速化するために、複数のハードウェア アクセラレータをサポートしています。GPU は、TensorFlow Lite が委任メカニズムを通じて利用できるアクセラレータの 1 つであり、非常に使いやすいものです。

  1. start モジュールの build.gradle を開きます。または、TODO リストの TODO 5 をクリックして、次の依存関係を追加します。
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. MainActivity.kt ファイルに戻るか、TODO リストの TODO 6 をクリックします。flowerModel の単純な初期化を次のように置き換えます。GPU 互換性リストのインスタンスを取得し、リストに記載されている互換性のある GPU のいずれかであるかどうかに応じて GPU を初期化します。それ以外の場合は、4 つの CPU スレッドを開始してモデルを実行します。
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. メソッド入力に options を追加して、これを使用するようにモデル初期化プログラムを変更します。
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}

  1. TFL_Classify.start を選択し、ツールバーの実行ボタン 86934b7b01ad7565.png を押して、実際のデバイスでアプリを実行します。

60a77ef126c1373d.png

9. 次のステップ

詳しくは、以下のリンクをご覧ください。