關(guān)于Android項目的創(chuàng)建這里就不做贅述了,我們直接進入主題,看下如何把機器學習庫和訓練的模型導(dǎo)入一個安卓應(yīng)用中。
導(dǎo)入 Inference Interface
在上一課時中我們下載了 Inference Interface 的 nightly build 的 AAR 文件,這個AAR其實就是庫文件,需要把這個文件導(dǎo)入到項目中,通常會把這個 AAR 文件放在 app/libs 下面:
為了導(dǎo)入這個 AAR,首先需要在 app/build.gradle 中聲明一個本地的 flatDir 倉庫:
repositories{
flatDir{
dirs'libs'
}
}
然后指定依賴:
compilename:'tensorflow', ext:'aar'
最后再做一個 Project Sync 就完成了 Inference Interface 的導(dǎo)入,完整的app/build.gradle應(yīng)該是這樣的:
....
repositories {
flatDir {
dirs'libs'
}
}
android{
.....
}
dependencies{
.....
compile name:'tensorflow', ext:'aar'
.....
}
導(dǎo)入 Pre-trained Model
在上一課時中已經(jīng)下載了 Pre-trained model 的二進制包,解壓縮這個包,會發(fā)現(xiàn)里面有這些文件:
其中model.ckpt.* 是我們在訓練自己的模型時會用到的文件(下一系列課程我們會專門講解如何訓練自己的模型),這里暫時忽略;frozen_inference_graph.pb 文件正是我們需要的,開箱即用的模型文件,把這個文件作為一個 asset 導(dǎo)入項目中。在 Android Studio 中,單擊 New | Folder | Assets Folder 命令創(chuàng)建一個 assets 目錄,將 frozen_inference_graph.pb 復(fù)制到 assets 目錄中,重命名為 model.pb。
導(dǎo)入測試數(shù)據(jù)
在機器學習的世界里面,絕大部分的輸入和輸出數(shù)據(jù)都是數(shù)字,換句話來說,當訓練這個識別模型的時候,你不會告訴它這張圖片上的是人,而是告訴它這個圖片上面的物體代號是 1;模型在輸出識別結(jié)果的時候,也不會輸出人,汽車這樣的字符,而是輸出 1、2、3 這樣的數(shù)字,那么這些數(shù)字代表的是什么,去哪里找這樣的對應(yīng)關(guān)系呢?
首先我們要清楚一點,模型和訓練數(shù)據(jù)要存在一一對應(yīng)關(guān)系。要么是使用的數(shù)據(jù)提前訓練了模型,要么數(shù)據(jù)當下訓練模型。因為TensorFlow Object Detection API 中的模型訓練時使用的是 MS COCO 的物體數(shù)據(jù)集合,所以我們可以在這里(關(guān)注公眾號,后臺留言提供下載鏈接)下載到相應(yīng)的標簽文件, 我們打開這個文件:
0: unlabeled
1: person
2: bicycle
3: car
4: motorcycle
5: airplane
6: bus
7: train
8: truck
9: boat
10: traffic light
11: fire hydrant
12: street sign
13: stop sign
14: parking meter
15: bench
16: bird
17: cat
18: dog
19: horse
20: sheep
21: cow
22: elephant
23: bear
把這個文件也存到 assets 目錄中,重命名為 labels.txt,現(xiàn)在 assets 目錄應(yīng)該是這樣的:
關(guān)鍵的代碼
現(xiàn)在相關(guān)的資源都導(dǎo)入到項目里面了,接下來我們寫一點代碼把模型和數(shù)據(jù)加載起來!
想一想我們需要做哪些工作:
加載模型 model.pb,獲取一個 TensorFlowInferenceInterface 來進行后續(xù)操作。
TensorFlowInferenceInterface inferenceInterface =newTensorFlowInferenceInterface(getAssets(),"model.pb");
獲取到 TensorFlowInferenceInterface 的對象之后就可以在這個對象上面輸入圖片數(shù)據(jù)并獲取識別結(jié)果了??鋸埖闹v人工智能科學家大牛們現(xiàn)在研究的就是如何實現(xiàn)這個接口,這里我們先不探究原理,只會用就好,以后的系列課程我們慢慢的去剖析機器學習的原理。
把數(shù)據(jù)集 labels.txt 的內(nèi)容讀到數(shù)組中,供查詢識別結(jié)果中的物體名稱;
List labels =newArrayList<>();
InputStream labelsInput = getAssets().open("labels.text");
BufferedReader br =newBufferedReader(newInputStreamReader(labelsInput));
Stringline;
while((line = br.readLine()) !=null) {
labels.add(line);
}
br.close();
至此,相信你應(yīng)該了解了tensorflow框架,訓練模型,測試數(shù)據(jù)是如何在一個應(yīng)用程序中實現(xiàn)的。是不是很簡單!下一課程讓我們一起完成一個完整的apk程序,也會把完成的源代碼后臺發(fā)給大家!
推薦閱讀: