Ошибка отправки полезной нагрузки строки для прогнозирования с помощью табличной модели в PHP не задокументирована для [Google AutoML] - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь предсказать созданную модель Auto ML Table.

Нет проблем с CURL, где (используя токен на предъявителя) я POST к этому пути https://automl.googleapis.com/v1beta1/projects/{{project-id}}/locations/us-central1/models/{{model-id}}:predict следующие данные:

{
  "payload": {
    "row": {
      "values": [
        "ARIZONA",
        "JUICE-READY TO DRINK",
        "4",
        "1",
        "23",
        "oz",
        "2.00",
        "4.00",
        "/$con arizona cc/u"
      ]
    }
  }
}

Я пытаюсь сделать то же самое с PHP, но не могу сгенерировать правильную полезную нагрузку.

Обратите внимание, что, будучи моделью Table, она ожидает строку; здесь больше информации: https://cloud.google.com/vision/automl/docs/reference/rest/v1beta1/projects.locations.models/predict#examplepayload

Это ошибка:

Fatal error: Uncaught Exception: Expect Google\Cloud\Dlp\V2\Value. in /Users/torlanco/Documents/www/facts-data-entry/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBUtil.php:197
Stack trace: 
#0 /Users/torlanco/Documents/www/facts-data-entry/vendor/google/protobuf/src/Google/Protobuf/Internal/RepeatedField.php(183): Google\Protobuf\Internal\GPBUtil::checkMessage('ARIZONA', 'Google\\Cloud\\Dl...') 
#1 /Users/torlanco/Documents/www/facts-data-entry/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBUtil.php(209): Google\Protobuf\Internal\RepeatedField->offsetSet(NULL, 'ARIZONA') 
#2 /Users/torlanco/Documents/www/facts-data-entry/vendor/google/cloud/Dlp/src/V2/Table/Row.php(51): Google\Protobuf\Internal\GPBUtil::checkRepeatedField(Array, 11, 'Google\\Cloud\\Dl...') 
#3 /Users/torlanco/Documents/www/facts-data-entry/vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php(1009): Google\Cloud\Dlp\V2\Table\Row->setValues(Array) 
#4 /Users/torlanco/Documents/www/facts-data-entry/vendor/google/protobuf/src/Google/Pro in /Users/torlanco/Documents/www/facts-data-entry/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBUtil.php on line 197

Это мой код:

<?php
require 'vendor/autoload.php';

use Google\Cloud\AutoMl\V1beta1\ExamplePayload;
use Google\Cloud\AutoMl\V1beta1\Image;
use Google\Cloud\AutoMl\V1beta1\TextSnippet;
use Google\Cloud\AutoMl\V1beta1\PredictionServiceClient;
use Google\Cloud\Dlp\V2\Table\Row;

startPredict('sapient-spark-240001', 'TBL4416632655659925504');

function startPredict($projectId, $modelId){
  try {

    $predictionServiceClient = new PredictionServiceClient([
      'credentials' => 'assets/google-cloud-cred.json',
      'transport' => 'rest'
    ]);

    $formattedName = $predictionServiceClient->modelName($projectId, 'us-central1', $modelId);

    $row = new Row( ['values' => ["ARIZONA","JUICE-READY TO DRINK","4","1","23","oz","2.00","4.00","/$con arizona cc/u"]]);
    $payload = new ExamplePayload(['row'=> $row]);

    $response = $predictionServiceClient->predict($formattedName, $payload);
    $res = $response->serializeToJsonString();
    $predictResult = json_decode($res, true);

  } finally {
    $predictionServiceClient->close();
  }

}
?>

Я ожидаю следующего ответа:

{
    "payload": [
        {
            "tables": {
                "score": 0.0025087874,
                "value": "REFRIGERATED"
            }
        },
        {
            "tables": {
                "score": 0.29803053,
                "value": "BOTTLED"
            }
        },
        {
            "tables": {
                "score": 0.6979729,
                "value": "CANNED"
            }
        },
        {
            "tables": {
                "score": 0.0014877517,
                "value": "ASEPTIC"
            }
        }
    ]
}

1 Ответ

0 голосов
/ 05 июля 2019

Я не даю весь код, но именно так я и поступил в своем проекте.Замени это внутри своей функции.

        $image = file_get_contents($image_url);

        $formattedName = $predictionServiceClient->modelName(env('GCLOUD_PROJECT'), env('GCLOUD_COMPUTE'), env('GCLOUD_MODEL_ID'));

        $googleImage = new Image();
        $googleImage->setImageBytes($image);

        $payload = new ExamplePayload(['image' => $googleImage]);

        $response = $predictionServiceClient->predict($formattedName, $payload, ['score_threshold' => 0.01]);
        $gAML_results = $response->getPayload();

        $results = [];
        foreach ($gAML_results as $row) {
            $data['label'] = $row->getDisplayName();
            $data['score'] = $row->getClassification()->getScore();
            $results[] = $data;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...