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. httpd基于域名虚拟主机配置

    什么是虚拟主机 在一个Apache服务器上可以配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录. httpd支持多种方式的虚拟主机的配置,主要有以下种: 基于IP ...

  2. 批量ping测试的脚本

    #脚本开始 #!/bin/bash HOSTLIST=`cat /usr/local/ipaddrs.txt` for IP in $HOSTLIST do ping -c 3 -i 0.2 -W 3 ...

  3. SourceInsight宏插件3(非常好用,强力推荐)

    openfolder.em源码:(链接:https://pan.baidu.com/s/1draaimWzCHZ3vLxL--lfiQ  提取码:zyq4) //使用资源管理器打开当前文件所在文件夹, ...

  4. 群晖NAS同步文件,防止Mac OS X自动休眠的办法

    背景: NAS drive同步文件到移动硬盘,需要消耗很长时间.但长时间不动电脑,mac又会自动关闭所有application,进入休眠模式,导致同步任务被终止. 使用系统的节能设置配置也没能成功关闭 ...

  5. MySQL事务的介绍+事务的特性+事务的开启

    事务介绍: 简单的说,事务就是指逻辑上的一组SQL语句操作,组成这组操作的各个SQL语句,要么全成功要么全失败. 例如:A给B转账5元,流程是从A的账户扣除5元,把5元打入B的账户,B的账户上收到5元 ...

  6. git bash的一些使用经验

    1.最开始使用git的时候, git remote -v 查看远程仓库 报了一个错误fatal: not a git repository (or any of the parent director ...

  7. SSD硬盘测速较低的原因备忘

    SATA3 SSD测速度盘速度只有200MB/s,可能原因有: 原因分为几种:没开AHCI 没有4K对齐 虽然接的是SATA3接口但SATA3有分为3G和6G这些传输速度接口的分别,同理SATA线3G ...

  8. python之路——17

    王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1.迭代器2.生成器3.内置函数 1.学习55个 2.带key的,max min filter map ...

  9. C#类与结构体的小结

    1.定义不同 类使用class关键字来定义: 结构体用struct: 2.使用时的注意事项 ->结构体是值类型,类是引用类型 ->结构体中声明的变量不能做赋值操作,但是类可以. -> ...

  10. Java子类访问父类的私有成员变量

    /**子类会继承父类所有的属性和方法. * 但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量 * 所以对于重名变量,子类和父类都各有一份. * 对于子类和父类中 ...