如何将模型部署到安卓移动端,这里有一份简单教程

android studio 教程 | 2018-07-22 02:57

本文介绍了如何利用 TensorFlow Mobile 将 PyTorch 和 Keras 模型部署到安卓移动端。

截至 2018 年,全球活跃的安卓设备已经超过了 20 亿部。安卓手机的迅速普及在很大程度上得益于各种各样的智能应用,从地图到图片编辑器无所不有。随着深度学习技术的兴起,移动应用注定会变得更加智能。深度学习加持下的下一代移动应用将专门为你学习和定制功能。微软的「SwiftKey」就是一个很好的例子,它能够通过学习你常用的单词和短语来帮助你更快地打字。

计算机视觉、自然语言处理、语音识别以及语音合成等技术可以极大地提高移动应用程序各个方面的用户体验。幸运的是,人们现在已经开发出了大量工具,用于简化在移动应用中部署和管理深度学习模型的过程。在本文中,作者将向大家介绍如何使用 TensorFlow Mobile 将 Pytorch 和 Keras 模型部署到移动设备上。

使用 TensorFlow Mobile 将模型部署到安卓设备上包括三个步骤:

将训练好的模型转换成 TensorFlow 格式;

编写相关的 Java 代码,在你的应用中使用 TensorFlow 模型执行推断。

在本文中,我将带你熟悉以上的整个流程,最终完成一个嵌入图像识别功能的安卓应用。

环境设置

在本教程中,我们将使用 Pytorch 和 Keras,选择你偏好的机器学习框架,并按照说明进行操作。因此,你的环境设置取决于你选择的框架。

第一步,安装 TensorFlow:

pip3 install tensorflow

如果你是 PyTorch 开发者,请确保你已经安装了最新版本的 PyTorch。关于安装 PyTorch 的说明,请查阅我早前编写的这篇文章(-of-image-classification-with-pytorch-2f8973c51864)。

如果你是一名 Keras 开发者,你可以使用下面的命令安装相关开发环境:

pip3 install keraspip3 install h5py

Android Studio(精简版 3.0)

将 PyTorch 模型转换为 Keras 模型

本节仅针对于 PyTorch 开发者。如果你使用的是 Keras 框架,你可以直接跳到「将 Keras 模型转换为 TensorFlow 模型」这一节。

我们需要做的第一件事就是将 PyTorch 模型的参数转化为其在 Keras 框架下等价的参数。为了简化这个过程,我编写了一个脚本来自动化地进行这个转换工作。在这篇教程中,我将使用 Squeezenet,这是一种准确率还不错且规模非常小的移动架构。你可以通过这个链接下载预训练好的模型(大小仅仅只有 5mb!):-f364aa15.pth。

在转换权重之前,我们需要在 PyTorch 和 Keras 中定义 Squeezenet 模型。

在两个框架中都定义 Squeezenet,然后使用下面的方法将 PyTorch 框架的权重迁移到 Keras 框架中。

创建一个 convert.py 文件,引入下面的代码,并且运行脚本。

在完成了上述权重转换工作后,你现在只需将 Keras 模型保存为 squeezenet.h5。此时,我们可以将 PyTorch 模型抛在脑后,继续进行我们的下一步工作。

将 Keras 模型转化为 TensorFlow 模型

此时,你已经有了一个从 PyTorch 模型转换而来的 Keras 模型,或者直接使用 Keras 训练得到的模型。你可以通过这里的链接()下载预训练好的 Keras Squeezenet 模型。下一步,将整个模型架构和权重转换成一个可用于实际生产的 TensorFlow 模型。

创建一个新的 ConvertToTensorflow.py 文件,添加以下代码。

上述代码将 squeezenet.pb 保存到了我们的 output_dir 文件夹中。它还在同一个文件夹中创建了 TensorBoard 事件文件。

为了对模型有一个更清晰的理解,你可以在 TensorBoard 中对其可视化。

你需要打开命令提示符,输入:

tensorboard –logdir=output_dir_pathoutput_dir_path 即 output_dir 的路径。

当你成功启动 TensorBoard 后,你将看到下面的对话框,请求你打开 COMPUTER_NAME:6006 的 url 链接。

在你最喜欢的浏览器中输入 URL 地址,会显示出下图所示的界面。

请双击 IMPORT 来可视化你的模型。

仔细查看模型,并且请注意输入和输出节点的名字(架构中的第一个和最后一个节点)。

