当前位置: 首页 > 工具软件 > lite-flow > 使用案例 >

Tensor Flow Lite调研

葛承教
2023-12-01

一、Tensor Flow Lite 简介
Tensor Flow Lite 是 Google I/O 2017大会上的推出的,是专门针对移动设备上可运行的深度网络模型简单版,目前还只是开发者预览版,未推出正式版。
1、相比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 上的。
2、Tensor Flow Lite组件
1)Tensor Flow 模型(Tensor Flow Model):保存在磁盘中的训练模型。
2)Tensor Flow Lite 转化器(Tensor Flow Lite Converter):将模型转换成 Tensor Flow Lite 文件格式的项目。
3)Tensor Flow Lite 模型文件(Tensor Flow Lite Model File):基于 Flat Buffers,适配最大速度和最小规模的模型。

3、Tensor Flow Lite过程
1)使用现有优秀的网络模型训练自己的模型
模型需要现在PC端进行训练,若要使用现有模型解决新问题,也可以考虑迁移学习。
2)模型转换成TF Lite模型文件。这一步涉及模型的固化(保存模型的参数和graph),目前主流的方法有两种。
第一种:
Step 1:在算法训练的脚本中保存图模型文件(GraphDef)和变量文件(CheckPoint)。
Step 2:利用freeze_graph工具生成frozen的graphdef文件。
Step 3:利用toco工具,生成最终的TF Lite文件。
参考:https://blog.csdn.net/sinat_34022298/article/details/81569769
备注:网上大多数资料讲的都是这种通过bazel重新编译模型生成依赖方法,但看到一些开发者实践认为这种方法难度很大,建议尝试Tensor Flow Lite官方的例子中的方法,也就是下面第二种方法。

第二种:变量转成常量之后写入PB文件,谷歌提供方法快速实现变量转换成常量的方法。
参考:https://www.jianshu.com/p/091415b114e2
实际开发时需要一些支持文件,已在Github找到,下载地址:libandroid_tensorflow_inference_java.jar、libtensorflow_inference.so。
3)在AndroidStudio进行构建
4、版本支持
Android Studio 3.0
SDK Version API25,或者API26
NDK Version 14
二、移动端深度学习SDK比较
11月14日,谷歌终于开源了业界期待已久的移动版Tensor Flow — Tensor Flow Lite(Github传送门)。谷歌很可能凭借这款利器赢得移动端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系统都支持。
    不同点:
  5. MDL和NCNN均是只支持Caffe框架生成的模型文件,而TF Lite则毫无意外的只支持自家大哥Tensor Flow框架生成的模型文件。
  6. MDL支持利用iOS系统的Matal框架进行GPU加速,能够显著提升在iPhone上的运行速度,达到准实时的效果。而NCNN和TF Lite还没有这个功能。
    三、Tensor Flow Lite 应用
    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上使用此功能。
    1、 Smart Reply(智能回复)
    摘自谷歌发布会原文
    谷歌推出了 Android Wear 2.0,这是“设备上”(on-device)机器学习技术用于智能通讯的第一款产品。这使得基于云的技术,例如智能回复(Smart Reply),以前在 Gmail、Inbox 和 Allo 中提供,现在在任何应用中都可以直接使用,包括第三方的消息应用,而无需连接到云端。也就是说,我们可以直接在智能手表上对收到的聊天信息作出回复。
    谷歌发布了一个基于Tensor Flow Lite驱动的自然语言应用程序的示例,即设备上会话模型(on-device conversational model)和一个用于 demo 的 app,以便让开发人员和研究人员更容易地构建基于设备上推理(on-device inference)的新机器智能特征。这个模型能够在输入会话聊天信息时生成回复建议,通过有效的推理,可以很容易地插入到聊天应用程序中,从而为设备上会话智能提供动力。
    谷歌发布的设备上会话模型使用了一种新的ML架构,用于训练紧凑的神经网络(以及其他机器学习模型),它基于一个联合优化的框架,最初是在 ProjectionNet 的论文中提出的(参考论文:ProjectionNet: Learning Efficient On-Device Deep Networks Using Neural Projections)。这个架构可以在具有有限计算能力和内存的移动设备上高效地运行,通过使用有效的“投影”(projection)操作,将任何输入转换为紧凑的位向量(bit vector)表示——类似的输入被投影到邻近的向量上,这些向量或密集,或稀疏,取决于投影的类型。例如,“嘿,你好吗?”(hey, how’s it going?)”和“老兄,最近怎么样?”(How’s it going buddy?),这两个消息可能被投影到相同的向量表示。
    在这个想法下,会话模型在低计算力和内存占用的情况下将这些操作高效地结合起来。谷歌使用一个ML框架对这个设备上的模型进行了端到端的训练,这个框架联合训练两种类型的模型——一个紧凑的 projection 模型(如前文所述)和一个 trainer 模型。这两个模型采用联合的方式进行训练, projection 模型从 trainer 模型中学习—— trainer 具有专家的特征,并且使用更大、更复杂的ML架构进行建模,而projection 模型就像一个从专家那里学习的学生。在训练过程中,还可以利用量化(quantization) 或“蒸馏”(distillation)等其他技术,从而进一步压缩或选择性地优化目标函数的某些部分。训练完毕后,较小的 projection 模型就可以直接用于设备上的推理。

