Nodejs Tensorflow Serving Client Ошибка 3

Я обслуживаю предварительно обученную начальную модель и до сих пор следовал официальным руководствам, чтобы обслуживать ее. В настоящее время я получаю код ошибки 3, как показано ниже:

{ Error: contents must be scalar, got shape [305]
  [[Node: map/while/DecodeJpeg = DecodeJpeg[_output_shapes=[[?,?,3]], acceptable_fraction=1, channels=3, dct_method="", fancy_upscaling=true, ratio=1, try_recover_truncated=false, _device="/job:localhost/replica:0/task:0/device:CPU:0"](map/while/TensorArrayReadV3)]]
  at /server/node_modules/grpc/src/client.js:554:15 code: 3, metadata: Metadata { _internal_repr: {} } }

Я использую predict_service.proto из API Tensorflow Serving. Вот мой файл Nodejs, в котором я определяю функцию:

const PROTO_PATH = "./pb/prediction_service.proto";
const TensorflowServing = grpc.load(PROTO_PATH).tensorflow.serving;

const testClient = new TensorflowServing.PredictionService(
    TF_TEST, grpc.credentials.createInsecure()
);

function getTestModelMsg(val){
    return {
        model_spec: { name: "inception", signature_name: "predict_images", version: 1},
        inputs: {
            images: {
                dtype: "DT_STRING",
                tensor_shape: {
                    dim: [{size: 220}, {size: 305}],
                    unknown_rank: false
                },
                string_val: val
            }
        }
    }
}


function predictTest(array, callback) {
    testClient.predict(getTestModelMsg(array), (error, response) => {
        if(error)
            return callback(error);

    callback(null, response.outputs)
})}

И я передаю изображение в виде двоичного изображения следующим образом:

fs.readFile('./test/Xiang_Xiang_panda.jpg', (err, data) => {
    if(err) {
        return res.json({message: "Not found"});
    }

    predictTest( data.toString('binary') , (error, outputs) => {
        if (error) {
            console.error(error);
            return res.status(500).json({ error });
        }
        res.status(200).json({ outputs });
    })
})

Я застрял в этом некоторое время, поэтому был бы очень признателен, если бы кто-нибудь мог мне помочь здесь! Любая помощь будет здорово! Заранее спасибо! :)


person Afraz Hussain    schedule 18.11.2017    source источник


Ответы (1)


Итак, мне наконец удалось взломать это. Публикую это как ответ здесь на случай, если кто-то столкнется с точно такой же проблемой.

Таким образом, исходная модель ожидает изображение в кодировке base64:

fs.readFile('./test/Xiang_Xiang_panda.jpg', (err, data) => {
    if(err) {
        return res.json({message: "Not found"});
    }

    predictTest( data.toString('base64') , (error, outputs) => {
        if (error) {
            console.error(error);
            return res.status(500).json({ error });
        }
        res.status(200).json({ outputs });
    })
})

Затем, просмотрев файл inception_client.py от Tensorflow Serving, я обнаружил, что тензор на самом деле имеет shape=[1]. Итак, это делает getTestModelMsg следующим:

function getTestModelMsg(val){
return {
    model_spec: { name: "inception", signature_name: "serving_default", version: 1},
    inputs: {
        images: {
            dtype: "DT_STRING",
            tensor_shape: {
                dim: [{size: 1}],
                unknown_rank: false
            },
            string_val: val
        }
    }
}

Надеюсь, это поможет кому-то. Удачи. :)

person Afraz Hussain    schedule 29.11.2017