我已经在Google ML Engine上建立并运行了一个模型,可以在我的个人计算机上成功成功使用该模型。现在,我正在尝试设置Firebase Cloud Functions来调用我的ML Engine模型。我真的很接近(我认为),但是我现在撞墙了。
我的预测请求正在被ML Engine接收,但是我没有在回调函数中获得预测结果。
results.predictions
始终为null,当我对results
进行字符串化时,我看到了这一点:
并且Stackdriver显示请求已成功发送:
您还可以在ML Engine Models仪表板上看到Last use time
确实反映了我调用云函数时的情况。
但是我不知道为什么我没有从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_name
和my_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}]
}
但它们似乎都表现相同。
关于为什么我没有从请求中获得预测结果的任何想法?谢谢。
答案 0 :(得分:1)
经过更多的挖掘,试验,错误等后,我确定预测结果存储在results.data
中,而不存储在results
中。例如,我可以在result.data.predictions[0].scores
中查看我的分数,并在result.data.predictions[0].prediction
中查看预测。最初,我似乎被Cloud Functions控制台的输出限制所欺骗,在该控制台中data
属性被截断,因此我看不到预测结果。