自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深度學(xué)習(xí)利器:TensorFlow在智能終端中的應(yīng)用

人工智能 深度學(xué)習(xí)
本文主要基于看花識(shí)名APP應(yīng)用,講解TensorFlow模型如何應(yīng)用于Android系統(tǒng);在服務(wù)器端訓(xùn)練TensorFlow模型,并把模型文件遷移到智能終端;TensorFlow Android開發(fā)環(huán)境構(gòu)建以及應(yīng)用開發(fā)API。

[[204425]]

前言

深度學(xué)習(xí)在圖像處理、語音識(shí)別、自然語言處理領(lǐng)域的應(yīng)用取得了巨大成功,但是它通常在功能強(qiáng)大的服務(wù)器端進(jìn)行運(yùn)算。如果智能手機(jī)通過網(wǎng)絡(luò)遠(yuǎn)程連接服務(wù)器,也可以利用深度學(xué)習(xí)技術(shù),但這樣可能會(huì)很慢,而且只有在設(shè)備處于良好的網(wǎng)絡(luò)連接環(huán)境下才行,這就需要把深度學(xué)習(xí)模型遷移到智能終端。

由于智能終端CPU和內(nèi)存資源有限,為了提高運(yùn)算性能和內(nèi)存利用率,需要對(duì)服務(wù)器端的模型進(jìn)行量化處理并支持低精度算法。TensorFlow版本增加了對(duì)Android、iOS和Raspberry Pi硬件平臺(tái)的支持,允許它在這些設(shè)備上執(zhí)行圖像分類等操作。這樣就可以創(chuàng)建在智能手機(jī)上工作并且不需要云端每時(shí)每刻都支持的機(jī)器學(xué)習(xí)模型,帶來了新的APP。

本文主要基于看花識(shí)名APP應(yīng)用,講解TensorFlow模型如何應(yīng)用于Android系統(tǒng);在服務(wù)器端訓(xùn)練TensorFlow模型,并把模型文件遷移到智能終端;TensorFlow Android開發(fā)環(huán)境構(gòu)建以及應(yīng)用開發(fā)API。

看花識(shí)名APP

使用AlexNet模型、Flowers數(shù)據(jù)以及Android平臺(tái)構(gòu)建了“看花識(shí)名”APP。TensorFlow模型對(duì)五種類型的花數(shù)據(jù)進(jìn)行訓(xùn)練。如下圖所示:

Daisy:雛菊

 

Dandelion:蒲公英 

 

Roses:玫瑰

 

Sunflowers:向日葵 

 

Tulips:郁金香

 

在服務(wù)器上把模型訓(xùn)練好后,把模型文件遷移到Android平臺(tái),在手機(jī)上安裝APP。使用效果如下圖所示,界面上端顯示的是模型識(shí)別的置信度,界面中間是要識(shí)別的花: 

 

TensorFlow模型如何應(yīng)用于看花識(shí)名APP中,主要包括以下幾個(gè)關(guān)鍵步驟:模型選擇和應(yīng)用、模型文件轉(zhuǎn)換以及Android開發(fā)。如下圖所示:

 

 

模型訓(xùn)練及模型文件

本章采用AlexNet模型對(duì)Flowers數(shù)據(jù)進(jìn)行訓(xùn)練。AlexNet在2012取得了ImageNet***成績,top 5準(zhǔn)確率達(dá)到80.2%。這對(duì)于傳統(tǒng)的機(jī)器學(xué)習(xí)分類算法而言,已經(jīng)相當(dāng)出色。模型結(jié)構(gòu)如下: 

