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

教程:人脸活体检测

本教程介绍如何结合使用服务器端代码和客户端移动应用程序进行人脸活体检测。

小提示

有关人脸活体检测的一般信息,请参阅概念指南

本教程演示如何操作前端应用程序和应用服务器来跨各种平台和语言执行活体检测,包括可选的人脸验证步骤。

重要说明

用于活体的人脸客户端 SDK 是一项门控功能。 你必须填写人脸识别登记表来请求访问活体功能。 当你的 Azure 订阅获得访问权限后,你可以下载人脸活体 SDK。

小提示

满足先决条件后,可以通过 TestFlight 尝试 iOS 活体体验,并通过 Vision Studio 尝试 Web 活体体验。 此外,还可以从示例部分生成并运行完整的前端示例(在 iOS、Android 或 Web 上)。

先决条件

  • Azure 订阅 - 免费创建订阅
  • 你的 Azure 帐户必须分配有“认知服务参与者”角色,你才能同意负责任 AI 条款并创建资源。 若要将此角色分配给你的帐户,请按照分配角色文档中的步骤进行操作,或与管理员联系。
  • 拥有 Azure 订阅后,在 Azure 门户中创建人脸资源,获取密钥和终结点。 部署后,选择“转到资源”
    • 你需要从创建的资源获取密钥和终结点,以便将应用程序连接到人脸服务。
    • 可以使用免费定价层 (F0) 试用该服务,然后再升级到付费层进行生产。
  • 访问适用于移动设备(IOS 和 Android)和 Web 的 Azure AI 视觉人脸客户端 SDK。 首先,你需要申请人脸识别受限访问功能才能访问此 SDK。 有关详细信息,请参阅人脸受限访问页面。
  • 熟悉人脸活体检测功能。 请参阅概念指南

准备 SDK

我们提供了不同语言的 SDK 来简化前端应用程序和应用服务器的开发:

下载适用于前端应用程序的 SDK

按照 azure-ai-vision-sdk GitHub 存储库中的说明将 UI 和代码集成到本机移动应用程序中。 活体 SDK 支持适用于 Android 移动应用程序的 Java/Kotlin、适用于 iOS 移动应用程序的 Swift、适用于 Web 应用程序的 JavaScript:

  • 对于 Swift iOS,请按照 iOS 示例中的说明操作
  • 对于 Kotlin/Java Android,请按照 Android 示例中的说明操作
  • 对于 JavaScript Web,请按照 Web 示例中的说明操作

当你将代码添加到应用程序中后,SDK 会处理以下事项:启动相机、指导最终用户调整其姿势、编写活体有效负载,以及调用 Azure AI 人脸云服务来处理活体有效负载。

可以监视 SDK 存储库的发布部分,以获取新的 SDK 版本更新。

下载适用于应用服务器的 Azure AI 人脸客户端库

应用服务器/协调器负责控制活体检测会话的生命周期。 应用服务器必须先创建一个会话才能执行活体检测,然后它可以查询结果,并在完成活体检查后删除会话。 我们提供了各种语言的库,用于轻松实现应用服务器。 请按照以下步骤安装所需的包:

重要说明

若要为 Azure 人脸服务密钥和终结点创建环境变量,请参阅快速入门

执行活体检测

活体编排涉及的大致步骤如下所示:

