做者 | 武维
审校 | 蔡芳芳
AI前线出品| ID:ai-front
前言html
深度学习在图像处理、语音识别、天然语言处理领域的应用取得了巨大成功,可是它一般在功能强大的服务器端进行运算。若是智能手机经过网络远程链接服务器,也能够利用深度学习技术,但这样可能会很慢,并且只有在设备处于良好的网络链接环境下才行,这就须要把深度学习模型迁移到智能终端。java
因为智能终端CPU和内存资源有限,为了提升运算性能和内存利用率,须要对服务器端的模型进行量化处理并支持低精度算法。TensorFlow版本增长了对Android、iOS和Raspberry Pi硬件平台的支持,容许它在这些设备上执行图像分类等操做。这样就能够建立在智能手机上工做而且不须要云端每时每刻都支持的机器学习模型,带来了新的APP。android
本文主要基于看花识名APP应用,讲解TensorFlow模型如何应用于Android系统;在服务器端训练TensorFlow模型,并把模型文件迁移到智能终端;TensorFlow Android开发环境构建以及应用开发API。git
看花识名APPgithub
使用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提供了Android开发的示例框架,下面基于AlexNet模型的看花识名APP作一些相应源码的修改,并编译生成Android的安装包:
TensorFlow移动端应用开发API
在Android系统中执行TensorFlow Inference操做,须要调用libandroid_tensorflow_inference_java.jar中的JNI接口,主要接口以下:
总结
本文基于看花识名APP,讲解了TensorFlow在Android智能终端中的应用技术。首先回顾了AlexNet模型结构,基于AlexNet的slim模型对Flowers数据进行训练;对训练后的CheckPoint数据,进行Freeze和Quantized处理,生成智能终端要用的Inference模型。而后介绍了TensorFlow Android应用开发环境的构建,编译生成TensorFlow在Android上的动态连接库以及java开发包;文章最后介绍了Inference API的使用方式。
参考文献
做者简介
武维(微信:3381209@qq.com):博士,系统架构师,主要从事大数据,深度学习,云计算等领域的研发工做。