日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android TensorFlow Lite 深度学习识别手写数字mnist demo

發布時間:2025/3/11 Android 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android TensorFlow Lite 深度学习识别手写数字mnist demo 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. TensorFlow Lite

TensorFlow Lite介紹.jpeg

TensorFlow Lite特性.jpeg

TensorFlow Lite使用.jpeg

TensorFlow Lite 是用于移動設備和嵌入式設備的輕量級解決方案。TensorFlow Lite 支持 Android、iOS 甚至樹莓派等多種平臺。

我們知道大多數的 AI 是在云端運算的,但是在移動端使用 AI 具有無網絡延遲、響應更加及時、數據隱私等特性。

對于離線的場合,云端的 AI 就無法使用了,而此時可以在移動設備中使用 TensorFlow Lite。

二. tflite 格式

TensorFlow 生成的模型是無法直接給移動端使用的,需要離線轉換成.tflite文件格式。

tflite 存儲格式是 flatbuffers。

FlatBuffers 是由Google開源的一個免費軟件庫,用于實現序列化格式。它類似于Protocol Buffers、Thrift、Apache Avro。

因此,如果要給移動端使用的話,必須把 TensorFlow 訓練好的 protobuf 模型文件轉換成 FlatBuffers 格式。官方提供了 toco 來實現模型格式的轉換。

三. 常用的 Java API

TensorFlow Lite 提供了 C ++ 和 Java 兩種類型的 API。無論哪種 API 都需要加載模型和運行模型。

而 TensorFlow Lite 的 Java API 使用了 Interpreter 類(解釋器)來完成加載模型和運行模型的任務。后面的例子會看到如何使用 Interpreter。

四. TensorFlow Lite + mnist 數據集實現識別手寫數字

mnist 是手寫數字圖片數據集,包含60000張訓練樣本和10000張測試樣本。
測試集也是同樣比例的手寫數字數據。每張圖片有28x28個像素點構成,每個像素點用一個灰度值表示,這里是將28x28的像素展開為一個一維的行向量(每行784個值)。

mnist 數據集獲取地址:http://yann.lecun.com/exdb/mnist/

下面的 demo 中已經包含了 mnist.tflite 模型文件。(如果沒有的話,需要自己訓練保存成pb文件,再轉換成tflite 格式)

對于一個識別類,首先需要初始化 TensorFlow Lite 解釋器,以及輸入、輸出。

?

// The tensorflow lite fileprivate lateinit var tflite: Interpreter// Input byte bufferprivate lateinit var inputBuffer: ByteBuffer// Output array [batch_size, 10]private lateinit var mnistOutput: Array<FloatArray>init {try {tflite = Interpreter(loadModelFile(activity))inputBuffer = ByteBuffer.allocateDirect(BYTE_SIZE_OF_FLOAT * DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE)inputBuffer.order(ByteOrder.nativeOrder())mnistOutput = Array(DIM_BATCH_SIZE) { FloatArray(NUMBER_LENGTH) }Log.d(TAG, "Created a Tensorflow Lite MNIST Classifier.")} catch (e: IOException) {Log.e(TAG, "IOException loading the tflite file failed.")}}

從 asserts 文件中加載 mnist.tflite 模型:

?

/*** Load the model file from the assets folder*/@Throws(IOException::class)private fun loadModelFile(activity: Activity): MappedByteBuffer {val fileDescriptor = activity.assets.openFd(MODEL_PATH)val inputStream = FileInputStream(fileDescriptor.fileDescriptor)val fileChannel = inputStream.channelval startOffset = fileDescriptor.startOffsetval declaredLength = fileDescriptor.declaredLengthreturn fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength)}

真正識別手寫數字是在 classify() 方法:

?

val digit = mnistClassifier.classify(Bitmap.createScaledBitmap(paintView.bitmap, PIXEL_WIDTH, PIXEL_WIDTH, false))

classify() 方法包含了預處理用于初始化 inputBuffer、運行 mnist 模型、識別出數字。

?

/*** Classifies the number with the mnist model.** @param bitmap* @return the identified number*/fun classify(bitmap: Bitmap): Int {if (tflite == null) {Log.e(TAG, "Image classifier has not been initialized; Skipped.")}preProcess(bitmap)runModel()return postProcess()}/*** Converts it into the Byte Buffer to feed into the model** @param bitmap*/private fun preProcess(bitmap: Bitmap?) {if (bitmap == null || inputBuffer == null) {return}// Reset the image datainputBuffer.rewind()val width = bitmap.widthval height = bitmap.height// The bitmap shape should be 28 x 28val pixels = IntArray(width * height)bitmap.getPixels(pixels, 0, width, 0, 0, width, height)for (i in pixels.indices) {// Set 0 for white and 255 for black pixelsval pixel = pixels[i]// The color of the input is black so the blue channel will be 0xFF.val channel = pixel and 0xffinputBuffer.putFloat((0xff - channel).toFloat())}}/*** Run the TFLite model*/private fun runModel() = tflite.run(inputBuffer, mnistOutput)/*** Go through the output and find the number that was identified.** @return the number that was identified (returns -1 if one wasn't found)*/private fun postProcess(): Int {for (i in 0 until mnistOutput[0].size) {val value = mnistOutput[0][i]if (value == 1f) {return i}}return -1}

對于 Android 有一個地方需要注意,必須在 app 模塊的 build.gradle 中添加如下的語句,否則無法加載模型。

?

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

demo 運行效果如下:

?

識別手寫數字5.png

識別手寫數字7.png

何程序錯誤,以及技術疑問或需要解答的,請掃碼添加作者VX

?

五. 總結

本文只是 TF Lite 的初探,很多細節并沒有詳細闡述。應該會在未來的文章中詳細介紹。

本文 demo 的 github 地址:https://github.com/xiaobingchan/TFLite-MnistDemo

當然,也可以跑一下官方的例子:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/android/app

總結

以上是生活随笔為你收集整理的Android TensorFlow Lite 深度学习识别手写数字mnist demo的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。