作为一名多年移动端应用开发人员,我觉得移动端深度学习会是一个大机会。原因有:响应更快(不需要网络通信延迟),可以实时处理视频(实时上传和处理视频不够快),对开发者更便宜(不需要租用服务器),节省流量(不需要上传数据)。随着近年来机器学习模型的广泛使用,出现了大量在移动和嵌入式设备上部署它们的需求。
一、引言
尽管移动端的深度学习框架不少,如 Tensorflow Lite、Caffe、CoreML、NCNN(腾讯)、MDL(百度)等,但现在市场上占大头的还是 Google 的 Tensorflow Lite。
2018年 5 月,Google 在 I/O 大会上宣布推出 TensorFlow Lite,TensorFlow Lite 是 TensorFlow 针对移动和嵌入式设备的轻量级解决方案。TensorFlow Lite 是一种用于设备端推断的开源深度学习框架,它使设备上的机器学习预测具有低延迟和小的二进制大小;它是一组工具,可帮助开发者在移动设备、嵌入式设备和 IoT 设备上运行 TensorFlow 模型。它支持设备端机器学习推断,延迟较低,并且二进制文件很小。。因此我们可以利用它进行分类,回归或获取想要的任何东西,而无需与服务器交互。
TensorFlow Lite 包括两个主要组件:
- TensorFlow Lite 解释器,它可在手机、嵌入式 Linux 设备和微控制器等很多不同类型的硬件上运行经过专门优化的模型
- TensorFlow Lite 转换器,它可将 TensorFlow 模型转换为高效形式以供解释器使用,并可引入优化以减小二进制文件的大小和提高性能
TensorFlow Lite 允许设备端的机器学习模型的低延迟推断。设计初衷:
- 轻量级:允许小 binary size 和快速初始化/启动的设备端机器学习模型进行推断
- 跨平台:运行时的设计使其可以在不同的平台上运行,最先允许的平台是 Android 和 iOS
- 快速:专为移动设备进行优化,包括大幅提升模型加载时间,支持硬件加速
现在,越来越多移动设备内置了专门的自定义硬件以高效处理机器学习工作负载。TensorFlow Lite 支持 Android 神经网络 API,以充分利用新的可用加速器。当加速器硬件不可用时,TensorFlow Lite 返回至经优化的 CPU 执行操作,确保模型仍然可在大量设备上快速运行。
二、TensorFlow Lite 介绍
入手 TensorFlow Lite,首先要了解预训练模型,然后在真实设备上运行以下示例应用,再深入了解 TensorFlow Lite 的功能。
2.1 模型
虽然 TensorFlow Lite 还不能自已训练模型,但 TensorFlow Lite 已经支持多个面向移动端训练和优化的模型:
MobileNet:一种能够识别超过 1000 种不同物体的视觉模型,专为移动端和嵌入式设备设计
Inception V3:一种图像识别模型,功能上类似于 MobileNet,但能提供更高的准确率(当然模型也更大)
Smart Reply:一种设备端对话模型,能对接收到的会话聊天信息提供触发性应答。第一方和第三方通信 APP 可在 Android Wear 上使用该特性
Inception v3 和 MobileNet 都在 ImageNet 数据集上训练过,可以通过迁移学习轻松地在自己的图像数据集上重新训练这些模型。
针对常见移动和边缘用例的优化模型,采用先进的优化研究模型,并轻松地将这些模型部署到移动设备和边缘设备上。
图像分类
预测图像类别的任务被称为 图像分类。训练图像分类模型的目的是识别各类图像。比如,一个模型可能被训练用于识别三种动物的特征:兔子、仓鼠和狗。使用优化的预训练模型来识别上百种对象,包括人、活动、动物、植物和地点。
物体检测
对于给定的图片或者视频流,对象检测模块可以识别出已知的物体和该物体在图片中的位置。使用矩形框识别图片中的多个对象。可以辨别出 80 多种不同种类的物体。
物体检测模块被训练用于检测多种物体的存在以及他们的位置。例如,模型可使用包含多个水果的图片和水果所分别代表(如,苹果,香蕉,草莓)的 label 进行训练,返回的数据指明了图像中对象所出现的位置。
随后,当我们为模型提供图片,模型将会返回一个列表,其中包含检测到的对象,包含对象矩形框的坐标和代表检测可信度的分数。
姿势预测
PoseNet 能够通过预测图像或视频中人体的关键位置进行姿势的预测。姿势检测通过使用计算机图形技术来对图片和视频中的人进行检测和判断,如图片中的人露出了肘臂。
为了达到清晰的目的,该算法只是对图像中的人简单的预测身体关键位置所在,而不会去辨别此人是谁。
智能回复
智能回复模型基于聊天消息生成回复建议。该建议是主要是依据上下文的相关内容,一触即发的响应帮助用户轻松回复传入的消息。
该模型为会话聊天消息生成回复建议。可以带来以下优势:
- 运行快速:该模型内置在设备中和无需网络连接。因此,模型推理快速,同时平均延迟只有几毫秒
- 资源高效:该模型在设备中占用的内存很小
- 隐私保护:用户数据从不离开设备
分割
是用于语义图像分割的最先进的深度学习模型,其目标是为图像中的每个像素分配语义标签(例如人,狗,猫)。
风格迁移
即基于两个输入图像创建新图像(称为模仿)的能力:一个代表艺术风格,一个代表内容。
文字分类
使用预先训练的模型将段落分类为预定义的组。
问题和答案
使用预先训练的模型根据给定段落的内容回答问题。该模型可用于构建可以用自然语言回答用户问题的系统。
2.2 面向移动开发者
如果是一位在机器学习和 TensorFlow 方面没有太多经验的移动开发者,可以先学习如何训练模型并使用 TensorFlow Lite Model Maker 将模型部署到移动应用中。
组件包括
- TensorFlow 模型(TensorFlow Model):训练后的 TensorFlow 模型,保存在磁盘中
- TensorFlow Lite 转换器(TensorFlow Lite Converter):该程序将模型转换成 TensorFlow Lite 文件格式
- TensorFlow Lite 模型文件(TensorFlow Lite Model File):该格式基于 FlatBuffers,经过优化以适应最大速度和最小规模
然后将 TensorFlow Lite 模型文件部署到移动 APP 中:
- Java API:安卓设备上适用于 C++ API 的便利封装
- C++ API:加载 TensorFlow Lite 模型文件,启动编译器。Android 和 iOS 设备上均有同样的库
- 编译器(Interpreter):使用运算符执行模型。解释器支持选择性加载运算符;没有运算符时,编译器只有 70 KB,加载所有运算符后,编译器为 300 KB。这比 TensorFlow Mobile(具备一整套运算符)的 1.5 M 要小得多
在选择的 Android 设备上,编译器将使用 Android 神经网络 API(API >=27) 进行硬件加速,或者在无可用 API 的情况下默认执行 CPU。开发者还使用 C++ API 实现自定义 kernel,它可被解释器使用。
2.3 面向模型创建者
如果已经熟悉 TensorFlow 并且希望将模型部署到边缘设备,那么可以开始了解如何将 TensorFlow 模型转换为 TensorFlow Lite 格式,并针对设备端推断进行优化。
识别手写数字
使用 TensorFlow Lite 构建手写数字分类器应用。介绍如何转换和优化用于设备端推断的 Tensorflow 模型,然后将其部署到 APP 应用。
图像分类的迁移学习
了解如何使用 Tensorflow lite Model Maker 快速创建图像分类模型。
2.4 面向 IoT 开发者
如果想将 TensorFlow 模型部署到资源非常有限的微控制器,可以开始从开发 TensorFlow 模型到转换为 TensorFlow Lite 格式,以及使用 TensorFlow Lite Micro 部署到微控制器的端到端工作流程。
检测启动指令
试练可以检测简单启动指令的超小语音模型。
手势识别
训练一个能够根据加速度计数识别不同手势的模型。此应用程序使用实时相机并立即对图像进行分类。TensorFlow Lite 应用程序比使用 TensorFlow Mobile 制作的应用程序更小、更快、更准确,因为 TensorFlow Lite 专门用于在移动平台上运行神经网络。将使用 MobileNet 模型来训练我们的网络,这将使应用程序更小。
三、使用 TensorFlow Lite
TensorFlow Lite 提供了转换 TensorFlow 模型,并在移动端(mobile)、嵌入式(embeded)和物联网(IoT)设备上运行 TensorFlow 模型所需的所有工具。以下指南介绍了开发工作流程的每个步骤。选择模型 -> 转换模型 -> 部署到设备 -> 优化模型 。
3.1 选择一个模型
TensorFlow Lite 允许您在多种设备上运行 TensorFlow 模型。TensorFlow 模型是一种数据结构,这种数据结构包含了在解决一个特定问题时,训练得到的机器学习网络的逻辑和知识。
有多种方式可以获得 TensorFlow 模型,从使用预训练模型(pre-trained models)到训练自己的模型。为了在 TensorFlow Lite 中使用模型,模型必须转换成一种特殊格式。
Note: 不是所有的 TensorFlow 模型都能在 TensorFlow Lite 中运行,因为解释器(interpreter)只支持部分(a limited subset)TensorFlow 运算符(operations)。
使用预训练模型
TensorFlow Lite 团队提供了一系列预训练模型(pre-trained models),用于解决各种机器学习问题。这些模型已经转换为能与 TensorFlow Lite 一起使用,且可以在应用程序中使用的模型。
这些预训练模型包括:
- 图像分类(Image classification)
- 物体检测(Object detection)
- 智能回复(Smart reply)
- 姿态估计(Pose estimation)
- 语义分割(Segmentation)
在模型列表(Models)中查看预训练模型的完整列表。
来自其他来源的模型
还可以在许多其他地方得到预训练的 TensorFlow 模型,包括 TensorFlow Hub。在大多数情况下,这些模型不会以 TensorFlow Lite 格式提供,您必须在使用前转换(convert)这些模型。
重新训练模型(迁移学习)
迁移学习(transfer learning)允许您采用训练好的模型并重新(re-train)训练,以执行其他任务。例如,一个图像分类模型可以重新训练以识别新的图像类别。与从头开始训练模型相比,重新训练花费的时间更少,所需的数据更少。
可以使用迁移学习,根据您的应用程序定制预训练模型。在用 TensorFlow 识别花朵的 codelab 中,您可以学习如何进行迁移学习。
训练自定义模型
如果设计并训练了自己的 TensorFlow 模型,或者训练了从其他来源得到的模型,在使用前,您需要将此模型转换成 TensorFlow Lite 的格式。
3.2 转换模型
TensorFlow Lite 的设计旨在在各种设备上高效执行模型。这种高效部分源于在存储模型时,采用了一种特殊的格式。TensorFlow 模型在能被 TensorFlow Lite 使用前,必须转换成这种格式。
转换模型减小了模型文件大小,并引入了不影响准确性(accuracy)的优化措施(optimizations)。开发人员可以在进行一些取舍的情况下,选择进一步减小模型文件大小,并提高执行速度。可以使用 TensorFlow Lite 转换器(converter)选择要执行的优化措施。
因为 TensorFlow Lite 支持部分 TensorFlow 运算符(operations),所以并非所有模型都能转换。
TensorFlow Lite 转换器
TensorFlow Lite 转换器(converter)是一个将训练好的 TensorFlow 模型转换成 TensorFlow Lite 格式的工具。
转换器以 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 模型时,这些输入类型有:
- SavedModel 文件夹
- Frozen GraphDef (通过 freeze_graph.py 生成的模型)
- Keras HDF5 模型
- 从 tf.Session 得到的模型
当转换 TensorFlow 2.x 模型时,这些输入类型有:
- SavedModel 文件夹
- tf.keras 模型
- 具体函数(Concrete functions)
转换器可以配置为应用各种优化措施(optimizations),这些优化措施可以提高性能,减少文件大小。
Ops 兼容性
TensorFlow Lite 当前支持一部分(limited subset) TensorFlow 运算符(operations)。长期目标是将来能支持全部的 TensorFlow 运算符。
如果您期望转换的模型中含有不受支持的运算符,您可以使用 TensorFlow Select 包含来自 TensorFlow 的运算符。这会使得部署到设备上的二进制文件更大。
3.3 使用模型进行推理
推理(Inference) 是通过模型(model)运行数据(data)以获得预测(predictions)的过程。这个过程需要模型(model)、解释器(interpreter)和输入数据(input data)。
TensorFlow Lite 解释器
TensorFlow Lite 解释器(interpreter)是一个库(library),它接收一个模型文件(model file),执行模型文件在输入数据(input data)上定义的运算符(operations),并提供对输出(output)的访问。
该解释器(interpreter)适用于多个平台,提供了一个简单的 API,用于从 Java、Swift、Objective-C、C++ 和 Python 运行 TensorFlow Lite 模型。
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 解释器很容易在两个主要移动平台上使用。要入门,浏览 Android 快速入门 和 iOS 快速入门指南。对这两个平台,都有示例应用程序。
要获得所需的库(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 中尚未实现的 TensorFlow 运算符(operations),可以使用 TensorFlow Select 在模型中使用它们。需要构建一个包含 TensorFlow 运算符的自定义版本解释器。
可以用自定义运算符(Custom operators)编写您自己的运算符(operations),或将新运算符移植(port)到 TensorFlow Lite 中。运算符版本(Operator versions)让您能为已有的运算符添加新的功能和参数。
3.4 优化您的模型
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)损失。
模型优化工具包
模型优化工具包(Model Optimization Toolkit)是一套工具和技术,旨在使开发人员可以轻松优化它们的模型。虽然其中的许多技术可以应用于所有 TensorFlow 模型,并非特定于 TensorFlow Lite,但在资源有限的设备上进行推理(inference)时,它们特别有价值。