Node.js AWS compareFaces()Rekognition Javascript SDK错误:无法从S3获取对象元数据。检查对象密钥、区域和/或访问权限
我试图使用aws Rekognition API中的compareFaces()函数,方法是引用与Rekognition位于同一区域的同一S3 bucket“reconfaces”中的两个文件(我将S3 bucket设置为us-east-1,因此Rekognition)。为了简单起见,我将bucket设置为public,并且我正在使用一个对Rekognion和S3拥有完全权限的用户(这在本例中不是必需的,只是为了澄清它): aws-Rekognion-config.jsNode.js AWS compareFaces()Rekognition Javascript SDK错误:无法从S3获取对象元数据。检查对象密钥、区域和/或访问权限,node.js,amazon-web-services,amazon-s3,amazon-rekognition,multer-s3,Node.js,Amazon Web Services,Amazon S3,Amazon Rekognition,Multer S3,我试图使用aws Rekognition API中的compareFaces()函数,方法是引用与Rekognition位于同一区域的同一S3 bucket“reconfaces”中的两个文件(我将S3 bucket设置为us-east-1,因此Rekognition)。为了简单起见,我将bucket设置为public,并且我正在使用一个对Rekognion和S3拥有完全权限的用户(这在本例中不是必需的,只是为了澄清它): aws-Rekognion-config.js const dotenv
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中,我做了一个简单的测试来比较我的bucket中的两个图像:
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;
}
正如您所看到的,文件存在于bucket中,并且与Rekognion配置中指定的文件位于同一区域:
我正在使用的用户凭据的权限超过了执行此任务所需的权限:
我还必须提到,我通过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控制台上传这两个文件,我公开了这两个文件和bucket,我得到了相同的错误,所以我怀疑这与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"}}'
这段视频中的那个家伙也做不到我想要的:
这家伙可以用我的特权
如果我抛出另一个操作,它将起作用:
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中找到的大多数答案都是关于这两种资源在不同的地区运行的,这不是我的情况
多谢各位 这个问题真的很愚蠢。在bucket中,我有一个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"
}
最后,检查文件名是否与目标存储桶中的文件名匹配。我想我得睡一会儿了