Ошибка AWS compareFaces() Rekognition Javascript SDK: невозможно получить метаданные объекта из S3. Проверьте ключ объекта, регион и/или права доступа

Я пытаюсь использовать функцию compareFaces() из aws Rekognition API, ссылаясь на два файла в одном и том же сегменте S3, который находится в том же регионе, что и Rekognition (я установил для сегмента S3 значение us-east-1, и поэтому Rekognition ). Для простоты я установил ведро как общедоступное, и я также использую пользователя с полными разрешениями на Rekognition и S3 (что не было необходимо в этом случае, просто чтобы уточнить):

aws-rekognition-config.js

const dotenv = require('dotenv');
dotenv.config();
const AWS = require('aws-sdk');

const rekognition = {
    "accessKeyId": process.env.AMAZON_DEV_ACCESS_KEY_ID,
    "secretAccessKey": process.env.AMAZON_DEV_SECRET_ACCESS_KEY,
    "region": "us-east-1"
  };

const Recognition = new AWS.Rekognition(rekognition);

module.exports = Recognition;

и index.js, где я выполняю простой тест для сравнения двух изображений в моей корзине:

let express = require('express');
let router = express.Router();


var AWS = require('aws-sdk');

var rekognition = require('../config/aws-rekognition-config');


module.exports = () => {

    router.get('/compare/:uid', async(req,res,next) => {


 var params = {
  SimilarityThreshold: 90, 
  SourceImage: {
   S3Object: {
    Bucket: "reconfaces", 
    Name: "1541079978865.jpg"
   }
  }, 
  TargetImage: {
   S3Object: {
    Bucket: "reconfaces", 
    Name: "1541079982272.png"   }
  }
 };

  let faceMatches;

//tried promised version here as well but without any luck
  rekognition.compareFaces(params, function(err, data) {
    if (err) console.log(err, err.stack); // an error occurred
    else     console.log(data);           // successful response
  });
/* 
   try{
      faceMatches = await rekognition.compareFaces(params);
      let a = 1;
   }catch(err){
      console.log("Error comparing faces",err);
      return;
   } */


    });



  /* GET home page. */
  router.use('/', (req, res) => {
        //list all routes
      res.send({"Default":'Backend-'});
  });

  return router;
}

Как видите, файлы существуют в корзине и находятся в том же регионе, что и указанный в конфигурации распознавания: введите здесь описание изображения

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

введите здесь описание изображения

Я также должен упомянуть, что я загрузил файлы через API, используя пакет npm multer-s3:

    var multer = require('multer');
    var multerS3 = require('multer-s3');

    var s3 =  new aws.S3({
    "accessKeyId": process.env.AMAZON_DEV_ACCESS_KEY_ID,
    "secretAccessKey": process.env.AMAZON_DEV_SECRET_ACCESS_KEY,
    "region": "us-east-1",
    "s3BucketEndpoint": false,
    "endpoint": "https://s3.amazonaws.com"
  });


    var upload = multer({
      storage: multerS3({
        s3,
        bucket: 'reconfaces',
        metadata: function (req, file, cb) {
          cb(null, {fieldName: file.fieldname});
        },
        key: function (req, file, cb) {
          cb(null, Date.now() + path.extname(file.originalname));
        }
      })
    });

а затем он применяется в качестве промежуточного программного обеспечения:

router.post('/upload', upload.array('image',10), async(req,res,next)=>{

  //upload picture to s3 

    console.log("Files uploaded successfully");
    res.json({data:"UPLOAD_SUCCESS"});
});

Я не знаю, может метаданные испорчены multer-s3. Но я также попытался загрузить оба файла из консоли aws в браузере, я сделал оба файла и корзину общедоступными и получил ту же ошибку, поэтому я сомневаюсь, что это связано с пакетом multer-s3. Файлы не повреждены или что-то еще, так как я могу скачать их и просмотреть без каких-либо проблем...

Я также пытался использовать cli, и я получаю ту же ошибку:

aws rekognition compare-faces  --source-image '{"S3Object":{"Bucket":"reconfaces","Name":"11112-face1.jpg"}}' --region us-east-1 --target-image '{"S3Object":{"Bucket":"reconfaces","Name":"11112-face2.jpg"}}'

Парень в этом видео тоже не смог сделать то, что хотел я:

https://www.youtube.com/watch?v=GtknPjdlOfg

и этот парень мог бы использовать те же привилегии, что и я

https://www.youtube.com/watch?v=FhFs0zwCvg4

