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

教程:人脸活体检测

人脸活体检测可用于确定输入视频流中的人脸是真实的(活的)还是虚假的(欺骗性的)。 这是生物特征身份验证系统中的一个重要组成部分,可防止冒名顶替者试图使用照片、视频、面具或其他方式冒充他人来访问系统,从而发动欺骗攻击。

活体检测的目标是确保系统在身份验证时与实际存在的活人进行交互。 随着数字金融、远程访问控制和在线身份验证流程的兴起,此类系统变得越来越重要。

活体检测解决方案可以成功防御各种欺骗类型,包括纸质打印输出、2D/3D 面具以及手机和笔记本电脑上的欺骗演示。 活体检测是一个活跃的研究领域,随着时间的推移,人们不断对其进行改进以应对日益复杂的欺骗攻击。 随着整体解决方案对新型攻击的防御变得越来越强大,我们也会不断向客户端和服务组件推出持续改进。

重要

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

先决条件

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

执行活体检测

活体解决方案集成涉及两个不同的组件:移动应用程序和应用服务器/业务流程协调程序。

将活体集成到移动应用程序中

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

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

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

编排活体解决方案

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

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

  1. 移动应用程序启动活体检查并通知应用服务器。

  2. 应用服务器使用 Azure AI 人脸服务创建新的活体会话。 该服务创建一个活体会话并使用会话授权令牌进行响应。

    Request:
    curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectliveness/singlemodal/sessions' \
    --header 'Ocp-Apim-Subscription-Key:<insert-api-key>
    --header 'Content-Type: application/json' \
    --data '{
      "livenessOperationMode": "passive",
      "deviceCorrelationId": "723d6d03-ef33-40a8-9682-23a1feb7bccd",
      "sendResultsToClient": "false"
    }'
     
    Response:
    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": <session-authorization-token>
    }
    
  3. 应用服务器将会话授权令牌返回给移动应用程序。

  4. 移动应用程序在 Azure AI 视觉 SDK 初始化期间提供会话授权令牌。

    mServiceOptions?.setTokenCredential(com.azure.android.core.credential.TokenCredential { _, callback ->
        callback.onSuccess(com.azure.android.core.credential.AccessToken("<INSERT_TOKEN_HERE>", org.threeten.bp.OffsetDateTime.MAX))
    })
    
    serviceOptions?.authorizationToken = "<INSERT_TOKEN_HERE>"
    
  5. 接着,SDK 会启动相机,指导用户正确调整其姿势,然后准备有效负载以调用活体检测服务终结点。

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

  7. 移动应用程序将活体检查已完成这一情况中继到应用服务器。

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

    Request:
    curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectliveness/singlemodal/sessions/a3dc62a3-49d5-45a1-886c-36e7df97499a' \
    --header 'Ocp-Apim-Subscription-Key: <insert-api-key>
    
    Response:
    {
        "status": "ResultAvailable",
        "result": {
            "id": 1,
            "sessionId": "a3dc62a3-49d5-45a1-886c-36e7df97499a",
            "requestId": "cb2b47dc-b2dd-49e8-bdf9-9b854c7ba843",
            "receivedDateTime": "2023-10-31T16:50:15.6311565+00:00",
            "request": {
                "url": "/face/v1.1-preview.1/detectliveness/singlemodal",
                "method": "POST",
                "contentLength": 352568,
                "contentType": "multipart/form-data; boundary=--------------------------482763481579020783621915",
                "userAgent": ""
            },
            "response": {
                "body": {
                    "livenessDecision": "realface",
                    "target": {
                        "faceRectangle": {
                            "top": 59,
                            "left": 121,
                            "width": 409,
                            "height": 395
                        },
                        "fileName": "video.webp",
                        "timeOffsetWithinFile": 0,
                        "imageType": "Color"
                    },
                    "modelVersionUsed": "2022-10-15-preview.04"
                },
                "statusCode": 200,
                "latencyInMilliseconds": 1098
            },
            "digest": "537F5CFCD8D0A7C7C909C1E0F0906BF27375C8E1B5B58A6914991C101E0B6BFC"
        },
        "id": "a3dc62a3-49d5-45a1-886c-36e7df97499a",
        "createdDateTime": "2023-10-31T16:49:33.6534925+00:00",
        "authTokenTimeToLiveInSeconds": 600,
        "deviceCorrelationId": "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        "sessionExpired": false
    }
    
    

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

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

  1. 选择一个好的参考图像。
  2. 通过验证设置活体编排。

Azure AI 人脸中的活体验证工作流示意图。

选择一个好的参考图像

使用以下提示来确保输入图像提供最准确的识别结果。

技术要求:

  • 支持的输入图像格式为 JPEG、PNG、GIF(第一帧)和 BMP。
  • 图像文件不得大于 6 MB。
  • 使用适用的检测模型作为一般准则来判断图像质量是否足以尝试进行人脸识别时,可以在人脸检测操作中使用 qualityForRecognition 属性。 建议仅将 "high" 质量图像用于人员登记,将 "medium" 或以上质量的图像用于识别方案。

