TensorFlow Mobile for Android

TF標準模型TensorFlow Mobile for Android

本文鏈接:https://blog.csdn.net/leifengpeng/article/details/78754405

在推出Tensorflow(一下簡稱TF)時同時推出了TensorFlow Mobile(手機版和標準電腦版有區別,一下簡稱TFM)對於移動設備上使用深度學習網絡還是有相對的限制,主要是計算性能無法達到。近期google推出了專門針對移動設備上可運行的深度網絡模型簡單版(Tensorflow Lite,一下簡稱TFT),查看其demo效果識別速度確實比較快,但是也有很多限制目前而言,區別如下: 
1 TFT是TFM的進化版,在大多數情況下使用TFT來開發可以減少很多空間,其網絡模型要比TFM要小的多。 
2 TFT目前爲開發預覽版本,沒有涵蓋所有用例,如果有需求還是推薦使用TFM。 
3 TFT目前只支持一組有限的運算符,因此默認情況下並不是所有TF網絡模型都可以運行。而TFM具有更全面的支持功能。

整個過程可分爲3個步驟: 
1 使用現有優秀的網絡模型訓練自己的模型 
2 模型轉換成TFM可識別使用的模型文件 
3 在AndroidStudio進行構建

如何使用現有的網絡模型訓練自己可用的模型? 
這裏使用google訓練好的模型inception-2015-12-05.tgz(該模型在ImageNet比賽中獲得No.1) 
https://storage.googleapis.com/download.tensorflow.org/models/tflite/mobilenet_v1_224_android_quant_2017_11_08.zip 
模型下載需要穿牆。下載好以後新建文件夾retrain存放如新建inception_model 文件夾,這裏手動解壓,正常應該會有這些文件:(文件夾名稱隨意) 
這裏寫圖片描述 
該模型能識別1000個物體類別,性能表現良好,因此選擇該模型進行“遷移學習“

現在開始準備我們需要讓網絡識別的物體數據,如做人臉識別,可以事先採取人臉數據,每個人臉數據圖片不得少於 20 張圖片,格式爲jpg或者png。這裏準備喬布斯照片20張 
這裏寫圖片描述

重點來了,整個文件結構是固定的,有點蛋疼,新建目錄data ,在該文件夾下面在新疆 train 文件夾,在train文件夾下面新建某個具體人臉的文件夾 xxxface,然後具體的人臉數據放在對應的文件夾下面,如下: 
這裏寫圖片描述 
注意:在train下面一級的文件夾名稱必須小寫,不能有中文,文件夾名稱相當於類別標籤。

數據準備完畢後,在retrain文件夾下面新建一個文件夾 bottleneck 該文件夾名稱固定(這裏是由於網絡模型內部結構導致必須如此)

如果有興趣可以把可視化日子保存下來,如上圖的 summaries文件夾就是用來存放日誌的

以上都準備完畢後開始準備重建自己的網絡模型,首先打開cmd命令行窗口,找到在git上clone下來的Tensorflow項目,找到項目中的 ..\ tensorflow\tensorflow\examples\image_retraining\retrain.py 文件,複製該文件路徑到cmd中(這是python腳本因此需要python方式運行),在路徑後面追加參數, 
參數1:–bottleneck_dir ..\ inception_model\retrain\bottleneck (這裏是剛剛新建的空文件夾) 
參數2:–how_many_training_steps 100 (這裏表示訓練次數) 
參數3:–model_dir ..\inception_model (這個表示下載下來的模型存放的文件夾) 
參數4:–summaries_dir ..\inception_model\retrain\summaries (存放可視化模型日誌文件夾) 
參數5:–output_graph ..\inception_model\retrain\myoutput_graph.pb (輸出模型的位置) 
參數6:–output_labels ..\ inception_model\retrain\myoutput_lables.txt (輸出類別標籤位置) 
參數7:–image_dir .. \inception_model\retrain\data\train (存放需要訓練圖片的文件夾地址)

綜上可寫入一個批處理文件中 retarin.bat:

python E:\openSource\Deeplearning\TensorFlow\tensorflow\tensorflow\examples\image_retraining\retrain.py ^
--bottleneck_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\bottleneck ^
--how_many_training_steps 100 ^
--model_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model ^
--summaries_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\summaries ^
--output_graph E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\myoutput_graph.pb ^
--output_labels E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\myoutput_lables.txt ^
--image_dir E:\workSpace\pythonWorkSpace\tensorflow\src\inception_model\retrain\data\train ^
pause

執行以上語句,訓練完成後會在指定位置生產適用自己數據的網絡模型 myoutput_graph.pb和myoutput_lables.txt 標籤文件.

可以先在電腦上測試下模型是否正確識別訓練的圖片。

至此學習模型準備完畢。


模型轉換

在電腦上訓練的網絡模型,有些運算在TFM上可能不支持,需要做一些處理,處理步驟如下: 
打開cmd,找到tensorflow項目中的strip_unused.py 腳本文件(..\ tensorflow\tensorflow\python\tools\strip_unused.py),複製該路徑到cmd中,該腳本需要幾個參數。 
參數1:–input_graph=..\inception_model\retrain\myoutput_graph.pb (需要轉換的模型) 
參數2:–output_graph= ..\inception_model\retrain\ my_tfm_output_graph.pb (轉換後存放) 
參數3:–input_node_names=”Mul” (輸入節點的名稱,固定) 
參數4:–output_node_names=”final_result” (輸出節點名稱,固定) 
參數5:–input_binary=true (輸入二進制數據)

執行完以上腳本語句即可進行轉換。


最後構建App應用

打開Android Studio 導入項目 ..\ tensorflow\tensorflow\examples\android 
導入後他會自動進行構建,構建過程會去下載一些數據,如果沒穿牆可能會fail 下載的數據可以在download-models.gradle 文件中看到: 
這裏寫圖片描述 
如果不需要下載這些模型數據可以找到build.gradle文件把 
apply from: “download-models.gradle” 註釋即可。

修改編譯模式,在build.gradle文件中默認編譯工具爲bazel ,如果選擇bazel需要先安裝這個構建工具,這裏選擇cmake方式構建jni文件,修改:

def nativeBuildSystem = 'cmake'
  • 1

接下來把剛剛轉換好的模型和標籤文件放入 項目 assets 文件夾下面:

這裏寫圖片描述

修改org.tensorflow.demo. ClassifierActivity.java頁面(demo識別人口) 
這裏寫圖片描述

把這些屬性修改成以上值,在進行構建,構建成功後可直接運行到移動設備上。 
效果: 
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章