Press "Enter" to skip to content

AutoML Vision 的云与端 Part 2:补充在 TensorFlow 内进行 inference 的方法

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

Source: Deep Learning on Medium

Dennis Chang

 

在上一篇中我们谈到 AutoML Vision Edge 汇出的模型可以分别使用 Container (CPU / GPU)、TPU,以及云端 API 来进行推论。但这几个方法都是使用包装好的 container image 或套件。如果我们不能 (或不想) 使用 container、没有 TPU、没有网路,但是却有 GPU 可使用 (例如 Jetson Nano) 时,那幺在 TensorFlow 内执行 inference 就是一个方案。本篇文章也一併介绍 saved_model_cli.py 这个方便的指令,让我们可以快速地了解 Saved_Model. 内所包含的资讯。

 

下载 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,但过程不太顺利,有太多特别的 无法转换跟执行。若是有人可以分享成功经验,那就太感谢了。在此之前就先用这个方法顶着用吧。

 

另外要注意到,输入的档案大小会影响效能! 以目前所使用的範例档案 (大约 50KB) 大约可以跑 20fps,但是换成另一个範例档案 (大约 1.2MB) 就剩下 2fps。因为这个 model 是直接给 raw file,所有前处理都在 model 里面做。所以为了执行效能,也许先将图档做某个程度的压缩可能比较有助于效能提昇。

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注