天天看點

機器學習:如何在安卓上內建TensorFlow

機器學習:如何在安卓上內建TensorFlow

我們都知道,谷歌有一個開源庫叫做tensorflow,可被用在安卓系統中實作機器學習。換言之,tensorflow是谷歌為機器智能提供的一個開源軟體庫。

我在網絡上搜尋了很久,都沒有找到在安卓上搭建tensorflow的簡單的方法或執行個體。仔細查閱許多資料以後,我終于可以搭建它了。于是,我決定把我搭建的過程寫出來,這樣其他人就不必再浪費時間了。

這篇文章是寫給那些熟悉機器學習并且知道怎樣為機器學習搭模組化型的人的(在這個示例中我會使用一個預訓練模型)。近期,我會寫一系列關于機器學習的文章,這樣每個人都能夠學到如何為機器學習搭模組化型。

從搭建安卓上的機器學習模型過程講起

我們需要知道的幾個要點:

tensorflow的核心是用c++編寫的;

為了在安卓上搭建tensorflow,我們需要用jni(java本地接口)來調用c++函數,比如說loadmodel,getpredictions,等等;

我們會用到.so(shared object,即共享對象)檔案,它是c++編譯檔案;還會用到jar檔案,它由能夠調用本地c++的java api組成。之後,我們就可以調用java api輕松地把事情做好;

是以我們需要jar(java api)和一個.so(c++編譯)檔案;

我們必須要有一個預訓練模型檔案和一個用于分類的标簽檔案。

我們會做以下的目标檢測:

機器學習:如何在安卓上內建TensorFlow

編譯jar和.so檔案

注意:--recurse-submodules對于提取子子產品(pull submodules)很重要。

在這裡(https://developer.android.com/ndk/downloads/older_releases.html#ndk-12b-downloads)下載下傳ndk。

下載下傳安卓sdk,或者,我們也可以從android studio sdk提供路徑。

安裝bazel(https://bazel.build/versions/master/docs/install.html)。bazel是tensorflow的主要編譯系統。

現在,編輯工作空間(workspace),我們可以在早先克隆的tesnsorflow根路徑中找到工作空間(workspace)檔案。

機器學習:如何在安卓上內建TensorFlow

我們的sdk和ndk路徑就跟下面一樣:

機器學習:如何在安卓上內建TensorFlow

然後編譯生成.so檔案:

将armeabi-v7a換成我們所需要的目标架構。

庫會被放置在:

機器學習:如何在安卓上內建TensorFlow

編譯java副本:

機器學習:如何在安卓上內建TensorFlow

我們可以在這裡找到jar檔案:

機器學習:如何在安卓上內建TensorFlow

現在我們有了jar和.so檔案。你也可以從下面的工程中直接提取使用我已經建立好的.so檔案和jar。

我已經在這裡(https://github.com/mindorksopensource/androidtensorflowmachinelearningexample)建立了一個完整可運作的示例應用。

但是,我們需要預訓練模型和标簽檔案。

在這個例子中,我們會使用google預訓練模型,它實作了在一張給定的照片上做目标檢測。

解壓縮zip檔案,我們就會得到imagenet_comp_graph_label.strings.txt(目标标簽)以及tensorflow_inception_graph.pb(預訓練模型)。

現在,在android studio上建立安卓示例工程吧。

将imagenet_comp_graph_label.strings.txt(目标标簽)以及tensorflow_inception_graph.pb放進assets檔案夾。

将libandroid_tensorflow_inference_java.jar放進lib檔案夾,單擊右鍵,添加庫。

機器學習:如何在安卓上內建TensorFlow

在主目錄建立一個jnilibs檔案夾并且将libtensorflow_inference.so放到jnilibs/armeabi-v7a檔案夾中。

現在,我們就可以調用tensorflow java api了。

tensorflow java api通過tensorflowinferenceinterface類開放了所有需要的方法。

現在,我們可以用模型路徑調用tensorflow java api并且加載它了。

然後,我們可以輸入一張圖檔來擷取預測結果。

如果想要體會完整的流程,克隆這個項目(https://github.com/mindorksopensource/androidtensorflowmachinelearningexample),搭建并運作它吧。

如果你在搭建這個項目的過程中有任何問題的話,聯系我,我會非常樂意幫助你。

happy coding:)

讀者問答

q:我很疑惑要怎麼連接配接到‘so’庫?也沒有任何一行像’system.loadlibray’的代碼?

a:system.loadlibrary已經寫在tensorflow jar中了。

q:是以這是一個c++應用還是java應用啊?你用的是什麼語言?

a:這是一個用java語言編寫的安卓應用,它通過java本地接口(jni: java native interface)調用c++做預測(機器學習)。

原文釋出時間為:2017-04-27

本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号