Tensorflow服务:InvalidArgumentError:预期的图像(JPEG,PNG或GIF),格式为'AAAAAAAAAAAAAAAA'

时间:2019-05-23 12:43:58

标签: tensorflow-serving

我正在尝试准备自定义的Keras模型以进行部署以与Tensorflow Serving一起使用,但是在处理图像时遇到了问题。

训练模型时,我使用以下函数预处理图像:

def process_image_from_tf_example(self, image_str_tensor, n_channels=3):
    image = tf.image.decode_image(image_str_tensor)
    image.set_shape([256, 256, n_channels])
    image = tf.cast(image, tf.float32) / 255.0
    return image

def read_and_decode(self, serialized):
    parsed_example = tf.parse_single_example(serialized=serialized, features=self.features)
    input_image = self.process_image_from_tf_example(parsed_example["image_raw"], 3)
    ground_truth_image = self.process_image_from_tf_example(parsed_example["gt_image_raw"], 1)
    return input_image, ground_truth_image

我的图像是本地保存的PNG,当我将它们写在.tfrecord文件上时, tf.gfile.GFile(str(image_path), 'rb').read()

这有效,我能够训练我的模型并将其用于局部预测。

现在,我想部署我的模型以用于Tensorflow Serving。我的serving_input_receiver_fn函数如下所示:

def serving_input_receiver_fn(self):
    input_ph = tf.placeholder(dtype=tf.string, shape=[None], name='image_bytes')
    images_tensor = tf.map_fn(self.process_image_from_tf_example, input_ph, back_prop=False, dtype=tf.float32)
    return tf.estimator.export.ServingInputReceiver({'input_1': images_tensor}, {'image_bytes': input_ph})

其中process_image_from_tf_example与上面的功能相同,但是出现以下错误:

InvalidArgumentError (see above for traceback): assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP]

阅读here似乎是由于我没有使用事实而导致的错误 tf.gfile.GFile(str(image_path), 'rb').read()

与我的训练/测试文件一样,但我无法使用它,因为我需要发送格式为

的编码字节

{"image_bytes": {'b64': base64.b64encode(image).decode()}}

根据TF服务的要求。

Examples online发送JPEG编码的字节并以

开头对图像进行预处理

tf.image.decode_jpeg(image_buffer, channels=3)

但是如果我在以{p>开头的serving_input_receiver_fn中使用了不同的预处理功能(不同于用于培训的预处理功能)

tf.image.decode_png(image_buffer, channels=3)

我收到以下错误:

InvalidArgumentError (see above for traceback): Expected image (JPEG, PNG, or GIF), got unknown format starting with 'AAAAAAAAAAAAAAAA'

(顺便说一下,decode_jpeg也会发生这种情况)

我在做什么错?您需要我提供更多代码来回答吗?非常感谢!

编辑! 因为标题不够清晰而更改了标题

1 个答案:

答案 0 :(得分:0)

好,我解决了。

{% if ($countrycode:"" == LITERAL) %} <div> {$countryname}</div> {% else %} <!-- Otherwise = DEFAULT --> {% endif %} Theme theme = new Theme(htmlTemplate); Chunk html = theme.makeChunk(); html.set("countrycode", "IND"); html.set("countryname", "India"); String html = html.toString(); 是一个numpy数组,但我必须执行以下操作:

var rectangle = {}
rectangle = new google.maps.Rectangle({
            bounds: bounds,
            editable: true,
            draggable: true
          });

此外,我的预处理和image函数已更改:

buffer = cv2.imencode('.jpg', image)[1].tostring()
bytes_image = base64.b64encode(buffer).decode('ascii')
{"image_bytes": {"b64": bytes_image}}

serving_input_receiver_fn与上面用于训练的def process_image_from_buffer(self, image_buffer): image = tf.image.decode_jpeg(image_buffer, channels=3) image = tf.image.convert_image_dtype(image, dtype=tf.float32) image = tf.expand_dims(image, 0) image = tf.image.resize_bilinear(image, [256, 256], align_corners=False) image = tf.squeeze(image, [0]) image = tf.cast(image, tf.float32) / 255.0 return image def serving_input_receiver_fn(self): input_ph = tf.placeholder(dtype=tf.string, shape=[None]) images_tensor = tf.map_fn(self.process_image_from_buffer, input_ph, back_prop=False, dtype=tf.float32) return tf.estimator.export.ServingInputReceiver({'input_1': images_tensor}, {'image_bytes': input_ph}) 不同。 我还从上面的process_image_from_buffer中删除了process_image_from_tf_example

希望很明显可以帮助别人。

Excellent guide partially used for solving it