在 Android 上使用 TensorFlow Lite 辨識 Flowers

1. 簡介

657431be3173fa86.png android.png

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

TensorFlow 是多用途的機器學習架構,TensorFlow 的用途十分廣泛,從在雲端叢集訓練大型模型,到在手機等嵌入式系統上在本機執行模型,都能派上用場。

這個程式碼研究室會使用 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,瞭解如何使用 Keras 訓練分類器,透過 TensorFlow Lite 遷移學習辨識花卉。

3. 設定工作目錄

複製 Git 存放區

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

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

接著,前往您剛複製存放區的目錄。您將在本程式碼研究室的其餘部分使用這個專案:

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 Sync」彈出式視窗,詢問是否要使用 Gradle Wrapper。按一下 [確定]。

d68b4d7189e6c1e4.png

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

60a77ef126c1373d.png

  1. 現在請允許 Tensorflow Demo 存取攝影機:

b63cba02bb36b7e3.png

  1. 手機上會顯示下列畫面,其中隨機數字會取代實際結果。

82c603596afa35f1.png

5. 在 Android 應用程式中新增 TensorFlow Lite

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

cede7f2b8b23c1a7.png

  1. start 模組上按一下滑鼠右鍵,或依序點選 FileNewOtherTensorFlow Lite Model

bf243d9fdd27e20a.png

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

cfee18cc6674a408.png

  1. 按一下「Finish」。
  2. 最後會看到以下內容。FlowerModel.tflite 已順利匯入,並顯示模型的高階資訊,包括輸入 / 輸出內容,以及一些入門範例程式碼。

82840065f0d59def.png

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

TODO 清單可讓您輕鬆前往需要更新程式碼研究室的確切位置。您也可以在 Android 專案中使用,提醒自己日後要完成的工作。您可以使用程式碼註解新增待辦事項,並輸入關鍵字 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 的 analyze 方法內,我們需要將相機輸入的 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。否則,請啟動 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. 後續步驟

如需更多資訊,請參閱下列連結: