1. 程式人生 > >TF標準模型TensorFlow Mobile for Android

TF標準模型TensorFlow Mobile for Android

在推出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'

接下來把剛剛轉換好的模型和標籤檔案放入 專案 assets 資料夾下面:

這裡寫圖片描述

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

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