使用 Azure Face 优化人脸识别方式 API

Optimized way of face recognition using Azure Face API

我需要使用天蓝色人脸实现人脸识别api。我开发了一个能够使用 .net SDK 找到相似面孔的程序。对于我的用例,我需要从网络摄像头中点击一个人的照片,并从保存在天蓝色云存储中的图像中找到匹配的面孔。现在,Azure 云存储中可能有数千张图像,在我当前的人脸识别实现中,我正在遍历所有图像(保存在 Azure 云存储中),然后将它们与网络摄像头图像进行匹配。 这里的问题是: 人脸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();
        }

就调用 Face API / 你的存储("DetectFaceRecognizeWithAttributes" 背后的内容)而言,你的实现对我来说并不完全清楚。但我认为你是对的,因为你错过了一些东西,而且你的全球处理成本过高。

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

  • 是脸"identification"吗?
  • 还是脸"similarity"?

两者逻辑相同,但使用的API操作不同

案例一——人脸识别

进程

全局过程如下:您将使用 "Person Group" 或 "Large Person Group"(取决于您拥有的人数)来存储关于您已经知道的面孔的数据(在你存储),你将使用这个组来 "identify" 一个新面孔。这样,您将进行“1-n”搜索,而不是像现在这样进行“1-1”搜索。

初始设置(组创建):

如果您需要个人组或大人组,请选择,以下是根据您的定价的实际限制:

  • 个人组:
    • 免费套餐订阅名额:1000人组。每个最多可容纳 1,000 人。
    • S0层订阅名额:100万人组。每个最多可容纳10,000人。
  • 大型人群:
    • 最多可容纳 1,000,000 人。
    • 免费套餐订阅配额:1,000 个大型团体。
    • S0级订阅名额:1,000,000个大型人群。

这里我用的是Person Group来说明,但是方法是一样的

当您知道需要的那个时,使用 "Create" 操作创建它。 然后,对于每个人,您必须使用 "PersonGroup Person - Create" 创建一个 "PersonGroup Person",并使用 "PersonGroup Person - Add Face" 添加相应的面孔。完成后,您永远不需要在这些面上重新处理 "detect" 操作。

然后"run"部分

当您有要比较的新图像时:

  1. 使用Detect人脸端点检测图像中的人脸API
  2. 获取结果的人脸 ID
  3. 调用Identify人脸端点API尝试用你的(大)人群识别那些人脸ID

要限制调用次数,您甚至可以进行批量识别调用(1 个调用中最多 10 个 "input" 人脸 ID - 参见 doc)。

案例 2 - 人脸相似度

这里可以用一个"Face List"或者"Large Face List"来存储你已经知道的人脸,调用"Find Similar"操作的时候传递这个列表的id。 FaceList 示例:

  1. 从 "FaceList - Create" 开始创建您的列表 (doc)
  2. 使用 "FaceList - Add Face" 添加您当前在 blob 中的所有面孔 (doc)
  3. 然后对于运行,当你调用"Find Similar"时,在"faceListId"参数中提供你的FaceList的ID和你想要比较的人脸的id(来自Face Detect呼叫)