本文采用TensorFlow官方Slim(https://github.com/tensorflow/models/tree/master/slim)AlexNet模型進(jìn)行訓(xùn)練。

  • 首先下載Flowers數(shù)據(jù),并轉(zhuǎn)換為TFRecord格式:
  1. DATA_DIR=/tmp/data/flowers 
  2. python download_and_convert_data.py --dataset_name=flowers 
  3.  --dataset_dir="${DATA_DIR}"  
  • 執(zhí)行模型訓(xùn)練,經(jīng)過36618次迭代后,模型精度達(dá)到85%
  1. TRAIN_DIR=/tmp/data/train 
  2. python train_image_classifier.py --train_dir=${TRAIN_DIR}  
  3. --dataset_dir=${DATASET_DIR} --dataset_name=flowers   
  4. --dataset_split_name=train  --model_name=alexnet_v2  
  5.  --preprocessing_name=vgg  
  • 生成Inference Graph的PB文件
  1. python export_inference_graph.py  --alsologtostderr   
  2. --model_name=alexnet_v2  --dataset_name=flowers --dataset_dir=${DATASET_DIR}  
  3.  --output_file=alexnet_v2_inf_graph.pb  
  • 結(jié)合CheckPoint文件和Inference GraphPB文件,生成Freeze Graph的PB文件 
  1. python freeze_graph.py  --input_graph=alexnet_v2_inf_graph.pb  
  2. --input_checkpoint= ${TRAIN_DIR}/model.ckpt-36618  --input_binary=true  
  3. --output_graph=frozen_alexnet_v2.pb --output_node_names=alexnet_v2/fc8/squeezed 
  • 對(duì)Freeze Graph的PB文件進(jìn)行數(shù)據(jù)量化處理,減少模型文件的大小,生成的quantized_alexnet_v2_graph.pb為智能終端中應(yīng)用的模型文件
  1. bazel-bin/tensorflow/tools/graph_transforms/transform_graph   
  2. --in_graph=frozen_alexnet_v2.pb  --outputs="alexnet_v2/fc8/squeezed"  
  3. --out_graph=quantized_alexnet_v2_graph.pb --transforms='add_default_attributes 
  4.  strip_unused_nodes(type=float, shape="1,224,224,3")  remove_nodes(op=Identity,  
  5. op=CheckNumerics) fold_constants(ignore_errors=true)  fold_batch_norms  
  6. fold_old_batch_norms quantize_weights quantize_nodes  
  7.  strip_unused_nodes sort_by_execution_order'  

為了減少智能終端上模型文件的大小,TensorFlow中常用的方法是對(duì)模型文件進(jìn)行量化處理,本文對(duì)AlexNet CheckPoint文件進(jìn)行Freeze和Quantized處理后的文件大小變化如下圖所示: 

 

量化操作的主要思想是在模型的Inference階段采用等價(jià)的8位整數(shù)操作代替32位的浮點(diǎn)數(shù)操作,替換的操作包括:卷積操作、矩陣相乘、激活函數(shù)、池化操作等。量化節(jié)點(diǎn)的輸入、輸出為浮點(diǎn)數(shù),但是內(nèi)部運(yùn)算會(huì)通過量化計(jì)算轉(zhuǎn)換為8位整數(shù)(范圍為0到255)的運(yùn)算,浮點(diǎn)數(shù)和8位量化整數(shù)的對(duì)應(yīng)關(guān)系示例如下圖所示: 

 

量化Relu操作的基本思想如下圖所示:

 

TensorFlow Android應(yīng)用開發(fā)環(huán)境構(gòu)建

在Android系統(tǒng)上使用TensorFlow模型做Inference依賴于兩個(gè)文件libtensorflow_inference.so和libandroid_tensorflow_inference_java.jar。這兩個(gè)文件可以通過下載TensorFlow源代碼后,采用bazel編譯出來,如下所示:

  1. android_sdk_repository(name = "androidsdk", api_level = 23, build_tools_version = "25.0.2", path = "/opt/android",) 
  2. android_ndk_repository(name="androidndk",  path="/opt/android/android-ndk-r12b",  api_level=14)  
  • 編譯libtensorflow_inference.so
  1. bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so   
  2.   --crosstool_top=//external:android/crosstool --host_crosstool_top= 
  3. @bazel_tools//tools/cpp:toolchain --cpu=armeabi-v7a  
  • 編譯libandroid_tensorflow_inference_java.jar
  1. bazel build //tensorflow/contrib/android:android_tensorflow_inference_java 

TensorFlow提供了Android開發(fā)的示例框架,下面基于AlexNet模型的看花識(shí)名APP做一些相應(yīng)源碼的修改,并編譯生成Android的安裝包:

  • 基于AlexNet模型,修改Inference的輸入、輸出的Tensor名稱
  1. private static final String INPUT_NAME = "input"
  2.  
  3. private static final String OUTPUT_NAME = "alexnet_v2/fc8/squeezed" 
  • 放置quantized_alexnet_v2_graph.pb和對(duì)應(yīng)的labels.txt文件到assets目錄下,并修改Android文件路徑
  1. private static final String MODEL_FILE = "file:///android_asset/quantized_alexnet_v2_graph.pb"
  2.  
  3. private static final String LABEL_FILE = "file:///android_asset/labels.txt" 
  • 編譯生成安裝包
  1. bazel build -c opt //tensorflow/examples/android:tensorflow_demo 
  • 拷貝tensorflow_demo.apk到手機(jī)上,并執(zhí)行安裝,太陽花識(shí)別效果如下圖所示:(點(diǎn)擊放大圖像)

 

TensorFlow移動(dòng)端應(yīng)用開發(fā)API

在Android系統(tǒng)中執(zhí)行TensorFlow Inference操作,需要調(diào)用libandroid_tensorflow_inference_java.jar中的JNI接口,主要接口如下:

  • 構(gòu)建TensorFlow Inference對(duì)象,構(gòu)建該對(duì)象時(shí)候會(huì)加載TensorFlow動(dòng)態(tài)鏈接庫libtensorflow_inference.so到系統(tǒng)中;參數(shù)assetManager為android asset管理器;參數(shù)modelFilename為TensorFlow模型文件在android_asset中的路徑。
  1. TensorFlowInferenceInterface inferenceInterface = new 
  2.  
  3. TensorFlowInferenceInterface(assetManager, modelFilename);  
  • 向TensorFlow圖中加載輸入數(shù)據(jù),本App中輸入數(shù)據(jù)為攝像頭截取到的圖片;參數(shù)inputName為TensorFlow Inference中的輸入數(shù)據(jù)Tensor的名稱;參數(shù)floatValues為輸入圖片的像素?cái)?shù)據(jù),進(jìn)行預(yù)處理后的浮點(diǎn)值;[1,inputSize,inputSize,3]為裁剪后圖片的大小,比如1張224*224*3的RGB圖片。
  1. inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3); 
  • 執(zhí)行模型推理; outputNames為TensorFlow Inference模型中要運(yùn)算Tensor的名稱,本APP中為分類的Logist值。
  1. inferenceInterface.run(outputNames); 
  • 獲取模型Inference的運(yùn)算結(jié)果,其中outputName為Tensor名稱,參數(shù)outputs存儲(chǔ)Tensor的運(yùn)算結(jié)果。本APP中,outputs為計(jì)算得到的Logist浮點(diǎn)數(shù)組。
  1. inferenceInterface.fetch(outputName, outputs); 