Если я выброшу эту другую операцию, она сработает:

aws rekognition detect-labels --image '{"S3Object":{"Bucket":"reconfaces","Name":"11112-face1.jpg"}}' 

он возвращает:

{
    "Labels": [
        {
            "Name": "Human",
            "Confidence": 99.17317962646484
        },
        {
            "Name": "People",
            "Confidence": 99.17317962646484
        },
        {
            "Name": "Person",
            "Confidence": 99.17317962646484
        },
        {
            "Name": "Face",
            "Confidence": 63.1695671081543
        },
        {
            "Name": "Head",
            "Confidence": 57.89347839355469
        },
        {
            "Name": "Portrait",
            "Confidence": 55.02056884765625
        },
        {
            "Name": "Glasses",
            "Confidence": 51.320011138916016
        },
        {
            "Name": "Child",
            "Confidence": 50.735557556152344
        },
        {
            "Name": "Kid",
            "Confidence": 50.735557556152344
        }
    ],
    "OrientationCorrection": "ROTATE_0"
}

так что это должно быть что-то с конечной точкой сравнения лиц.

В чем может быть проблема?. Я видел, что у многих людей возникают проблемы с этим конкретным API, но большинство ответов, которые я нашел здесь и в проблемах github, касались того, что оба ресурса работают в разных регионах, что не относится к моему случаю.

Большое спасибо!


person Juan    schedule 01.11.2018    source источник


Ответы (1)


Проблема была действительно глупой. В ведре у меня были face1.jpg и face.png, и я звонил обоим с jpg, например

var params = {
  SimilarityThreshold: 90, 
  SourceImage: {
  S3Object: {
    Bucket: "reconfaces", 
    Name: "face1.jpg"
  }
  }, 
  TargetImage: {
  S3Object: {
    Bucket: "reconfaces", 
    Name: "face2.jpg"   }
  }
};

после исправления face2.jpg с помощью face2.png я получил правильный ответ:

  var params = {
      SimilarityThreshold: 90, 
      SourceImage: {
      S3Object: {
        Bucket: "reconfaces", 
        Name: "face1.jpg"
      }
      }, 
      TargetImage: {
      S3Object: {
        Bucket: "reconfaces", 
        Name: "face2.png"   }
      }
    };

Ответ:

{
    "SourceImageFace": {
        "BoundingBox": {
            "Width": 0.48317307233810425,
            "Height": 0.6442307829856873,
            "Left": 0.2584134638309479,
            "Top": 0.18910256028175354
        },
        "Confidence": 99.9949722290039
    },
    "FaceMatches": [
        {
            "Similarity": 98,
            "Face": {
                "BoundingBox": {
                    "Width": 0.2640642821788788,
                    "Height": 0.2769230902194977,
                    "Left": 0.16237494349479675,
                    "Top": 0.29230770468711853
                },
                "Confidence": 99.84500122070312,
                "Landmarks": [
                    {
                        "Type": "eyeLeft",
                        "X": 0.2420874983072281,
                        "Y": 0.3932344913482666
                    },
                    {
                        "Type": "eyeRight",
                        "X": 0.3406614661216736,
                        "Y": 0.3887109160423279
                    },
                    {
                        "Type": "nose",
                        "X": 0.3142981231212616,
                        "Y": 0.4448704421520233
                    },
                    {
                        "Type": "mouthLeft",
                        "X": 0.2604469358921051,
                        "Y": 0.5106690526008606
                    },
                    {
                        "Type": "mouthRight",
                        "X": 0.3448459208011627,
                        "Y": 0.5012921690940857
                    }
                ],
                "Pose": {
                    "Roll": -3.831692695617676,
                    "Yaw": 14.12887954711914,
                    "Pitch": 3.8166630268096924
                },
                "Quality": {
                    "Brightness": 82.77690887451172,
                    "Sharpness": 89.91268920898438
                }
            }
        }
    ],
    "UnmatchedFaces": [],
    "SourceImageOrientationCorrection": "ROTATE_0",
    "TargetImageOrientationCorrection": "ROTATE_0"
}

Итак, в завершение, ПРОВЕРЬТЕ, ЧТО ИМЕНА ФАЙЛОВ СООТВЕТСТВУЮТ НАЗВАНИЯМ В ВЕДРЕ, НА КОТОРОЕ ВЫ НАПРАВЛЯЕТЕСЬ. Я думаю, мне нужно немного поспать xD

person Juan    schedule 01.11.2018