【问题标题】:Optimized way of face recognition using Azure Face API使用 Azure 人脸 API 优化人脸识别方式
【发布时间】:2020-09-03 17:36:50
【问题描述】:

我需要使用 azure face api 实现人脸识别。我开发了一个程序,它能够使用 .net SDK 找到相似的面孔。对于我的用例,我需要从网络摄像头单击一个人的照片,并从保存在 azure 云存储中的图像中找到匹配的面孔。现在,天蓝色云存储中可能有数千张图像,在我当前的人脸识别实现中,我正在遍历所有图像(保存在天蓝色云存储中),然后将它们与网络摄像头图像匹配。 这里的问题是: face api(由 azure 提供)每千次通话收费 1 美元。有没有一种方法可以优化搜索,这样我就不必扫描我已经扫描过的面部以进行先前的搜索了


public async Task<List<DetectedFaceAttributes>> FindSimiliarFacesWithAttributesFromContainer(IFaceClient client, string RECOGNITION_MODEL1, string sourceImageFileName)
        {
            string url = BlobBaseURL;
            string sourceurl = sourceContainerURL;
            var imagesInNovotraxContainer = await _blobService.GetNames();
            IList<Guid?> targetFaceIds = new List<Guid?>();
            var faceList = new List<DetectedFaceAttributes>();

            // Detect faces from source image url.
            IList<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{sourceurl}{sourceImageFileName}", RECOGNITION_MODEL1);
            if (detectedFaces.Any())
            {
                foreach (var targetImageFileName in imagesInNovotraxContainer)
                {
                    var faceattribute = new DetectedFaceAttributes();
                    // Detect faces from target image url.
                    var faces = await DetectFaceRecognizeWithAttributes(client, $"{url}{targetImageFileName}");
                    // Add detected faceId to list of GUIDs.
                    if (faces.Any())
                    {
                        targetFaceIds.Add(faces[0].FaceId.Value);
                        faceattribute.DetectedFace = faces[0];
                        faceattribute.ImageFileName = targetImageFileName;
                        faceList.Add(faceattribute);
                    }
                }


                // Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.

                IList<SimilarFace> similarResults = await client.Face.FindSimilarAsync(detectedFaces[0].FaceId.Value, null, null, targetFaceIds);

                var similiarFaceIDs = similarResults.Select(y => y.FaceId).ToList();
                var returnDataTypefaceList = faceList.Where(x => similiarFaceIDs.Contains(x.DetectedFace.FaceId.Value)).ToList();
                return returnDataTypefaceList;
            }
            else
            {
                throw new Exception("no face detected in  captured photo ");
            }
public async Task<List<DetectedFace>> DetectFaceRecognize(IFaceClient faceClient, string url, string RECOGNITION_MODEL1)
        {
            // Detect faces from image URL. Since only recognizing, use the recognition model 1.
            IList<DetectedFace> detectedFaces = await faceClient.Face.DetectWithUrlAsync(url, recognitionModel: RECOGNITION_MODEL1);
            //if (detectedFaces.Any())
            //{
            //    Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{Path.GetFileName(url)}` with ID : {detectedFaces.First().FaceId}");
            //}
            return detectedFaces.ToList();
        }

【问题讨论】:

    标签: azure azure-cognitive-services


    【解决方案1】:

    在调用人脸 API/您的存储(“DetectFaceRecognizeWithAttributes”背后的内容)方面,您的实现对我来说并不完全清楚。但我认为你是对的,因为你错过了一些东西,而且你的全局处理成本过高。

    你应该做什么取决于你的目标:

    • 是不是人脸“识别”?
    • 还是面临“相似”?

    两者具有相同的逻辑,但它们使用不同的 API 操作

    案例 1 - 人脸识别

    流程

    全局过程如下:您将使用“人员组”或“大型人员组”(取决于您拥有的人数)来存储有关您已经知道的面孔的数据(您存储中的那个) ,您将使用该组来“识别”新面孔。这样,您将进行“1-n”搜索,而不是像现在那样进行“1-1”搜索。

    初始设置(组创建):

    选择是否需要人员组或大型人员组,以下是实际限制,具体取决于您的定价:

    • 个人组:
      • 免费层订阅配额:1,000 人组。每个最多可容纳 1,000 人。
      • S0 层订阅配额:1,000,000 人组。每个最多可容纳 10,000 人。
    • 大人组:
      • 最多可容纳 1,000,000 人。
      • 免费层订阅配额:1000 个大人组。
      • S0 层订阅配额:1,000,000 个大人组。

    这里我在解释中使用了Person Group,但是方法是一样的。

    当您知道您需要的那个时,使用“创建”操作创建它。 然后,对于每个人,您必须使用“PersonGroup Person - Create”创建一个“PersonGroup Person”,并使用“PersonGroup Person - Add Face”向其中添加相应的面孔。完成后,您再也不需要对这些人脸重新进行“检测”操作了。

    然后是“运行”部分

    当您有一个新图像要比较时:

    1. 使用人脸 API 的 Detect 端点检测图像中的人脸
    2. 获取结果的人脸 ID
    3. 调用人脸 API 的 Identify 端点,尝试用您的(大型)人员组识别这些人脸 ID

    为了限制调用次数,您甚至可以进行批量识别调用(一次调用最多 10 个“输入”人脸 ID - 请参阅 doc)。

    案例 2 - 人脸相似度

    这里可以使用“人脸列表”或“大人脸列表”来存储您已经知道的人脸,并在调用“查找相似”操作时传递此列表的id。 FaceList 示例:

    1. 从“FaceList - Create”开始创建您的列表 (doc)
    2. 使用“FaceList - 添加人脸”添加您当前在 Blob 中的所有人脸 (doc)
    3. 然后在运行时,当您调用“Find Similar”时,在“faceListId”参数中提供您的 FaceList 的 ID 和您要比较的人脸的 ID(来自 Face Detect 调用)

    【讨论】:

    • 。我添加了缺少的 DetectFaceRecognizeWithAttributes 函数以供参考。我的用例围绕案例 2 面部相似性。能否请您更详细地解释一下案例 2
    • 所以流程可能是这样的,我运行一个窗口服务来定期扫描人脸,获取 faceId 并将它们保存到 largefacelist 。然后可以迭代 largefacelist 以识别来自网络摄像头的点击图像的 faceid 与 Largefacelist 上的 faceid 的相似性
    • 为什么要定期扫描?您只需将每个面添加一次。而且您不必在 largefacelist 上进行迭代:它是在 Face Similar 中制作的
    • 定期扫描的原因是图像会定期添加到存储容器中。所以我会扫描图像并在扫描图像时将一些元数据与图像相关联,然后在第二次扫描迭代中我会检查与图像关联的元数据,这样已经扫描的图像就不会被再次扫描。
    • 好的,我明白了。您可以使用 blob 触发器创建一个 azure 函数,以便它会自动执行此“扫描”以添加新图像。
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 2021-06-28
    • 2022-12-17
    • 2019-08-11
    • 2018-01-23
    • 1970-01-01
    • 2015-10-13
    • 2017-06-07
    相关资源
    最近更新 更多