【问题标题】:tensorflow serving prediction as b64 output top resulttensorflow 将预测作为 b64 输出最高结果
【发布时间】:2018-01-11 21:27:33
【问题描述】:

我有一个 Keras 模型,我将其转换为 tensorflow 服务模型。我可以成功地将我的预训练 keras 模型转换为接受 b64 输入,预处理该输入,并将其提供给我的模型。我的问题是我不知道如何获取我得到的预测数据(这是巨大的)并且只导出最高结果。我正在做图像分割,所以我的输出预测是形状 (?, 473, 473, 3),我想得到最好的结果并以 b64 编码格式返回它。我目前所拥有的只是返回整个预测:

sess = K.get_session()
g = sess.graph
g_def = graph_util.convert_variables_to_constants(sess, 
                      g.as_graph_def(),
                      [model.output.name.replace(':0','')])

with tf.Graph().as_default() as g_input:
    input_b64 = tf.placeholder(shape=(1,),
                               dtype=tf.string,
                               name='b64')
    tf.logging.info('input b64 {}'.format(input_b64))

    image = tf.image.decode_image(input_b64[0])#input_bytes)
    image_f = tf.image.convert_image_dtype(image, dtype=tf.float16)
    input_image = tf.expand_dims(image_f, 0)
    image_r = tf.image.resize_bilinear(input_image, [HEIGHT, WIDTH], align_corners=False)
    input_data = preprocess_image(image_r)
    output = tf.identity(input_data, name='input_image')




# Convert to GraphDef
g_input_def = g_input.as_graph_def()


with tf.Graph().as_default() as g_combined:
    x = tf.placeholder(tf.string, name="b64")

    im, = tf.import_graph_def(g_input_def,
                              input_map={'b64:0': x},
                              return_elements=["input_image:0"])

    pred, = tf.import_graph_def(g_def,
             input_map={model.input.name: im},
             return_elements=[model.output.name])

    with tf.Session() as session:
        inputs = {"image_bytes": tf.saved_model.utils.build_tensor_info(x)}
        outputs = {"output_bytes":tf.saved_model.utils.build_tensor_info(pred)}
        signature =tf.saved_model.signature_def_utils.build_signature_def(
                inputs=inputs,
                outputs=outputs,
                method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME
            )


        """Convert the Keras HDF5 model into TensorFlow SavedModel."""

        if os.path.exists(export_path):
            shutil.rmtree(export_path)
        legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
        builder = saved_model_builder.SavedModelBuilder(export_path)
        builder.add_meta_graph_and_variables(
            sess=session,
            tags=[tag_constants.SERVING],
            signature_def_map={ signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature },
        )
        builder.save()

我从https://medium.com/google-cloud/serverless-transfer-learning-with-cloud-ml-engine-and-keras-335435f31e15 获取了很多我的工作以供参考。谢谢!

【问题讨论】:

    标签: python tensorflow prediction predict tensorflow-serving


    【解决方案1】:

    发布我自己的解决方案,以防其他人遇到此问题。基本上,您只需执行输入函数的逆操作。

    def postprocess_image(img, in_shape):
        class_image = tf.argmax(img, axis=2)
        colored_class_image = utils.class_image_to_image_tensor(class_image, [HEIGHT,WIDTH])
    
        image_expand = tf.expand_dims(colored_class_image, 0)
        image_r = tf.image.resize_bilinear(image_expand, in_shape, align_corners=False)
        casted_data = tf.bitcast(tf.cast(image_r[0], tf.int8), tf.uint8)
    
        out_image = tf.image.encode_png(casted_data)
    
        return out_image
    
    sess = K.get_session()
    g = sess.graph
    g_def = graph_util.convert_variables_to_constants(sess, 
                          g.as_graph_def(),
                          [model.output.name.replace(':0','')])
    
    
    with tf.Graph().as_default() as g_input:
        input_b64 = tf.placeholder(shape=(1,),
                                   dtype=tf.string,
                                   name='b64')
        tf.logging.info('input b64 {}'.format(input_b64))
    
        image = tf.image.decode_image(input_b64[0])
        image_f = tf.image.convert_image_dtype(image, dtype=tf.uint8)
        input_image = tf.expand_dims(image_f, 0)
    
        image_r = tf.image.resize_bilinear(input_image, [HEIGHT, WIDTH], align_corners=False)
        input_data = preprocess_image(image_r[0])
        output = tf.identity(input_data, name='input_image')
    
    
    with tf.Graph().as_default() as g_output:
        first = tf.placeholder(shape=[1,473,473,150],
                                   dtype=tf.float32,
                                   name='activation_58/div')
        i_shape = tf.placeholder(dtype=tf.int32, shape=[2], name='in_shape')
    
    
        post_image = postprocess_image(first[0], i_shape)
    
        output_data = tf.identity(post_image, name='out')
    
    
    g_input_def = g_input.as_graph_def()
    g_output_def = g_output.as_graph_def()
    
    with tf.Graph().as_default() as g_combined:
        x = tf.placeholder(tf.string, name="b64")
        in_shape = tf.placeholder(tf.int32, shape=[1,2],name="original_shape")
    
        im, = tf.import_graph_def(g_input_def,
                                  input_map={'b64:0': x},
                                  return_elements=["input_image:0"])
    
        pred, = tf.import_graph_def(g_def,
             input_map={model.input.name: im},
             return_elements=[model.output.name])
    
    
    
        y, = tf.import_graph_def(g_output_def,
                 input_map={model.output.name: pred,
                 'in_shape:0':in_shape[0]},
                 return_elements=["out:0"])
    
        with tf.Session() as session:
            inputs = {"image_bytes": tf.saved_model.utils.build_tensor_info(x),
                    "original_shape":tf.saved_model.utils.build_tensor_info(in_shape)}
            outputs = {"output_bytes":tf.saved_model.utils.build_tensor_info(y)}
            signature =tf.saved_model.signature_def_utils.build_signature_def(
                    inputs=inputs,
                    outputs=outputs,
                    method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME
                )
    
    
            """Convert the Keras HDF5 model into TensorFlow SavedModel."""
    
            if os.path.exists(export_path):
                shutil.rmtree(export_path)
            legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
            builder = saved_model_builder.SavedModelBuilder(export_path)
            builder.add_meta_graph_and_variables(
                sess=session,
                tags=[tag_constants.SERVING],
                signature_def_map={ signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature },
            )
            builder.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多