深度學習利器:TensorFlow在智能終端中的應用

做者 | 武維
審校 | 蔡芳芳
AI前線出品| ID:ai-front


前言html

深度學習在圖像處理、語音識別、天然語言處理領域的應用取得了巨大成功,可是它一般在功能強大的服務器端進行運算。若是智能手機經過網絡遠程鏈接服務器,也能夠利用深度學習技術,但這樣可能會很慢,並且只有在設備處於良好的網絡鏈接環境下才行,這就須要把深度學習模型遷移到智能終端。java

因爲智能終端CPU和內存資源有限,爲了提升運算性能和內存利用率,須要對服務器端的模型進行量化處理並支持低精度算法。TensorFlow版本增長了對Android、iOS和Raspberry Pi硬件平臺的支持,容許它在這些設備上執行圖像分類等操做。這樣就能夠建立在智能手機上工做而且不須要雲端每時每刻都支持的機器學習模型,帶來了新的APP。android

本文主要基於看花識名APP應用,講解TensorFlow模型如何應用於Android系統;在服務器端訓練TensorFlow模型,並把模型文件遷移到智能終端;TensorFlow Android開發環境構建以及應用開發API。git


看花識名APPgithub

使用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編譯出來,以下所示:

  • 編譯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的使用方式。


參考文獻

  1. http://www.tensorflow.org
  2. 深度學習利器:分佈式TensorFlow及實例分析
  3. 深度學習利器:TensorFlow使用實戰
  4. 深度學習利器:TensorFlow系統架構與高性能程序設計
  5. 深度學習利器:TensorFlow與深度卷積神經網絡
  6. 深度學習利器:TensorFlow與NLP模型


做者簡介

武維(微信:3381209@qq.com):博士,系統架構師,主要從事大數據,深度學習,雲計算等領域的研發工做。

相關文章
相關標籤/搜索