移动端目标识别(2)——使用TENSORFLOW LITE将TENSORFLOW模型部署到移动端(SSD)之TF Lite Developer Guide

时间:2023-12-13 11:59:26

TF Lite开发人员指南

目录:

   1 选择一个模型

      使用一个预训练模型

      使用自己的数据集重新训练inception-V3,MovileNet

      训练自己的模型

   2 转换模型格式

      转换tf.GraphDef

      完整转换器参考

      计算节点兼容性

      Graph 可视化工具

   3 在移动端app,使用TensorFlow Lite模型推理

android

IOS

Raspberry PI

   使用一个TensorFlow Lite 模型在你的移动端app需要受到需要约束:首先,你必须有训练好的模型(预训练/自己训练),其次,将模型转换为TensorFlow Lite格式,最后,在app内整合模型.

1 选择一个模型

  根据使用场景,你可以选择一个广泛应用的开源模型,比如InceptionV3,Mobilenets,和使用自己的数据集训练的模型,甚至使用自己设计的模型.

  使用预训练的模型:

    MobileNets是TensorFlow的移动优先计算机视觉模型系列,旨在有效地最大限度地提高准确性,同时考虑到设备或嵌入式应用程序的受限资源.MobileNets是小型,低延迟,低功耗模型,参数化以满足各种用途的资源限制。它们可用于分类,检测,嵌入和分割 - 类似于其他流行的大型模型,例如Inception。Google为MobileNets提供了16个经过预先培训的ImageNet分类ckpt模型文件,可用于各种规模的移动项目。

    Inception-v3是一种图像识别模型,可以实现相当高的准确度,可以识别1000个类别的一般对象,例如“斑马”,“达尔马提亚”和“洗碗机”。该模型使用卷积神经网络从输入图像中提取一般特征,并基于具有完全连接和softmax层的那些特征对它们进行分类。

    On Device Smart Reply是一种设备上模型,通过建议与上下文相关的消息,为传入的文本消息提供一键式回复。该模型专为内存受限设备(如手表和手机)而构建,并已成功用于Android Wear上的Smart Replies.目前这个模型是安卓特有的.

    这些预训练的模型可用下载链接是:https://www.tensorflow.org/lite/models    

  使用自己的数据,重新train Inception-V3 或MobileNet

    这些预训练的模型使用ImageNet 数据集训练预定义的1000个类别.如果这些类别在你的业务场景中并不足够,预训练的模型将需要重新训练.在预训练模型基础上再训练,我们称之为迁移学习,就是一个已经在某个解决方式上训练的模型,在相似的问题上,使用自己的数据重训练.深度学习从头开始训练将花费很多天的时间,但是迁移学习十分快.为了实现迁移学习,你需要生成自己的数据和标注.

   Tensorflow for poets(https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0)代码库逐步完成了重新培训过程.该代码支持浮点和量化推理.

