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