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


<<:  [DAY-17] 热情从何处来

>>:  Day 16 ml5.js

[Day 13] Forensics 小进阶

我都是睡前写铁人文, 每天都是现场产文:) 所以在写铁人时就察觉一天又要过了 很好现在11:03分我...

Day 20 - 研习计画之网站上线以及功能延伸开发篇

转眼间到11月网站也准备要上线了,回想当时很佩服研习生们有坚持住将该有的功能开发出来,另外昨日提到的...

Day29-D3 进阶图表:合并图表(长条+折线)

本篇大纲:合并图表绘制关键、图表画面与互动效果、本次使用资料、图表绘制 今天的一天一图表,我们要来...

[想试试看JavaScript ] 阵列一些操作阵列好用的方法 forEach

阵列-一些操作阵列好用的方法 这篇整理一些常用的阵列方法 forEach() forEach() 会...

Microsoft Azure Machine Learning - Day 2

Chap.I Practical drill 实战演练 以下内容来自这里 Prat1. Create...