zoukankan      html  css  js  c++  java
  • 移动端目标识别(2)——使用TENSORFLOW LITE将TENSORFLOW模型部署到移动端(SSD)之TF Lite Developer Guide

    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 ...

    树莓派 ...  

     
  • 相关阅读:
    Redis哨兵(Sentinel)模式
    一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗
    Redis 快速入门
    Redis 持久化之RDB和AOF
    Junit 入门使用教程 转自:http://www.cnblogs.com/ysocean/p/6889906.html
    Spring里PropertyPlaceholderConfigurer类的使用 转自:https://www.cnblogs.com/huqianliang/p/5673701.html
    Apache Commons Codec 编码/解码 (Base64/MD5/SHA1/SHA256等算法) 转自https://blog.csdn.net/hbtj_1216/article/details/52813741
    hive中时间日期函数的使用
    关于mat函数
    strip 和split
  • 原文地址:https://www.cnblogs.com/YouXiangLiThon/p/10131071.html
Copyright © 2011-2022 走看看