0
本文作者: AI研习社-译站 | 2018-07-12 18:18 |
雷锋网按:本文为雷锋字幕组编译的技术博客,原标题 Deploying PyTorch and Keras Models to Android with TensorFlow Mobile ,作者为 John Olafenwa 。
翻译 | 于志鹏 整理 | MY
截止到今年,已经有超过 20 亿活跃的安卓设备。安卓手机的迅速普及很大程度上是因为各式各样的智能 app,从地图到图片编辑器应有尽有。随着深度学习的出现,我们的手机 app 将变得更加智能。下一代由深度学习驱动的手机 app 将可以学习并为你定制功能。一个很显著的例子是「Microsoft Swiftkey」,这是一个键盘 app, 能通过学习你常用的单词和词组来帮助你快速打字。
计算机视觉,自然语言处理,语音识别和语音合成等技术能够大大改善用户在移动应用方面的体验。幸运的是,在移动应用方面,有很多工具开发成可以简化深度学习模型的部署和管理。在这篇文章中,我将阐释如何用 TensorFlow mobile 将 PyTorch 和 Keras 部署到移动设备。
用 TensorFlow mobile 部署模型到安卓设备分为三个步骤:
将你的训练模式转换到 TensorFlow
在安卓应用中添加 TensorFlow mobile 作为附加功能
在你的应用中使用 TensorFlow 模式写 Java 代码执行推理。
在这篇文章中,我将介绍整个过程,最后完成一个植入图像识别功能的安卓应用
安装
本教程会用到 PyTorch 和 Keras 两个框架-遵循下列指导安装你想使用的机器学习框架。安装哪个由你选择。
首先,安装 TensorFlow:
如果你是 PyTorch 的开发者,确保你安装的是 PyTorch 的最新版本。关于安装 PyTorch 的指导文件,请查阅我之前的文章。
如果你是 Keras 的开发者,使用以下命令安装:
Android Studio(至少3.0 的版本)
https://developer.android.com/studio
将 PyTorch 模式转成 Keras 模式
这部分仅适用于 PyTorch 开发者。如果你使用的是 Keras,你可以跳到 “将 Keras 模式转成 TensorFlow 模式”章节。
首先我们要做的是将我们的 PyTorch 模式参数转成 Keras 中的同等参数。
为了简化这个过程,我创建了一个脚本来自动运行转化。在此教程中,我们将使用 Squeezenet 。这是一种很小但具备合理精确度的移动架构。在这儿下载预训练模式(只有5M!)。
在转权值之前,我们需要在 PyTorch 和 Keras 中定义 Squeezenet 模型。
如下图所示,在这两种框架下定义 Squeezenet,然后将 PyTorch 权值 转成 Keras。
创建文件 convert.py,包括下面的代码并运行脚本。
上面是已经转好权值的,你所需要做的是将 Keras 模型保存为 squeezenet.h5。到这一步,我们可以抛弃 PyTorch 模型,继续下一步了。
将 Keras 转成 TensorFlow 模式
到这一步,你已经有了 Keras 模式,无论是从 PyTorch 转化而来的还是直接用 Keras 训练而获得的。你可以在这儿下载预训练的 Keras Squeezenet 模式。下一步是将我们整个的模型架构和权值转成可运行的 TensorFlow 模型。
创建一个新文件 ConvertToTensorflow.py 并添加以下代码。
上面的代码将我们的 squeezenet.pb 保存到了 output_dir 中。并在同一文件夹中创建 了 TensorBoard 事件。
为了更加清晰地理解你的模型,你可以用 TensorBoard 将它可视化。
打开命令行并输入
tensorboard –logdir=output_dir_path
output_dir_path 是你的 output_dir 路径。
一旦 TensorBoard 成功启动,你将看到提示让你打开如下 url COMPUTER_NAME:6006
将 URL 地址输入到浏览器中,将显示以下界面。
为了可视化你的模式,双击 IMPORT.
仔细看下该模型并记下输入和输出节点的名字(框架中的第一个和最后一个)。
如果你的命名和我之前代码一样的话,他们就应该是 input_1 和output_1 。
到这一步, 我们的模型就可以调用了。
将TensorFlow Mobile 添加到你的项目中
TensorFlow 有 2 个针对移动设备的库,分别是「TensorFlow Mobile」和「TensorFlow Lite.」Lite 版本设计得非常小,所有的依赖库大约只有 1M。它的模型也更优化。另外,在安卓 8 以上的设备中,还可以用神经网络 API 加速。与「TensorFlow Mobile」不同,「TensorFlow Lite.」目前还不太完善,有些层并不能实现预期的效果。此外,windows 系统还不支持编译库和将模式转成原生格式的操作。因此,在这个教程里,我坚持用 TensorFlow Mobile.
如果没有现存项目的话,使用 Android Studio,创建一个新的安卓项目。然后添加TensorFlow Mobile 依赖库到你的build.gradle 文件。
implementation ‘org.tensorflow:tensorflow-android:+’
Android studio 将提示你同步 gradle,点击 Sync Now 等待同步完成。
到这一步项目就创建完成了。
在你的移动 App 上执行推理
在用代码执行推理前,你需要将转化的模式 (squeezenet.pb) 添加到你的应用的资源文件夹里。
在 Android Studio 中右击你的项目,鼠标移到「添加文件夹」选项,然后选择「资源文件夹」。这时会在你的 app 目录下创建一个资源文件夹。然后,拷贝你的模式到此目录下。
点击 here 下载标签类,并拷贝文件到资源目录。
现在你的项目包含了分类图像的所有工具。
添加一个新的 Java 类到你的项目的主包中,取名为 ImageUtils , 然后将以下代码拷贝到其中。
如果不理解上面的代码也没关系,这是一些未在核心 TensorFlow-Mobile 库中实现的功能。因此,在参考了一些官方样例后,我写了这些代码以方便后续工作。
在你的主活动中,创建一个 ImageView 和一个 TextView ,这将被用来显示图像和其预测结果。
在你的主活动中,你需要加载 TensorFlow-inference 库和初始化一些类变量。在你的 onCreate 方法前添加以下内容:
添加一个计算预测类的函数:
添加函数来接收Image Bitmap并在其上执行推理:
以上代码在后台线程中运行预测,并将预测的类和它的评估得分写到我们之前定义的 TextView 中。
注意在主 UI 线程运行推理时可能会挂起。记住一个原则 :“永远在你的后台线程运行推理!”
本教程的重点是图像识别,为此我在资源文件夹中添加了一只小鸟的图像。在标准应用程序中,你要用代码从文件系统加载图像。
添加任何你想做预测的图像到资源文件夹中。为了方便的运行算法,在下列的代码中,我们在一个按钮上添加了一个点击监听。该监听可以加载该图像并调用预测功能。
很好!所有步骤都已完成!双击检验一下,如果都没有问题。点击「Bulid APK.」按钮
APK很快就创建完成了,之后在设备上安装并运行App.
结果如下图所示:
为了得到更新奇的体验,你的 App 应当从安卓文件系统加载图像或用摄像头抓取图像,而不是从资源文件夹加载。
总结
移动端的深度学习框架将最终转变我们开发和使用 app 的方式。使用上述代码,你能轻松导出你训练的 PyTorch 和 Keras 模型到 TensorFlow。运用 TensorFlow Mobile 和这篇文章中介绍的步骤,你可以将卓越的 AI 功能完美的植入到你的移动端应用中。
安卓项目的完整代码和模型转换工具在我的 GitHub 上可以找到。
雷锋网雷锋网
雷峰网原创文章,未经授权禁止转载。详情见转载须知。