Я пытаюсь использовать функцию compareFaces () из aws Rekognition API, ссылаясь на два файла в одной и той же корзине S3, которые «находятся в том же регионе, что и Rekognition» (я установил корзину S3 на us-east-1, и так Rekognition). Для простоты я установил корзину на public, и я также использую пользователя, у которого есть Full Permisions over 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:
![enter image description here](https://i.stack.imgur.com/2birQ.png)
И учетные данные, которые я использую, имеют больше разрешений, чем необходимо для этой задачи:
![enter image description here](https://i.stack.imgur.com/KHg0r.png)
Я также должен упомянуть, что я загрузил файлы через 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, были о том, что оба ресурса работают в разных регионах, что не в моем случае.
Большое спасибо!