Keras 深度学习模型到 android

Posted

技术标签:

【中文标题】Keras 深度学习模型到 android【英文标题】:Keras deep learning model to android 【发布时间】:2018-02-03 01:57:37 【问题描述】:

我正在为 android 开发一个实时对象分类应用程序。首先,我使用“keras”创建了一个深度学习模型,并且我已经将训练好的模型保存为“model.h5”文件。我想知道如何在 android 中使用该模型进行图像分类。

【问题讨论】:

似乎keras模型不是为支持android而设计的,但我认为你可以将模型文件转换为tensorflow模型文件,然后将tensorflow模型文件部署到android,这个issue可以帮助你做转换和这个tutorial 可以帮助您了解如何将 tensorflow 模型部署到 android 【参考方案1】:

您不能将 Keras 直接导出到 Android,但您必须保存模型

将 TensorFlow 配置为您的 Keras 后端。

使用model.save(filepath) 保存模型(你已经这样做了)

然后使用以下解决方案之一加载它:

解决方案 1:在 Tensflow 中导入模型

1- 构建 TensorFlow 模型

从 keras 模型 use this code 构建 tensorflow 模型(链接已更新)

2- 构建 Android 应用并调用 Tensorflow。检查这个tutorial 和这个来自谷歌的official demo 以了解如何做到这一点。

解决方案2:在java中导入模型 1- deeplearning4j 一个允许导入 keras 模型的 java 库:tutorial link 2- 在 Android 中使用 deeplearning4j:这很容易,因为您在 Java 世界中。检查this tutorial

【讨论】:

【参考方案2】:

如果您想优化分类方法,那么我建议您使用 armnn android 库对您的模型进行推理。

您必须遵循几个步骤。 1. 在 ubuntu 中安装和设置 arm nn 库。您可以从以下网址获取帮助

https://github.com/ARM-software/armnn/blob/branches/armnn_19_08/BuildGuideAndroidNDK.md

    只需导入您的模型并进行推理。您可以从以下网址获取帮助

https://developer.arm.com/solutions/machine-learning-on-arm/developer-material/how-to-guides/deploying-a-tensorflow-mnist-model-on-arm-nn/deploying-a-tensorflow-mnist-model-on-arm-nn-single-page

    编译后你会得到二进制文件,它将接受输入并给你输出

    您可以在任何安卓应用程序中运行该二进制文件

是优化方式。

【讨论】:

【参考方案3】:

首先您需要将 Keras 模型导出到 Tensorflow 模型:

def export_model_for_mobile(model_name, input_node_names, output_node_name):
    tf.train.write_graph(K.get_session().graph_def, 'out', \
        model_name + '_graph.pbtxt')

    tf.train.Saver().save(K.get_session(), 'out/' + model_name + '.chkp')

    freeze_graph.freeze_graph('out/' + model_name + '_graph.pbtxt', None, \
        False, 'out/' + model_name + '.chkp', output_node_name, \
        "save/restore_all", "save/Const:0", \
        'out/frozen_' + model_name + '.pb', True, "")

    input_graph_def = tf.GraphDef()
    with tf.gfile.Open('out/frozen_' + model_name + '.pb', "rb") as f:
        input_graph_def.ParseFromString(f.read())

    output_graph_def = optimize_for_inference_lib.optimize_for_inference(
            input_graph_def, input_node_names, [output_node_name],
            tf.float32.as_datatype_enum)

    with tf.gfile.FastGFile('out/tensorflow_lite_' + model_name + '.pb', "wb") as f:
        f.write(output_graph_def.SerializeToString())

您只需要知道图表的input_nodes_namesoutput_node_names。这将创建一个包含多个文件的新文件夹。其中,一个以tensorflow_lite_开头。这是您应该移动到 Android 设备的文件。

然后在 Android 上导入 Tensorflow 库并使用 TensorFlowInferenceInterface 运行您的模型。

implementation 'org.tensorflow:tensorflow-android:1.5.0'

你可以在 Github 上查看我的简单异或示例:

https://github.com/OmarAflak/Keras-Android-XOR

【讨论】:

以上是关于Keras 深度学习模型到 android的主要内容,如果未能解决你的问题,请参考以下文章

Keras深度学习实战——基于ResNet模型实现性别分类

Keras深度学习实战(28)——利用单词向量构建情感分析模型

用Python/Keras/Flask/Docker在Kubernetes上部署深度学习模型

Keras深度学习实战(33)——基于LSTM的序列预测模型

深度学习高级,Keras多输入和混合数据实现回归模型

吐血整理!基于 Flask 部署 Keras 深度学习模型