移动端目标识别(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 ...
树莓派 ...
移动端目标识别(2)——使用TENSORFLOW LITE将TENSORFLOW模型部署到移动端(SSD)之TF Lite Developer Guide的更多相关文章
- 移动端目标识别(3)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之Running on mobile with TensorFlow Lite (写的很乱,回头更新一个简洁的版本)
承接移动端目标识别(2) 使用TensorFlow Lite在移动设备上运行 在本节中,我们将向您展示如何使用TensorFlow Lite获得更小的模型,并允许您利用针对移动设备优化 ...
- 移动端目标识别(1)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之TensorFlow Lite简介
平时工作就是做深度学习,但是深度学习没有落地就是比较虚,目前在移动端或嵌入式端应用的比较实际,也了解到目前主要有 caffe2,腾讯ncnn,tensorflow,因为工作用tensorflow比较多 ...
- TensorFlow Serving实现多模型部署以及不同版本模型的调用
前提:要实现多模型部署,首先要了解并且熟练实现单模型部署,可以借助官网文档,使用Docker实现部署. 1. 首先准备两个你需要部署的模型,统一的放在multiModel/文件夹下(文件夹名字可以任意 ...
- tensorflow从训练自定义CNN网络模型到Android端部署tflite
网上有很多关于tensorflow lite在安卓端部署的教程,但是大多只讲如何把训练好的模型部署到安卓端,不讲如何训练,而实际上在部署的时候,需要知道训练模型时预处理的细节,这就导致了自己训练的模型 ...
- tensorflow 模型保存与加载 和TensorFlow serving + grpc + docker项目部署
TensorFlow 模型保存与加载 TensorFlow中总共有两种保存和加载模型的方法.第一种是利用 tf.train.Saver() 来保存,第二种就是利用 SavedModel 来保存模型,接 ...
- TensorFlow应用实战 | TensorFlow基础知识
挺长的~超出估计值了~预计阅读时间20分钟. 从helloworld开始 mkdir 1.helloworld cd 1.helloworldvim helloworld.py 代码: # -*- c ...
- 如何将phantomjs单独部署在服务端
如何将phantomjs单独部署在服务端 文章目录 一. 容我分析(lao dao)几句 二. 服务端 Look here 服务端phantomjs搭建 web端搭建及如何调用phantomjs 三. ...
- 【多端应用开发系列0.0.0——之总序】xy多端应用开发方案定制
[目录] 0.0.0 [多端应用开发系列之总序]服务器Json数据处理——Json数据概述 0.0.0 [因] 正在学习多客户端应用开发,挖个坑,把所用到的技术方案,用最简单直白的语言描述出来,写成一 ...
- 学习TensorFlow,生成tensorflow输入输出的图像格式
TensorFLow能够识别的图像文件,可以通过numpy,使用tf.Variable或者tf.placeholder加载进tensorflow:也可以通过自带函数(tf.read)读取,当图像文件过 ...
随机推荐
- JVM-垃圾收集算法
新生代:复制算法,IBM研究过,约98%对象是“朝生夕死”,所以不需要按照1:1来划分:HotSpot中默认是8:1:1,即每次新生代可用空间为90%,只有10%会被“浪费”, 当Survivor空间 ...
- C# 6.0:在catch和finally中使用await
Asyn方法是一个现在很常用的方法,当使用async和await时,你或许曾有这样的经历,就是你想要在catch块或finally块中使用它们,比如当出现一个exception而你希望将日志记在文件或 ...
- (转)SQLServer_十步优化SQL Server中的数据访问四
原文地址:http://tech.it168.com/a2009/1125/814/000000814758_all.shtml 第八步:使用SQL事件探查器和性能监控工具有效地诊断性能问题 在SQL ...
- (转)K-近邻算法(KNN)
K-近邻算法(KNN)概述 KNN是通过测量不同特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别 ...
- stm32 uart 中断 蜜汁bug
在项目中,使用stm32f103,配置uart1接收RXNE中断,使用DMA来进行UART1的发送. 初始化代码如下: void uart_init(u32 bound) { GPIO_InitTyp ...
- Java笔记Spring(五)
C:\apache-tomcat-8.0.36\bin\catalina.bat run [2018-05-23 02:30:31,657] Artifact demo-springmvc:war e ...
- DRF 认证、权限、限制
DRF 认证.权限.限制 认证: 定义一个用户表和一个保存用户的Token表 # ======================day96======================= class ...
- electron builder 打包错误 cannot unpack electron zip file 解决方案
npm run buildwin > study01@1.0.0 buildwin F:\Nodejs\electron\Test\study01> electron-builder -- ...
- python汉诺塔问题的递归理解
一.问题背景 汉诺塔问题是源于印度一个古老传说. 源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下 ...
- core dump 配置
引用:http://www.cnblogs.com/secondtonone1/p/5732938.html Windows环境崩溃问题可根据vs调试工具查看,Linux同样可以查看调用堆栈的信息,只 ...