1. 簡介
注意:本程式碼研究室需要使用實體裝置進行測試
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 圖片辨識程式來識別花朵。
授權:可免費使用
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 Studio 4.1 以上版本
如果您尚未安裝 AndroidStudio 4.1 以上版本,請參閱這篇文章。
使用 Android Studio 開啟專案
按照下列步驟操作,即可透過 Android Studio 開啟專案:
- 開啟 Android Studio 。載入完成後,選取「Open an Existing project」從這個彈出式視窗:
- 在檔案選取器中,從工作目錄中選擇
TFLClassify/build.gradle
。
- 您會收到「Gradle Sync」彈出式視窗,因此系統會在您初次開啟專案時,詢問如何使用 Gradle 包裝函式。按一下 [確定]。
- 如果您尚未在手機上啟用開發人員模型和 USB 偵錯功能,請先啟用。這是一次性設定。請按照這些說明操作。
- 專案和手機準備就緒後,只要選取
TFL_Classify.start
然後按下工具列上的執行按鈕 ,即可在實際裝置上執行:
- 現在,請允許 Tensorflow Demo 存取相機:
- 進入下方的手機畫面後,您會看到顯示實際結果的隨機號碼。
5. 將 TensorFlow Lite 新增至 Android 應用程式
- 在左側的專案探索工具中選取
start
模組:
- 在
start
模組上按一下滑鼠右鍵,或依序點按File
和New
>Other
>TensorFlow Lite Model
- 選取您先前下載自訂訓練
FlowerModel.tflite
的模型位置。
- 按一下「
Finish
」。 - 結尾將顯示以下內容。FlowerModel.tflite 已成功匯入,並顯示模型的相關概略資訊,包括輸入 / 輸出內容,以及一些程式碼範例,幫助您快速上手。
6. 選用:查看所有待辦事項清單
透過「待辦事項」清單,您可以輕鬆找到更新程式碼研究室的確切位置。你也可以在 Android 專案中使用此功能,提醒自己日後要處理哪些工作。您可以使用程式碼註解新增待辦事項,並輸入關鍵字「TODO
」。如要存取 TODO 清單,您可以:
- 看待待辦事項清單是不錯的方式。如要這麼做,請選取頂端選單列
View
>Tool Windows
>TODO
- 根據預設,它會列出所有模組中的所有 TODO,但這有點令人混淆。按一下「TODO」面板側邊的「分組依據」按鈕,然後選擇「
Modules
」,即可篩選出一開始的待辦事項
- 展開起始模組下方的所有項目:
7. 使用 TensorFlow Lite 執行自訂模型
- 按一下 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)
...
}
- 在 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))
...
}
- 處理圖片,並對結果執行下列作業:
- 在
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
...
}
- 將經過排序及篩選後的結果轉換為資料物件
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))
}
...
}
- 刪除或刪除下列程式行,這有助於產生我們之前看到的假結果:
// 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.
- 選取
TFL_Classify.start
,然後按下工具列上的執行按鈕 ,即可在實體裝置上執行應用程式:
- 您會在手機上看到下方的隨機號碼,其中含有顯示實際結果的隨機號碼:
8. 選用:使用 GPU 委派功能加快推論速度
TensorFlow Lite 支援多種硬體加速器,可加快行動裝置上的推論速度。GPU 是其中一個加速器,可供 TensorFlow Lite 透過委派機制運用,而且相當容易使用。
- 在
start
模組下開啟 build.gradle,或按一下 TODO 清單下方的 TODO 5 並新增下列依附元件:
// TODO 5: Optional GPU Delegates
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
- 返回 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()
}
...
}
- 在方法輸入中加入
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)
}
}
- 選取
TFL_Classify.start
,然後按下工具列上的執行按鈕 ,即可在實體裝置上執行應用程式:
9. 接下來呢?
請參閱下列連結瞭解詳情:
- 嘗試其他與機器學習模型繫結相容於 tfhub.dev 的 TFLite 模型。
- 參閱 tensorflow.org 和程式碼存放區的文件,進一步瞭解 TFLite。
- 試試其他 TFLite 預先訓練模型,包括語音啟動字詞偵測工具和裝置端版本的智慧回覆功能。
- 參閱入門指南文件,進一步瞭解 TensorFlow 的一般資訊。