本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.
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 里面做。所以为了执行效能,也许先将图档做某个程度的压缩可能比较有助于效能提昇。
Be First to Comment