组合要求:

  • 照片清晰,不模糊,不像素化,不扭曲,也无损坏。
  • 照片没有通过修改来消除人脸瑕疵或改变人脸外貌。
  • 照片必须采用 RGB 颜色支持的格式(JPEG、PNG、WEBP、BMP)。 建议的人脸大小为 200 像素 x 200 像素。 人脸大小大于 200 像素 x 200 像素不会带来更好的 AI 质量。大小不得超过 6 MB。
  • 用户不佩戴眼镜、面具、帽子、耳机、头罩或面罩。 人脸面前应没有任何障碍物。
  • 允许佩戴面部首饰,前提是它们不会遮盖人脸。
  • 照片中只能看到一张人脸。
  • 人脸应保持端正的姿势,双眼睁开,嘴闭,没有极端的面部表情或头部倾斜情况。
  • 人脸不应有任何阴影或红眼。 如果出现上述禁止情况中的任何一种,请重新拍照。
  • 背景应该均匀、朴素,没有任何阴影。
  • 人脸应位于图像中心并至少占图像的 50%。

通过验证设置活体编排。

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

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

    • 应用服务器在创建活体会话时提供参考图像。

      Request:
      curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectlivenesswithverify/singlemodal/sessions' \
      --header 'Ocp-Apim-Subscription-Key: <api_key>' \
      --form 'Parameters="{
        \"livenessOperationMode\": \"passive\",
        \"deviceCorrelationId\": \"723d6d03-ef33-40a8-9682-23a1feb7bccd\"
      }"' \
      --form 'VerifyImage=@"test.png"'
      
      Response:
      {
          "verifyImage": {
              "faceRectangle": {
                  "top": 506,
                  "left": 51,
                  "width": 680,
                  "height": 475
              },
              "qualityForRecognition": "high"
          },
          "sessionId": "3847ffd3-4657-4e6c-870c-8e20de52f567",
          "authToken":<session-authorization-token>
      }
      
      
    • 移动应用程序在初始化 SDK 时提供参考图像。

      val singleFaceImageSource = VisionSource.fromFile("/path/to/image.jpg")
      mFaceAnalysisOptions?.setRecognitionMode(RecognitionMode.valueOfVerifyingMatchToFaceInSingleFaceImage(singleFaceImageSource))
      
      if let path = Bundle.main.path(forResource: "<IMAGE_RESOURCE_NAME>", ofType: "<IMAGE_RESOURCE_TYPE>"),
         let image = UIImage(contentsOfFile: path),
         let singleFaceImageSource = try? VisionSource(uiImage: image) {
          try methodOptions.setRecognitionMode(.verifyMatchToFaceIn(singleFaceImage: singleFaceImageSource))
      }
      
  2. 除了活体结果之外,应用服务器现在还可以查询验证结果。

    Request:
    curl --location '<insert-api-endpoint>/face/v1.1-preview.1/detectlivenesswithverify/singlemodal/sessions/3847ffd3-4657-4e6c-870c-8e20de52f567' \
    --header 'Content-Type: multipart/form-data' \
    --header 'apim-recognition-model-preview-1904: true' \
    --header 'Authorization: Bearer.<session-authorization-token> \
    --form 'Content=@"video.webp"' \
    --form 'Metadata="<insert-metadata>"
    
    Response:
    {
        "status": "ResultAvailable",
        "result": {
            "id": 1,
            "sessionId": "3847ffd3-4657-4e6c-870c-8e20de52f567",
            "requestId": "f71b855f-5bba-48f3-a441-5dbce35df291",
            "receivedDateTime": "2023-10-31T17:03:51.5859307+00:00",
            "request": {
                "url": "/face/v1.1-preview.1/detectlivenesswithverify/singlemodal",
                "method": "POST",
                "contentLength": 352568,
                "contentType": "multipart/form-data; boundary=--------------------------590588908656854647226496",
                "userAgent": ""
            },
            "response": {
                "body": {
                    "livenessDecision": "realface",
                    "target": {
                        "faceRectangle": {
                            "top": 59,
                            "left": 121,
                            "width": 409,
                            "height": 395
                        },
                        "fileName": "video.webp",
                        "timeOffsetWithinFile": 0,
                        "imageType": "Color"
                    },
                    "modelVersionUsed": "2022-10-15-preview.04",
                    "verifyResult": {
                        "matchConfidence": 0.9304124,
                        "isIdentical": true
                    }
                },
                "statusCode": 200,
                "latencyInMilliseconds": 1306
            },
            "digest": "2B39F2E0EFDFDBFB9B079908498A583545EBED38D8ACA800FF0B8E770799F3BF"
        },
        "id": "3847ffd3-4657-4e6c-870c-8e20de52f567",
        "createdDateTime": "2023-10-31T16:58:19.8942961+00:00",
        "authTokenTimeToLiveInSeconds": 600,
        "deviceCorrelationId": "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        "sessionExpired": true
    }
    

清理资源

如果想要清理并移除 Azure AI 服务订阅,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。

后续步骤

请参阅 Azure AI 视觉 SDK 参考资料以了解活体 API 中的其他选项。

请参阅会话 REST API 参考,详细了解可用于编排活体解决方案的功能。