機器學習:在Android中整合TensorFlow (深度學習,AI,人工智慧,DL,ML,神經網路)
眾所周知,google谷歌有一個名為TensorFlow的開源庫,可用來在Android中實現機器學習。
TensorFlow是一個由google谷歌提供的機器智慧開源軟體庫。我在網上搜索了很多關於在Android端 構建 TensorFlow的簡單簡單方法和簡單demo,都一無所獲。在閱讀了眾多資源後,我總算可以構建成功了。然後我決定寫下這篇部落格,以便其他人不用花費太多時間。
本篇Demo——影象分類器,是取材於google谷歌官方的TensorFlow的Demo。
閱讀這篇文章,你需要已經熟悉機器學習,並且知道如何為機器學習構建相關的模型(在這個Demo裡我暫時用一套預訓練模型)。不久之後,我將要寫下關於機器學習的一系列文章,以便所有人都可以學習如何來為機器學習構建模型。
開啟Android機器學習 構建之門
你需要了解一些重要的點:
* TensorFlow的核心是用C++編寫的。
* 為了在Android中構建,我們不得不使用JNI(Java Native Interface)來呼叫C++函式,例如loadModel, getPredictions等等。
* 我們將使用一個jar包和一個.so動態連結庫檔案,前者裡面由呼叫native C++的JAVA API構成,後者是C++編譯的so檔案。然後我們可以僅通過呼叫JAVA API來把事情搞定。
* 因此,請注意,我們需要一個jar檔案(JAVA API)和一個.so檔案(C++編譯好)
* 我們必須還有2個東西:提前訓練的模型檔案(.pb),用來分類的標籤檔案(.txt)。
我們將構建一個如下圖的物體探測器:
接下來,讓我們構建jar檔案和.so檔案
執行如下命令:
git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
注意:–recurse-submodules 非常重要,用來下拉子模組的程式碼。
需要使用官方推薦的NDK r12b來構建so, 太新或太舊的版本都會有問題,如果你沒有NDK r12b,請在這裡下載.
如果你不用r12b編譯,你就會遇到各種各樣的錯誤。
如果你是全新玩家,那麼你當然還需要下載Android SDK了,或者採用Android Studio 下載的Android SDK也可以,後面我們需要的是SDK的路徑。
你需要了解谷歌的構建工具Bazel,它是TensorFlow的首席構建工具。你可以在這裡安裝Bazel。
當你對Bazel有所瞭解之後:
現在,編輯WORKSPACE檔案,我們可以在之前clone下來的TensorFlow的根路徑裡找到WORKSPACE檔案。
# Uncomment and update the paths in these entries to build the Android demo.
#android_sdk_repository(
# name = "androidsdk",
# api_level = 23,
# build_tools_version = "25.0.1",
# # Replace with path to Android SDK on your system
# path = "<PATH_TO_SDK>",
#)
#
#android_ndk_repository(
# name="androidndk",
# path="<PATH_TO_NDK>",
# api_level=14)
將以上檔案內容改為我們自己的sdk、ndk的路徑:
android_sdk_repository(
name = "androidsdk",
api_level = 23,
build_tools_version = "25.0.1",
# Replace with path to Android SDK on your system
path = "/Users/xxx/Library/Android/sdk/",
)
android_ndk_repository(
name="androidndk",
path="/Users/xxx/Downloads/android-ndk-r13/",
api_level=14)
下一步,構建.so檔案,執行如下命令:
bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
--crosstool_top=//external:android/crosstool \
[email protected]_tools//tools/cpp:toolchain \
--cpu=armeabi-v7a
其中的armeabi-v7a
引數可以換成你所需的目標cpu架構。
構建完成後,.so檔案將在如下路徑生成:
bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so
接著構建JAVA jar檔案:
bazel build //tensorflow/contrib/android:android_tensorflow_inference_java
jar檔案在如下路徑生成:
bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar
現在我們同時擁有了jar檔案和.so檔案了。
如果你構建失敗了,可以直接從這裡可以下載demo工程,裡面都有構建好的檔案。
但是我們還需要預訓練模型檔案和標籤檔案。
在這個demo裡,我們使用Google提供的預訓練模型檔案,這個檔案用來從已有的圖片中檢測物體(影象識別)。
下載完zip包解壓縮,得到2個檔案:
* imagenet_comp_graph_label_strings.txt(物體的標籤檔案)
* tensorflow_inception_graph.pb (預訓練模型檔案).
現在我們使用Android Studio來建立一個樣例工程。把.pb、.txt這2個檔案放入assets資料夾。
將生成的jar包,放入libs檔案,在build.gradle中加入:
compile files('libs/libandroid_tensorflow_inference_java.jar')
在main目錄建立jniLibs資料夾,把編譯好的.so檔案放進jniLibs/armeabi-v7a/
路徑
到現在為止,我們就可以呼叫TensorFlow的JAVA API了。
TensorFlow的JAVA層API通過TensorFlowInferenceInterface來暴露所有需要的方法。
我們需要先通過模型路徑裝載模型,才能進一步呼叫這些JAVA API。
並且,我們可以提供輸入影象,來得到識別的結果。
上面已經說過了,想圖省事,直接clone現成的專案,看看程式碼,編譯執行即可。
相關推薦
機器學習:在Android中整合TensorFlow (深度學習,AI,人工智慧,DL,ML,神經網路)
眾所周知,google谷歌有一個名為TensorFlow的開源庫,可用來在Android中實現機器學習。 TensorFlow是一個由google谷歌提供的機器智慧開源軟體庫。我在網上搜索了很多關於在Android端 構建 TensorFlow的簡單簡單方
在 Android 中 整合 tensorflow 並使用訓練後的模型
第一次整合使用 tensorflow ,內心還是有些激動的。開始時候,並不知道怎麼進行,其實是一臉茫然的,然後就看了不少文章,關於整合的,大致有了個思路,然後就開始整合測試。這次就總結下具體整合思路和步
[TensorFlow深度學習深入]實戰三·分別使用DNN,CNN與RNN(LSTM)做文字情感分析(機器如何讀懂人心)
[TensorFlow深度學習深入]實戰三·使用Word2Vec與RNN(LSTM)做文字情感分析(機器如何讀懂人心) 用到了 DNN CNN Word2Vec RNN(LSTM) 不太清楚的可以回顧我們之前的博文。 使用了全連線,卷積神經網路與迴
基於C#的機器學習--c# .NET中直觀的深度學習
在本章中,將會學到: l 如何使用Kelp.Net來執行自己的測試 l 如何編寫測試 l 如何對函式進行基準測試 Kelp.Net是一個用c#編寫的深度學習庫。由於能夠將函式鏈到函式堆疊中,它在一個非常靈活和直觀的平臺中提供了驚人的功能。它還充分利用OpenCL語言平臺,在
Android中關於JNI 的學習(一)對於JNIEnv的一些認識
else size 初步 jint 使用 包括 pri jnienv 就會 一個簡單的樣例讓我們初步地了解JNI的作用,可是關於JNI中的一些概念還是須要了解清楚,才可以更好的去利用它來實現我們想要做的事情。 那麽C++和Java之間的是怎樣通過JNI來進行互相調用的呢
《TensorFlow深度學習應用實踐》
常用 基本應用 水平 目的 record tar csv 支持 .com http://product.dangdang.com/25207334.html 內容 簡 介 本書總的指導思想是在掌握深度學習的基本知識和特性的基礎上,培養使用TensorFlow進行實際編程以解
Tensorflow深度學習之十二:基礎圖像處理之二
fcm 數字 ssi port con tty .net term file Tensorflow深度學習之十二:基礎圖像處理之二 from:https://blog.csdn.net/davincil/article/details/76598474 首先放出
機器學習是什麽?深度學習DeepLeaning現實一些該怎麽學?
IT 一次 計算機程序 機器學習 建議 企業 深度 特征 ava 作為剛入門的小白,剛剛以實驗出真理的心態抱著大腿完成了一次圖像分類達到top1-96的寶貴經歷。 以下是對於前輩講座理解以及這次實踐後理解心得: 機器學習是什麽? 機器學習是一門人工智能的科學,該領域的
數據分析、數據挖掘、機器學習、神經網絡、深度學習和人工智能概念區別(入門級別)
新的 簡單 什麽 nbsp 駕駛 exce 小白 數學 未來 數據分析, 就是對數據進行分析, 得出一些結論性的內容, 用於決策。 分析什麽哪? 根據分析現狀、 分析原因、 預測未來。 分析現狀和分析原因, 需要結合業務才能解釋清楚。 用到的技術比較簡單, 最簡單的數據分析
TensorFlow深度學習實戰---MNIST數字識別問題
驗證 ali 結構 shadow -m spa 直接 訓練數據 叠代 1.滑動平均模型: 用途:用於控制變量的更新幅度,使得模型在訓練初期參數更新較快,在接近最優值處參數更新較慢,幅度較小 方式:主要通過不斷更新衰減率來控制變量的更新幅度。 衰減率計算公式 :
TensorFlow深度學習實戰---圖像識別與卷積神經網絡
實戰 都是 循環 特征 結構 分析 神經網絡 圖片 網絡 全連接層網絡結構:神經網絡每兩層之間的所有結點都是有邊相連的。 卷積神經網絡:1.輸入層 2.卷積層:將神經網絡中的每一個小塊進行更加深入地分析從而得到抽象程度更高的特征。
教程 | 沒有博士學位,照樣玩轉TensorFlow深度學習
flow doc 深度 tensor sdn shtml art 線性 算法系列 香港科技大學TensorFlow三天速成課件 https://blog.csdn.net/zhongxon/article/details/54709347 香港科技大學TensorFlow三
機器學習筆記(十五):TensorFlow實戰七(經典卷積神經網路:VGG)
1 - 引言 之前我們介紹了LeNet-5和AlexNet,在AlexNet發明之後,卷積神經網路的層數開始越來越複雜,VGG-16就是一個相對前面2個經典卷積神經網路模型層數明顯更多了。 VGGNet是牛津大學計算機視覺組(Visual Geometry Group)和Google
機器學習筆記(十四):TensorFlow實戰六(經典卷積神經網路:AlexNet )
1 - 引言 2012年,Imagenet比賽冠軍的model——Alexnet [2](以第一作者alex命名)。這個網路算是一個具有突破性意義的模型 首先它證明了CNN在複雜模型下的有效性,然後GPU實現使得訓練在可接受的時間範圍內得到結果,讓之後的網路模型構建變得更加複雜,並且通過
機器學習筆記(十三):TensorFlow實戰五(經典卷積神經網路: LeNet -5 )
1 - 引言 之前我們介紹了一下卷積神經網路的基本結構——卷積層和池化層。通過這兩個結構我們可以任意的構建各種各樣的卷積神經網路模型,不同結構的網路模型也有不同的效果。但是怎樣的神經網路模型具有比較好的效果呢? 下圖展示了CNN的發展歷程。 經過人們不斷的嘗試,誕生了許多有
機器學習筆記(十七):TensorFlow實戰九(經典卷積神經網路:ResNet)
1 - 引言 我們可以看到CNN經典模型的發展從 LeNet -5、AlexNet、VGG、再到Inception,模型的層數和複雜程度都有著明顯的提高,有些網路層數更是達到100多層。但是當神經網路的層數過高時,這些神經網路會變得更加難以訓練。 一個特別大的麻煩就在於訓練的時候會產
機器學習筆記(十六):TensorFlow實戰八(經典卷積神經網路:GoogLeNet)
1 - 引言 GoogLeNet, 在2014年ILSVRC挑戰賽獲得冠軍,將Top5 的錯誤率降低到6.67%. 一個22層的深度網路 論文地址:http://arxiv.org/pdf/1409.4842v1.pdf 題目為:Going deeper with convolu
[TensorFlow深度學習入門]實戰四·邏輯迴歸鳶尾花進行分類(對比均方根誤差與softmax交叉熵誤差區別)
[TensorFlow深度學習入門]實戰四·邏輯迴歸鳶尾花進行分類 問題描述 資料集 鳶尾花資料集下載地址 鳶尾花資料集包含四個特徵和一個標籤。這四個特徵確定了單株鳶尾花的下列植物學特徵: 1、花萼長度 2、花萼寬度 3、花瓣長度 4、花瓣寬度 該標籤確定了鳶尾花品種,
機器學習工程師 - Udacity 癌症檢測深度學習
1.如果你是態度認真的機器學習工程師,你會花很長時間清洗資料。 2.對網路提前訓練完全不同的事物,比從來沒有訓練過的網路可以得到更好的結果。從某種角度講,神經網路內部形成的特徵,與你訓練的圖片型別無關。 3.敏感性與特異性敏感性和特異性
Tensorflow深度學習筆記(二)--BPNN手寫數字識別視覺化
資料集:MNIST 啟用函式:Relu 損失函式:交叉熵 Optimizer:AdamOptimizer 視覺化工具:tensorboad 迭代21epoch,accuracy結果如下: Iter 16,Testing Accuracy: