深度学习在图像处理、语音识别、自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算。如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有在设备处于良好的网络连接环境下才行,这就需要把深度学习模型迁移到智能终端。
由于智能终端 CPU 和内存资源有限,为了提高运算性能和内存利用率,需要对服务器端的模型进行量化处理并支持低精度算法。TensorFlow 版本增加了对 Android、iOS 和 Raspberry Pi 硬件平台的支持,允许它在这些设备上执行图像分类等操作。这样就可以创建在智能手机上工作并且不需要云端每时每刻都支持的机器学习模型,带来了新的 APP。
本文主要基于看花识名 APP 应用,讲解 TensorFlow 模型如何应用于 Android 系统;在服务器端训练 TensorFlow 模型,并把模型文件迁移到智能终端;TensorFlow Android 开发环境构建以及应用开发 API。
使用 AlexNet 模型、Flowers 数据以及 Android 平台构建了“看花识名”APP。TensorFlow 模型对五种类型的花数据进行训练。如下图所示:
Daisy:雏菊
Dandelion:蒲公英
Roses:玫瑰
Sunflowers:向日葵
Tulips:郁金香
在服务器上把模型训练好后,把模型文件迁移到 Android 平台,在手机上安装 APP。使用效果如下图所示,界面上端显示的是模型识别的置信度,界面中间是要识别的花:
TensorFlow 模型如何应用于看花识名 APP 中,主要包括以下几个关键步骤:模型选择和应用、模型文件转换以及 Android 开发。如下图所示:
本章采用 AlexNet 模型对 Flowers 数据进行训练。AlexNet 在 2012 取得了 ImageNet 最好成绩,top 5 准确率达到 80.2%。这对于传统的机器学习分类算法而言,已经相当出色。模型结构如下:
本文采用 TensorFlow 官方 Slim(https://github.com/tensorflow/models/tree/master/slim)AlexNet 模型进行训练。
为了减少智能终端上模型文件的大小,TensorFlow 中常用的方法是对模型文件进行量化处理,本文对 AlexNet CheckPoint 文件进行 Freeze 和 Quantized 处理后的文件大小变化如下图所示:
量化操作的主要思想是在模型的 Inference 阶段采用等价的 8 位整数操作代替 32 位的浮点数操作,替换的操作包括:卷积操作、矩阵相乘、激活函数、池化操作等。量化节点的输入、输出为浮点数,但是内部运算会通过量化计算转换为 8 位整数(范围为 0 到 255)的运算,浮点数和 8 位量化整数的对应关系示例如下图所示:
量化 Relu 操作的基本思想如下图所示:
TensorFlow Android 应用开发环境构建
在 Android 系统上使用 TensorFlow 模型做 Inference 依赖于两个文件 libtensorflow_inference.so 和 libandroid_tensorflow_inference_java.jar。这两个文件可以通过下载 TensorFlow 源代码后,采用 bazel 编译出来,如下所示:
下载 TensorFlow 源代码
git clone --recurse-submodules
https://github.com/tensorflow/tensorflow.git
下载安装 Android NDK
https://developer.android.com/ndk/downloads/older_releases.html#ndk-12b-downloads
下载安装 Android SDK
https://developer.android.com/studio/command-line/sdkmanager.html
配置 tensorflow/WORKSPACE 中 android 开发工具路径
TensorFlow 在
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android 下提供了 Android 开发的示例框架,下面基于 AlexNet 模型的看花识名 APP 做一些相应源码的修改,并编译生成 Android 的安装包:
在 Android 系统中执行 TensorFlow Inference 操作,需要调用 libandroid_tensorflow_inference_java.jar 中的 JNI 接口,主要接口如下:
向 TensorFlow 图中加载输入数据,本 App 中输入数据为摄像头截取到的图片;参数 inputName 为 TensorFlow Inference 中的输入数据 Tensor 的名称;参数 floatValues 为输入图片的像素数据,进行预处理后的浮点值;[1,inputSize,inputSize,3] 为裁剪后图片的大小,比如 1 张 224*224*3 的 RGB 图片。
本文基于看花识名 APP,讲解了 TensorFlow 在 Android 智能终端中的应用技术。首先回顾了 AlexNet 模型结构,基于 AlexNet 的 slim 模型对 Flowers 数据进行训练;对训练后的 CheckPoint 数据,进行 Freeze 和 Quantized 处理,生成智能终端要用的 Inference 模型。然后介绍了 TensorFlow Android 应用开发环境的构建,编译生成 TensorFlow 在 Android 上的动态链接库以及 java 开发包;文章最后介绍了 Inference API 的使用方式。
[1] http://www.tensorflow.org
[2] 深度学习利器: 分布式 TensorFlow 及实例分析
[3] 深度学习利器:TensorFlow 使用实战
[4] 深度学习利器:TensorFlow 系统架构与高性能程序设计
[5] 深度学习利器:TensorFlow 与深度卷积神经网络
[6] 深度学习利器:TensorFlow 与 NLP 模型
今日荐文
点击下方图片即可阅读
想知道第一部 Mac 是如何被开发出来的?想了解更多苹果公司的工程师文化?想学习硅谷人是如何将产品做到极致的?想领略乔布斯的领导魅力?这本书都能告诉你。点击「 阅读原文 」即可购买,还有精美书签赠送哦~