總結(jié)

本文基于看花識(shí)名APP,講解了TensorFlow在Android智能終端中的應(yīng)用技術(shù)。首先回顧了AlexNet模型結(jié)構(gòu),基于AlexNet的slim模型對(duì)Flowers數(shù)據(jù)進(jìn)行訓(xùn)練;對(duì)訓(xùn)練后的CheckPoint數(shù)據(jù),進(jìn)行Freeze和Quantized處理,生成智能終端要用的Inference模型。然后介紹了TensorFlow Android應(yīng)用開發(fā)環(huán)境的構(gòu)建,編譯生成TensorFlow在Android上的動(dòng)態(tài)鏈接庫以及java開發(fā)包;文章***介紹了Inference API的使用方式。

參考文獻(xiàn)

 

責(zé)任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2017-08-16 10:57:52

深度學(xué)習(xí)TensorFlowNLP

2017-09-06 14:56:09

深度學(xué)習(xí)CTR應(yīng)用

2018-09-06 08:00:00

深度學(xué)習(xí)TensorFlowPython

2022-11-13 08:11:03

TensorFlow人工智能開源

2016-12-23 09:09:54

TensorFlowKubernetes框架

2017-04-24 14:09:13

深度學(xué)習(xí)TensorFlow

2017-05-03 22:05:48

深度學(xué)習(xí)候選采樣深度學(xué)習(xí)庫

2017-04-10 16:15:55

人工智能深度學(xué)習(xí)應(yīng)用

2017-02-20 19:23:13

2017-12-01 15:24:04

TensorFlow深度學(xué)習(xí)教程

2022-11-29 21:00:39

技術(shù)搜索

2021-07-29 09:55:40

人工智能AI深度學(xué)習(xí)

2021-02-02 10:08:17

AI深度強(qiáng)化學(xué)習(xí)智能城市

2017-05-22 13:15:45

TensorFlow深度學(xué)習(xí)

2018-01-04 15:50:44

深度學(xué)習(xí)自然語言機(jī)器學(xué)習(xí)

2022-05-12 08:32:25

JavaArthas阿爾薩斯

2023-03-28 15:21:54

深度學(xué)習(xí)計(jì)算機(jī)視覺

2018-09-04 08:00:00

人工智能深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)

2017-02-09 18:26:41

智能谷歌開發(fā)

2017-11-27 17:29:43

深度學(xué)習(xí)TensorFlow安卓設(shè)備
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)