我正在尝试通过引用与 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 配置中指定的区域位于同一区域:
而且我使用的用户凭据具有比此任务所需的更多权限:
我还必须提到,我也使用 npm 包 multer-s3 通过 api 上传了文件:
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 问题中找到的大多数答案都是关于这两种资源在不同区域运行的,这不是我的情况。
非常感谢!