當前位置:
首頁 > 知識 > Android端運行Tensorflow的demo去分類自己的數據集

Android端運行Tensorflow的demo去分類自己的數據集

畢業設計用到了tensorflow, 最近在看其github庫時發現tf 可以在手機上運行。 官方的鏈接

於是就按照官方的教程用Bazel 編譯 Tensorflow 環境,並參考這一篇教程, 訓練一個分類自己數據集合的模型(fine tuning Inception net)並把它部署在了安卓手機上。

結果如下:

Android端運行Tensorflow的demo去分類自己的數據集

下面我會介紹下如何實現此操作。

實驗環境

Ubuntu 16.04 LTS (Win10 也可以,但前提是Bazel 要成功地安裝,並且版本在4.5以上)

Tensorflow 1.0 (此時的tf版本已經更新到了1.2)

安卓手機(魅族)

配置環境

1,安裝Bazel

這個可以參考官方教程。Ubuntu 安裝Bazel 很方便, 但建議先安裝和配置Java

1.1 安裝Java 8 你可以參考這個教程

1.2 以此執行如下命令:

echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install bazel
sudo apt-get upgrade bazel

注意一定要注意Bazel 的版本. 輸入 bazel version 去檢驗。

Android端運行Tensorflow的demo去分類自己的數據集

2, 下載Tensorflow源碼和 Android studio 以及 Android ndk, 運行官方的demo

2.1 下載tensorflow (事先安裝好git工具,否則 cmd 輸入 sudo apt-get install git )

cmd下輸入

git clone https://github.com/tensorflow/tensorflow

注意用 git checkout origin/r1.0 切換到版本1.0 (也可以不執行此操作但是有一點不同的地方,在文章末尾指明)

2.2 下載 Android studio 和Android ndk

注意sdk 的版本要在23.0.3以上,最好是24或 25。 (最新的是25.0.3)用Android studio 裡面自帶的 SDK manager 更新下SDK的版本。

ndk 可以到官方網站下載。 以下是下載結果。下載後解壓。

Android端運行Tensorflow的demo去分類自己的數據集

2.3 配置tensorflow代碼根目錄下的 WORKSPACE文件

取消注釋,修改你對應的sdk和ndk的版本號以及path

# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
name = "androidsdk",
api_level = 25,
build_tools_version = "25.0.3",
# Replace with path to Android SDK on your system
path = "/home/lxt-bupt/Android/Sdk", #
)
#
android_ndk_repository(
name="androidndk",
path="/home/lxt-bupt/Android/android-ndk-r12b",#
api_level=21)

3 用Bazel 編譯Tensorflow 的Android 環境在編譯之前,先下載和解壓 demo的model文件(Imagenet dataset訓練出來的)

curl -L https://storage.googleapis.com/download.tensorflow.org/models/inception5h.zip -o /tmp/inception5h.zip
curl -L https://storage.googleapis.com/download.tensorflow.org/models/mobile_multibox_v1.zip -o /tmp/mobile_multibox_v1.zip
unzip /tmp/inception5h.zip -d tensorflow/examples/android/assets/
unzip /tmp/mobile_multibox_v1.zip -d tensorflow/examples/android/assets/

然後運行

bazel build -c opt //tensorflow/examples/android:tensorflow_demo

運行時報protocol 的錯誤時,運行 git submodule update --init 命令,重新編譯。

這個編譯時間很長,期間會出現很多的warning 如果成功的話,會得出如下結果。

Android端運行Tensorflow的demo去分類自己的數據集

此時在tensorflow代碼根目錄/bazel-bin/tensorflow/examples/android下,會有 tensorflow_demo.apk 此時可以把該文件移動到手機上安裝,

會有3個app 生成如下圖, 這3個app就是tensorflow 官方的demo。分別用於分類,檢測,和更改圖片的風格。

Android端運行Tensorflow的demo去分類自己的數據集

3,用自己的數據finetuning Inception模型。

1,準備自己的數據。

自己的數據集有5個類別, 可樂,雪碧,芬達,農夫山泉,怡寶, 新建立一個data目錄

Android端運行Tensorflow的demo去分類自己的數據集

2,Bazel 編譯retrain 模塊

在根目錄下輸入:

bazel build tensorflow/examples/image_retraining:retrain

編譯時間很長,耐心等待, 注意可能要安裝一些Python的依賴庫numpy mock 等等

3, 訓練自己的模型

在tensorflow根目錄下新建model目錄(存放訓練後的模型)和retrain_logs目錄(記錄訓練過程,以便於用tensorboard可視化),接著輸入如下命令:

note: 還有其他的參數可以選擇,可以看 tensorflow/examples/image_retraining/retrain.py 文件中有哪些可以選取.

bazel-bin/tensorflow/examples/image_retraining/retrain
--bottleneck_dir=./model/bottlenecks
--how_many_training_steps 4000
--model_dir=./model/inception
--output_graph=./model/retrained_graph.pb
--output_labels=./model/retrained_labels.txt
--image_dir ./data/
--summaries_dir ./retrain_logs/

開始了訓練過程(先創建bottlenecks,再開始訓練4000次迭代,注意圖片格式是jpeg,否則會報錯)

Android端運行Tensorflow的demo去分類自己的數據集

訓練完畢後會在model目錄下有retrained_graph.pb (模型) 和 retrain_labels.txt (標籤) 兩個文件

Android端運行Tensorflow的demo去分類自己的數據集

4,優化和測試模型

必須要進行如下build操作, 在根目錄依次輸入如下Bazel命令: (依然是漫長的等待過程)

bazel build tensorflow/python/tools:optimize_for_inference
bazel build tensorflow/examples/label_image:label_image

4.1 優化模型

在根目錄下輸入如下命令:

bazel-bin/tensorflow/python/tools/optimize_for_inference
--input=./model/retrained_graph.pb
--output=./model/optimized_graph.pb
--input_names=Mul
--output_names=final_result

4.2用優化後的模型測試圖片

取一張可樂的圖片放到model目錄下測試,輸入如下命令: 你也可以測試其他的圖片:)

bazel-bin/tensorflow/examples/label_image/label_image
--output_layer=final_result
--labels=./model/retrained_labels.txt
--image=./model/img28.jpg
--graph=./model/optimized_graph.pb

結果如下圖:

Android端運行Tensorflow的demo去分類自己的數據集

4.3 修改相關的java文件, /tensorflow/tensorflow/examples/android/src/org/tensorflow/demo 目錄下的ClassifierActivity.java文件

修改相關行

按照下圖去每個值的大小:

Android端運行Tensorflow的demo去分類自己的數據集

並把上述兩個文件移(optimized_graph.pb 和 retrained_labels.txt)動到 /tensorflow/tensorflow/examples/android/assets 目錄下

5,部署模型到安卓手機

5.1 重新編譯Android 環境

根目錄輸入:

bazel build -c opt //tensorflow/examples/android:tensorflow_demo

Android端運行Tensorflow的demo去分類自己的數據集

5.2 把新的apk文件放到安卓手機上安裝,最後運行tf_classify ,效果如下圖

Android端運行Tensorflow的demo去分類自己的數據集

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Vue + ElementUI 後台管理網站基本框架之創建項目(附源碼)
Ajax跨域問題詳解

TAG:程序員小新人學習 |