iT邦幫忙

2021 iThome 鐵人賽

DAY 26
0
Mobile Development

Kotlin Android 30天,從 0 到 ML (Machine Learning)系列 第 26

Kotlin Android 第26天,從 0 到 ML - TensorFlow Lite -手寫數字辨識

前言:

   手寫辨識是最基本入門款,利用第22天canvas手勢繪圖和參照tensorflow 的codelab,來玩手寫辨識。
    

大綱 :

將 TensorFlow Lite 模型添加到assets文件夾

 mnist.tflite

build.gradle(app)

dependencies {
       implementation 'org.tensorflow:tensorflow-lite:2.5.0'
}

android {
      ...
    aaptOptions {
        noCompress "tflite"
    }
      ...
}

建立和初始化 DigitClassifier (TensorFlow Lite interpreter)

class DigitClassifier(private val context: Context) {

 ….

private fun initializeInterpreter() {
  //載入tensorflow lite 模組
  val assetManager = context.assets
  val model = loadModelFile(assetManager)

  // 初始化 TF Lite 解釋器 和 開啟神經網路
  val options = Interpreter.Options()
  options.setUseNNAPI(true)
  val interpreter = Interpreter(model, options)

  // 模型中讀取模型輸入格式
  val inputShape = interpreter.getInputTensor(0).shape()
  inputImageWidth = inputShape[1]
  inputImageHeight = inputShape[2]
  modelInputSize = FLOAT_TYPE_SIZE * inputImageWidth * inputImageHeight * PIXEL_SIZE

  // 完成初始化
  this.interpreter = interpreter
   isInitialized = true
   }

 ….
}

輸入資料給模型預測

private fun classify(bitmap: Bitmap): String {
  …
  //  … 先處理輸入的圖片

  val resizedImage = Bitmap.createScaledBitmap(bitmap, inputImageWidth, inputImageHeight, true)
  val byteBuffer = convertBitmapToByteBuffer(resizedImage)
  …
  val result = Array(1) { FloatArray(OUTPUT_CLASSES_COUNT) }
  interpreter?.run(byteBuffer, result)
  … 
  //最後輸出文字結果
  return getOutputString(result[0])
}

觸控手勢處劃完後放開呼叫 classifyDrawing(extraBitmap)

override fun onTouchEvent(event: MotionEvent): Boolean {
    motionTouchEventX = event.x
    motionTouchEventY = event.y

    when (event.action) {
        MotionEvent.ACTION_DOWN -> touchStart()
        MotionEvent.ACTION_MOVE -> touchMove()
        MotionEvent.ACTION_UP -> classifyDrawing(extraBitmap)
    }
    return true
}

執行結果:
https://ithelp.ithome.com.tw/upload/images/20211001/20121643ilHheIi1Rt.png

參考:

https://developer.android.com/codelabs/digit-classifier-tflite


上一篇
Kotlin Android 第25天,從 0 到 ML - TensorFlow Lite 功能與特色
下一篇
Kotlin Android 第27天,從 0 到 ML - TensorFlow Lite -物體檢測 (Object detection)
系列文
Kotlin Android 30天,從 0 到 ML (Machine Learning)30

尚未有邦友留言

立即登入留言