对于推理,训练的 projection 模型被编译成一组 Tensor Flow Lite 操作,这些操作经过优化,可以在移动平台上快速执行,并直接在设备上执行。下图是用于设备上会话模型的 Tensor Flow Lite 推理图。

设备上会话模型的 Tensor Flow Lite 执行
2、文档识别(有道云笔记)
文档识别最初是开发有道云笔记的文档扫描功能时面对的一个问题。文档扫描功能希望能在用户拍摄的照片中,识别出文档所在的区域,进行拉伸 (比例还原),识别出其中的文字,最终得到一张干净的图片或是一篇带有格式的文字版笔记。实现这个功能需要以下这些步骤:
1)识别文档区域: 将文档从背景中找出来,确定文档的四个角;
2)拉伸文档区域,还原宽高比: 根据文档四个角的坐标,根据透视原理,计算出文档原始宽高比,并将文档区域拉伸还原成矩形;
3)色彩增强: 根据文档的类型,选择不同的色彩增强方法,将文档图片的色彩变得干净清洁;
4)布局识别: 理解文档图片的布局,找出文档的文字部分;
5)OCR: 将图片形式的“文字”识别成可编码的文字;
6)生成笔记: 根据文档图片的布局,从 OCR 的结果中生成带有格式的笔记。
文档识别算法基于 FCNN (Fully Convolutional Neural Network) ,这是一种特别的 CNN(卷积神经网络),其特点是对于输入图片的每一个像素点,都对应着一个输出(相对的,普通的 CNN 网络则是每一张输入图片对应着一个输出)。因此,我们可以标记一批包含文档的图片,将图片中文档边缘附近的像素标注为正样本,其他部分标注为副样本。训练时,以图片作为 FCNN 的输入,将输出值与标注值作对比得到训练惩罚,从而进行训练。
算法具体参考:https://mp.weixin.qq.com/s?__biz=MzIxMDg0NTgwNA==&mid=2247483651&idx=1&sn=c3d4c5a8fb3e173ef1d433f665bdac35&chksm=975f2800a028a116b88b7a72199ecbfce63375dbb90746a34e153ff399c2c47769b2f00a4722&scene=21&pass_ticket=fhdTLb3VGiB9e2giJGM5NZ6xLcGmGxJQMrpGVZOEGw6cn56iMjsEm1X3DdOWkYLs#wechat_redirect

有道云笔记中的文档识别功能是基于移动端 Tensor Flow 库 (Tensor Flow Mobile) 的,因此可以迁移至Tensor Flow Lite,减少链接库的体积。
TF Lite 目前仅提供有限的算子,主要以 CNN 中使用到的算子为主,如卷积、池化等。有道云笔记文档识别模型是全卷积神经网络,大部分算子 TF Lite 都有提供,但 conv2d_transpose(反向卷积)算子并没有被提供。不过该算子出现在网络模型的末端,因此可将反向卷积之前的计算结果取出,用 c++ 实现一个反向卷积,从而计算出最终的结果。由于反向卷积的运算量并不大,所以基本没有影响到运行速度。
如果模型需要但 TF Lite 缺少的算子并非出现在网络的末端,这时可以自定义一个 TF Lite 算子,将其注册在 TF Lite 的 kernels 列表中,这样编译得到的 TF Lite 库就可以处理该算子了。同时,在模型转换时,还需要加上 --allow_custom_ops 选项,将 TF Lite 默认不支持的算子也保留在模型中。
3、 kika输入法
移动端的解决方案如 TensorFlow Mobile、TensorFlow Lite 等在一定程度上并不完善(TF Mobile 的内存管理与 TF Lite 的 Operators 的缺失),在实践中可能需要更多的修正与完善。
kika输入法成功地将基于循环神经网络的深度学习模型应用到安卓版的手机输入法引擎中,在克服工程化问题的情况下大大提升了输入体验:不仅使基于上下文的词预测更加准确,同时还使得词纠错功能更加强大。
可以参考这个案例中Android 移动端轻量化部署所遇到的工程化挑战极其解决方法,为后期实践做准备。

算法和实践原文参考:https://baijiahao.baidu.com/s?id=1598247649132552549&wfr=spider&for=pc

 类似资料: