胡新健 丁峰 劉魯南 陳義明
摘要:近年來(lái),人工智能技術(shù)取得了突破性的進(jìn)展,基于Google Tensorflow深度學(xué)習(xí)框架的智能模型大量涌現(xiàn),為android移動(dòng)設(shè)備獲得進(jìn)一步的智能提供了契機(jī)。該文總結(jié)了將tensorflow人工智能模型應(yīng)用到android移動(dòng)設(shè)備的步驟和方法,成功將圖像識(shí)別的tensorflow模型應(yīng)用到android平臺(tái),開(kāi)發(fā)了一個(gè)有趣實(shí)用的拍照識(shí)物app,為T(mén)ensorflow智能模型在Android設(shè)備上的應(yīng)用提供借鑒。
關(guān)鍵詞:人工智能;Tensorflow;Android
中圖分類(lèi)號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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
最近幾年,人工智能飛速發(fā)展,從Alphago打敗圍棋第一人柯潔到百度無(wú)人駕駛汽車(chē)上路,人工智能正在變得越來(lái)越強(qiáng)大、越來(lái)越可靠。隨著谷歌對(duì)深度學(xué)習(xí)系統(tǒng)Tensorflow的開(kāi)源,人工智能的門(mén)檻變低從而得到更廣泛、更加貼近生活的運(yùn)用。在智能設(shè)備已經(jīng)普及的今天,將人工智能與智能設(shè)備結(jié)合應(yīng)用以提高人們生活的便捷性成為一個(gè)可行的方案,使得智能設(shè)備更加智能。
深度學(xué)習(xí)在圖像處理、語(yǔ)音識(shí)別、自然語(yǔ)言處理領(lǐng)域的應(yīng)用取得了巨大成功,但是它通常在功能強(qiáng)大的服務(wù)器端進(jìn)行運(yùn)算。如果智能手機(jī)通過(guò)網(wǎng)絡(luò)遠(yuǎn)程連接服務(wù)器,也可以利用深度學(xué)習(xí)技術(shù),但這樣可能會(huì)很慢,而且只有在設(shè)備處于良好的網(wǎng)絡(luò)連接環(huán)境下才行,這就需要把深度學(xué)習(xí)模型遷移到智能終端。
1 Tensorflow簡(jiǎn)介
TensorFlow是谷歌基于DistBelief研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng)[1],于2015年11月9日開(kāi)源。Tensor代表N維數(shù)組,F(xiàn)low意味著Tensorflow是基于數(shù)據(jù)流圖的計(jì)算。數(shù)據(jù)流圖是Tensorflow的核心概念,本質(zhì)是一個(gè)有向無(wú)環(huán)圖,結(jié)點(diǎn)表示運(yùn)算,入邊和出邊分別表示運(yùn)算數(shù)和輸出。Tensorflow運(yùn)行過(guò)程就是張量從圖的一端流動(dòng)到另一端的計(jì)算過(guò)程[2]。目前,TensorFlow支持卷積神經(jīng)網(wǎng)絡(luò)(Convolution Neural Network,CNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)的構(gòu)建,是一個(gè)可以支持大規(guī)模數(shù)據(jù)計(jì)算的機(jī)器學(xué)習(xí)框架。
1.1 Tensorflow模型構(gòu)建
使用Tensorflow框架提供的API可以十分方便地構(gòu)建數(shù)據(jù)流圖??梢灾苯釉谀J(rèn)圖graph中構(gòu)建數(shù)據(jù)流圖,也可以先顯式地獲得一個(gè)graph對(duì)象g=tf.graph(),然后在語(yǔ)句with g.as_default()打開(kāi)的范圍內(nèi)構(gòu)建數(shù)據(jù)流圖。如下面的程序?qū)?gòu)建如圖1的數(shù)據(jù)流圖。
m = tf.MatMul(W,X)
s= tf.add(m,b)
1.2 Tensorflow模型訓(xùn)練
在解決實(shí)際問(wèn)題時(shí),要求模型輸出盡可能接近期望的正確輸出,定義一個(gè)合適的損失函數(shù)loss[3]。Tensorflow數(shù)據(jù)流圖模型含有大量的權(quán)值和偏置參數(shù),參數(shù)的不同取值會(huì)產(chǎn)生不同的損失。因此,模型訓(xùn)練的本質(zhì)就是選取合適的參數(shù),使得損失函數(shù)的值最小[4]。Tensorflow通常使用梯度下降技術(shù)獲取這個(gè)最小值。下面是構(gòu)建模型訓(xùn)練結(jié)點(diǎn)以及訓(xùn)練模型的代碼:
loss = tf.reduce_mean(tf.square(y-[y])) # 假設(shè)期望的正確輸出為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訓(xùn)練過(guò)程通常將模型保存為檢查點(diǎn)文件,由以下四部分組成:
1)Checkpoint文件:保存不同訓(xùn)練時(shí)刻的檢查點(diǎn)文件,以便按順序進(jìn)行組合。
2)Meta文件:包含模型經(jīng)過(guò)壓縮后的protobufs圖和相關(guān)的所有元數(shù)據(jù),如集合、學(xué)習(xí)率和運(yùn)算等。
3)Ckpt文件:模型數(shù)據(jù)如權(quán)值等,經(jīng)常是模型的主要部分。
在模型訓(xùn)練過(guò)程中,使用下列語(yǔ)句可以保存模型檢查點(diǎn):
saver = tf.train.Saver()
with tf.Session() as sess:
saver.save(sess, '/logs/data-all.chkp')
2 Tensorflow模型處理
模型應(yīng)用需要將檢查點(diǎn)文件合并為一個(gè)protobuf文件,按下列三步進(jìn)行:
1)裝載張量流圖元數(shù)據(jù)
saver = tf.train.import_meta_graph(dir+'/logs/data-all.chkp.meta')
2)將檢查點(diǎn)數(shù)據(jù)恢復(fù)到張量流圖中,即將張量流圖中的變量用檢查點(diǎn)中具體的數(shù)值代入
saver.restore(sess, dir+'/logs/data-all.chkp')
3)保存到文件系統(tǒng)中
下列程序?qū)⒑喜⒌臄?shù)據(jù)流圖保存為二進(jìn)制文件:
Import tensorflow as tf
With tf.gfile.Gfile(output_pb_file_name,wb) as f:
f.write(graph_def.SerializeToString())
3 Tensorflow模型的Android應(yīng)用
TensorFlow可以用來(lái)作為機(jī)器學(xué)習(xí)算法的執(zhí)行框架,也可以作為機(jī)器學(xué)習(xí)算法的實(shí)現(xiàn)接口。因此在TensorFlow上實(shí)現(xiàn)的算法,也更容易移植到異構(gòu)系統(tǒng)上,從移動(dòng)端到普通的CPU服務(wù)器,甚至是大規(guī)模GPU集群[5]。
3.1 導(dǎo)入jar包和.so文件
jar包和.so文件可以從官方網(wǎng)站(https://ci.tensorflow.org/view/Nightly/job/nightly-android/)獲取也可以使用bazel工具通過(guò)以下代碼編譯獲得。
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
然后將訓(xùn)練好的pb模型文件放到android項(xiàng)目assets文件夾下,將libandroid_tensorflow_inference_java.jar存放到/app/libs目錄下,并添加到library,并將libtensorflow_inference.so放在/app/libs下新建的armeabi文件夾中。
libandroid_tensorflow_inference_java.jar包下面最主要的接口是 TensorFlowInferenceInterface,該接口下主要包括以下幾個(gè)方法:
1)initializeTensorFlow(getAssets(), MODEL_FILE)用于初始化tensorflow。
2)fillNodeFloat(INPUT_NODE, new int[]{1, HEIGHT, WIDTH, CHANNEL},inputs);該方法用于向tensorflow傳入float型數(shù)據(jù),如需傳入其他類(lèi)型的數(shù)據(jù)則需要調(diào)用相應(yīng)的方法。
3)runInference(new String[]{OUTPUT_NODE})進(jìn)行模型的推理。
4)readNodeFloat(OUTPUT_NODE, outputs)獲取輸出數(shù)據(jù)。
tensorflow官方發(fā)布的jar包中將該接口中一系列方法作了簡(jiǎn)化,采用了重載方法的形式,并且由構(gòu)造方法進(jìn)行初始化,基本方法如下。
1)feed(inputName, floatValues, 1, inputSize, inputSize, 3);該方法用于向tensorflow中輸入要處理的數(shù)據(jù)。
2)run(outputNames, logStats)運(yùn)行tensorflow得到結(jié)果。
3)featch(outputName, outputs);用于將的到的結(jié)果傳給輸出變量。
3.2 配置gradle文件
指定jniLibs的路徑
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}}
defaultConfig{
ndk{
abiFilters "armeabi"
}}
3.3 調(diào)用tensorflow API
//定義接口
TensorFlowInferenceInterface inferenceInterface =
new TensorFlowInferenceInterface(assetManager, modelFilename);
// 將數(shù)據(jù)傳給tensorflow
inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3);
// 運(yùn)行tensorflow
inferenceInterface.run(outputNames, logStats);
//將結(jié)果輸出到 outpus變量
inferenceInterface.fetch(outputName, outputs);
4 拍照識(shí)物APP運(yùn)行效果
4.1 安卓應(yīng)用界面
如圖2所示,即為安卓應(yīng)用的主界面,由一個(gè)取景框、一個(gè)信息提示欄和兩個(gè)按鈕組成,Toggle Camera按鈕可以切換攝像頭(默認(rèn)使用后置攝像頭),Detect Object按鈕可以抓取圖片并完成識(shí)別,將結(jié)果顯示在信息提示欄中。
4.2 識(shí)別結(jié)果
如圖3所示,即為最終結(jié)果,物體識(shí)別有個(gè)置信率,檢測(cè)結(jié)果會(huì)顯示每種可能的物品的置信率,然后進(jìn)行排序。
如果畫(huà)面只有一件物品,通常置信率可以達(dá)到50%以上,表示檢測(cè)出的物品比較正確。但是如果多個(gè)物品同時(shí)出現(xiàn)在畫(huà)面中,則多個(gè)物品的置信率只分別達(dá)到15%左右。
5 結(jié)束語(yǔ)
通過(guò)模型的移植,將原本只能在電腦端進(jìn)行模型檢測(cè)和分析數(shù)據(jù)的TensorFlow模型運(yùn)用到安卓端。如今,TensorFlow已經(jīng)被廣泛運(yùn)用到各個(gè)領(lǐng)域,如計(jì)算機(jī)視覺(jué)、語(yǔ)音識(shí)別等,對(duì)現(xiàn)代社會(huì)產(chǎn)生了巨大影響。通過(guò)將TensorFlow移植到移動(dòng)端進(jìn)行模型使用,使得移動(dòng)端可以方便攜帶模型運(yùn)用到更多新奇的領(lǐng)域,給人類(lèi)帶來(lái)更加便利的體驗(yàn)。
參考文獻(xiàn):
[1] 維克托·邁爾-舍恩伯格, 肯尼斯·庫(kù)克耶, 盛陽(yáng)燕, 等. 大數(shù)據(jù)時(shí)代:生活、工作與思維的大變革[M].杭州: 浙江人民出版社, 2013.
[2] 李河偉. 一種移動(dòng)式TensorFlow平臺(tái)的卷積神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)方法[J]. 電腦知識(shí)與技術(shù), 2017, 13(8): 179-182.
[3] 杜俊. 基于TensorFlow手寫(xiě)數(shù)字識(shí)別模型設(shè)計(jì)與實(shí)現(xiàn)[J]. 甘肅科技, 2017(21).
[4] 章敏敏,徐和平,王曉潔,等.谷歌TensorFlow機(jī)器學(xué)習(xí)框架及應(yīng)用[J].微型機(jī)與應(yīng)用,2017, 36(10): 58-60.
[5] 余瑩,李肯立,鄭光勇. 基于GPU集群的深度優(yōu)先并行算法設(shè)計(jì)與實(shí)現(xiàn)[J]. 計(jì)算機(jī)科學(xué), 2015, 42(1): 82-85.