AutoML Vision 的雲與端 Part 2:補充在 TensorFlow 內進行 inference 的方法

栏目: 数据库 · 发布时间: 6年前

Source: Deep Learning on Medium

在上一篇中我們談到 AutoML Vision Edge 匯出的模型可以分別使用 Container (CPU / GPU)、TPU,以及雲端 API 來進行推論。但這幾個方法都是使用包裝好的 container image 或套件。如果我們不能 (或不想) 使用 container、沒有 TPU、沒有網路,但是卻有 GPU 可使用 (例如 Jetson Nano) 時,那麼在 TensorFlow 內執行 inference 就是一個方案。本篇文章也一併介紹 saved_model_cli.py 這個方便的指令,讓我們可以快速地了解 Saved_Model.pb 內所包含的資訊。

下載 Saved_Model.pb

首先到 EDGE DEVICES 內,選擇 TensorFlow (Recommended for GPU-based devices)。檔案會儲存到 GCS 內,直接到 GCS 頁面內將模型檔案下載到本機即可。

AutoML Vision 的雲與端 Part 2:補充在 TensorFlow 內進行 inference 的方法

安裝並使用 saved_model_cli.py 工具

接著使用在 Tensorflow 套件內的 saved_model_cli.py 工具,需要先 git clone TensorFlow 才能使用。

$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow/tensorflow/python/tools

接著執行 saved_model_cli.py show 指令,可分別取得 tag-sets、singature_def 等資訊,如下例。有了這些資訊,我們就知道如何使用這個模型。

備註:SAVED_MODEL_DIR 為模型檔案儲存的路徑。

取得我們要使用的 meta graph 的標籤,透過以下指令知道這個模型只有一個 serve (也是 tensorflow.python.saved_model.tag_constants.SERVING 的預設值)。

$ saved_model_cli.py show \
 --dir {SAVED_MODEL_DIR}
serve

接著,為了取得要使用的 tensor 名稱 (才知道 input node 跟 output node),需要先知道目前有幾種 SignatureDef。透過以下指令知道,目前只有 serving_default 這個定義。

$ saved_model_cli.py show \
 --dir {SAVED_MODEL_DIR} \
 --tag_set serve
The given SavedModel MetaGraphDef contains SignatureDefs with the following keys:
SignatureDef key: "serving_default"

最後,透過已知的 tag_set 以及 singature_def 來獲取 input 跟 output 的可能性。

$ saved_model_cli.py show \
 --dir {SAVED_MODEL_DIR} \
 --tag_set serve \
 --signature_def serving_default
The given SavedModel SignatureDef contains the following input(s):
 inputs['image_bytes'] tensor_info:
 dtype: DT_STRING
 shape: (-1)
 name: Placeholder:0
 inputs['key'] tensor_info:
 dtype: DT_STRING
 shape: (-1)
 name: Placeholder_1:0
The given SavedModel SignatureDef contains the following output(s):
 outputs['key'] tensor_info:
 dtype: DT_STRING
 shape: (-1)
 name: Identity:0
 outputs['labels'] tensor_info:
 dtype: DT_STRING
 shape: (-1, 2)
 name: Tile:0
 outputs['scores'] tensor_info:
 dtype: DT_FLOAT
 shape: (-1, 2)
 name: scores:0
Method name is: tensorflow/serving/predict

由以上執行結果可以知道,輸入有兩個選擇,分別是 image_bytes 以及 key。而輸出則有 key、labels 和 scores。在此我們輸入使用 image_bytes 這個 input (Tensor name 是 Placeholder:0),輸出就用 scores (Tensor name 是 scores:0) 在我們的程式碼當中。

使用 TensorFlow 進行推論

接著我們建立以下的程式碼,即可對 cat1.jpg 進行預測。

import tensorflow as tf
from tensorflow.python.saved_model import tag_constants
sess = tf.Session()
tf.saved_model.loader.load(sess, [tag_constants.SERVING], SAVED_MODEL_DIR)
output_tensor = tf.get_default_graph().get_tensor_by_name("scores:0")
sess.run([tf.global_variables_initializer(), tf.local_variables_initializer()])
data = tf.gfile.FastGFile('./cat1.jpg', 'rb').read()
output = sess.run(output_tensor, feed_dict = {'Placeholder:0': [data]})
print(output)

執行後輸出結果如下,可看到第一類 (貓) 的百分比為 98.1%。預測結果正確!

[[0.9819572 0.01804277]]

若想知道每一個 nodes 的 label 名稱,只要輸出 Tile:0 的結果即可。

[[b'Cat b'Dog']]

這篇文章嘗試了 Container、TPU 之外的另外一種寫法。其實本來是想直上 TensorRT,但過程不太順利,有太多特別的 Op 無法轉換跟執行。若是有人可以分享成功經驗,那就太感謝了。在此之前就先用這個方法頂著用吧。

另外要注意到,輸入的檔案大小會影響效能! 以目前所使用的範例檔案 (大約 50KB) 大約可以跑 20fps,但是換成另一個範例檔案 (大約 1.2MB) 就剩下 2fps。因為這個 model 是直接給 raw file,所有前處理都在 model 裡面做。所以為了執行效能,也許先將圖檔做某個程度的壓縮可能比較有助於效能提昇。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java技术手册(第6版)

Java技术手册(第6版)

Benjamin J Evans、David Flanagan / 安道 / 人民邮电出版社 / 2015-12-1 / 79.00

《Java技术手册 第6版》为《Java 技术手册》的升级版,涵盖全新的Java 7 和Java 8。第1部分介绍Java 编程语言和Java 平台,主要内容有Java 环境、Java 基本句法、Java 面向对象编程、Java 类型系统、Java的面向对象设计、Java 实现内存管理和并发编程的方式。第2部分通过大量示例来阐述如何在Java 环境中完成实际的编程任务,主要内容有编程和文档约定,使......一起来看看 《Java技术手册(第6版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具