前言
- TensorFlow是谷歌研發(fā)的第二代人工智能學習系統(tǒng),其命名來源于本身的運行原理。
- Tensor(張量)意味著N維數(shù)組,F(xiàn)low(流)意味著基于數(shù)據(jù)流圖的計算,TensorFlow為張量從流圖的一端流動到另一端計算過程。
- TensorFlow是將復雜的數(shù)據(jù)結(jié)構(gòu)傳輸至人工智能神經(jīng)網(wǎng)中進行分析和處理過程的系統(tǒng)。
TensorFlow Android
- tensorflow對android和ios平臺都做了適配
- android:tensorflow/tensorflow/examples/android/
- Demo中使用的camera2 Api支持需要5.0及以上系統(tǒng)
- tensorflow lib 支持android 4.0 及以上版本
- ios : tensorflow/tensorflow/examples/ios/
- 需要xcode 7.3
TensorFlow 大概執(zhí)行過程
tensorFlow執(zhí)行過程圖
- Session 計算模型的執(zhí)行環(huán)境
- Graph 計算模型
- Tensor 計算過程中傳遞數(shù)據(jù)的結(jié)構(gòu)
- feed、fetch輸入和輸出數(shù)據(jù)
編譯
首先用Android Studio打開目錄tensorflow/tree/master/tensorflow/examples/android
-
修改build.gradle
- def nativeBuildSystem = 'none'
- 把nativeBuildSystem的值改為none, 這樣就不會本地編譯tensorflow庫,而是直接用TensorFlow AAR from JCenter
- 修改build.gradle和download-models.gradle文件中所有的jcenter()為jcenter { url "http://jcenter.bintray.com" } 目的是從jcenter的http地址下載相關(guān)aar包。
下載模型文件并放到gradleBuild/downloads下面, 直接用gradle task downloadFile下載模型文件會超時,因為地址是https的。
-
打開download-models.gradle文件
https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip https://storage.googleapis.com/download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_android_export.zip https://storage.googleapis.com/download.tensorflow.org/models/stylize_v1.zip https://storage.googleapis.com/download.tensorflow.org/models/speech_commands_conv_actions.zip
- 直接下載上面的4個文件, url地址就是MODEL_URL和文件名的拼接, 下載完后放到gradleBuild/downloads
- 在工程目錄下新建libs文件夾,添加libtensorflow_demo.so等文件
把libtensorflow_demo.so 文件復制過來。這樣就不需要自己編譯jni庫了
android中使用TensorFlow
- 引入依賴
compile 'org.tensorflow:tensorflow-android:+'
- 復制PB文件
快速開發(fā)的話直接把PB文件放在assets文件夾里就行,如果正式上線的時候覺得PB文件 一起打包較大的話可以放在服務器,打開APP的時候提示下載再復制進去就好。
- 載入TensorFlow
System.loadLibrary("tensorflow_inference");
- 初始化模型
TensorFlowInferenceInterface inferenceInterface = new TensorFlowInferenceInterface(context.getAssets(),"rounded_graph.pb");
- 設置入?yún)?br>
inferenceInterface.feed();
- 執(zhí)行session
inferenceInterface.run();
- 獲取輸出數(shù)據(jù)
inferenceInterface.fetch();
- 輸出數(shù)據(jù)變換
fetch方法的接受變量的參數(shù)類型只有double、float、int、byte,如果有其他類型可以通過byte[]接收,然后自己解析成想要的數(shù)據(jù)類型
TensorFlow Android demo效果
demo效果