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

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

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 裡面做。所以為了執行效能,也許先將圖檔做某個程度的壓縮可能比較有助於效能提昇。


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

查看所有标签

猜你喜欢:

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

C和C++代码精粹

C和C++代码精粹

阿林森 / 董慧颖 / 人民邮电出版社 / 2003-4-1 / 59.00

《C和C++代码精粹》基于作者备受好评的C/C++ User Journal杂志上的每月专栏,通过大量完全符合ISO标准C++的程序集合,说明了C++真正强大的威力,是C和C++职业程序员的实践指南。可以帮助有一定经验的C和C++程序员深入学习这两种密切相关的语言,对书中代码的参悟和应用,可以帮助他们从根本上提高使用程序的效率。一起来看看 《C和C++代码精粹》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换