Как передать изображение в AWS конечную точку SageMaker - PullRequest
0 голосов
/ 30 марта 2020

Мне нужно использовать модель WireframeToCode из AWS Marketplace, я использовал Nodejs для чтения и отправки данных файла в модель следующим образом:

var sageMakerRuntime = new AWS.SageMakerRuntime();

var bitmap = fs.readFileSync("sample.jpeg", "utf8");
var buffer = new Buffer.from(bitmap, "base64");

var params = {
  Body: buffer.toJSON(),
  EndpointName: "wireframe-to-code",
  Accept: "image/jpeg",
  ContentType: "application/json"
};

sageMakerRuntime.invokeEndpoint(params, function(err, data) {
  if (err) console.log(err, err.stack);
  else console.log(data);
});

но я получаю эту ошибку:

сообщение: «Ожидаемые параметры. Объект, являющийся объектом строки, буфера, потока, BLOB-объекта или типизированного массива», код: «InvalidParameterType», время: 2020-03 -30T11: 06: 27.535Z

Из документации поддерживается тип содержимого для ввода image/jpeg, при выводе application/json.

при попытке преобразовать тело в строка вроде этого: JSON.stringify(buffer.toJSON()) Я получаю эту ошибку:

Получена ошибка клиента (415) от модели с сообщением «Этот предиктор поддерживает только JSON данные в формате»

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Мне нужно было передать растровое изображение и изменить ContentType на "image/jpeg"

const AWS = require("aws-sdk");
const fs = require("fs");

const sageMakerRuntime = new AWS.SageMakerRuntime({
  region: "us-east-1",
  accessKeyId: "XXXXXXXXXXXX",
  secretAccessKey: "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
});

const bitmap = fs.readFileSync("sample.jpeg");

var params = {
  Body: bitmap,
  EndpointName: "wireframe-to-code",
  ContentType: "image/jpeg"
};

sageMakerRuntime.invokeEndpoint(params, function(err, data) {
  if (err) {
    console.log(err, err.stack);
  } else {
    responseData = JSON.parse(Buffer.from(data.Body).toString());
    console.log(responseData);
  }
});
1 голос
/ 05 апреля 2020

Поэтому я думаю, что вам нужно изменить полезную нагрузку, которую вы передаете, на invokeEndpoint

Документация предполагает, что хотя полезная нагрузка должна быть JSON, тело должно быть буфером в этот случай, и он будет бесплатно кодировать в base64.

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SageMakerRuntime.html#invokeEndpoint -property

const fs = require('fs')

const sageMakerRuntime = new AWS.SageMakerRuntime()

const bitmap = fs.readFileSync('sample.jpeg', 'utf8')
const buffer = new Buffer.from(bitmap)

const params = {
    Body: buffer, //Buffer, Typed Array, Blob, String
    EndpointName: 'wireframe-to-code',
    Accept: 'image/jpeg', //The desired MIME type of the inference in the response
    ContentType: 'image/jpeg', //MIME type of body
}

sageMakerRuntime.invokeEndpoint(params, function(err, data) {
    if (err) console.log(err, err.stack)
    else console.log(data)
})
...