機器學習:如何在安卓上集成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++編譯)文件;
-
我們必須要有一個預訓練模型文件和一個用於分類的標簽文件。
我們會做以下的目標檢測:
編譯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)文件。
我們的SDK和NDK路徑就跟下麵一樣:
然後編譯生成.so文件:
將armeabi-v7a換成我們所需要的目標架構。
庫會被放置在:
編譯Java副本:
我們可以在這裏找到JAR文件:
現在我們有了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文件夾,單擊右鍵,添加庫。
在主目錄新建一個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++做預測(機器學習)。
原文發布時間為:2014-04-27
本文來自雲棲社區合作夥伴“大數據文摘”,了解相關信息可以關注“BigDataDigest”微信公眾號
最後更新:2017-05-17 11:02:20