Node Js Когнитивные службы Майкрософт

У меня проблема с вызовом Cognitive Services из NodeJs. Я новичок в Node, поэтому преобразование прямого JavaScript в Node было сложной задачей. когда я использую изображение, которое находится в Интернете, оно работает, но мне нужно использовать изображение, которое находится на локальном сервере, и я много чего перепробовал, чтобы удовлетворить требованиям, что это необработанный двоичный файл. Вот что я пытался ...

    const cognitiveServices = require('cognitive-services');
    var fs = require('fs');
    var apiKey = "myapikey";
    var apiUrl="https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze"
    const FRIENDS_IMAGE_URL ='http://az616578.vo.msecnd.net/files/2016/10/09/636115830685164048-686058602_friends.jpg';

    const parameters ={ "visualFeatures": "Tags","details": "Celebrities","language": "en"}
    //var body = { "url": FRIENDS_IMAGE_URL };

   var body = { "url":  getlocalimage()};
   //var body = getlocalimage();

   function getlocalimage()
    {
      var fn = "test.jpg"
      var base64 = fs.readFileSync(fn).toString('base64');
      //  var myimage = "data:image/jpeg:base64," + base64;
      var myimage =  base64;
      return new Buffer(myimage, 'base64').toString('binary');
     }

    function cogtest()
      {
        const chkImage = new cognitiveServices.computerVision({
                     apiKey: apiKey,
                     endpoint: "westus.api.cognitive.microsoft.com"
      })

    chkImage.analyzeImage({  parameters,  body  })
      .then(response => { console.log(response); })
      .catch((err) => { console.log(err);});

      }

       cogtest();

Поскольку вызов может быть выполнен успешно при использовании изображения из Интернета, и я все время получаю следующую ошибку:

   { StatusCodeError: 400 - {"code":"InvalidImageUrl","requestId":"96432967-59d8-4851-a039-1e5b281b4cb7","message":"Can't fetch the image."}
    at new StatusCodeError (/Users/Tim/Downloads/0PiNode/node_modules/request-promise-core/lib/errors.js:32:15)
    at /Users/Tim/Downloads/0PiNode/node_modules/request-promise-core/lib/plumbing.js:97:41
    at tryCatcher (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromiseCtx (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/promise.js:606:10)
    at Async._drainQueue (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/async.js:138:12)
    at Async._drainQueues (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues [as _onImmediate] (/Users/Tim/Downloads/0PiNode/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:800:20)
    at tryOnImmediate (timers.js:762:5)
    at processImmediate [as _immediateCallback] (timers.js:733:5)
  name: 'StatusCodeError',
  statusCode: 400,
  message: '400 - {"code":"InvalidImageUrl","requestId":"96432967-59d8-4851-a039-1e5b281b4cb7","message":"Can\'t fetch the image."}',
  error: 
   { code: 'InvalidImageUrl',
     requestId: '96432967-59d8-4851-a039-1e5b281b4cb7',
     message: 'Can\'t fetch the image.' },
  options: 
   { uri: 'https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze',
     method: 'POST',
     headers: 
      { 'Ocp-Apim-Subscription-Key': 'KEY' },
     qs: 
      { visualFeatures: 'Tags',
        details: 'Celebrities',
        language: 'en' },
     json: true,

Любые идеи? Я считаю, что это связано с передачей необработанного двоичного изображения в теле. В модуле https://github.com/joshbalfour/node-cognitive-services

https://github.com/joshbalfour/node-cognitive-services/tree/v0.2.0#computer-vision---analyze-image

спасибо за любую помощь


person user852566    schedule 09.01.2018    source источник


Ответы (1)


Вам не нужно преобразовывать изображение в представление base64. Вы можете просто сделать это:

var parameters = {
    "visualFeatures": "Tags",
    "details": "Celebrities",
    "language": "en"
}

var body = fs.readFileSync("test.jpg");

var chkImage = new cognitiveServices.computerVision({
    apiKey: "myapikey",
    endpoint: "westus.api.cognitive.microsoft.com"
})

chkImage.analyzeImage({
    parameters,
    body
})
    .then(response => {
        console.log(response);
    })
    .catch((err) => {
        console.log(err);
    });

То есть просто отправьте результат fs.readFileSync как тело запроса.

person Maria Ines Parnisari    schedule 09.01.2018
comment
я пробовал это, но получаю ошибки .. {StatusCodeError: 400 - {code: InvalidImageUrl, requestId: d031231b-9e35-43f6-959f-2e8556dc7f02, message: Can't fetch the image.} Я также попытался добавить const headers = {content -type: application / octet-stream}; затем добавьте его в оператор chkImage.analyzeImage, но на этот раз тоже были ошибки .. {StatusCodeError: 400 - {code: InvalidImageFormat, requestId: e065f813-5aa2-491c-905b-f0a0f4891e72, message: Входные данные не являются допустимым изображением .} - person user852566; 09.01.2018
comment
Код, который я разместил, работает для меня .. вы отправляете действительный файл изображения? И размером менее 4 МБ? См. westus.devser.cognitive.microsoft.com /, чтобы узнать больше об ограничениях. - person Maria Ines Parnisari; 09.01.2018
comment
Я скопировал приведенный выше фрагмент кода и добавил только операторы require и мой ключ ... на новом Mac, на котором я просто установил узел ... я могу получить файл friends.jpg из Интернета с кодом для работы. но если я скопирую friends.jpg в свою локальную систему и использую readfilesync, как в фрагменте, он все равно выдает ошибку InvalidImageUrl. есть идеи, что еще это может быть? - person user852566; 10.01.2018
comment
не уверен, имеет ли это значение, но я использую узел v9.2.1, когнитивные службы 0.6.2 на Mac. также протестирую его сегодня вечером на моем RaspberryPis, который в любом случае является последним местом для этого кода ... сообщу вам, работает ли он. - person user852566; 10.01.2018