没有来自Google ML Engine在线预测请求的响应的预测结果

时间:2018-06-30 23:40:07

标签: firebase google-cloud-platform google-cloud-functions google-cloud-ml

我已经在Google ML Engine上建立并运行了一个模型,可以在我的个人计算机上成功成功使用该模型。现在,我正在尝试设置Firebase Cloud Functions来调用我的ML Engine模型。我真的很接近(我认为),但是我现在撞墙了。

我的预测请求正在被ML Engine接收,但是我没有在回调函数中获得预测结果。

results.predictions始终为null,当我对results进行字符串化时,我看到了这一点:

Firebase Cloud Functions console

并且Stackdriver显示请求已成功发送:

Stackdriver logs

您还可以在ML Engine Models仪表板上看到Last use time 确实反映了我调用云函数时的情况。

My model is being called

但是我不知道为什么我没有从ML Engine中获得预测结果。

这是我一直遵循的设置我的Cloud Functions的指南:https://github.com/GoogleCloudPlatform/ml-functions-helpdesk/blob/master/functions/index.js

这是我目前的云函数,它通过data.imageData传递了base64编码的图像数据,并且通过复制输出并运行PC上的预测请求,我已经验证了它是有效的图像编码。 / p>

const functions = require('firebase-functions');
const {google} = require('googleapis');

exports.analyzeDetection = functions.https.onCall((data, context) => {
    if (data.imageData) {
        // Auth
        google.auth.getApplicationDefault((err, authClient) => {
            if (err) {
                console.error("getApplicationDefault err " + err);
                return {
                    prediction: "error"
                }
            }

            //[START ml_engine_auth]
            if (authClient.createScopedRequired && authClient.createScopedRequired()) {
                // https://developers.google.com/identity/protocols/googlescopes#mlv1
                authClient = authClient.createScoped(['https://www.googleapis.com/auth/cloud-platform']);
            }

            //Create authenticated ml engine client
            var ml = google.ml({
                version: 'v1',
                auth: authClient
            });
            //[END ml_engine_auth]

            // Prediction
            ml.projects.predict({
                name: `projects/my_project_name/models/my_model_name`,
                resource: {
                    instances: [{"b64": data.imageData}]
                }
            }, (err, result) => {

                // The problem is that result is always null

                if (err){
                    console.error('ERROR ', err);
                    return {
                        prediction: "error"
                    }
                }
                return {
                    prediction: "add this after the prediction requests are working"//result.predictions[0].predicted
                }
            });
        });
    }
});

注意:我已经混淆了my_project_namemy_model_name,这并不是他们真正说的。

我还尝试了多种不同的预测参数,例如:

name: 'projects/my_project_name/models/my_model_name',
resource: {
    instances: [{"image_bytes": {"b64": data.imageData}, "key": "0"}]
}

name: 'projects/my_project_name/models/my_model_name',
resource: {
    name: 'projects/my_project_name/models/my_model_name',
    instances: [{"b64": data.imageData}]
}

但它们似乎都表现相同。

关于为什么我没有从请求中获得预测结果的任何想法?谢谢。

1 个答案:

答案 0 :(得分:1)

经过更多的挖掘,试验,错误等后,我确定预测结果存储在results.data中,而不存储在results中。例如,我可以在result.data.predictions[0].scores中查看我的分数,并在result.data.predictions[0].prediction中查看预测。最初,我似乎被Cloud Functions控制台的输出限制所欺骗,在该控制台中data属性被截断,因此我看不到预测结果。