你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

查找相似人脸

注意

为了支持我们负责任的 AI 原则,基于资格和使用标准对人脸服务访问进行限制。 人脸服务仅适用于 Microsoft 托管客户和合作伙伴。 使用人脸识别引入表单来申请访问。 有关详细信息,请参阅人脸受限访问页面。

查找相似操作会在目标人脸和一组候选人脸之间进行人脸匹配,找出与目标人脸相似的一小组人脸。 这对于按图像进行人脸搜索很有用。

本指南演示如何使用不同语言 SDK 中的“查找相似”功能。 以下示例代码假定你已对 Face 客户端对象进行身份验证。 有关如何执行此操作的详细信息,请遵循快速入门

检测人脸以进行比较

需要先检测图像中的人脸,然后再进行比较。 在本指南中,以下名为 findsimilar.jpg 的远程图像将用作源:

一个微笑的男人的照片。

本指南使用通过 URL 访问的远程图像。 保存对基本 URL 字符串的引用。 本指南中访问的所有图像都位于该 URL 路径。

string baseUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/";

以下人脸检测方法针对比较操作进行了优化。 它不提取详细的人脸属性,而是使用优化的识别模型。

private static async Task<List<FaceDetectionResult>> DetectFaceRecognize(FaceClient faceClient, string url)
{
    // Detect faces from image URL.
    var response = await faceClient.DetectAsync(new Uri(url), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, true, [FaceAttributeType.QualityForRecognition]);
    IReadOnlyList<FaceDetectionResult> detectedFaces = response.Value;
    List<FaceDetectionResult> sufficientQualityFaces = new List<FaceDetectionResult>();
    foreach (FaceDetectionResult detectedFace in detectedFaces)
    {
        QualityForRecognition? faceQualityForRecognition = detectedFace.FaceAttributes.QualityForRecognition;
        if (faceQualityForRecognition.HasValue && (faceQualityForRecognition.Value != QualityForRecognition.Low))
        {
            sufficientQualityFaces.Add(detectedFace);
        }
    }
    Console.WriteLine($"{detectedFaces.Count} face(s) with {sufficientQualityFaces.Count} having sufficient quality for recognition detected from image `{Path.GetFileName(url)}`");

    return sufficientQualityFaces;
}

以下代码使用上述方法从一系列图像中获取人脸数据。

Console.WriteLine("========FIND SIMILAR========");
Console.WriteLine();

List<string> targetImageFileNames = new List<string>
                    {
                        "Family1-Dad1.jpg",
                        "Family1-Daughter1.jpg",
                        "Family1-Mom1.jpg",
                        "Family1-Son1.jpg",
                        "Family2-Lady1.jpg",
                        "Family2-Man1.jpg",
                        "Family3-Lady1.jpg",
                        "Family3-Man1.jpg"
                    };

string sourceImageFileName = "findsimilar.jpg";
List<Guid> targetFaceIds = new List<Guid>();
foreach (string targetImageFileName in targetImageFileNames)
{
    // Detect faces from target image url.
    List<FaceDetectionResult> faces = await DetectFaceRecognize(client, $"{baseUrl}{targetImageFileName}");
    // Add detected faceId to list of GUIDs.
    targetFaceIds.Add(faces[0].FaceId.Value);
}

// Detect faces from source image url.
List<FaceDetectionResult> detectedFaces = await DetectFaceRecognize(client, $"{baseUrl}{sourceImageFileName}");
Console.WriteLine();

查找和打印匹配项

在本指南中,在 Family1-Dad1.jpg 图像中检测到的人脸应该作为与源图像人脸相似的人脸返回。

一个微笑的男人的照片;这是与前一张图像相同的人。

以下代码调用人脸列表上保存的“查找相似 API”。

// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
var response = await client.FindSimilarAsync(detectedFaces[0].FaceId.Value, targetFaceIds);
List<FaceFindSimilarResult> similarResults = response.Value.ToList();

以下代码将匹配详细信息输出到控制台:

foreach (FaceFindSimilarResult similarResult in similarResults)
{
    Console.WriteLine($"Faces from {sourceImageFileName} & ID:{similarResult.FaceId} are similar with confidence: {similarResult.Confidence}.");
}
Console.WriteLine();

下一步

本指南介绍了如何调用“查找相似 API”在较大一组人脸中通过相似性来执行人脸搜索。 接下来,详细了解可用于人脸比较操作的不同识别模型。