[Day 28] Android Studio 七日陨石开发:把 tflite 模型放进 app

0. 前言

距离真正完成表情辨识的App,
只差把辨识图像的功能实作出来,
在这里我们必须将Day21存好的TFLite模型拿出来,
制作出含有metadata的TFLite模型。


1. 将tflite模型加入metadata

准备材料

  1. model.tflite
    之前我们训练好久的model,有用.h5和.tflite的格式储存,
    现在我们只需要准备好.tflite的档案
  2. labels.txt
    这里要记录我们的类别名称,用"换行"分隔。
    https://ithelp.ithome.com.tw/upload/images/20211003/20141294q8T6dpuxnV.jpg

程序码

我把"effB0_fer.tflite"加入metadata後,
另存为"effB0_fer_meta.tflite"。

# %% 生成 model metadata
from tflite_support.metadata_writers import writer_utils
from tflite_support.metadata_writers import image_classifier

ImageClassifierWriter = image_classifier.MetadataWriter
_MODEL_PATH = "./models/effB0_fer.tflite"
_LABEL_FILE = "./data/FER2013_labels.txt"
_SAVE_TO_PATH = "./models/effB0_fer_meta.tflite"

_INPUT_NORM_MEAN = 0
_INPUT_NORM_STD = 1

# Create the metadata writer.
writer = ImageClassifierWriter.create_for_inference(
    writer_utils.load_file(_MODEL_PATH), [_INPUT_NORM_MEAN], [_INPUT_NORM_STD],
    [_LABEL_FILE])
# Verify the metadata generated by metadata writer.
print(writer.get_metadata_json())
# Populate the metadata into the model.
writer_utils.save_file(writer.populate(), _SAVE_TO_PATH)

解说

这边唯一有需要自己决定的只有_INPUT_NORM_MEAN_INPUT_NORM_STD
这两个变数的数值决定於我们输入图片矩阵的时候有无做正规化,
因为我是将[0. ~ 255.]直接丢入模型,所以设mean = 0, std = 1。

官网原文:

Normalization is a common data preprocessing technique in machine learning. The goal of normalization is to change the values to a common scale, without distorting differences in the ranges of values.


2. 将metadata tflite model导入Android Studio

  1. app上按滑鼠右键,最後点击tensorflow lite model
    https://ithelp.ithome.com.tw/upload/images/20211003/20141294WlWMuIooir.png

  2. 选择已训练model的位置进行import,按下finish进行import。(不建议勾gpu选项)
    https://ithelp.ithome.com.tw/upload/images/20211003/201412941HAtPXWPW1.jpg

  3. 等待1分钟後,可以看到菜单左栏位多出ml资料夹。

  4. ml资料夹下有我们的tflite model,可以点开他查看(这边记录了input shape和scale range)
    https://ithelp.ithome.com.tw/upload/images/20211003/20141294WmVpwqXV3u.jpg

  5. 呼叫模型的程序码

val model = Effb0FerMeta.newInstance(context)

// Creates inputs for reference.
val image = TensorImage.fromBitmap(bitmap)

// Runs model inference and gets result.
val outputs = model.process(image)
val probability = outputs.probabilityAsCategoryList

// Releases model resources if no longer used.
model.close()

3. 结语

终於把模型放进去了,
现在只差把 2.5 (呼叫模型的程序码)的程序码实作成function加入MainActivity.kt了!
明天再见~


<<:  DAY28-EXCEL统计分析:回归分析介绍

>>:  Day28 - [Shioaji] 超入门!永丰证券程序交易API快速上手 (1)

DAY14 呼叫功能列表样板

@csrf_exempt def callback(request): if request.met...

[ 卡卡 DAY 23 ] - React Native 表单套件用 Formik + Yup 验证 (上)

在网路上看到有人推荐 Formik 不仅符合 react native 也可以在 react 上使...

Day02 - GCP 介绍及环境建置

什麽是云端服务 ? 云端服务指的就是将软硬体等资源,放到网际网路上作为服务,使用者只需透过网路,就可...

离职倒数16天:推荐在日本软件业工作吗?「东京并不是一个让你实现梦想的地方。东京是一个能让你不去注意到自己的梦想并未实现的地方。」

前几天有朋友问我「推荐在日本软件业工作吗?」 我有点不太知道怎麽回答,因为我没在其他地方工作过,无从...

Day16:今天来谈一下Microsoft Cloud App Security

Microsoft Cloud App Security是一种云端存取安全性代理人(CASB), 可...