В ответ на запрос онлайн-прогноза Google ML Engine нет результатов - PullRequest
0 голосов
/ 01 июля 2018

У меня есть модель, настроенная и работающая на Google ML Engine, которую я могу успешно использовать со своего персонального компьютера. Сейчас я пытаюсь настроить облачные функции Firebase, чтобы звонить в мою модель ML Engine. Я очень близок (я думаю), но сейчас я бью стену.

Мои запросы на предсказание принимаются ML Engine, но я не получаю результаты предсказания в функции обратного вызова.

results.predictions всегда равно нулю, и когда я строковый results я вижу это:

Firebase Cloud Functions console

и Stackdriver показывает успешно отправляемый запрос:

Stackdriver logs

Вы также можете увидеть на панели инструментов ML Engine Models, что Last use time отображает , когда я вызываю функцию облака.

My model is being called

Но я не могу понять, почему я не получаю результаты прогноза от ML Engine.

Это то, чему я следовал в качестве руководства по настройке моих облачных функций: https://github.com/GoogleCloudPlatform/ml-functions-helpdesk/blob/master/functions/index.js

В настоящее время это моя облачная функция, ей передаются данные изображения в кодировке base64 через data.imageData, и я подтвердил, что это действительное кодирование изображения, скопировав вывод и запустив запрос прогнозирования с моего компьютера.

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}]
}

но, похоже, все они работают одинаково.

Есть идеи, почему я не получаю результаты прогноза обратно из запроса? Спасибо.

1 Ответ

0 голосов
/ 01 июля 2018

После еще нескольких копаний, проб, ошибок и т. Д. Я определил, что результаты прогноза хранятся в results.data, а не в results. Например, я могу просмотреть свои результаты в result.data.predictions[0].scores и прогноз в result.data.predictions[0].prediction. Похоже, меня изначально обманул выходной лимит консоли Cloud Functions, где свойство data было усечено, поэтому я не мог видеть результаты прогноза.

...