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 頁面內將模型檔案下載到本機即可。
安裝並使用 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 裡面做。所以為了執行效能,也許先將圖檔做某個程度的壓縮可能比較有助於效能提昇。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 理解实例方法、类方法、静态方法
- 【MyBatis源码分析】insert方法、update方法、delete方法处理流程(上篇)
- 【MyBatis源码分析】insert方法、update方法、delete方法处理流程(上篇)
- java:方法覆盖与方法重载
- 静态方法、实例化方法与线程安全
- JS数组方法总览及遍历方法耗时统计
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Google成功的七堂课
罗耀宗 / 电子工业出版社 / 2005-7 / 28.00元
Google是全球使用人数最多的搜索引擎,在短短几年内,Google从斯坦福大学的实验室,茁壮成长为举世瞩目的IT业超级巨人,他们的成功绝非偶然,尤其是在网络泡沫破灭,行业一片萧条之际,它的崛起更为IT业带来一缕曙光。作者从趋势观察家的角度,以讲座的形式,向读者讲述Google成功的关键因素:破除因循守旧、不断打破常规,核心技术领先、做出了“更好的捕鼠器”,使得Google在搜索技术方面远远超越对......一起来看看 《Google成功的七堂课》 这本书的介绍吧!