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

树莓派 ...

 

移动端目标识别(2)——使用TENSORFLOW LITE将TENSORFLOW模型部署到移动端(SSD)之TF Lite Developer Guide的更多相关文章

  1. 移动端目标识别(3)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之Running on mobile with TensorFlow Lite (写的很乱,回头更新一个简洁的版本)

    承接移动端目标识别(2) 使用TensorFlow Lite在移动设备上运行         在本节中,我们将向您展示如何使用TensorFlow Lite获得更小的模型,并允许您利用针对移动设备优化 ...

  2. 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介

    平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...

  3. TensorFlow Serving实现多模型部署以及不同版本模型的调用

    前提:要实现多模型部署,首先要了解并且熟练实现单模型部署,可以借助官网文档,使用Docker实现部署. 1. 首先准备两个你需要部署的模型,统一的放在multiModel/文件夹下(文件夹名字可以任意 ...

  4. tensorflow从训练自定义CNN网络模型到Android端部署tflite

    网上有很多关于tensorflow lite在安卓端部署的教程,但是大多只讲如何把训练好的模型部署到安卓端,不讲如何训练,而实际上在部署的时候,需要知道训练模型时预处理的细节,这就导致了自己训练的模型 ...

  5. tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署

    TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...

  6. TensorFlow应用实战 | TensorFlow基础知识

    挺长的~超出估计值了~预计阅读时间20分钟. 从helloworld开始 mkdir 1.helloworld cd 1.helloworldvim helloworld.py 代码: # -*- c ...

  7. 如何将phantomjs单独部署在服务端

    如何将phantomjs单独部署在服务端 文章目录 一. 容我分析(lao dao)几句 二. 服务端 Look here 服务端phantomjs搭建 web端搭建及如何调用phantomjs 三. ...

  8. 【多端应用开发系列0.0.0——之总序】xy多端应用开发方案定制

    [目录] 0.0.0 [多端应用开发系列之总序]服务器Json数据处理——Json数据概述 0.0.0 [因] 正在学习多客户端应用开发,挖个坑,把所用到的技术方案,用最简单直白的语言描述出来,写成一 ...

  9. 学习TensorFlow,生成tensorflow输入输出的图像格式

    TensorFLow能够识别的图像文件,可以通过numpy,使用tf.Variable或者tf.placeholder加载进tensorflow:也可以通过自带函数(tf.read)读取,当图像文件过 ...

随机推荐

  1. Hadoop2.6.0安装—单机/伪分布

    目录 环境准备 创建hadoop用户 更新apt 配置SSH免密登陆 安装配置Java环境 安装Hadoop Hadoop单机/伪分布配置 单机Hadoop 伪分布Hadoop 启动Hadoop 停止 ...

  2. 转:Xms Xmx PermSize MaxPermSize 区别

    Eclipse崩溃,错误提示:MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) sp ...

  3. 【9-2】mysql数据库学习01

    mysql安装 下载社区版本MySQL软件包(地址),或者windows installer 接压缩安装包到目标路径 在系统变量Path中加入目标路径 在mysql安装路径下,修改配置文件mysql- ...

  4. Java集合源码分析

    Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭 ...

  5. Python安装scipy

    1.下载numpy+mkl 下载链接:http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 2.下载scipy 下载链接:http://www.lfd.uc ...

  6. phantompy — phantompy 0.10 documentation

    phantompy - phantompy 0.10 documentation     phantompy¶     Release v0.10.     phantompy is a BSD Li ...

  7. unix网络io模型

    阻塞I/O(bloking I/O) 阻塞IO的特点就是在IO执行的两个阶段(recvfrom和数据从内核空间转移到用户空间)都被block了 非阻塞I/O(non-bloking I/O)   非阻 ...

  8. zabbix3.2_yum官方文档centos 7版

    Installation from packages 1 Repository installation 2 Server installation with MySQL database 3 Ser ...

  9. Mybatis-PageHelper

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  10. nio编程

    NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector.传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从 ...