1. 程式人生 > >Tensorflow object detection API 搭建屬於自己的物體識別模型(3)——將自己的模型遷移到手機上執行

Tensorflow object detection API 搭建屬於自己的物體識別模型(3)——將自己的模型遷移到手機上執行

上一篇部落格中介紹瞭如何使用Tensorflow object detection API 搭建屬於自己的物體識別模型(https://blog.csdn.net/dy_guox/article/details/79111949),由於我們的模型是基於ssd_mobilenet訓練,這個模型本身是相對較為輕量級的,也可以在手機上使用,因此,這篇部落格將介紹如何將Tensorflow object detection API 訓練的模型遷移匯入到手機中使用。

首先需要確認,已經訓練好了自己的模型(以 .pb結尾)。即在object_detection\tv_vehicle_inference_graph資料夾下的 frozen_inference_graph.pb 檔案。接下來將以我在視訊教程中的例子(檢測武大靖)進行示範。(參考之前部落格教程的視訊地址:

https://www.bilibili.com/video/av21539370/

首先,將 frozen_inference_graph.pb 檔案重新命名為 WDJ_frozen_inference_graph.pb, 這樣便於跟其他模型區分開來。

我的測試將在Android系統進行,IOS系統沒有測試。

執行效果視訊:

如果你覺得有點幫助,歡迎投幣支援。

1、安裝配置 TensorFlow on Android

上述網址有詳細的教程,考慮到國內可能被牆,繼續重複一遍。

首先先根據提示把Demo跑起來,後面的工作在此基礎上進行。

去官網下載安裝即可。

2)在Github上 clone TensorFlow 

如果電腦上安裝了Git,那麼在特定目錄下,執行git 命令

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

如果連Git都沒有,那就到

右上方綠色“clone or download”下載 zip到本地,解壓。

3)搭建 Android Studio環境

開啟Android Studio,選擇 “Open an existing Android Studio project”,在“Open File or Project”,選擇在2)中對應的 tensorflow/examples/android 資料夾,OK。如果需要“Gradle Sync”,選擇OK。第一次啟動可能需要安裝或更新很多模組,耐心等待。

4) 在 build.gradle

檔案中(在左側 1:Project 面板  Android 下面 Gradle Scripts ),找到  nativeBuildSystem 這個變數,設定等於 “none”:

// set to 'bazel', 'cmake', 'makefile', 'none'def nativeBuildSystem ='none'

5) 點選上方選單 Run -> Run 'android'  命令, 在彈出選單選擇 右側的 Proceed Without Instant Run。

6)同時,開啟手機的開發者模式與USB除錯,用USB連線電腦。不同手機方法不同,自行百度。

成功連線後執行命令時會識別對應手機型號,選擇後繼續,將會在手機上安裝4個不同的APP,期間注意檢視手機,允許安裝(預設會拒絕)。

7)4個不同APP有不同的功能,大概就是深度學習的幾個重要的研究方向:

TF Classify. 物體識別,識別圖中有什麼物體;


TF Detect. 物體檢測,除了識別有什麼物體,還能檢測物體的位置,跟上一篇部落格的目的一致,也是本部落格模型遷移的目標;


TF Stylize. 實時風格變換,將攝像頭拍攝到的圖片自動轉換成不同的風格,類似前段時間很火的模仿梵高作畫;


TF Speech. 選擇單詞說出來,軟體能識別。


Demo視訊如下:

2.配置模型

1)將之前訓練好的識別武大靖的模型 WDJ_frozen_inference_graph.pb 放在 Android資料夾中的 assets 

資料夾下。

2)繼續在當前資料夾下,能發現數個 ‘...labels.txt’ 檔案,複製其中任意一個,重新命名為 “WDJ_labels.txt”用於儲存標籤,名字隨意起,只要你自己能理解就行。開啟 “WDJ_labels.txt”,建議用 Sublime Text,直接用記事本開啟所有標籤會擠在同一行。在Sublime text中,發現第一行是“???”,不用管,後面每一行是一個標籤,由於我的任務只有一個,就是“WDJ”,注意標籤跟之前訓練模型時候保持一致。儲存退出。

3) 查詢 “DetectorActivity.java”檔案,用Sublime text 開啟,找到 TF_OD_API_MODEL_FILE 與 TF_OD_API_LABELS_FILE 這兩個變數,前一個改成自己模型的路徑,如  ".../assets/WDJ_frozen_inference_graph.pb",後一個改成標籤 .txt檔案的路徑,如 “.../assets/WDJ_labels.txt

4 )“DetectorActivity.java” 檔案中  MINIMUM_CONFIDENCE_TF_OD_API  變數,決定最低多少置信度畫識別的框,如果發現移植到手機上的模型效果不理想,可以把這個值調低,就會更容易識別出物體(但是也更容易誤識別),根據自己的實際執行效果測試修改。

3. Run 

跟第1步中一樣的執行步驟,等待安裝。完成後在手機上開啟 TF Detect ,發現跟Demo不一樣了(我們不一樣!)。

具體效果視訊:




當然,因為之前的模型訓練的效果就很一般,所以在手機上的效果也是半斤八兩甚至還要差,但是至少能跑了。對比之前視訊裡的效果,這樣的結果也在預期之內,如果想追求完美,那就多訓練資料,用更好的模型,比如mobile net V2,這就有待讀者自己探索了。

參考資料:

https://towardsdatascience.com/detecting-pikachu-on-android-using-tensorflow-object-detection-15464c7a60cd

https://www.tensorflow.org/mobile/android_build