做者 | 武維
審校 | 蔡芳芳
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模型進行訓練。
爲了減小智能終端上模型文件的大小,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提供了Android開發的示例框架,下面基於AlexNet模型的看花識名APP作一些相應源碼的修改,並編譯生成Android的安裝包:
TensorFlow移動端應用開發API
在Android系統中執行TensorFlow Inference操做,須要調用libandroid_tensorflow_inference_java.jar中的JNI接口,主要接口以下:
總結
本文基於看花識名APP,講解了TensorFlow在Android智能終端中的應用技術。首先回顧了AlexNet模型結構,基於AlexNet的slim模型對Flowers數據進行訓練;對訓練後的CheckPoint數據,進行Freeze和Quantized處理,生成智能終端要用的Inference模型。而後介紹了TensorFlow Android應用開發環境的構建,編譯生成TensorFlow在Android上的動態連接庫以及java開發包;文章最後介紹了Inference API的使用方式。
參考文獻
做者簡介
武維(微信:3381209@qq.com):博士,系統架構師,主要從事大數據,深度學習,雲計算等領域的研發工做。