在 Android 上使用 TensorFlow Lite 辨識 Flowers

1. 簡介

657431be3173fa86.png android.png

注意:本程式碼研究室需要使用實體裝置進行測試

TensorFlow 是一種多用途機器學習架構,在任何位置都能使用 TensorFlow,無論是在雲端的叢集上訓練大型模型,還是在手機等嵌入式系統上執行模型,都能使用 TensorFlow。

本程式碼研究室使用 TensorFlow Lite 在 Android 裝置上執行圖片辨識模型。

安裝 Android Studio 4.1 以上版本

如果您尚未安裝 AndroidStudio 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,示範如何使用 Keras 訓練分類器,使用 TensorFlow Lite 遷移學習辨識花朵。

3. 設定工作目錄

複製 Git 存放區

下列指令會複製 Git 存放區,其中包含本程式碼研究室所需的檔案:

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

接著,前往剛剛複製的存放區目錄。您將在這個程式碼研究室中,進行其餘的本程式碼研究室:

cd TFLClassify

4. 設定 Android 基本架構應用程式

android.png

安裝 Android Studio 4.1 以上版本

如果您尚未安裝 AndroidStudio 4.1 以上版本,請參閱這篇文章

使用 Android Studio 開啟專案

按照下列步驟操作,即可透過 Android Studio 開啟專案:

  1. 開啟 Android Studio 7f2480ded53a193b.png。載入完成後,選取「Open an Existing project」從這個彈出式視窗:

f3b8bea7e3b39376.png

  1. 在檔案選取器中,從工作目錄中選擇 TFLClassify/build.gradle
  1. 您會收到「Gradle Sync」彈出式視窗,因此系統會在您初次開啟專案時,詢問如何使用 Gradle 包裝函式。按一下 [確定]。

d68b4d7189e6c1e4.png

  1. 如果您尚未在手機上啟用開發人員模型和 USB 偵錯功能,請先啟用。這是一次性設定。請按照這些說明操作。
  2. 專案和手機準備就緒後,只要選取 TFL_Classify.start 然後按下工具列上的執行按鈕 86934b7b01ad7565.png,即可在實際裝置上執行:

60a77ef126c1373d.png

  1. 現在,請允許 Tensorflow Demo 存取相機:

b63cba02bb36b7e3.png

  1. 進入下方的手機畫面後,您會看到顯示實際結果的隨機號碼。

82c603596afa35f1.png

5. 將 TensorFlow Lite 新增至 Android 應用程式

  1. 在左側的專案探索工具中選取 start 模組:

cede7f2b8b23c1a7.png

  1. start 模組上按一下滑鼠右鍵,或依序點按 FileNew >Other >TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. 選取您先前下載自訂訓練 FlowerModel.tflite 的模型位置。

cfee18cc6674a408.png

  1. 按一下「Finish」。
  2. 結尾將顯示以下內容。FlowerModel.tflite 已成功匯入,並顯示模型的相關概略資訊,包括輸入 / 輸出內容,以及一些程式碼範例,幫助您快速上手。

82840065f0d59def.png

6. 選用:查看所有待辦事項清單

透過「待辦事項」清單,您可以輕鬆找到更新程式碼研究室的確切位置。你也可以在 Android 專案中使用此功能,提醒自己日後要處理哪些工作。您可以使用程式碼註解新增待辦事項,並輸入關鍵字「TODO」。如要存取 TODO 清單,您可以:

  1. 看待待辦事項清單是不錯的方式。如要這麼做,請選取頂端選單列 View >Tool Windows >TODO

5de29b413574f25c.png

  1. 根據預設,它會列出所有模組中的所有 TODO,但這有點令人混淆。按一下「TODO」面板側邊的「分組依據」按鈕,然後選擇「Modules」,即可篩選出一開始的待辦事項

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 的分析方法中,我們必須將相機輸入 ImageProxy 轉換為 Bitmap,並建立推論程序所需的 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. 將經過排序及篩選後的結果轉換為資料物件 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

8. 選用:使用 GPU 委派功能加快推論速度

TensorFlow Lite 支援多種硬體加速器,可加快行動裝置上的推論速度。GPU 是其中一個加速器,可供 TensorFlow Lite 透過委派機制運用,而且相當容易使用。

  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 而初始化 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. 接下來呢?

請參閱下列連結瞭解詳情: