【发布时间】:2019-08-28 09:12:12
【问题描述】:
对于这篇长文,我深表歉意。
我对 AWS Rekognition 和 Lambda 还很陌生,但我接手了一个项目,使用 AWS S3、Rekognition 和 Lambda 构建面部识别系统。我设法使用AWS JavaScript SDK Documentation 中提供的一些 Rekognition API 获得了一个可行的解决方案,但它仅在输入图像中有一张脸时才有效。我开始使用具有多张面孔的图像,但它没有给出我正在寻找的响应。经过研究,我将问题缩小到以下几点:
我需要能够使用indexFaces API 指定要在具有多个面孔的图像中索引哪些面孔。
注意:我正在使用 JavaScript。
我对图像中单个面孔的逻辑是我使用SearchFacesByImage API,我首先查看我是否已将过去的人 1 的面孔索引到“allFaces”。如果我有,那么我不需要将 Person 1 的脸再次索引到“allFaces”,但如果我没有,那么我需要先这样做。
到目前为止,当我使用具有单人脸的图像作为输入时,一切正常。 (参见下面的代码示例)
问题来了,当我有一张包含多张脸的图像时,包括人 1 的脸,它会再次索引该图像中的所有人脸,包括人 1 的脸,并将其添加到“allFaces”集合中,但我想要实现的是系统会在过去检索到 Person 1 的位置,因此它不应该再次索引 Person 1,而是索引图像中的所有其他人。
这就是我如何改进我的问题,以便能够指定我想要在包含多张面孔的图像中索引哪些面孔,因为如果我能做到这一点,那么我可以说第 1 个人已被索引,所以继续与人 2。
在indexFaces API 中,您可以指定“MaxFaces”和“QualityFilter”参数。我已经看过了,但我不相信它可以解决我的解决方案,所以我正在远离它,除非它 100% 可以解决我的解决方案。
我也不确定我的逻辑是否存在问题,或者我的逻辑是否正常但我缺乏 JavaScript 知识是阻碍我前进的原因。
这是我迄今为止对图像中的一张脸所做的:
const AWS = require('aws-sdk');
const s3 = new AWS.S3({apiVersion: "2006-03-01"});
const rekognition = new AWS.Rekognition();
//-----------------------------Exports Function-----------------------
exports.handler = function(event, context) {
bucket = event.Records[0].s3.bucket.name;
key = event.Records[0].s3.object.key;
console.log(bucket);
console.log(key);
searchingFacesByImage(bucket, key);
};
//--------------------------------------------------------------------
// Search for a face in an input image
function searchingFacesByImage(bucket, key) {
let params = {
CollectionId: "allFaces",
FaceMatchThreshold: 95,
Image: {
S3Object: {
Bucket: bucket,
Name: key
}
},
MaxFaces: 5
};
const searchingFace = rekognition.searchFacesByImage(params, function(err, searchdata) {
if (err) {
console.log(err, err.stack); // an error occurred
} else {
// console.log(JSON.stringify(searchdata, null, '\t'));
// if data.FaceMatches > 0 : There that face in the image exists in the collection
if (searchdata.FaceMatches.length > 0) {
console.log("Face is a match");
// Continue
} else {
console.log("Face is not a match");
console.log("Start indexing face to 'allFaces'");
indexToAllFaces(bucket, key);
}
}
});
return searchingFace;
}
//--------------------------------------------------------------------
// If face is not a match in 'allFaces', index face to 'allFaces' collection
function indexToAllFaces(bucket, key) {
let params = {
CollectionId: "allFaces",
DetectionAttributes: ['ALL'],
Image: {
S3Object: {
Bucket: bucket,
Name: key
}
}
};
const indexFace = rekognition.indexFaces(params, function(err, data) {
if (err) {
console.log(err, err.stack); // an error occurred
} else {
console.log("INDEXING TO 'allFaces'");
console.log(JSON.stringify(data, null, '\t'));
}
});
return indexFace;
}
//--------------------------------------------------------------------
就像我说的那样,这在使用具有单张面孔的图像时效果很好,所以这就是为什么我希望添加一些逻辑来过滤具有多张面孔的图像中的面孔,并且过去已经索引过谁的面孔, 不应再次编入索引。
提前感谢您的任何反馈。
【问题讨论】:
标签: node.js amazon-web-services aws-lambda