第三課:把tensorflow,模型和測試數(shù)據(jù)導(dǎo)入Android工程

關(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ā)給大家!

推薦閱讀:

第一課:人工智能在嵌入式中的機會

第二課:開發(fā)機器學習app前的準備工作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容