关于 tflite 移动端部署中如何为 tflite 模型添加 metadata

写在前面

本篇是 详解 TensorFlow TFLite 移动端(安卓)部署物体检测 demo(2)——量化模型 的辅助篇,主要记录如何向 tflite 模型中写入 metadata 的相关信息以适应 tflite 更新后的 lib_task_apilib_interpreter 两种方式。由于 tensorflow 相关文档更新得不及时,所以有些引导和线索获取得磕磕绊绊,本篇主要是我自己查找资料的过程。


2021.07 更新
最近在细看 models 项目的文档,发现 tensorflow 把移动端部署 tflite 模型更新需要添加 metadata 这个介绍放在 models 下面了……但是并没有从 examples 项目中的 object detection demo 引导 models 项目去……so,放上来,在 /models/research/object_detection/g3doc/running_on_mobile_tf2.md 中,介绍了三步,freeze、convert 和 metadata……哎脑瓜子嗡嗡地,能不能不要藏着掖着鸭,难道先接触 examples 再接触 models 项目就不配做人了嘛/(ㄒoㄒ)/~~ 而且起名叫 running on mobile tf2,你给的 object detection demo 明明只能在 tf1 下运行啊……
在这里插入图片描述


第一步

/examples/lite/examples/object_detection/android/README.md 中的 Switch between inference solutions (Task library vs TFLite Interpreter) 部分,此部分给了关于 lib_task_apilib_interpreter 两种方式的资料链接,以及在 Android Studio 中如何切换两种方式。

其中,lib_interpreter 的资料链接里面,目前没有更新(没有提及 metadata 的信息,但是实际上使用 interpreter 的方式也需要向 tflite 写入 metadata……),对本篇主题没有贡献,pass。所以下一步的信息是从 lib_task_api 的资料链接中获取的。

第二步

根据 lib_task_api 的资料链接,查看到其对 metadata 的兼容性要求(强制性 ):
在这里插入图片描述
下一步就点击上图中的链接,其内容主要围绕如何向 tflite 模型中添加 metadata。

第三步

这个链接中有关 metadata 的资料很多,整体方便对 metadata 格式的了解。但也可以跳着看,其中关键部分在于 建立 metadata 工具 以及 后面 Examples 下给的 Image Classification 的例子。

metadata 简介

TensorFlow Lite metadata 为模型描述提供了标准,是了解模型的功能及其输入/输出信息的重要来源,由两部分组成(1)人类可读部分和 (2)机器可读部分。

并且提到:在 TensorFlow Lite 托管模型和 TensorFlow Hub 上发布的所有图像模型都已添加 metadata。

拥有 metadata 的模型格式

在这里插入图片描述
Figure 1. TFLite model with metadata and associated files.

Model metadata 定义在 metadata_schema.fbs(FlatBuffer文件)中。如图1所示,它存储在 TFLite 模型模式的 metadata 字段中,名称为“TFLITE_METADATA”。某些模型可能附带相关文件,例如分类标签文件。这些文件使用 ZipFile 的 “append” mode(“a” mode)作为 ZIP 文件连接到原始模型文件的末尾。TFLite 解释器可以像以前一样使用新的文件格式。有关详细信息,请参见打包相关文件。请参阅下面关于如何构建、可视化和读取 metadata 的说明。

建立 metadata 工具

首先,要有一个环境用来运行 Tensorflow,略过了。在环境中安装 tflite-support。

pip install tflite-support

使用 Flatbuffers Python API 添加 metadata

架构中的模型 metadate 包括三个部分:

  • 模型信息:模型的总体描述以及许可条款等项。请参见 ModelMetadata。
  • 输入信息:对输入和所需的预处理(如规范化)的描述。请参阅 SubGraphMetadata.input_tensor_metadata。
  • 输出信息:描述输出和所需的后处理,如映射到标签。请参见 SubGraphMetadata.output_tensor_metadata。

由于 TensorFlow Lite 此时仅支持单个子图,因此在显示 metadata 和生成代码时,TensorFlow Lite 代码生成器和 Android Studio ML 绑定功能将使用 ModelMetadata.name 和 ModelMetadata.description,而不是 SubGraphMetadata.name 和 SubGraphMetadata.description。

支持的 Input / Output 类型

对于输入和输出,TensorFlow Lite metadata 在设计时并没有考虑特定的模型类型,而是考虑输入和输出类型。不管模型在功能上做什么,只要输入和输出类型包含以下内容或以下内容的组合,TensorFlow Lite metadata 就支持它:

  • 特征:无符号整数或浮点数32。
  • 图像:metadata 当前支持 RGB 和灰度图像。
  • 边界框:矩形形状边界框。该模式支持多种编号方案。
打包 associated files(对图像分类 or 物体检测任务就肯定有 labelmap)

TensorFlow Lite 模型可能附带不同的相关文件。例如,自然语言模型通常有将单词片段映射到单词 id 的 voab 文件;分类模型可能具有指示对象类别的标签文件。如果没有关联的文件(如果有),模型将无法正常工作。

现在,关联的文件可以通过metadata Python 库与模型绑定。新的 TensorFlowLite 模型将成为一个包含模型和相关文件的 zip 文件。它可以用普通的 zip 工具解包。此新模型格式始终使用相同的文件扩展名 .tflite。它与现有 TFLite 框架和解释器兼容。有关详细信息,请参见将 metadata 和相关文件打包到模型中。

相关文件信息可以记录在 metadata 中。根据文件类型和文件附着到的位置(即 ModelMetadata、SubgraphMetData 和 TensormeTata),TensorFlow Lite Android 代码生成器可以自动将相应的预/后处理应用于对象。有关详细信息,请参阅架构中每个关联文件类型的section。

Normalization and quantization parameters

