本地使用TensorFlow Serving SavedModel(字符串张量输入)进行预测时的图片格式转换与报错问题
解决TensorFlow Serving模型输入字符串张量的问题
看起来你踩了一个常见的坑:你的模型内部包含了图片解码节点(从错误日志里的StatefulPartitionedCall/decode_image/DecodeImage能明确看出来),它期望的输入是原始图片文件的二进制字符串(比如JPG/PNG文件的原始字节数据),而不是你处理后的浮点张量转成的base64字符串。
错误原因拆解
你当前的处理流程完全搞反了模型的输入逻辑:
读文件→解码成图片张量→resize→转浮点→base64编码
但这个模型的设计是自身完成图片解码和预处理步骤,你提前解码图片再编码回去的内容,已经不是标准的JPG/PNG格式字节了,模型自然识别不出图片格式。
修正后的代码
直接读取原始图片的二进制数据,转成TensorFlow字符串张量即可,不需要任何解码、resize操作:
# 直接读取原始图片二进制,不做解码 img_raw = tf.io.read_file(path) # 这就是模型需要的字符串张量,无需base64编码 input_tensor = tf.constant(img_raw) # 预测(注意:模型输出键是'output_0',不是你写的'sequential_1',参考你给出的模型结构) pred = inf_model(encoded=input_tensor)['output_0'][0]
特殊场景补充(非当前问题适用)
如果你的模型确实需要预处理后的张量转字符串(比如某些定制化场景),那你需要把预处理后的浮点张量重新编码成标准图片格式的二进制,示例代码如下:
# 假设你已经完成了resize和转浮点的预处理 img_encoded = tf.io.encode_jpeg(tf.cast(img * 255, tf.uint8)) # 转回uint8再编码成JPG格式 input_tensor = tf.constant(img_encoded)
但根据你的错误信息,显然不是这种情况,模型明确要的是原始图片文件的二进制,所以第一种方案才是正确的。
内容的提问来源于stack exchange,提问作者Pietro Sonza
相关产品推荐
相关产品推荐

