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

技术讨论 sophie ⋅ 于 4周前 ⋅ 271 阅读

前言

深度学习在图像处理、语音识别、自然语言处理领域的应用取得了巨大成功,但是它通常在功能强大的服务器端进行运算。如果智能手机通过网络远程连接服务器,也可以利用深度学习技术,但这样可能会很慢,而且只有在设备处于良好的网络连接环境下才行,这就需要把深度学习模型迁移到智能终端。
由于智能终端 CPU 和内存资源有限,为了提高运算性能和内存利用率,需要对服务器端的模型进行量化处理并支持低精度算法。TensorFlow 版本增加了对 Android、iOS 和 Raspberry Pi 硬件平台的支持,允许它在这些设备上执行图像分类等操作。这样就可以创建在智能手机上工作并且不需要云端每时每刻都支持的机器学习模型,带来了新的 APP。
本文主要基于看花识名 APP 应用,讲解 TensorFlow 模型如何应用于 Android 系统;在服务器端训练 TensorFlow 模型,并把模型文件迁移到智能终端;TensorFlow Android 开发环境构建以及应用开发 API。

看花识名 APP

使用 AlexNet 模型、Flowers 数据以及 Android 平台构建了“看花识名”APP。TensorFlow 模型对五种类型的花数据进行训练。如下图所示:

Daisy:雏菊

file

Dandelion:蒲公英

file

Roses:玫瑰

file

Sunflowers:向日葵

file

Tulips:郁金香

file

在服务器上把模型训练好后,把模型文件迁移到 Android 平台,在手机上安装 APP。使用效果如下图所示,界面上端显示的是模型识别的置信度,界面中间是要识别的花:
file

TensorFlow 模型如何应用于看花识名 APP 中,主要包括以下几个关键步骤:模型选择和应用、模型文件转换以及 Android 开发。如下图所示:

file

file

模型训练及模型文件
本章采用 AlexNet 模型对 Flowers 数据进行训练。AlexNet 在 2012 取得了 ImageNet 最好成绩,top 5 准确率达到 80.2%。这对于传统的机器学习分类算法而言,已经相当出色。模型结构如下:
file

本文采用 TensorFlow 官方 Slim https://github.com/tensorflow/models/tree/master/slim%EF%BC%89AlexNet 模型进行训练。
首先下载 Flowers 数据,并转换为 TFRecord 格式:
file

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

file

生成 Inference Graph 的 PB 文件
file

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

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

为了减少智能终端上模型文件的大小,TensorFlow 中常用的方法是对模型文件进行量化处理,本文对 AlexNet CheckPoint 文件进行 Freeze 和 Quantized 处理后的文件大小变化如下图所示:
file

量化操作的主要思想是在模型的 Inference 阶段采用等价的 8 位整数操作代替 32 位的浮点数操作,替换的操作包括:卷积操作、矩阵相乘、激活函数、池化操作等。量化节点的输入、输出为浮点数,但是内部运算会通过量化计算转换为 8 位整数(范围为 0 到 255)的运算,浮点数和 8 位量化整数的对应关系示例如下图所示:
file

量化 Relu 操作的基本思想如下图所示:
file

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 开发工具路径
file
编译 libtensorflow_inference.so
file
编译 libandroid_tensorflow_inference_java.jar
file
TensorFlow 在 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android 下提供了 Android 开发的示例框架,下面基于 AlexNet 模型的看花识名 APP 做一些相应源码的修改,并编译生成 Android 的安装包:
基于 AlexNet 模型,修改 Inference 的输入、输出的 Tensor 名称
file

放置 quantized_alexnet_v2_graph.pb 和对应的 labels.txt 文件到 assets 目录下,并修改 Android 文件路径
file
编译生成安装包
file
拷贝 tensorflow_demo.apk 到手机上,并执行安装,太阳花识别效果如下图所示:
file

TensorFlow 移动端应用开发 API

在 Android 系统中执行 TensorFlow Inference 操作,需要调用 libandroid_tensorflow_inference_java.jar 中的 JNI 接口,主要接口如下:
构建 TensorFlow Inference 对象,构建该对象时候会加载 TensorFlow 动态链接库 libtensorflow_inference.so 到系统中;参数 assetManager 为 android asset 管理器;参数 modelFilename 为 TensorFlow 模型文件在 android_asset 中的路径。
file
向 TensorFlow 图中加载输入数据,本 App 中输入数据为摄像头截取到的图片;参数 inputName 为 TensorFlow Inference 中的输入数据 Tensor 的名称;参数 floatValues 为输入图片的像素数据,进行预处理后的浮点值;[1,inputSize,inputSize,3] 为裁剪后图片的大小,比如 1 张 2242243 的 RGB 图片。
file
执行模型推理; outputNames 为 TensorFlow Inference 模型中要运算 Tensor 的名称,本 APP 中为分类的 Logist 值。
file
获取模型 Inference 的运算结果,其中 outputName 为 Tensor 名称,参数 outputs 存储 Tensor 的运算结果。本 APP 中,outputs 为计算得到的 Logist 浮点数组。
file

总结

本文基于看花识名 APP,讲解了 TensorFlow 在 Android 智能终端中的应用技术。首先回顾了 AlexNet 模型结构,基于 AlexNet 的 slim 模型对 Flowers 数据进行训练;对训练后的 CheckPoint 数据,进行 Freeze 和 Quantized 处理,生成智能终端要用的 Inference 模型。然后介绍了 TensorFlow Android 应用开发环境的构建,编译生成 TensorFlow 在 Android 上的动态链接库以及 java 开发包;文章最后介绍了 Inference API 的使用方式。


作者:武维
编辑:Natalie
来源:AI前线@微信公众号(ID:ai-front)

微信公众号: 极市平台(ID: extrememart )
每天推送最新CV干货

成为第一个点赞的人吧 :bowtie:
回复数量: 0
暂无回复~
您需要登陆以后才能留下评论!