作者 | 武維
審校 | 蔡芳芳
AI前線出品| ID:ai-front
前言
深度學習在影象處理、語音識別、自然語言處理領域的應用取得了巨大成功,但是它通常在功能強大的伺服器端進行運算。如果智慧手機通過網路遠端連線伺服器,也可以利用深度學習技術,但這樣可能會很慢,而且只有在裝置處於良好的網路連線環境下才行,這就需要把深度學習模型遷移到智慧終端。
由於智慧終端CPU和記憶體資源有限,為了提高運算效能和記憶體利用率,需要對伺服器端的模型進行量化處理並支援低精度演算法。TensorFlow版本增加了對Android、iOS和Raspberry Pi硬體平臺的支援,允許它在這些裝置上執行影象分類等操作。這樣就可以建立在智慧手機上工作並且不需要雲端每時每刻都支援的機器學習模型,帶來了新的APP。
本文主要基於看花識名APP應用,講解TensorFlow模型如何應用於Android系統;在伺服器端訓練TensorFlow模型,並把模型檔案遷移到智慧終端;TensorFlow Android開發環境構建以及應用開發API。
看花識名APP
使用AlexNet模型、Flowers資料以及Android平臺構建了“看花識名”APP。TensorFlow模型對五種型別的花資料進行訓練。如下圖所示:
Daisy:雛菊
Dandelion:蒲公英
Roses:玫瑰
Sunflowers:向日葵
Tulips:鬱金香
在伺服器上把模型訓練好後,把模型檔案遷移到Android平臺,在手機上安裝APP。使用效果如下圖所示,介面上端顯示的是模型識別的置信度,介面中間是要識別的花:
TensorFlow模型如何應用於看花識名APP中,主要包括以下幾個關鍵步驟:模型選擇和應用、模型檔案轉換以及Android開發。如下圖所示:
模型訓練及模型檔案
本章採用AlexNet模型對Flowers資料進行訓練。AlexNet在2012取得了ImageNet最好成績,top 5準確率達到80.2%。這對於傳統的機器學習分類演算法而言,已經相當出色。模型結構如下:
本文采用TensorFlow官方Slim(https://github.com/tensorflow/models/tree/master/slim)AlexNet模型進行訓練。
- 首先下載Flowers資料,並轉換為TFRecord格式:
- 執行模型訓練,經過36618次迭代後,模型精度達到85%
- 生成Inference Graph的PB檔案
- 結合CheckPoint檔案和Inference GraphPB檔案,生成Freeze Graph的PB檔案
- 對Freeze Graph的PB檔案進行資料量化處理,減少模型檔案的大小,生成的quantized_alexnet_v2_graph.pb為智慧終端中應用的模型檔案
為了減少智慧終端上模型檔案的大小,TensorFlow中常用的方法是對模型檔案進行量化處理,本文對AlexNet CheckPoint檔案進行Freeze和Quantized處理後的檔案大小變化如下圖所示:
量化操作的主要思想是在模型的Inference階段採用等價的8位整數操作代替32位的浮點數操作,替換的操作包括:卷積操作、矩陣相乘、啟用函式、池化操作等。量化節點的輸入、輸出為浮點數,但是內部運算會通過量化計算轉換為8位整數(範圍為0到255)的運算,浮點數和8位量化整數的對應關係示例如下圖所示:
量化Relu操作的基本思想如下圖所示:
TensorFlow Android應用開發環境構建
在Android系統上使用TensorFlow模型做Inference依賴於兩個檔案libtensorflow_inference.so和libandroid_tensorflow_inference_java.jar。這兩個檔案可以通過下載TensorFlow原始碼後,採用bazel編譯出來,如下所示:
- 下載TensorFlow原始碼git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
- 下載安裝Android NDK
- 下載安裝Android SDK
- 配置tensorflow/WORKSPACE中android開發工具路徑
- 編譯libtensorflow_inference.so
- 編譯libandroid_tensorflow_inference_java.jar
TensorFlow提供了Android開發的示例框架,下面基於AlexNet模型的看花識名APP做一些相應原始碼的修改,並編譯生成Android的安裝包:
- 基於AlexNet模型,修改Inference的輸入、輸出的Tensor名稱
- 放置quantized_alexnet_v2_graph.pb和對應的labels.txt檔案到assets目錄下,並修改Android檔案路徑
- 編譯生成安裝包
- 拷貝tensorflow_demo.apk到手機上,並執行安裝,太陽花識別效果如下圖所示:
TensorFlow移動端應用開發API
在Android系統中執行TensorFlow Inference操作,需要呼叫libandroid_tensorflow_inference_java.jar中的JNI介面,主要介面如下:
- 構建TensorFlow Inference物件,構建該物件時候會載入TensorFlow動態連結庫libtensorflow_inference.so到系統中;引數assetManager為android asset管理器;引數modelFilename為TensorFlow模型檔案在android_asset中的路徑。
- 向TensorFlow圖中載入輸入資料,本App中輸入資料為攝像頭擷取到的圖片;引數inputName為TensorFlow Inference中的輸入資料Tensor的名稱;引數floatValues為輸入圖片的畫素資料,進行預處理後的浮點值;[1,inputSize,inputSize,3]為裁剪後圖片的大小,比如1張224*224*3的RGB圖片。
- 執行模型推理; outputNames為TensorFlow Inference模型中要運算Tensor的名稱,本APP中為分類的Logist值。
- 獲取模型Inference的運算結果,其中outputName為Tensor名稱,引數outputs儲存Tensor的運算結果。本APP中,outputs為計算得到的Logist浮點陣列。
總結
本文基於看花識名APP,講解了TensorFlow在Android智慧終端中的應用技術。首先回顧了AlexNet模型結構,基於AlexNet的slim模型對Flowers資料進行訓練;對訓練後的CheckPoint資料,進行Freeze和Quantized處理,生成智慧終端要用的Inference模型。然後介紹了TensorFlow Android應用開發環境的構建,編譯生成TensorFlow在Android上的動態連結庫以及java開發包;文章最後介紹了Inference API的使用方式。
參考文獻
- http://www.tensorflow.org
- 深度學習利器:分散式TensorFlow及例項分析
- 深度學習利器:TensorFlow使用實戰
- 深度學習利器:TensorFlow系統架構與高效能程式設計
- 深度學習利器:TensorFlow與深度卷積神經網路
- 深度學習利器:TensorFlow與NLP模型
作者簡介
武維(微信:3381209@qq.com):博士,系統架構師,主要從事大資料,深度學習,雲端計算等領域的研發工作。