前几天有人发布了一个可以在 iOS 设备上直接训练神经网络的开源项目 MNIST-CoreML-Training,引起热议。

项目使用 MNIST 手写数字数据集部署图像分类模型,不需要在其他 ML 框架中训练,而是基于 Core ML 直接本地训练出一个卷积神经网络(LeNet CNN) 模型。项目作者还将之和其他设备模型做了对比。在模型架构和训练参数相同的情况下,同时在 iphone 11上运行 Core ML 和在 i7 MacBook Pro 上运行 TensorFlow 2.0,两种方式的准确率都超过了0.98,前者训练时间大概为248秒,后者为158秒。

虽然用时上还有一定差距。但该项目和实验被认为证明了 ios 设备计算性能的提升,也探索了移动设备在本地训练的可能性。目前移动设备本地训练还难以完美实现,但想要在移动端部署 AI 应用还是有很多途径的,今天就来看看移动端的 AI 开发。

iOS 的 Core ML 和 Andorid 的 NNAPI

在移动端实现卷积神经网络,一般可以先在 GPU 或 TPU 上训练模型,之后再压缩部署到移动端。早前,有人基于开源的计算机视觉库 OpenCV 和开源训练模型 Caffe,在 Android 端实现车牌识别。Caffe 便是在 GPU 机器上训练,然后部署到商品集群或移动设备,在 CPU 和 GPU 之间切换,Caffe 模型还曾被用来在 Android 上做性别识别卷积神经训练。

当然,也已经有项目基于移动设备内置的一些 ML 框架,省去了在 GPU 和 TPU 上提前训练模型的步骤,直接在移动端部署。如 ios 内置的 Core ML,主要解决训练模型部署在移动端的问题,是一个模型转换工具,开头提到的 MNIST-CoreML-Training 就是基于它实现的。

Android 系统中也有类似的工具——NNAPI。NNAPI 是一个 Android C API,它为构建和训练 ML 框架,如 TensorFlow Lite、Caffe 2提供基础功能层,类似 ios 中的 Core ML。NNAPI 通过机器学习库、框架和工具调用,这些工具可以帮助开发者脱离设备训练模型,并完成部署。应用一般不会直接使用 NNAPI,而是直接使用更高级的 ML 框架。

iPhone 11 训练神经网络的开源项目火了,准确率可与 i7 MacBook Pro 持平-冯金伟博客园

图(NNAPI 高级系统架构)

使用 TensorFlow Lite 部署深度学习模型

Android 设备基于 NNAPI,还需要通过一些 ML 框架实现 AI 应用开发。被项目作者拿来做对比的 TensorFlow 早在2017年就衍生出 TensorFlow Lite,就可以用来在 Android 上部署深度学习模型。

TensorFlow Lite 是一种用于移动端的开源深度学习框架,最早由谷歌在2017年11月发布。TensorFlow Lite 可以在 CPU、GPU 上运行,也可以直接通过 NNAPI 运行,算上是应用较多的移动端 ML 框架。

早在2018年,同样有人使用 MNIST 数据库,在 Android 设备上搭建 TensorFlow Lite,实现移动端手写数字识别。而除了手写数字识别,TensorFlow Lite 现在还支持构建图像、物体识别模型,智能回复、姿势评估的模型。下面是 TensorFlow Lite 给出的使用流程。

  • 选择并使用一个模型:

TensorFlow Lite 提供系列预训练模型(pre-trained models)。开发者选择模型之后,可以通过 transfer learning 重新训练,以执行其他任务。开发者也可以设计并训练自己的  TensorFlow Lite 模型。

  • 转换模型:

TensorFlow Lite 支持部分 TensorFlow 运算符,TensorFlow 模型在被 TensorFlow Lite 使用前,必须转换成规定的特殊格式。

TensorFlow Lite 转换器以 Python API 的形式提供。下面的例子说明了将一个 TensorFlow SavedModel 转换成 TensorFlow Lite 格式的过程举例:

import tensorflow as tfconverter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)tflite_model = converter.convert()open("converted_model.tflite", "wb").write(tflite_model)
  • 使用模型推理:

推理是通过模型运行数据以获得预测的过程。这个过程需要模型、解释器和输入数据。TensorFlow Lite 解释器是一个库,它接收模型文件,执行模型文件在输入数据上定义的运算符,并提供对输出的访问。

该解释器适用于多个平台,提供了一个简单的 API,用于从 Java、Swift、Objective-C、C++ 和 Python 运行 TensorFlow Lite 模型。

下面的代码显示了从 Java 调用解释器的方式:

try (Interpreter interpreter = new Interpreter(tensorflow_lite_model_file)) {  interpreter.run(input, output);}
  • 优化模型:

TensorFlow Lite 提供优化模型大小和性能的工具,通常对准确性影响甚微。优化模型可能需要稍微复杂的训练,转换或集成。

  • 创建 Android 应用程序示例

如果想使用 TensorFlow Lite 快速编写 Android 代码, 官方推荐使用 Android 图像分类代码例子 作为起始点。下面介绍如何在 Android上 使用 TensorFlow Lite。

可以在build.gradle依赖中指定,使用 JCenter 中的 TensorFlow Lite AAR:

dependencies {    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'}

这个 AAR 包含了 Android ABIs 中的所有的二进制文件,可以通过只包含需要支持的 ABIs 减少应用程序的二进制文件大小。

官方推荐大部分开发者删简 x86,x86_64,和arm32 的 ABIs。开发者可以通过如下的Gradle 配置实现,这个配置只包括了 armeabi-v7a和arm64-v8a,该配置能涵盖住大部分的现代 Android 设备:

android {    defaultConfig {        ndk {            abiFilters 'armeabi-v7a', 'arm64-v8a'        }    }}

在本地构建 TensorFlow Lite,可参照自定义 AAR 构建说明 ,创建 AAR 并将其纳入 APP 中。