APP下载

Android拍照识物APP的设计与实现

2018-05-28胡新健丁峰刘鲁南陈义明

电脑知识与技术 2018年9期
关键词:人工智能

胡新健 丁峰 刘鲁南 陈义明

摘要:近年来,人工智能技术取得了突破性的进展,基于Google Tensorflow深度学习框架的智能模型大量涌现,为android移动设备获得进一步的智能提供了契机。该文总结了将tensorflow人工智能模型应用到android移动设备的步骤和方法,成功将图像识别的tensorflow模型应用到android平台,开发了一个有趣实用的拍照识物app,为Tensorflow智能模型在Android设备上的应用提供借鉴。

关键词:人工智能;Tensorflow;Android

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2018)09-0072-03

Abstract: In recent years, breakthroughs have been made in artificial intelligence technology. The emergence of intelligent models based on the Google Tensorflow deep learning framework has provided an opportunity for the Android mobile device to gain further intelligence. This paper summarizes the steps and methods of applying the tensorflow artificial intelligence model to the android mobile device, successfully applies the tensorflow model of the image recognition to the android platform, and develops an interesting and practical photo recognition APP for the Tensorflow intelligent model on the Android device Application to provide reference.

Key words:Artificial Intelligence;Tensorflow; Android

最近几年,人工智能飞速发展,从Alphago打败围棋第一人柯洁到百度无人驾驶汽车上路,人工智能正在变得越来越强大、越来越可靠。随着谷歌对深度学习系统Tensorflow的开源,人工智能的门槛变低从而得到更广泛、更加贴近生活的运用。在智能设备已经普及的今天,将人工智能与智能设备结合应用以提高人们生活的便捷性成为一个可行的方案,使得智能设备更加智能。

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

1 Tensorflow简介

TensorFlow是谷歌基于DistBelief研发的第二代人工智能学习系统[1],于2015年11月9日开源。Tensor代表N维数组,Flow意味着Tensorflow是基于数据流图的计算。数据流图是Tensorflow的核心概念,本质是一个有向无环图,结点表示运算,入边和出边分别表示运算数和输出。Tensorflow运行过程就是张量从图的一端流动到另一端的计算过程[2]。目前,TensorFlow支持卷积神经网络(Convolution Neural Network,CNN)和循环神经网络(Recurrent Neural Network,RNN)的构建,是一个可以支持大规模数据计算的机器学习框架。

1.1 Tensorflow模型构建

使用Tensorflow框架提供的API可以十分方便地构建数据流图。可以直接在默认图graph中构建数据流图,也可以先显式地获得一个graph对象g=tf.graph(),然后在语句with g.as_default()打开的范围内构建数据流图。如下面的程序将构建如图1的数据流图。

m = tf.MatMul(W,X)

s= tf.add(m,b)

1.2 Tensorflow模型訓练

在解决实际问题时,要求模型输出尽可能接近期望的正确输出,定义一个合适的损失函数loss[3]。Tensorflow数据流图模型含有大量的权值和偏置参数,参数的不同取值会产生不同的损失。因此,模型训练的本质就是选取合适的参数,使得损失函数的值最小[4]。Tensorflow通常使用梯度下降技术获取这个最小值。下面是构建模型训练结点以及训练模型的代码:

loss = tf.reduce_mean(tf.square(y-[y])) # 假设期望的正确输出为y

optimizer = tf.train.GradientDescentOptimizer(learning_rate)

train_op = optimizer.minimize(loss)

with tf.Session() as sess:

for i in range(1000):

sess.run(train_op)

1.3 Tensorflow模型保存

Tensorflow训练过程通常将模型保存为检查点文件,由以下四部分组成:

1)Checkpoint文件:保存不同训练时刻的检查点文件,以便按顺序进行组合。

2)Meta文件:包含模型经过压缩后的protobufs图和相关的所有元数据,如集合、学习率和运算等。

3)Ckpt文件:模型数据如权值等,经常是模型的主要部分。

在模型训练过程中,使用下列语句可以保存模型检查点:

saver = tf.train.Saver()

with tf.Session() as sess:

saver.save(sess, '/logs/data-all.chkp')

2 Tensorflow模型处理

模型应用需要将检查点文件合并为一个protobuf文件,按下列三步进行:

1)装载张量流图元数据

saver = tf.train.import_meta_graph(dir+'/logs/data-all.chkp.meta')

2)将检查点数据恢复到张量流图中,即将张量流图中的变量用检查点中具体的数值代入

saver.restore(sess, dir+'/logs/data-all.chkp')

3)保存到文件系统中

下列程序将合并的数据流图保存为二进制文件:

Import tensorflow as tf

With tf.gfile.Gfile(output_pb_file_name,wb) as f:

f.write(graph_def.SerializeToString())

