TensorFlow Serving:将图像传递给分类器
TensorFlow Serving: Pass image to classifier
我在 Tensorflow(Python、tensorflow 1.9.0 和 tensorflow-serving 1.9.0)中构建了一个简单的分类器,它将对象分类为 5 个 类 之一。现在,我想为那个模型服务。我已经导出并给它一个分类签名(而且只有一个分类签名):
classification_signature = tf.saved_model.signature_def_utils.build_signature_def(
inputs={signature_constants.CLASSIFY_INPUTS: classification_inputs},
outputs={
signature_constants.CLASSIFY_OUTPUT_CLASSES:
classification_outputs_classes
},
method_name=signature_constants.CLASSIFY_METHOD_NAME)
其中,进一步向下,变为:
builder.add_meta_graph_and_variables(
sess, [tag_constants.SERVING],
signature_def_map={
'classification_results':
classification_signature
},
clear_devices=True, legacy_init_op=legacy_init_op)
当我启动 TF 服务器时,我可以看到正在为模型提供服务。我的问题是如何将图像从客户端传递给它。代码如下:
request = classification_pb2.ClassificationRequest()
request.model_spec.name = model
request.model_spec.signature_name = 'classification_results'
这就是我有点迷茫和困惑的地方。对于 PredictionRequest,代码是:
request.inputs['inputs'].CopyFrom(
tf.contrib.util.make_tensor_proto(image.astype(dtype=np.uint8), shape=[1, height, width, 3]))
但这不适用于 ClassificationRequest。错误是:
File "TestServices.py", line 99, in make_request
request.inputs['inputs'].CopyFrom(
AttributeError: 'ClassificationRequest' object has no attribute 'inputs'
也没有:
request.input.CopyFrom(input_pb2.Input(
tf.contrib.util.make_tensor_proto(image.astype(dtype=np.uint8), shape=[1, height, width, 3])
)
)
给出错误:
File "TestServices.py", line 102, in make_request
tf.contrib.util.make_tensor_proto(image.astype(dtype=np.uint8), shape=[1,height, width, 3])
TypeError: Parameter to CopyFrom() must be instance of same class:
expected tensorflow.serving.Input got tensorflow.TensorProto.
因此,我的问题是:使用 ClassificationRequest 将图像传递给分类器需要做什么?
我不确定这是否符合最佳做法,但这似乎可行。作为一个纯粹的 python 用户,我不得不说这感觉就像一个骗局。我花了一段时间,但我通过查看 definition of the protobuf files and this documentation.
弄明白了
import tensorflow as tf
import numpy as np
from tensorflow_serving.apis import classification_pb2, input_pb2
image = np.random.rand(1, 32,32,3)
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
request = classification_pb2.ClassificationRequest()
request.model_spec.name = 'model'
request.model_spec.signature_name = 'classification_results'
# Wrap numpy image in an example protobuf
example = tf.train.Example(features=tf.train.Features(feature={'image': _bytes_feature(image.tostring())}))
inp = input_pb2.Input()
inp.example_list.examples.extend([example])
request.input.CopyFrom(inp)
我在 Tensorflow(Python、tensorflow 1.9.0 和 tensorflow-serving 1.9.0)中构建了一个简单的分类器,它将对象分类为 5 个 类 之一。现在,我想为那个模型服务。我已经导出并给它一个分类签名(而且只有一个分类签名):
classification_signature = tf.saved_model.signature_def_utils.build_signature_def(
inputs={signature_constants.CLASSIFY_INPUTS: classification_inputs},
outputs={
signature_constants.CLASSIFY_OUTPUT_CLASSES:
classification_outputs_classes
},
method_name=signature_constants.CLASSIFY_METHOD_NAME)
其中,进一步向下,变为:
builder.add_meta_graph_and_variables(
sess, [tag_constants.SERVING],
signature_def_map={
'classification_results':
classification_signature
},
clear_devices=True, legacy_init_op=legacy_init_op)
当我启动 TF 服务器时,我可以看到正在为模型提供服务。我的问题是如何将图像从客户端传递给它。代码如下:
request = classification_pb2.ClassificationRequest()
request.model_spec.name = model
request.model_spec.signature_name = 'classification_results'
这就是我有点迷茫和困惑的地方。对于 PredictionRequest,代码是:
request.inputs['inputs'].CopyFrom(
tf.contrib.util.make_tensor_proto(image.astype(dtype=np.uint8), shape=[1, height, width, 3]))
但这不适用于 ClassificationRequest。错误是:
File "TestServices.py", line 99, in make_request
request.inputs['inputs'].CopyFrom(
AttributeError: 'ClassificationRequest' object has no attribute 'inputs'
也没有:
request.input.CopyFrom(input_pb2.Input(
tf.contrib.util.make_tensor_proto(image.astype(dtype=np.uint8), shape=[1, height, width, 3])
)
)
给出错误:
File "TestServices.py", line 102, in make_request
tf.contrib.util.make_tensor_proto(image.astype(dtype=np.uint8), shape=[1,height, width, 3])
TypeError: Parameter to CopyFrom() must be instance of same class:
expected tensorflow.serving.Input got tensorflow.TensorProto.
因此,我的问题是:使用 ClassificationRequest 将图像传递给分类器需要做什么?
我不确定这是否符合最佳做法,但这似乎可行。作为一个纯粹的 python 用户,我不得不说这感觉就像一个骗局。我花了一段时间,但我通过查看 definition of the protobuf files and this documentation.
弄明白了import tensorflow as tf
import numpy as np
from tensorflow_serving.apis import classification_pb2, input_pb2
image = np.random.rand(1, 32,32,3)
def _bytes_feature(value):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
request = classification_pb2.ClassificationRequest()
request.model_spec.name = 'model'
request.model_spec.signature_name = 'classification_results'
# Wrap numpy image in an example protobuf
example = tf.train.Example(features=tf.train.Features(feature={'image': _bytes_feature(image.tostring())}))
inp = input_pb2.Input()
inp.example_list.examples.extend([example])
request.input.CopyFrom(inp)