Azure AI 人脸中的活体检测工作流示意图。

  1. 前端应用程序启动活性检查并通知应用服务器。

  2. 应用服务器使用 Azure AI 人脸服务创建新的活体会话。 该服务创建一个活体会话并使用会话授权令牌进行响应。 有关创建活性会话所涉及的每个请求参数的详细信息,请参阅 Liveness Create Session Operation

    var endpoint = new Uri(System.Environment.GetEnvironmentVariable("FACE_ENDPOINT"));
    var credential = new AzureKeyCredential(System.Environment.GetEnvironmentVariable("FACE_APIKEY"));
    
    var sessionClient = new FaceSessionClient(endpoint, credential);
    
    var createContent = new CreateLivenessSessionContent(LivenessOperationMode.Passive)
    {
        DeviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        EnableSessionImage = true,
    };
    
    var createResponse = await sessionClient.CreateLivenessSessionAsync(createContent);
    var sessionId = createResponse.Value.SessionId;
    Console.WriteLine($"Session created.");
    Console.WriteLine($"Session id: {sessionId}");
    Console.WriteLine($"Auth token: {createResponse.Value.AuthToken}");
    

    响应正文的示例:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2024-11-15",
        "results": {
            "attempts": []
        }
    }
    
  3. 应用服务器将会话授权令牌返回给前端应用程序。

  4. 前端应用程序使用会话授权令牌启动人脸实时检测器,这将启动实时流。

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. 接着,SDK 会启动相机,指导用户正确调整其姿势,然后准备有效负载以调用活体检测服务终结点。

  6. SDK 调用 Azure AI 视觉人脸服务来执行活体检测。 一旦服务进行响应,SDK 就会通知前端应用程序活体检查已完成。

  7. 前端应用程序将活性检查的完成情况中继到应用服务器。

  8. 应用服务器现在可以从 Azure AI 视觉人脸服务查询活体检测结果。

    var getResultResponse = await sessionClient.GetLivenessSessionResultAsync(sessionId);
    
    var sessionResult = getResultResponse.Value;
    Console.WriteLine($"Session id: {sessionResult.Id}");
    Console.WriteLine($"Session status: {sessionResult.Status}");
    Console.WriteLine($"Liveness detection decision: {sessionResult.Result?.Response.Body.LivenessDecision}");
    

    响应正文的示例:

    {
        "sessionId": "0acf6dbf-ce43-42a7-937e-705938881d62",
        "authToken": "",
        "status": "Succeeded",
        "modelVersion": "2024-11-15",
        "results": {
            "attempts": [
            {
                "attemptId": 1,
                "attemptStatus": "Succeeded",
                "result": {
                "livenessDecision": "realface",
                "targets": {
                    "color": {
                    "faceRectangle": {
                        "top": 763,
                        "left": 320,
                        "width": 739,
                        "height": 938
                    }
                    }
                },
                "digest": "517A0E700859E42107FA47E957DD12F54211C1A021A969CD391AC38BB88295A2",
                "sessionImageId": "Ab9tzwpDzqdCk35wWTiIHWJzzPr9fBCNSqBcXnJmDjbI"
                }
            }
            ]
        }
    }
    
  9. 查询所有会话结果后,应用服务器就可以删除该会话。

    await sessionClient.DeleteLivenessSessionAsync(sessionId);
    Console.WriteLine($"The session {sessionId} is deleted.");
    

通过人脸验证执行活体检测

将人脸验证与活体检测相结合,可以对感兴趣的具体人员进行生物特征验证,进一步保证该人实际存在于系统中。

Azure AI 人脸服务提供的附带人脸验证的活体检测工作流的示意图。

将活体与验证相结合的过程分为两个部分:

步骤 1 - 选择参考图像

按照身份验证方案的构成要求中列出的提示操作,确保输入的图像能够提供最准确的识别结果。

步骤 2 - 通过验证设置活体编排。