训练自己的模型

    开发者选择tensorflow 训练自己的模型(详细见tensorflow tutorials).如果,你已经有了一个写好的模型,你需要做的就是输出这个模型为tf.GraphDef文件.这是必需的,因为某些格式不会将模型结构存储在代码之外,我们必须与框架的其他部分进行通信。 查看 Exporting the Inference Graph:https://www.tensorflow.org/tutorials/keras/save_and_restore_models#save_the_entire_model,以通过自己的模型创建tf.GraphDef文件.

    tensorflow lite 目前支持tensorflow 操作的子集,请查阅: TensorFlow Lite & TensorFlow Compatibility Guide(https://www.tensorflow.org/lite/tf_ops_compatibility)获取当前支持的操作和使用方式.这个操作集合将在未来发布的tensorlow lite 版本上不断增加.

 

2 转换模型格式

   TensofFlow Lite Converter(https://www.tensorflow.org/lite/convert/index)转换器支持下面的文件格式:

       SacedModel :一个图定义文件GraphDef,和ckpt保存的模型,包含输入输出的签名和参数.查看文档使用python(https://www.tensorflow.org/lite/convert/python_api#basic_savedmodel)和命令行(https://www.tensorflow.org/lite/convert/cmdline_examples#savedmodel)

       tf.keras 一个HDF5文件,包含tf.keras生成的模型文件,输入输出参数.查看python(https://www.tensorflow.org/lite/convert/python_api#basic_keras_file)或者命令行(https://www.tensorflow.org/lite/convert/cmdline_examples#keras)

    frozen tf.GraphDef 属于不包含变量tf.GraphDef的子类.一个GraphDef可以被转换为grizen GraphDef,通过一个带有ckpt的模型和GraphDef文件,并使用从ckpt检索的值将每个变量转换为常量.有关将tf.GraphDef转换为TensorFlow Lite模型的说明将在下一小节中介绍。

转换tf.GraphDef

TensorFlow模型可以保存为.pb或.pbtxt tf.GraphDef文件。为了将tf.GraphDef文件转换为TensorFlow Lite,必须首先frozen模型。此过程会调用多种文件格式,包括frozen的GraphDef:

tf.GraphDef(.pb或.pbtxt) - 表示TensorFlow训练或计算图的protobuf。它包含运算符,张量和变量定义。

checkpoint(.ckpt) - 来自TensorFlow图的序列化变量。由于这不包含图形结构,因此无法自行解释。

TensorFlow Lite模型(.tflite) - 一个序列化的FlatBuffer,包含用于TensorFlow Lite解释器的TensorFlow Lite运算符和张量。

您必须拥有包含训练权值的检查点ckpt文件。 tf.GraphDef文件仅包含图形的结构。将检查点值与图结构合并的过程称为冻结图(freezing the graph).

tf.GraphDef和MobileNet模型的检查点文件可在此处获得:https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md

要冻结图形freeze the graph,请使用以下命令(更改参数)

freeze_graph --input_graph=/tmp/mobilenet_v1_224.pb \
  --input_checkpoint=/tmp/checkpoints/mobilenet-10202.ckpt \
  --input_binary=true \
  --output_graph=/tmp/frozen_mobilenet_v1_224.pb \
  --output_node_names=MobileNetV1/Predictions/Reshape_1

读取二进制protobuf(.pb文件)时,将input_binary标志设置为True。对于.pbtxt文件,设置为False。

将input_graph和input_checkpoint设置为相应的文件名。在构建模型的代码之外,output_node_names可能并不明显。找到它们的最简单方法是使用TensorBoard或graphviz可视化图形。

freeze的GraphDef现在可以转换为FlatBuffer格式(.tflite),以便在Android或iOS设备上使用.对于Android,TensorFlow Lite转换器工具支持浮点和量化模型。要将冻结的GraphDef转换为.tflite格式,请使用类似于以下内容的命令:

tflite_convert \
  --output_file=/tmp/mobilenet_v1_1.0_224.tflite \
  --graph_def_file=/tmp/mobilenet_v1_0.50_128/frozen_graph.pb \
  --input_arrays=input \
  --output_arrays=MobilenetV1/Predictions/Reshape_1

这里使用的frozen_graph.pb文件可供下载:https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_1.0_224_frozen.tgz

设置input_array和output_array参数并不简单.找到这些值的最简单方法是使用TensorBoard探索图形。在freeze_graph步骤中重用用于指定推理的输出节点的参数。

完整转换器参考

TensorFlow Lite转换器可以是Python(https://www.tensorflow.org/lite/convert/python_api),也可以是命令行(https://www.tensorflow.org/lite/convert/cmdline_examples)。这允许您将转换步骤集成到模型设计工作流程中,确保模型易于转换为移动推理图.

Ops兼容性

有关故障排除帮助,请参阅操作兼容性指南(https://www.tensorflow.org/lite/tf_ops_compatibility),如果这样做无效,请提出问题(https://github.com/tensorflow/tensorflow/issues)。

图形可视化工具

    development repo(https://github.com/tensorflow/tensorflow)包含一个在转换后可视化TensorFlow Lite模型的工具。要构建visualize.py (https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/tools/visualize.py)工具:

bazel run tensorflow/lite/tools:visualize -- model.tflite model_viz.html

  这将生成一个交互式HTML页面,其中列出了子图,操作和图形可视化

3.使用TensorFlow Lite模型在移动应用程序中进行推理

   完成前面的步骤后,您现在应该有一个.tflite模型文件。

Android

   由于Android应用程序是用Java编写的,核心TensorFlow库是用C ++编写的,因此提供了一个JNI库作为接口.这仅用于推理 - 它提供加载图形,设置输入和运行模型以计算输出的能力。开源Android演示应用程序使用JNI接口,可在GitHub上使用(https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/java/demo/app).您还可以下载预建的APK(http://download.tensorflow.org/deps/tflite/TfLiteCameraDemo.apk)。有关详细信息,请参阅Android演示指南(https://www.tensorflow.org/lite/demo_android)。Android移动(https://www.tensorflow.org/lite/android_build)指南提供了在Android上安装TensorFlow以及设置bazel和Android Studio的说明。 

Ios ...

树莓派 ...