3 Tensorflow模型的Android应用

TensorFlow可以用来作为机器学习算法的执行框架,也可以作为机器学习算法的实现接口。因此在TensorFlow上实现的算法,也更容易移植到异构系统上,从移动端到普通的CPU服务器,甚至是大规模GPU集群[5]。

3.1 导入jar包和.so文件

jar包和.so文件可以从官方网站(https://ci.tensorflow.org/view/Nightly/job/nightly-android/)获取也可以使用bazel工具通过以下代码编译获得。

bazel编译jar包:

bazelbuild //tensorflow/contrib/android:

android_tensorflow_inference_java

bazel编译.so文件:

bazel build –c opt//tensorflow/contrib/android:libtensorflow_inference.so \

crosstool_top=//external:android/crosstool \

host_crosstool_top=@bazel_tools//tools/cpp:toolchain \

cpu=armeabi-v7a

然后将训练好的pb模型文件放到android项目assets文件夹下,将libandroid_tensorflow_inference_java.jar存放到/app/libs目录下,并添加到library,并将libtensorflow_inference.so放在/app/libs下新建的armeabi文件夹中。

libandroid_tensorflow_inference_java.jar包下面最主要的接口是 TensorFlowInferenceInterface,该接口下主要包括以下几个方法:

1)initializeTensorFlow(getAssets(), MODEL_FILE)用于初始化tensorflow。

2)fillNodeFloat(INPUT_NODE, new int[]{1, HEIGHT, WIDTH, CHANNEL},inputs);该方法用于向tensorflow传入float型数据,如需传入其他类型的数据则需要调用相应的方法。

3)runInference(new String[]{OUTPUT_NODE})进行模型的推理。

4)readNodeFloat(OUTPUT_NODE, outputs)獲取输出数据。

tensorflow官方发布的jar包中将该接口中一系列方法作了简化,采用了重载方法的形式,并且由构造方法进行初始化,基本方法如下。

1)feed(inputName, floatValues, 1, inputSize, inputSize, 3);该方法用于向tensorflow中输入要处理的数据。

2)run(outputNames, logStats)运行tensorflow得到结果。

3)featch(outputName, outputs);用于将的到的结果传给输出变量。

3.2 配置gradle文件

指定jniLibs的路径

sourceSets{

main{

jniLibs.srcDirs = ['libs']

}}

defaultConfig{

ndk{

abiFilters "armeabi"

}}

3.3 调用tensorflow API

//定义接口

TensorFlowInferenceInterface inferenceInterface =

new TensorFlowInferenceInterface(assetManager, modelFilename);

// 将数据传给tensorflow

inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3);

// 运行tensorflow

inferenceInterface.run(outputNames, logStats);

//将结果输出到 outpus变量

inferenceInterface.fetch(outputName, outputs);

4 拍照识物APP运行效果

4.1 安卓应用界面

如图2所示,即为安卓应用的主界面,由一个取景框、一个信息提示栏和两个按钮组成,Toggle Camera按钮可以切换摄像头(默认使用后置摄像头),Detect Object按钮可以抓取图片并完成识别,将结果显示在信息提示栏中。

4.2 识别结果

如图3所示,即为最终结果,物体识别有个置信率,检测结果会显示每种可能的物品的置信率,然后进行排序。

如果画面只有一件物品,通常置信率可以达到50%以上,表示检测出的物品比较正确。但是如果多个物品同时出现在画面中,则多个物品的置信率只分别达到15%左右。

5 结束语

通过模型的移植,将原本只能在电脑端进行模型检测和分析数据的TensorFlow模型运用到安卓端。如今,TensorFlow已经被广泛运用到各个领域,如计算机视觉、语音识别等,对现代社会产生了巨大影响。通过将TensorFlow移植到移动端进行模型使用,使得移动端可以方便携带模型运用到更多新奇的领域,给人类带来更加便利的体验。

参考文献:

[1] 维克托·迈尔-舍恩伯格, 肯尼斯·库克耶, 盛阳燕, 等. 大数据时代:生活、工作与思维的大变革[M].杭州: 浙江人民出版社, 2013.

[2] 李河伟. 一种移动式TensorFlow平台的卷积神经网络设计方法[J]. 电脑知识与技术, 2017, 13(8): 179-182.

[3] 杜俊. 基于TensorFlow手写数字识别模型设计与实现[J]. 甘肃科技, 2017(21).

[4] 章敏敏,徐和平,王晓洁,等.谷歌TensorFlow机器学习框架及应用[J].微型機与应用,2017, 36(10): 58-60.

[5] 余莹,李肯立,郑光勇. 基于GPU集群的深度优先并行算法设计与实现[J]. 计算机科学, 2015, 42(1): 82-85.

猜你喜欢

人工智能
我校新增“人工智能”本科专业
人工智能与就业