如果你像我在前面的代码中那样命名你的网络层,那么它们的名称应该分别是 input_1 和 output_1。

至此,我们的模型已经完全准备就绪,可以进行部署了。

将 TensorFLow Mobile 添加到你的项目中

TensorFlow 有两个移动程序库——「TensorFlow Mobile」和「TensorFlow Lite」。Lite 版本是为极小规模的模型设计的,整个依赖项仅占用大约 1Mb 的空间。Lite 中的模型也经过了更好的优化。最近,在安卓 8 及更高版本中,TensorFlow Lite 使用安卓神经网络 API 进行加速。然而,与「TensorFlow Mobile」不同,Lite 并不能直接用于生产,因为其中一些层的表现可能没有如预期一样好。此外,Windows 系统至今还不支持对 Lite 库的编译,以及将其模型转换为本地格式。因此,在这篇教程中,我坚持使用 TensorFlow Mobile。

接下来,如果你没有现有的安卓项目,请在 Android Studio 中创建一个。在你的 build.gradle 文件中添加 TensorFlow Mobile 依赖。

implementation ‘org.tensorflow:tensorflow-android:+’

Android Studio 将向你提示同步 gradle(一种项目自动化构建开源工具)。点击 Sync Now,等待同步完成。

此时,你的环境就已经完全设置好了。

在移动 app 中执行推断

在编写代码进行实际推断之前,你需要将转换后的模型(squeezenet.pb)添加到应用程序的资源文件夹中。在 Android Studio 中,右键点击你的项目,跳转至「Add Folder」(添加文件夹)部分,并选择「Assets Folder」(资源文件夹)。这将在你的应用程序目录中创建一个资源文件夹。接下来,你需要将模型复制到资源文件夹中。

你可以通过这个链接(-Keras-ToAndroid/raw/master/android-sample/app/src/main/assets/labels.json)下载类标签,并且将文件复制到资源文件夹中。

现在你的项目已经包含了进行图像分类所需的一切。

将一个新的 Java 类添加到项目的主程序包中,并将其命名为 ImageUtils,把下面的代码复制到其中。

如果你并不理解上面的大部分代码,那也没事——这是 TensorFlow Mobile 核心库中没有实现的两个标准函数。因此,借助官方示例的帮助,我写下了它们,以方便后续操作的便捷进行。

在你的主活动(main activity)中创建 ImageView 和 TextView。它们将被用于显示图像和预测结果。

在主活动中,你需要加载 TensorFlow-inference 库,并且初始化一些类变量。在 onCreat 方法前添加以下内容:

添加一个计算预测类的函数:

添加接收图像位图并对其进行推断的函数:

上述代码在后台线程中执行预测工作,并且将预测出的类和它的置信度写入我们之前定义的 TextView 文件中。

请注意,在主用户界面(UI)线程上执行推断可能会挂起应用程序。一般而言,我们总是在后台线程执行推断工作。

为了将本教程的重点放在图像识别的主题上,我简单地使用了一张添加到资源文件夹中的鸟的图像。在标准应用程序中,你应该编写代码从文件系统中加载图片。

你可以向资源文件夹添加任何你想要预测的图像。为了进行一次真实的预测,在下面的代码中,我们为一个按钮添加了一个点击事件的监听器。这个监听器仅仅加载图片并且调用预测函数。

现在,我们大功告成了!再仔细检查一遍,以确保你正确地完成了每一步。如果一切正常,请点击「Build APK」(构建安卓安装包)。

稍等片刻,你的安装包就构建好了。你可以安装 APK,运行该应用程序。

运行结果如下:

要想获得更令人兴奋的体验,你应该实现一些新功能,从安卓文件系统加载图像,或者使用相机获取图像,而不是使用资源文件夹。

移动端的深度学习最终将改变我们构建和使用 app 的方式。通过上面的代码片段,你可以很容易地将训练好的 PyTorch 和 Keras 模型导出到 TensorFlow 环境下。借助于 TensorFlow Mobile 的强大功能,并且按照本文中介绍的步骤,你可以为自己的移动应用程序无缝注入优秀的人工智能功能。

安卓项目的全部代码和模型转换器可以在我的 GitHub 上(-Keras-ToAndroid)获得。

原文链接:

-pytorch-and-keras-models-to-android-with-tensorflow-mobile-a16a1fb83f2

识别下图二维码,加“数盟社区”为好友,回复暗号“入群”,加入数盟社区交流群,群内持续有干货分享~~

媒体合作请联系: