我正在尝试准备自定义的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
也会发生这种情况)
我在做什么错?您需要我提供更多代码来回答吗?非常感谢!
编辑! 因为标题不够清晰而更改了标题
答案 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
。
希望很明显可以帮助别人。