TensorFlow Lite
一:机器学习
1.概念
简单归纳来说,机器学习分为两个阶段:
训练阶段:通过对有标签的样本数据进行训练得到合适的最佳模型
推测阶段:根据模型对无标签的样本数据进行推段得到结果(标签)
在对模型的进行训练的过程中,要考虑特征跟标签的关系推断所造成的误差,通过计算损失来反复调整计算参数来得到最佳模型。
当前流行的深度学习框架(包括 Caffe、Theano、PyTorch、TensorFlow 和 Keras),TensorFlow 目前是首选平台。
TensorFlow 是一个端到端开源机器学习平台。它拥有一个包含各种工具、库和社区资源的全面灵活生态系统,可以让研究人员推动机器学习领域的先进技术的发展,并让开发者轻松地构建和部署由机器学习提供支持的应用。
二:Tensor Flow
1.Tensor Flow发展历程
从2010年开始,谷歌大脑创建DistBelief作为他们的第一代专有的机器学习系统。
TensorFlow是谷歌大脑的第二代机器学习系统。
TensorFlow最初由谷歌大脑团队开发,用于Google的研究和生产,于2015年11月9日Google在Apache 2.0开源许可证下发布了Tensorflow的白皮书并很快将Tensorflow开源。
2016年3月AlphaGo以总比分4:1战胜韩国棋手李世石,彻底引爆了普通大众对人工智能的热情,AI技术也在加速向各行各业渗透。Tensorflow则成为一个现象级的技术名词,被普通大众所熟知。
2016年4月发布0.8.0版本,开始本地的支持分布式运行。
2016年6月发布0.9.0版本,开始支持iOS。
2016年12月发布0.12.0版本,开始支持Windows系统。该移植代码主要由微软贡献。
2017年2月发布了1.0.0版本,也标志着稳定版的诞生
2017年5月Google宣布从Android Oreo开始,提供一个专用于Android开发的软件栈TensorFlow Lite
2017年11月14日,谷歌终于开源了业界期待已久的移动版TensorFlow — TensorFlow Lite
2019年3月谷歌在加州举办TensorFlow开发者峰会(TensorFlow Dev Summit),正式发布2.0版本。
2.Tensor Flow 2.0版本:
TensorFlow 2.0 将专注于简单性和易用性,具有以下更新:
———使用 Keras 和 eager execution,轻松构建模型
———在任意平台上实现生产环境的稳健模型部署
———为研究提供强大的实验工具
———通过清理废弃的 API 和减少重复来简化 API
三、移动端深度学习SDK比较
2017年11月14日,谷歌终于开源了业界期待已久的移动版Tensor Flow — Tensor Flow Lite。谷歌很可能凭借这款利器赢得移动端AI的生态之战。理由有三:
1. 无缝支持通过Tensor Flow训练好的神经网络模型。只需要几个简单的步骤就可以完成桌面模型到移动端模型的转换。
2. TF Lite可以与Android 8.1中发布的神经网络API完美配合。而Android端版本演进的控制权是掌握在谷歌手中的,从长期看,TF Lite会得到Android系统层面上的支持。
3. 质量有保证。根据以往谷歌对开源项目支持力度看,TF Lite的功能迭代演进会很快,大量的bug会在第一时间修复。
此前,国内的巨头百度已经发布了MDL(传送门 )框架、腾讯发布了NCNN(传送门 )框架。比较这三个移动端框架的异同之处。
相同点:
1. 只含推理(inference)功能,使用的模型文件需要通过离线的方式训练得到。
2. 最终生成的库尺寸较小,均小于500kB。
3. 为了提升执行速度,都使用了ARM NEON指令进行加速。
4. 跨平台,iOS和Android系统都支持。
不同点:
1. MDL和NCNN均是只支持Caffe框架生成的模型文件,而TF Lite则毫无意外的只支持自家大哥Tensor Flow框架生成的模型文件。
2. MDL支持利用iOS系统的Matal框架进行GPU加速,能够显著提升在iPhone上的运行速度,达到准实时的效果。而NCNN和TF Lite还没有这个功能。
四:TensorFlow Lite
1.TensorFlow Mobile
TensorFlow 对于移动端设备,推出了Tensor Flow Mobile。
Tensor Flow Mobile是在推出Tensor flow时同时推出的,用于支持手机上的模型嵌入式部署,但对于移动设备上使用深度学习网络还是有相对的限制,主要是计算性能无法达到。
2.相比Tensor Flow Mobile
Tensor Flow Mobile是在推出Tensor flow(简称TF)时同时推出的,用于支持手机上的模型嵌入式部署,但对于移动设备上使用深度学习网络还是有相对的限制,主要是计算性能无法达到。
1)Tensor Flow Lite更为轻量级,相比Tensor Flow Mobile通过TF Lite 生成的链接库体积很小。
2)Tensor Flow Mobile的编译依赖protobuf 等库,而Tensor Flow Lite不需要大的依赖库。
3)Tensor Flow Mobile成熟,全面,支持的用例丰富。而Tensor Flow Lite目前为开发预览版本,没有涵盖所有用例。Tensor Flow Lite目前主要支持CNN的实现,对其他网络中的算子还没有很好的支持,若是想把RNN迁移到移动端,目前是不OK的。针对CNN,大多数算子都有提供,但反向卷积算子并没有提供。不过缺失的算子可以自定义,并添加TF Lite库,因此扩展性较好。
4)两者都能支持Android, iOS,跨平台性没问题
5)Tensor Flow Lite可以与Android 8.1中发布的神经网络API完美配合,即便在没有硬件加速时也能调用CPU处理,确保模型在不同设备上的运行。
6)可以用上移动端硬件加速。TF Lite 可以通过Android Neural Networks API (NNAPI) 进行硬件加速,只要加速芯片支持 NNAPI,就能够为TF Lite 加速。不过目前在大多数Android 手机上,TF Lite 还是运行在CPU 上的。
3.简介
Lite 版本 TensorFlow 是 TensorFlow Mobile 的一个延伸版本。
TensorFlow Lite应该被视为TensorFlow Mobile的升级版。
TensorFlow Lite是TensorFlow针对移动和嵌入式设备的轻量级解决方案。它使设备上的机器学习预测具有低延迟和小的二进制大小。 TensorFlow Lite还支持硬件加速Android神经 网络API。
TensorFlow Lite 目前仍处于“积极开发”状态,目前仅有少量预训练AI模型面世,比如MobileNet、用于计算机视觉物体识别的Inception v3、用于自然语言处理的Smart Reply,当然,TensorFlow Lite上也可以部署用自己的数据集定制化训练的模型。
TensorFlow Lite可以与Android 8.1中发布的神经网络API完美配合,即便在没有硬件加速时也能调用CPU处理,确保模型在不同设备上的运行。 而Android端版本演进的控制权是掌握在谷歌手中的,从长期看,TensorFlow Lite会得到Android系统层面上的支持。质量有保证。根据以往谷歌对开源项目支持力度看,TFLite的功能迭代演进会很快,大量的bug会在第一时间修复。
4.必要性
TensorFlow Lite 是一个为移动和嵌入式设备打造的轻量级、跨平台解决方案 。
这样一个轻量级的解决方案很有必要,因为机器学习越来越多地转移到终端设备,如手机、汽车、可穿戴设备等。在这样的设备上使用 ML 有很多限制,如有限的计算能力、有限的内存、电池限制等,TensorFlow Lite 可以很大程度上解决这些限制。
TensorFlow 生成的模型是无法直接给移动端使用的,需要离线转换成.tflite文件格式。
tflite 存储格式是 flatbuffers。
FlatBuffers 是由Google开源的一个免费软件库,用于实现序列化格式。它类似于Protocol Buffers、Thrift、Apache Avro。
如果没有模型的话,需要自己训练保存成pb文件,再转换成tflite 格式)
Tensor Flow Lite的使用案例:
有道云笔记:
文档识别的定义
5.Tensor Flow Lite的优点
TensorFlow Lite 是用于手机以及嵌入式设备上,部署机器学习应用的框架。之所以选择在端上部署,主要的考虑体现在以下三点:
第一:几乎没有延迟,可以提供稳定、及时的用户体验;
第二:不需要连接网络,可以在没有网络或者是网络很差的环境中使用;
第三:隐私保护,不会把数据传到云端,所有的处理能够在端上进行。
6.组件
其组件包括:
TensorFlow 模型(TensorFlow Model):保存在磁盘中的训练模型。
TensorFlow Lite 转化器(TensorFlow Lite Converter):将模型转换成 TensorFlow Lite 文件格式的项目。
TensorFlow Lite 模型文件(TensorFlow Lite Model File):基于 FlatBuffers,适配最大速度和最小规模的模型。
目前 TFLite 只提供了推理功能,需在PC上进行训练得到模型。
五:模型
1.模型的获取
A.使用Google提供的预训练模型
https://www.tensorflow.org/lite/models
B.来自其他来源的模型
您还可以在许多其他地方得到预训练的 TensorFlow 模型,包括 TensorFlow Hub。在大多数情况下,这些模型不会以 TensorFlow Lite 格式提供,您必须在使用前转换(convert)这些模型。
C.重新训练模型(迁移学习)
迁移学习(transfer learning)允许您采用训练好的模型并重新(re-train)训练,以执行其他任务。例如,一个图像分类模型可以重新训练以识别新的图像类别。与从头开始训练模型相比,重新训练花费的时间更少,所需的数据更少。
您可以使用迁移学习,根据您的应用程序定制预训练模型。在用 TensorFlow 识别花朵的 codelab 中,您可以学习如何进行迁移学习。
D.训练自定义模型
如果您设计并训练了您自己的 TensorFlow 模型,或者您训练了从其他来源得到的模型,在使用前,您需要将此模型转换成 TensorFlow Lite 的格式。
2.训练好的模型
Tensor Flow Lite 提供了有限的预训练人工智能模型,包括Mobile Net 和InceptionV3 物体识别计算机模型,以及Smart Replay 自然语言处理模型。开发者用自己的数据集做的定制模型也可以在上面部署。Tensor Flow Lite 使用Android 神经网络应用程序界面(API),可以在没有加速硬件时直接调用CPU 来处理,确保其可以兼容不同设备
Mobile Net:一类视觉模型,能够识别1000个不同的对象类别,专门为移动和嵌入式设备上的高效执行而设计。
Inception v3:图像识别模型,功能与Mobile Net类似,提供更高的准确性,但更大。
Smart Reply:一种设备上的会话模型,可以对流入的对话聊天消息进行一键式回复。第一方和第三方消息传递应用在Android Wear上使用此功能。
MobileNet v1(224 x 224)图像分类
( 专为移动和嵌入式视觉应用而设计的图像分类模型 )
下载地址:https://ai.googleblog.com/2017/06/mobilenets-open-source-models-for.html
用于姿势估计的 PoseNet
( 估计图像或视频中人物姿势的视觉模型 )
下载地址:https://github.com/tensorflow/tfjs-models/tree/master/posenet
DeepLab 分割(257 x 257)
( 图像分割模型,为输入图像中的每个像素分配语义标签,例如,狗,猫,汽车 )
下载地址:https://ai.googleblog.com/2018/03/semantic-image-segmentation-with.html
MobileNet SSD 对象检测
( 检测带有边框的多个对象的图像分类模型 )
下载地址:https://ai.googleblog.com/2018/07/accelerated-training-and-inference-with.html
google提供的模型:
https://ai.googleblog.com/2017/06/mobilenets-open-source-models-for.html
六:模型转换
1.转换工具:
转换工具有两种:命令行工具和 Python API
不是所有的 TensorFlow 模型都能在 TensorFlow Lite 中运行,因为解释器(interpreter)只支持部分(a limited subset)TensorFlow 运算符(operations)
TensorFlow Lite 提供了转换 TensorFlow 模型,并在移动端(mobile)、嵌入式(embeded)和物联网(IoT)设备上运行 TensorFlow 模型所需的所有工具。
在大多数情况下,这些模型不会以 TensorFlow Lite 格式提供,您必须在使用前转换(convert)这些模型。
TensorFlow Lite 的设计旨在在各种设备上高效执行模型。这种高效部分源于在存储模型时,采用了一种特殊的格式。TensorFlow 模型在能被 TensorFlow Lite 使用前,必须转换成这种格式。
转换模型减小了模型文件大小,并引入了不影响准确性(accuracy)的优化措施(optimizations)。开发人员可以在进行一些取舍的情况下,选择进一步减小模型文件大小,并提高执行速度。您可以使用 TensorFlow Lite 转换器(converter)选择要执行的优化措施。
因为 TensorFlow Lite 支持部分 TensorFlow 运算符(operations),所以并非所有模型都能转换
2.TensorFlow Lite 转换器
TensorFlow Lite 转换器(converter)是一个将训练好的 TensorFlow 模型转换成 TensorFlow Lite 格式的工具。它还能引入优化措施(optimizations)
转换器以 Python API 的形式提供。下面的例子说明了将一个 TensorFlow SavedModel 转换成 TensorFlow Lite 格式的过程:
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
您可以用类似的方法转换 TensorFlow 2.0 模型
虽然也能从命令行使用转换器,但是推荐用 Python API 进行转换。
选项
转换器可以从各种输入类型转换模型。
当转换 TensorFlow 1.x 模型时,这些输入类型有:
Frozen GraphDef (通过 freeze_graph.py 生成的模型)
Keras HDF5 模型
从 tf.Session 得到的模型
当转换 TensorFlow 2.x 模型时,这些输入类型有:
3. 兼容性
TensorFlow Lite 当前支持一部分(limited subset) TensorFlow 运算符(operations)。长期目标是将来能支持全部的 TensorFlow 运算符。
如果您期望转换的模型中含有不受支持的运算符,您可以使用 TensorFlow Select 包含来自 TensorFlow 的运算符。这会使得部署到设备上的二进制文件更大。
4.GPU 加速和委托
一些设备为机器学习运算符提供硬件加速(hardware acceleration)。例如,大多数手机有 GPU,这些 GPU 可以比 CPU 执行更快的浮点矩阵运算(floating point matrix operations)。
速度提升(speed-up)能有显著(substantial)效果。例如,当使用 GPU 加速时,MobileNet v1 图像分类模型在 Pixel 3 手机上的运行速度提高了 5.5 倍。
TensorFlow Lite 解释器可以配置委托(Delegates)以在不同设备上使用硬件加速。GPU 委托(GPU Delegates)允许解释器在设备的 GPU 上运行适当的运算符。
Android 和 iOS
TensorFlow Lite 解释器很容易在两个主要移动平台上使用。
要获得所需的库(libraries),Android 开发人员应该使用 TensorFlow Lite AAR。iOS 开发人员应该使用 CocoaPods for Swift or Objective-C。
Linux
嵌入式 Linux 是一个部署机器学习的重要平台。我们为 Raspberry Pi 和基于 Arm64 的主板,如 Odroid C2、Pine64 和 NanoPi,提供了构建说明。
微控制器
TensorFlow Lite 微控制器(Microcontrollers)版是一个 TensorFlow Lite 的实验端口,该端口针对只有几千字节(kilobytes)内存(memory)的微控制器和其他设备。
七. 优化您的模型
TensorFlow Lite 提供了优化模型大小(size)和性能(performance)的工具,通常对准确性(accuracy)影响甚微。优化模型可能需要稍微复杂的训练(training),转换(conversion)或集成(integration)。
机器学习优化是一个不断发展的领域,TensorFlow Lite 的模型优化工具包(Model Optimization Toolkit)随着新技术的发展而不断发展。
性能
模型优化的目标是在给定设备上,实现性能(performance)、模型大小(model size)和准确性(accuracy)的理想平衡。 性能最佳实践(Performance best practices)可以帮助指导您完成这个过程。
量化
通过降低模型中数值(values)和运算符(operations)的精度(precision),量化(quantization)可以减小模型的大小和推理所需的时间。对很多模型,只有极小的准确性(accuracy)损失。
TensorFlow Lite 转换器让量化 TensorFlow 模型变得简单。下面的 Python 代码量化了一个 SavedModel 并将其保存在硬盘中:
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
tflite_quant_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_quantized_model)
要了解有关量化的更多信息,请参阅训练后量化(Post-training quantization)。
模型优化工具包
模型优化工具包(Model Optimization Toolkit)是一套工具和技术,旨在使开发人员可以轻松优化它们的模型。虽然其中的许多技术可以应用于所有 TensorFlow 模型,并非特定于 TensorFlow Lite,但在资源有限的设备上进行推理(inference)时,它们特别有价值。
八:TensorFlow Lite在Android上的应用
1.环境要求:
Android Studio 3.2 (installed on a Linux, Mac or Windows machine)
Android device in developer mode with USB debugging enabled
USB cable (to connect Android device to your computer)
Target SDK Version 26
NDK Version 14
2.需要训练好的模型
在google上下载的模型:
一共两个文件:
1.txt文件:里面包含了训练的标签类型,即物品名称
2.tflite文件:是我们要使用的模型文件
3.代码上的修改
声明依赖
android {
aaptOptions {
noCompress "tflite" // 编译apk时,不压缩tflite文件
}
}
dependencies {
implementation 'org.tensorflow:tensorflow-lite:1.14.0'
}
其中,
aaptOptions 设置 tflite 文件不压缩,确保后面 tflite 文件可以被 Interpreter 正确加载。
org.tensorflow:tensorflow-lite 的最新版本号可以在这里查询 https://bintray.com/google/tensorflow/tensorflow-lite
设置好后,sync 和 build 整个工程,如果 build 成功说明,配置成功。引入解释器
然后,在你的代码中需要引入解释器:
import org.tensorflow.lite.Interpreter;
解释器可以装载和运行模型,你可以定义输入,运行 TensorFlow Lite,然后得到输出结果。
使用 App Assets 来加载模型
App assets 是存储模型的好地方,你的程序代码会从这里载入模型。虽然你可以从任何地方来完成,但是我们更推荐你用这种方式。
在台式机上设计、训练出目标模型,并将其转化成 TensorFlow Lite 的格式。接着,此格式文件在 TensorFlow Lite 中会被内置了 Neon 指令集的解析器加载到内存,并执行相应的计算。由于 TensorFlow Lite 对硬件加速接口良好的支持,开发者可以设计出性能更优的 App 供用户使用。
九:Tensor Flow 在github上的官方例子
感谢大佬们的分享!!!
参考大佬的博客:
https://www.jianshu.com/p/834bf90036c3
https://www.jianshu.com/p/9db330540a9f
https://www.jianshu.com/p/40ad065c8cc7
https://www.jianshu.com/p/e96f80c80e43
https://zhuanlan.zhihu.com/p/52619032
https://blog.csdn.net/u012328159/article/details/81101074
https://www.jianshu.com/p/4271c5efd92c
https://blog.csdn.net/qinchao315/article/details/88780845
https://blog.csdn.net/qq_33200967/article/details/82773677