归一化是机器学习中常用的数据预处理技术,目标是将值更改为一个共同的尺度,而不扭曲值范围中的差异。模型量化是一种允许降低权重表示精度的技术,并且可以选择激活存储和计算。

在预处理和后处理方面,归一化和量化是两个独立的步骤。以下是细节。
在这里插入图片描述
在处理 uint8 模型的图像数据时,标准化和量化有时被跳过。当像素值的范围为 [0,255]。但总的来说,你应该对数据进行归一化和量化处理适用时的参数。

TensorFlow Lite Task Library 可以为您处理规范化,如果您在 metadata 中设置 NormalizationOptions 。量化与去量化处理总是被封装的。

Examples

Note: The export directory specified has to exist before you run the script; it does not get created as part of the process.

You can find examples on how the metadata should be populated for different types of models here:

Image classification

Download the script here, which populates metadata to mobilenet_v1_0.75_160_quantized.tflite. Run the script like this:

python ./metadata_writer_for_image_classifier.py \
    --model_file=./model_without_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --label_file=./model_without_metadata/labels.txt \
    --export_directory=model_with_metadata

这个下载链接一看就知道对应的是 examples 项目下的/examples/lite/examples/image_classification/metadata/metadata_writer_for_image_classifier.py,其中的很多细节篇幅原因我不再讲了,总之是写入模型相关信息的。

看到这里的时候,还是有点懵的,难道这是离终点最近的资料了?我要照着分类的示例写物体检测的吗?

第四步

根据这个示例文件,我追看了 tflite_support 下面的 metadata_writer,发现其下有多种领域任务相关的包,其中也有 object detection,所以我更加坚定了,官方应该提供的了,只是没有很明显地放出来。

from tensorflow_lite_support.metadata.python.metadata_writers import audio_classifier
from tensorflow_lite_support.metadata.python.metadata_writers import image_classifier
from tensorflow_lite_support.metadata.python.metadata_writers import image_segmenter
from tensorflow_lite_support.metadata.python.metadata_writers import metadata_info
from tensorflow_lite_support.metadata.python.metadata_writers import nl_classifier
from tensorflow_lite_support.metadata.python.metadata_writers import object_detector
from tensorflow_lite_support.metadata.python.metadata_writers import writer_utils

之后我开始着手在 tensorflow 源码、examples 项目、models 项目下搜寻 metadata 的示例信息。终于到达了这里

在这里插入图片描述

在这里插入图片描述

总结

安装 tflite-support,然后使用官方代码为 tflite 模型添加 metadata 就好。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ tflite-support
pip install --upgrade pip

我还反思了自己,在 app README 文件一路走来,是不是错过了什么信息,倒置找半天才找到官方的示例。回头看了一遍,真的没有啊……要我说,给 tflite 模型增加 metadata 就应该直接把我最后找到的这个链接放进 app README 中啊……算了,README 连添加 metadata 这一步都压根儿没讲(/(ㄒoㄒ)/~~)

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
以下是将TensorFlow 1.15模型转换为TFLITE模型的详细代码和操作步骤: 1. 安装TensorFlow 1.15和TFLITE 在终端执行以下命令来安装TensorFlow 1.15和TFLITE: ``` pip install tensorflow==1.15 pip install tensorflow==1.15-gpu pip install tensorflow==1.15-tflite ``` 或者使用以下命令: ``` pip install tensorflow==1.15 tensorflow-gpu==1.15 tensorflow-tensorboard==1.15 tensorflow-estimator==1.15 tensorflow-addons==0.10.0 tensorflow-datasets==3.0.0 tensorflow-hub==0.7.0 tensorflow-metadata==0.25.0 tensorflow-probability==0.7.0 tensorflow-serving-api==1.15.0 tensorflow-transform==0.15.0 tensorflow-io==0.11.0 pip install tensorflow==1.15-tflite ``` 2. 加载TensorFlow模型 在Python脚本,使用以下代码加载TensorFlow模型: ``` import tensorflow as tf # Load the TensorFlow model model = tf.keras.models.load_model('path/to/the/model') ``` 3. 将TensorFlow模型转换为TFLITE模型 使用以下代码将TensorFlow模型转换为TFLITE模型: ``` # Convert the TensorFlow model to TFLITE converter = tf.lite.TFLiteConverter.from_keras_model(model) tflite_model = converter.convert() # Save the TFLITE model with open('model.tflite', 'wb') as f: f.write(tflite_model) ``` 在上面的代码,将TensorFlow模型转换为TFLITE模型的步骤是: - 从Keras模型创建一个转换器 - 使用转换器将模型转换为TFLITE格式 - 将TFLITE模型保存到磁盘上 在保存TFLITE模型时,可以将文件名更改为任何你想要的名称。 4. 加载TFLITE模型 使用以下代码加载TFLITE模型: ``` # Load the TFLITE model interpreter = tf.lite.Interpreter(model_path='model.tflite') interpreter.allocate_tensors() ``` 在上面的代码,使用TFLITE解释器加载模型,并调用“allocate_tensors”方法以分配解释器所需的所有张量。 5. 运行TFLITE模型 使用以下代码在TFLITE模型上运行推理: ``` # Run inference on the TFLITE model input_data = ... # Load input data interpreter.set_tensor(interpreter.get_input_details()[0]['index'], input_data) interpreter.invoke() output_data = interpreter.get_tensor(interpreter.get_output_details()[0]['index']) ``` 在上面的代码,需要将输入数据加载到“input_data”变量,并将其设置为TFLITE解释器的输入张量。然后,使用“invoke”方法运行推理,并从解释器的输出张量获取结果。 以上就是将TensorFlow 1.15模型转换为TFLITE模型的详细代码和操作步骤。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值