當前位置:
首頁 > 知識 > 深度學習利器:TensorFlow在智能終端中的應用

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

作者:武維

前言

深度學習在圖像處理、語音識別、自然語言處理領域的應用取得了巨大成功,但是它通常在功能強大的伺服器端進行運算。如果智能手機通過網路遠程連接伺服器,也可以利用深度學習技術,但這樣可能會很慢,而且只有在設備處於良好的網路連接環境下才行,這就需要把深度學習模型遷移到智能終端。

由於智能終端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格式:DATA_DIR=/tmp/data/flowers python download_and_convert_data.py --dataset_name=flowers --dataset_dir="$"

執行模型訓練,經過36618次迭代後,模型精度達到85%TRAIN_DIR=/tmp/data/train python train_image_classifier.py --train_dir=$ --dataset_dir=$ --dataset_name=flowers --dataset_split_name=train --model_name=alexnet_v2 --preprocessing_name=vgg

生成Inference Graph的PB文件python export_inference_graph.py --alsologtostderr --model_name=alexnet_v2 --dataset_name=flowers --dataset_dir=$ --output_file=alexnet_v2_inf_graph.pb

結合CheckPoint文件和Inference GraphPB文件,生成Freeze Graph的PB文件python freeze_graph.py --input_graph=alexnet_v2_inf_graph.pb --input_checkpoint= $/model.ckpt-36618 --input_binary=true --output_graph=frozen_alexnet_v2.pb --output_node_names=alexnet_v2/fc8/squeezed

對Freeze Graph的PB文件進行數據量化處理,減少模型文件的大小,生成的quantized_alexnet_v2_graph.pb為智能終端中應用的模型文件bazel-bin/tensorflow/tools/graph_transforms/transform_graph --in_graph=frozen_alexnet_v2.pb --outputs="alexnet_v2/fc8/squeezed" --out_graph=quantized_alexnet_v2_graph.pb --transforms='add_default_attributes strip_unused_nodes(type=float, shape="1,224,224,3") remove_nodes(op=Identity, op=CheckNumerics) fold_constants(ignore_errors=true) fold_batch_norms fold_old_batch_norms quantize_weights quantize_nodes strip_unused_nodes sort_by_execution_order'

為了減少智能終端上模型文件的大小,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開發工具路徑android_sdk_repository(name = "androidsdk", api_level = 23, build_tools_version = "25.0.2", path = "/opt/android",) android_ndk_repository(name="androidndk", path="/opt/android/android-ndk-r12b", api_level=14)

編譯libtensorflow_inference.sobazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so --crosstool_top=//external:android/crosstool --host_crosstool_top= @bazel_tools//tools/cpp:toolchain --cpu=armeabi-v7a

TensorFlow提供了Android開發的示例框架,下面基於AlexNet模型的看花識名APP做一些相應源碼的修改,並編譯生成Android的安裝包:

基於AlexNet模型,修改Inference的輸入、輸出的Tensor名稱private static final String INPUT_NAME = "input"; private static final String OUTPUT_NAME = "alexnet_v2/fc8/squeezed";

放置quantized_alexnet_v2_graph.pb和對應的labels.txt文件到assets目錄下,並修改Android文件路徑private static final String MODEL_FILE = "file:///android_asset/quantized_alexnet_v2_graph.pb"; private static final String LABEL_FILE = "file:///android_asset/labels.txt";

拷貝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中的路徑。TensorFlowInferenceInterface inferenceInterface = new TensorFlowInferenceInterface(assetManager, modelFilename);

向TensorFlow圖中載入輸入數據,本App中輸入數據為攝像頭截取到的圖片;參數inputName為TensorFlow Inference中的輸入數據Tensor的名稱;參數floatValues為輸入圖片的像素數據,進行預處理後的浮點值;[1,inputSize,inputSize,3]為裁剪後圖片的大小,比如1張224*224*3的RGB圖片。inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3);

執行模型推理; outputNames為TensorFlow Inference模型中要運算Tensor的名稱,本APP中為分類的Logist值。inferenceInterface.run(outputNames);

獲取模型Inference的運算結果,其中outputName為Tensor名稱,參數outputs存儲Tensor的運算結果。本APP中,outputs為計算得到的Logist浮點數組。inferenceInterface.fetch(outputName, outputs);

總結

本文基於看花識名APP,講解了TensorFlow在Android智能終端中的應用技術。首先回顧了AlexNet模型結構,基於AlexNet的slim模型對Flowers數據進行訓練;對訓練後的CheckPoint數據,進行Freeze和Quantized處理,生成智能終端要用的Inference模型。然後介紹了TensorFlow Android應用開發環境的構建,編譯生成TensorFlow在Android上的動態鏈接庫以及java開發包;文章最後介紹了Inference API的使用方式。

參考文獻

深度學習利器:分散式TensorFlow及實例分析

深度學習利器:TensorFlow使用實戰

深度學習利器:TensorFlow系統架構與高性能程序設計

深度學習利器:TensorFlow與深度卷積神經網路

深度學習利器:TensorFlow與NLP模型

End.

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 36大數據 的精彩文章:

供應鏈管理新玩法:預測分析和機器學習
大數據背後:蘋果中國用戶十年的變遷
大數據的局限性
大數據早報:Google Earth VR新增街景功能 亞馬遜宣布開始徵求新總部投標
17個新手常見Python運行時錯誤

TAG:36大數據 |