AndroidのTensorFlowLiteで花を認識する

657431be3173fa86.pngandroid.png

注:このコードラボでは、テストするために物理デバイスが必要です

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

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

Android Studio4.1以降をインストールする

まだインストールしていない場合は、TensorFlow Liteモデルのトレーニング中に、 AndroidStudio4.1以降をダウンロードしてインストールしてください。

あなたが学ぶこと

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

何を構築するか

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

f11c2821f2c8311d.png

ライセンス:無料で使用できます

モデルトレーニングを開始する前に、 Android Studio4.1以降のダウンロードとインストールを開始してください。

TensorFlow Lite転送学習を使用して花を認識するように、Kerasで分類器をトレーニングする方法を示すColabを開きます。

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

次のコマンドは、このコードラボに必要なファイルを含むGitリポジトリのクローンを作成します。

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

次に、リポジトリのクローンを作成したディレクトリに移動します。これは、このコードラボの残りの部分で作業する場所です。

cd TFLClassify

android.png

Android Studio4.1以降をインストールする

まだインストールしていない場合は、 AndroidStudio4.1以降をインストールしてください。

AndroidStudioでプロジェクトを開きます

次の手順を実行して、AndroidStudioでプロジェクトを開きます。

  1. AndroidStudioを開く7f2480ded53a193b.png 。ロード後、このポップアップから「既存のプロジェクトを開く」を選択します。

f3b8bea7e3b39376.png

  1. ファイルセレクタで、作業ディレクトリからTFLClassify/build.gradle選択します。
  1. プロジェクトを初めて開いたときに、gradleラッパーの使用について尋ねる「GradleSync」ポップアップが表示されます。 「OK」をクリックします。

d68b4d7189e6c1e4.png

  1. まだ行っていない場合は、携帯電話で開発者モデルとUSBデバッグを有効にします。これは1回限りの設定です。これらの指示に従ってください
  2. プロジェクトと電話の両方の準備ができたら、 TFL_Classify.startを選択して実行ボタンを押すことにより、実際のデバイスでTFL_Classify.startを実行できます。 86934b7b01ad7565.pngツールバー:

60a77ef126c1373d.png

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

b63cba02bb36b7e3.png

  1. 実際の結果が表示される場所の代わりに乱数が表示された次の画面が携帯電話に表示されます。

82c603596afa35f1.png

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

cede7f2b8b23c1a7.png

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

bf243d9fdd27e20a.png

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

cfee18cc6674a408.png

  1. [ Finishクリックします。
  2. 最後に次のように表示されます。 FlowerModel.tfliteが正常にインポートされ、入力/出力を含むモデルに関する高レベルの情報と、開始するためのサンプルコードが表示されます。

82840065f0d59def.png

TODOリストを使用すると、コードラボを更新する必要がある正確な場所に簡単に移動できます。 Androidプロジェクトで使用して、将来の作業を思い出させることもできます。コードコメントを使用してtodoアイテムを追加し、キーワードTODOます。 TODOのリストにアクセスするには、次のことができます。

  1. 私たちがやろうとしていることを確認するための素晴らしい方法は、TODOリストをチェックすることです。これを行うには、上部のメニューバーからView > [ Tool Windows View > [ TODO ]を選択します。

5de29b413574f25c.png

  1. デフォルトでは、すべてのモジュールのすべてのTODOが一覧表示されるため、少し混乱します。 TODOパネルの横にあるgroupbyボタンをクリックして、[ Modules ]を選択すると、開始TODOのみを並べ替えることができます。

5d8fe7b102340208.png

  1. 開始モジュールの下にあるすべての項目を展開します。

8d0f14a039995b20.png

  1. TODOリストでTODO1をクリックするか、 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アナライザーのanalyzeメソッド内で、カメラ入力ImageProxyBitmapに変換し、推論プロセス用のTensorImageオブジェクトを作成する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個の結果をMAX_RESULT_DISPLAYます。オプションで、この変数の値を変更して、結果を増減させることができます。
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. ソートおよびフィルタリングされた結果をデータオブジェクトに変換します。 Recognitionデータバインディングを介してRecyclerViewできるようになります。
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

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リストでTODO6をクリックします。 flowerModelの単純な開始を次のように置き換えます。GPU互換性リストのインスタンスを取得し、リストされている互換性のあるGPUの1つであるかどうかに応じて、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を追加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

詳細については、次のリンクを参照してください。