tensorflow服务预测无法使用对象检测宠物示例

时间:2017-07-28 13:40:00

标签: tensorflow gcloud tensorflow-serving google-cloud-ml-engine

我试图使用tensorflow对象检测宠物示例对gcloud ml-engine进行预测,但它无法正常工作。

我使用此示例创建了一个检查点:https://github.com/tensorflow/models/blob/master/object_detection/g3doc/running_pets.md

在tensorflow团队的帮助下,我能够创建一个saved_model来上传到gcloud ml-engine: https://github.com/tensorflow/models/issues/1811

现在,我可以将模型上传到gcloud ml-engine。但不幸的是,我无法对模型做出正确的预测请求。每当我尝试预测时,我都会得到同样的错误:

Input instances are not in JSON format.

我试图用

进行在线预测
gcloud ml-engine predict --model od_test --version v1 --json-instances prediction_test.json

我试图用

进行批量预测
gcloud ml-engine jobs submit prediction "prediction7" 
    --model od_test 
    --version v1 
    --data-format TEXT 
    --input-paths gs://ml_engine_test1/prediction_test.json 
    --output-path gs://ml_engine_test1/prediction_output 
    --region europe-west1

我想提交一个图像列表作为unit8-matrices,因此对于导出,我使用的是输入类型image_tensor

如此处的文档中所述:https://cloud.google.com/ml-engine/docs/concepts/prediction-overview#prediction_input_data,输入json应具有特定格式。但是,在线预测的格式以及批量预测的格式是有效的。我最新的测试是一个包含内容的单个文件:

{"instances": [{"values": [1, 2, 3, 4], "key": 1}]}

和内容:

{"images": [0.0, 0.3, 0.1], "key": 3}
{"images": [0.0, 0.7, 0.1], "key": 2}

他们都没有工作。任何人都可以帮助我,输入格式应该如何?

修改

批处理的错误是

{
    insertId:  "1a26yhdg2wpxvg6"   
    jsonPayload: {
        @type:  "type.googleapis.com/google.cloud.ml.api.v1beta1.PredictionLogEntry"    
        error_detail: {
            detail:  "No JSON object could be decoded"     
            input_snippet:  "Input snippet is unavailable."     
        }
        message:  "No JSON object could be decoded"    
    }
    logName:  "projects/tensorflow-test-1-168615/logs/worker"   
    payload: {
        @type:  "type.googleapis.com/google.cloud.ml.api.v1beta1.PredictionLogEntry"    
        error_detail: {
            detail:  "No JSON object could be decoded"     
            input_snippet:  "Input snippet is unavailable."     
        }
        message:  "No JSON object could be decoded"    
    }
    receiveTimestamp:  "2017-07-28T12:31:23.377623911Z"   
    resource: {
        labels: {
            job_id:  "prediction10"     
            project_id:  "tensorflow-test-1-168615"     
            task_name:  ""     
        }
        type:  "ml_job"    
    }
    severity:  "ERROR"   
    timestamp:  "2017-07-28T12:31:23.377623911Z"   
}

2 个答案:

答案 0 :(得分:1)

我相信特定模型需要二进制图像数据进行预测。

我希望您的请求符合以下要求:

{
  instances: [
    { "images": { "b64": "image-bytes-base64-encoded" }, "key": 1 },
    ...
  ]
}

希望有助于实现有效的解决方案。如果没有,请告诉我们,我会尽力为您提供更明确的内容。

答案 1 :(得分:1)

如果您使用gcloud提交gcloud ml-engine local predict请求以及批量预测,则导出的模型接受输入,如下所示进行预测。

{"inputs": [[[242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 23]]]}
{"inputs": [[[232, 242, 219], [242, 240, 239], [242, 240, 239], [242, 242, 239], [242, 240, 123]]]}
...

如果您直接向服务发送请求(即不使用gcloud),请求正文如下:

{"instances": [{"inputs": [[[242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 239], [242, 240, 23]]]}]}
{"instances": [{"inputs": [[[232, 242, 219], [242, 240, 239], [242, 240, 239], [242, 242, 239], [242, 240, 123]]]}]}

输入张量名称应为“输入”,因为它在signature.input中为what we've specified。每个JSON对象的值都是一个三维数组,您可以从here得知。外部维度为None以支持批量输入。不需要“实例”(除非您直接使用http API)。请注意,除非修改图形以包含额外的占位符并使用tf.identity输出它,否则不能在输入中指定“key”。

同样如the github issue中所述,由于模型需要大容量内存,在线服务可能无法正常工作。我们正在努力。