一、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的生态之战。理由有三:
相同点:
对于推理,训练的 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