最近我使用tensorflow服务API服务模型。该模型是图像分类器。根据tf服务文件。分类任务的请求格式如下:
post_data = {
"signature_name": "classify",
"examples": [
{
"inputs": {"b64": s}
},]}
其中 s 是base64编码的图像,其计算方式为:
img_path = '/Users/wuyanxue/Desktop/234.jpg'
img_b64 = base64.b64encode(open(img_path, 'rb').read())
s = str(img_b64, encoding='utf-8')
请注意,base64encode是url不安全的。当我使用 json = post_data 参数将请求发布到服务器时。它给了我
期望的图像(JPEG,PNG或GIF),格式以\\'\\ n \ ...开头。
因此,我一步一步检查了模型代码,即:
serialized_tf_example = tf.placeholder(shape=[1], dtype=tf.string, name='tf_example')
img_contents = tf.image.decode_jpeg(serialized_tf_example[0], channels=3)
此方法的签名为:
tensor_info_x = utils.build_tensor_info(serialized_tf_example)
tensor_info_class_names = utils.build_tensor_info(tf.convert_to_tensor(['neg', 'pos'], dtype=tf.string))
tensor_info_logits = utils.build_tensor_info(predictions)
classification_signature = signature_def_utils.build_signature_def(
inputs={"inputs": tensor_info_x},
outputs={"classes": tensor_info_class_names,
"scores": tensor_info_logits},
method_name=signature_constants.CLASSIFY_METHOD_NAME)
模型已建立:
builder.add_meta_graph_and_variables(
sess,
[tag_constants.SERVING],
signature_def_map={'classify': classification_signature},
legacy_init_op=legacy_init_op
)
很明显,这是jpeg解码错误,但是当我使用同一图像文件使用
填充模型时sess.run(results, feed_dict={serialized_tf_example: [open(img_path, 'rb').read()]})
它没有错误,结果正确。
在使用此tf服务分类API之前,我使用了tf服务预测API。 在该预测过程中,我使用了相同的模型并进行了预测。 它运行没有任何错误。当然,这两个API的请求格式略有不同。 (例如,预测使用“实例”,但不使用“示例”。) 我发现这两种呼叫类型之间没有其他区别。 谁能告诉我什么不正确?