查看原文
其他

在 Android 上使用 TensorFlow Lite

Google TensorFlow 2018-11-08

文 / Laurence Moroney, Developer Advocate


TensorFlow Lite 是 TensorFlow 针对移动和嵌入式设备的轻量级解决方案。它允许您在低延迟的移动设备上运行机器学习模型,因此您可以利用它进行分类,回归或获取你想要的任何东西,而无需与服务器交互。

注:TensorFlow Lite 链接

https://www.tensorflow.org/mobile/tflite/


目前,TensorFlow Lite 为 Android 和 iOS 设备提供了 C ++ API,并且为 Android 开发人员提供了 Java Wrapper。此外,在 Android 设备上,解释器还可以使用 Android 经网络 API 进行硬件加速,否则它将默认为 CPU 执行。在本文中,我将重点介绍如何在 Android 应用中使用它。


TensorFlow Lite 包含一个运行时环境,我们可以在其上运行预先存在的模型,并且它还提供了一套工具,可以为移动和嵌入式设备准备模型。


TensorFlow Lite 目前尚未支持训练模型。我们可以在高性能的机器上训练模型,然后将该模型转换为 TFLITE 格式,最终将其加载到解释器中。



TensorFlow Lite 目前处于开发人员预览阶段,因此可能不支持 TensorFlow 模型中的所有操作。但是它支持常见的图像分类模型,包括 Inception 和 MobileNets。在本文中,您将了解如何在 Android 上运行 MobileNet 模型。该应用程序将查看相机信息并使用经过训练的 MobileNet 对图像进行分类。



将 TensorFlow Lite 与 MobileNets 配合使用

例如,在这张图片中,我将相机对准了我最喜欢的咖啡杯,应用程序将它归类为 “杯子”。有趣的是,它有一个宽大的手柄,你可以看到它非常像一个茶壶!



这是如何做到的?它使用 MobileNet 模型,该模型针对移动设备上的多种图像场景进行设计和优化,包括对象检测,分类,面部属性检测和地标识别。



MobileNet 有许多变种,在此站点托管了 TensorFlow Lite 的训练模型。你会注意到每个文件都是一个包含两个文件的 zip 包:一个 labels.txt 文件,其中包含与模型相关的标签;一个 tflite 文件,其中包含可以与 TensorFlow Lite 一起使用的模型版本。如果你想要构建一个使用 MobileNets 的 Android 应用程序,则需要从此站点下载模型。你马上就会看到。



使用 TensorFlow Lite 构建 Android 应用程序

要构建使用 TensorFlow Lite 的 Android 应用程序,首先需要将 tensorflow-lite 库添加到您的应用程序中。这可以通过将以下行添加到 build.gradle 文件的依赖项部分来完成:


compile ‘org.tensorflow:tensorflow-lite:+’

完成此操作后,你可以导入 TensorFlow Lite 解释器。解释器通过为其提供一组输入来加载模型并允许你运行它。然后 TensorFlow Lite 将执行模型并输出结果,这真的很简单。


import org.tensorflow.lite.Interpreter;

要使用它,你需要创建一个 Interpreter 实例,然后使用 MappedByteBuffer 加载它。


protected Interpreter tflite;
tflite = new Interpreter(loadModelFile(activity));

在 GitHub 上的 TensorFlow Lite 示例中有一个辅助函数。只需确保函数 getModelPath() 返回一个指向特定模型的路径,并且加载该模型。

注:TensorFlow Lite 示例链接

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/java/demo/app/src/main/java/com/example/android/tflitecamerademo/ImageClassifier.java


/** Memory-map the model file in Assets. */
private MappedByteBuffer loadModelFile(Activity activity) throws IOException {
    AssetFileDescriptor fileDescriptor = activity.getAssets().openFd(getModelPath());
    FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
    FileChannel fileChannel = inputStream.getChannel();
    long startOffset = fileDescriptor.getStartOffset();
    long declaredLength = fileDescriptor.getDeclaredLength();
    return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}

然后,要对图像进行分类,我们只需要在 Interpeter 上调用 run 方法,并将图像数据和标签数组传递给它,它将完成剩下的工作:


tflite.run(imgData, labelProbArray);

详细介绍如何从相机中获取图像,并为 tflite 做准备超出了本文的范围,但是在 tensorflow github 中有一个完整示例详细阐明了这一切。通过单步执行此示例,你可以了解到如何从相机中获取图像,如何利用数据进行分类,以及如何采用将加权输出优先级列表从模型映射到标签数组的方式来处理输出。


要运行该示例,请确保拥有完整的 TensorFlow 源代码。你可以通过以下方式获取源代码:


> git clone https://www.github.com/tensorflow/tensorflow


完成后,你可以利用 Android Studio 打开 TensorFlow 示例项目(示例代码路径为:

/tensorflow/contrib/lite/java/demo):



演示文件不包含任何模型,但我们需要使用 mobilenet_quant_v1_224.tflite 文件,我们可以通过这个网站下载该模型。最后解压缩并将其放在 assets 文件夹中。

注:这个网站链接 

https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md



现在应该能够运行该应用程序了。


请注意,该应用程序同时支持 Inception 和 Quantized MobileNet。它默认支持后者,因此您需要确保模型存在,否则应用程序将运行失败。可以在 ImageClassifier.java 文件中找到用于从相机捕获数据并将其转换为字节缓冲区以便加载到模型中的代码。


核心功能可以在 Camera2BasicFragment.java 文件的 classifyFrame() 方法中找到:


/** Classifies a frame from the preview stream. */

private void classifyFrame() {
     if (classifier == null || getActivity() == null || cameraDevice ==   null) {
     showToast(“Uninitialized Classifier or invalid context.”)
     return;
}Bitmap bitmap = textureView.getBitmap(
     classifier.getImageSizeX(), classifier.getImageSizeY());
String textToShow = classifier.classifyFrame(bitmap);
bitmap.recycle();
showToast(textToShow);
}


在这里,您可以看到位图加载并调整为适合分类器的大小。然后 classifyFrame() 方法将返回包含与图像匹配的前 3 个类的列表及其权重的文本。


TensorFlow Lite 仍在不断发展,您可以在

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite  上跟踪它。



更多 AI 相关阅读:

· 神经网络已经猜到了你要绘制的内容

· 快速入门 TensorFlow.js

· Colab:学习和使用 TensorFlow 的简便方法

Be a Tensorflower

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存