【问题标题】:Specify what faces to index with AWS Rekognition and Lambda使用 AWS Rekognition 和 Lambda 指定要索引的面孔
【发布时间】: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


    【解决方案1】:

    您将需要使用DetectFaces() 来获取图像中检测到的所有人脸的列表。

    对于返回的每个人脸:

    • 使用BoundingBox 复制和裁剪图像,因此它只显示给定的人脸
    • 使用SearchFacesByImage() 来确定它是否已经在Face Collection 中
    • 如果它不在人脸集合中,请使用IndexImages() 将其添加到人脸集合中。它会将单人脸添加到集合中。

    根据经验,将ExternalImageId 与添加的每个图像相关联也是一个好主意。这可以包含您自己对人脸的引用,并且可以在数据库中用于存储有关人脸的附加信息(例如,id、姓名或他们来自哪张图片)。当在图像中检测到人脸时,ExternalImageId 将与 cetain 调用一起返回。

    【讨论】:

    • 感谢约翰的反馈。我已经谈到了这个解决方案,所以感谢您对其进行改进。但是,通过这条路线,我仍然会索引包含单个人脸的图像(因为我正在裁剪人脸)。有没有办法根据一组条件在具有多张脸的图像中索引一张脸?示例:为一张微笑的图像中的所有面孔编制索引,因此那些没有微笑的面孔不会被编制索引。
    • 没有。 IndexFaces 将添加所有图像,直到指定的最大值和指定的质量。任何与此不同的事情都需要在您的代码中完成。
    • 感谢约翰的帮助!我按照你的逻辑首先根据边界框裁剪出人脸。
    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2014-10-04
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多