【问题标题】:AWS compareFaces() Rekognition Javascript SDK Error: Unable to get object metadata from S3. Check object key, region and/or access permissionsAWS compareFaces() Rekognition Javascript SDK 错误:无法从 S3 获取对象元数据。检查对象键、区域和/或访问权限
【发布时间】:2018-11-01 16:29:35
【问题描述】:

我正在尝试通过引用与 Rekognition 位于同一区域的同一 S3 存储桶“reconfaces”中的两个文件来使用 aws Rekognition API 中的 compareFaces() 函数(我将 S3 存储桶设置为 us-east-1,等等 Rekognition)。为简单起见,我将存储桶设置为 public,并且我还使用了一个对 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;
}

您可以看到存储桶中存在文件,并且它与 rekognition 配置中指定的区域位于同一区域:

而且我使用的用户凭据拥有的权限超出了此任务所需的权限:

我还必须提到我通过 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"
}

所以它必须是带有 compare-faces 端点的东西。

可能是什么问题?我看到很多人对这个特定的 API 有问题,但我在这里和 github 问题中找到的大多数答案都是关于这两种资源在不同区域运行的,这不是我的情况。

非常感谢!

【问题讨论】:

    标签: node.js amazon-web-services amazon-s3 amazon-rekognition multer-s3


    【解决方案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.png 更正 face2.jpg 后,我得到了正确的响应:

      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

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      相关资源
      最近更新 更多