专栏名称: AI前线
我们专注大数据和机器学习,关注前沿技术和业界实践。每天发布高质量文章,技术案例等原创干货源源不断。同时有四千人的社群微课堂,每周一次业界大牛技术分享,也希望你能从这里分享前沿技术,交流深度思考。
目录
相关文章推荐
软件定义世界(SDX)  ·  OpenAI宣布完成66亿美元融资:估值15 ... ·  2 天前  
数据派THU  ·  深度解析Transformer、RNN和Ma ... ·  4 天前  
大数据文摘  ·  当代年轻人,在AI实现婚纱照自由 ·  4 天前  
大数据文摘  ·  腾讯 Robotics X ... ·  1 周前  
51好读  ›  专栏  ›  AI前线

深度学习利器:如何在智能终端中应用TensorFlow?

AI前线  · 公众号  · 大数据  · 2017-09-17 17:00

正文

编辑|Natalie
前言

深度学习在图像处理、语音识别、自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算。如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有在设备处于良好的网络连接环境下才行,这就需要把深度学习模型迁移到智能终端。

由于智能终端 CPU 和内存资源有限,为了提高运算性能和内存利用率,需要对服务器端的模型进行量化处理并支持低精度算法。TensorFlow 版本增加了对 Android、iOS 和 Raspberry Pi 硬件平台的支持,允许它在这些设备上执行图像分类等操作。这样就可以创建在智能手机上工作并且不需要云端每时每刻都支持的机器学习模型,带来了新的 APP。

本文主要基于看花识名 APP 应用,讲解 TensorFlow 模型如何应用于 Android 系统;在服务器端训练 TensorFlow 模型,并把模型文件迁移到智能终端;TensorFlow Android 开发环境构建以及应用开发 API。

看花识名 APP

使用 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 模型进行训练。

  • 首先下载 Flowers 数据,并转换为 TFRecord 格式:

  • 执行模型训练,经过 36618 次迭代后,模型精度达到 85%

  • 生成 Inference Graph 的 PB 文件

  • 结合 CheckPoint 文件和 Inference GraphPB 文件,生成 Freeze Graph 的 PB 文件

  • 对 Freeze Graph 的 PB 文件进行数据量化处理,减少模型文件的大小,生成的 quantized_alexnet_v2_graph.pb 为智能终端中应用的模型文件

为了减少智能终端上模型文件的大小,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 开发工具路径

  • 编译 libtensorflow_inference.so

  • 编译 libandroid_tensorflow_inference_java.jar

TensorFlow 在

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android 下提供了 Android 开发的示例框架,下面基于 AlexNet 模型的看花识名 APP 做一些相应源码的修改,并编译生成 Android 的安装包:

  • 基于 AlexNet 模型,修改 Inference 的输入、输出的 Tensor 名称

  • 放置 quantized_alexnet_v2_graph.pb 和对应的 labels.txt 文件到 assets 目录下,并修改 Android 文件路径

  • 编译生成安装包

  • 拷贝 tensorflow_demo.apk 到手机上,并执行安装,太阳花识别效果如下图所示:

TensorFlow 移动端应用开发 API

在 Android 系统中执行 TensorFlow Inference 操作,需要调用 libandroid_tensorflow_inference_java.jar 中的 JNI 接口,主要接口如下:

  • 构建 TensorFlow Inference 对象,构建该对象时候会加载 TensorFlow 动态链接库 libtensorflow_inference.so 到系统中;参数 assetManager 为 android asset 管理器;参数 modelFilename 为 TensorFlow 模型文件在 android_asset 中的路径。

  • 向 TensorFlow 图中加载输入数据,本 App 中输入数据为摄像头截取到的图片;参数 inputName 为 TensorFlow Inference 中的输入数据 Tensor 的名称;参数 floatValues 为输入图片的像素数据,进行预处理后的浮点值;[1,inputSize,inputSize,3] 为裁剪后图片的大小,比如 1 张 224*224*3 的 RGB 图片。

  • 执行模型推理; outputNames 为 TensorFlow Inference 模型中要运算 Tensor 的名称,本 APP 中为分类的 Logist 值。

  • 获取模型 Inference 的运算结果,其中 outputName 为 Tensor 名称,参数 outputs 存储 Tensor 的运算结果。本 APP 中,outputs 为计算得到的 Logist 浮点数组。

总结

本文基于看花识名 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 模型

作者介绍

武维(微信:[email protected]):博士,系统架构师,主要从事大数据,深度学习,云计算等领域的研发工作。

今日荐文

点击下方图片即可阅读

AI 一周热闻盘点


想知道第一部 Mac 是如何被开发出来的?想了解更多苹果公司的工程师文化?想学习硅谷人是如何将产品做到极致的?想领略乔布斯的领导魅力?这本书都能告诉你。点击「 阅读原文 」即可购买,还有精美书签赠送哦~