活体验证编排涉及的大致步骤如下所示:

  1. 通过以下两种方法中的一种提供验证参考图像:

    • 应用服务器在创建活体会话时提供参考图像。 有关创建具有验证的活性会话所涉及的每个请求参数的详细信息,请参阅 Liveness With Verify Create Session Operation

      var endpoint = new Uri(System.Environment.GetEnvironmentVariable("FACE_ENDPOINT"));
      var credential = new AzureKeyCredential(System.Environment.GetEnvironmentVariable("FACE_APIKEY"));
      
      var sessionClient = new FaceSessionClient(endpoint, credential);
      
      var createContent = new CreateLivenessWithVerifySessionContent(LivenessOperationMode.Passive)
      {
          DeviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bccd",
          EnableSessionImage = true,
      };
      using var fileStream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
      
      var createResponse = await sessionClient.CreateLivenessWithVerifySessionAsync(createContent, fileStream);
      
      var sessionId = createResponse.Value.SessionId;
      Console.WriteLine("Session created.");
      Console.WriteLine($"Session id: {sessionId}");
      Console.WriteLine($"Auth token: {createResponse.Value.AuthToken}");
      Console.WriteLine("The reference image:");
      Console.WriteLine($"  Face rectangle: {createResponse.Value.VerifyImage.FaceRectangle.Top}, {createResponse.Value.VerifyImage.FaceRectangle.Left}, {createResponse.Value.VerifyImage.FaceRectangle.Width}, {createResponse.Value.VerifyImage.FaceRectangle.Height}");
      Console.WriteLine($"  The quality for recognition: {createResponse.Value.VerifyImage.QualityForRecognition}");
      

      响应正文的示例:

      {
          "sessionId": "3847ffd3-4657-4e6c-870c-8e20de52f567",
          "authToken": "<session-authorization-token>",
          "status": "NotStarted",
          "modelVersion": "2024-11-15",
          "results": {
              "attempts": [],
              "verifyReferences": [
              {
                  "referenceType": "image",
                  "faceRectangle": {
                  "top": 98,
                  "left": 131,
                  "width": 233,
                  "height": 300
                  },
                  "qualityForRecognition": "high"
              }
              ]
          }
      }
      
    • 前端应用程序将在初始化 SDK 时提供参考图像。 Web 解决方案不支持此方案。

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. 除了活体结果之外,应用服务器现在还可以查询验证结果。

    var getResultResponse = await sessionClient.GetLivenessWithVerifySessionResultAsync(sessionId);
    var sessionResult = getResultResponse.Value;
    Console.WriteLine($"Session id: {sessionResult.Id}");
    Console.WriteLine($"Session status: {sessionResult.Status}");
    Console.WriteLine($"Liveness detection decision: {sessionResult.Result?.Response.Body.LivenessDecision}");
    Console.WriteLine($"Verification result: {sessionResult.Result?.Response.Body.VerifyResult.IsIdentical}");
    Console.WriteLine($"Verification confidence: {sessionResult.Result?.Response.Body.VerifyResult.MatchConfidence}");
    

    响应正文的示例:

    {
        "sessionId": "93fd6f13-4161-41df-8a22-80a38ef53836",
        "authToken": "",
        "status": "Succeeded",
        "modelVersion": "2024-11-15",
        "results": {
            "attempts": [
                {
                    "attemptId": 1,
                    "attemptStatus": "Succeeded",
                    "result": {
                    "livenessDecision": "realface",
                    "targets": {
                        "color": {
                            "faceRectangle": {
                                "top": 669,
                                "left": 203,
                                "width": 646,
                                "height": 724
                            }
                        }
                    },
                    "digest": "EE664438FDF0535C6344A468181E4DDD4A34AC89582D4FD6E9E8954B843C7AA7",
                    "verifyResult": {
                            "matchConfidence": 0.08172279,
                            "isIdentical": false
                        }
                    }
                }
            ],
            "verifyReferences": [
            {
                "faceRectangle": {
                    "top": 98,
                    "left": 131,
                    "width": 233,
                    "height": 300
                    },
                "qualityForRecognition": "high"
            }
            ]
        }
    }
    
  3. 如果不再查询会话结果,应用服务器可以删除会话。

    await sessionClient.DeleteLivenessWithVerifySessionAsync(sessionId);
    Console.WriteLine($"The session {sessionId} is deleted.");
    

在活体检测后执行其他人脸操作

(可选)可以在活体检查之后执行进一步的人脸操作,例如人脸分析(如获取人脸属性)和/或人脸标识操作。

  1. 若要启用此功能,需要在执行 Session-Creation 步骤期间将“enableSessionImage”参数设置为“true”。
  2. 会话完成后,可以从 Session-Get-Result 步骤中提取“sessionImageId”。
  3. 现在,你既可以下载会话图像(可参考活体状态:获取会话映像操作 API),也可以在根据会话图像 ID 进行检测 API操作中提供 "sessionImageId",以便继续执行其他人脸分析或人脸识别操作。 有关这些操作的详细信息,请参阅人脸检测概念人脸识别概念

支持选项

除了使用主要的 Azure AI 服务支持选项之外,还可以在 SDK 存储库的问题部分发布问题。

若要了解如何将活体解决方案集成到现有的应用程序,请参阅 Azure AI 视觉 SDK 参考。

若要详细了解可用于协调实时解决方案的功能,请参阅会话 REST API 参考。