Partilhar via


Tutorial: Detetar vivacidade em rostos

Aprenda a integrar a deteção de liveness facial no seu fluxo de trabalho usando lógica do lado do servidor e aplicações frontend associadas.

Sugestão

Para obter informações gerais sobre a deteção de vivacidade facial, consulte o guia conceitual.

Neste tutorial, aprendes a executar uma aplicação frontend com um servidor de aplicações para realizar a deteção de atividade. Também pode adicionar verificação facial em várias plataformas e idiomas.

Importante

Os SDKs do cliente Face para deteção de vivacidade são um recurso restrito. Você deve solicitar acesso ao recurso de vivacidade preenchendo o formulário de admissão de Reconhecimento Facial. Quando a sua subscrição do Azure tiver acesso concedido, poderá descarregar o SDK de verificação de vivacidade facial.

Pré-requisitos

  • Subscrição do Azure - Criar uma gratuitamente
  • A sua conta Azure deve ter atribuída a função Contribuidor de Serviços Cognitivos para que possa aceitar os termos de IA responsável e criar um recurso. Para que este papel seja atribuído à sua conta, siga as etapas na documentação Atribuir papéis ou entre em contato com um administrador.
  • Depois de ter a sua assinatura do Azure, crie um recurso Face no portal do Azure para obter a sua chave e o ponto de extremidade. Depois que for implantado, selecione Ir para recurso.
    • Você precisa da chave e do ponto de extremidade do recurso criado para conectar seu aplicativo ao serviço Face.
  • Acesso aos artefactos bloqueados necessários para Azure Vision no Foundry Tools Face Client SDK para Mobile (iOS e Android) e Web.
  • Familiaridade com o recurso de deteção de vivacidade facial. Consulte o guia conceptual.

Sugestão

Depois de completar os pré-requisitos, pode experimentar a experiência liveness nas seguintes plataformas:

  • iOS: App Store iOS — toque no ecrã da aplicação 10 vezes após a instalação para ativar o modo de programador.
  • Android: Google Play Store — toque no ecrã da aplicação 10 vezes após a instalação para ativar o modo de programador.
  • Web: Experimente diretamente no Vision Studio.

Também pode construir e executar um exemplo completo de frontend (iOS, Android ou Web) a partir da secção de Exemplos .

Preparar o aplicativo frontend

Fornecemos SDKs em vários idiomas para simplificar a integração com seu aplicativo frontend. Consulte o README para o SDK escolhido nas secções seguintes para integrar tanto a interface como o código necessário.

Importante

Cada SDK de frontend requer acesso a um ativo fechado para ser compilado com êxito. Consulte as seguintes instruções para configurar este acesso.

Para Swift iOS:

Para Kotlin/Java Android:

Para JavaScript Web:

Uma vez integrado na sua aplicação frontend, o SDK inicia a câmara, orienta o utilizador para ajustar a sua posição, compõe a carga útil de liveness e envia-a para o serviço Azure AI Face para processamento.

Monitorize a secção de Releases do repositório para atualizações de novas versões do SDK e ative alertas automáticos de atualização de dependências — como GitHub Dependabot (para repositórios GitHub) ou Renovate (GitHub, GitLab, Bitbucket, Azure Repos).

Realizar a deteção de vida

Os passos seguintes descrevem o processo de orquestração da vivacidade:

Diagrama do fluxo de trabalho de detecção de vivacidade no Azure AI Face.

  1. O aplicativo frontend inicia a verificação de vivacidade e notifica o servidor do aplicativo.

  2. O servidor de aplicações cria uma nova sessão de vivacidade com o Azure AI Face Service. O serviço cria uma sessão de liveness e responde com um token de autorização de sessão. Para mais informações sobre cada parâmetro de pedido envolvido na criação de uma sessão de liveness, consulte Operação de Criação de Sessão de Liveness.

    var endpoint = new Uri(System.Environment.GetEnvironmentVariable("FACE_ENDPOINT"));
    var key = new AzureKeyCredential(System.Environment.GetEnvironmentVariable("FACE_APIKEY"));
    
    var body = JsonSerializer.Serialize(new
    {
        livenessOperationMode = "PassiveActive",
        deviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        enableSessionImage = true
    });
    
    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
    
    var response = await client.PostAsync(
        $"{endpoint}/face/v1.2/detectLiveness-sessions",
        new StringContent(body, Encoding.UTF8, "application/json"));
    
    response.EnsureSuccessStatusCode();
    
    using var doc  = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
    var root       = doc.RootElement;
    
    Console.WriteLine("Session created");
    Console.WriteLine($"sessionId : {root.GetProperty("sessionId").GetString()}");
    Console.WriteLine($"authToken : {root.GetProperty("authToken").GetString()}");
    

    Um exemplo da estrutura de resposta:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2025-05-20",
        "results": {
            "attempts": []
        }
    }
    
  3. O servidor de aplicação fornece o token de autorização de sessão de volta à aplicação frontend.

  4. A aplicação frontend utiliza o token de autorização de sessão para iniciar o detetor de vivacidade da face, que inicia o fluxo de vivacidade.

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. O SDK inicia a câmara, guia o utilizador para se posicionar corretamente e, em seguida, prepara o payload para chamar o endpoint do serviço de deteção de presença.

  6. O SDK chama o serviço Azure Vision Face para realizar a deteção de vivacidade. Assim que o serviço responde, o SDK notifica a aplicação frontend de que a verificação de vivacidade está concluída. Nota: A resposta do serviço não contém a decisão de vivacidade. Tens de consultar esta informação a partir do servidor da aplicação.

  7. A aplicação frontal comunica a conclusão da verificação de vivacidade ao servidor da aplicação.

  8. O servidor de aplicações consulta o resultado da deteção de vivacidade do serviço Azure Vision Face.

    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
    
    var response = await client.GetAsync(
        $"{endpoint}/face/v1.2/livenessSessions/{sessionId}/result");
    
    response.EnsureSuccessStatusCode();
    
    using var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
    var root = doc.RootElement;
    var attempts = root.GetProperty("results").GetProperty("attempts");
    var latestAttempt = attempts[attempts.GetArrayLength() - 1];
    var attemptStatus = latestAttempt.GetProperty("attemptStatus").GetString();
    
    Console.WriteLine($"Session id: {root.GetProperty("sessionId").GetString()}");
    Console.WriteLine($"Session status: {root.GetProperty("status").GetString()}");
    Console.WriteLine($"Latest attempt status: {attemptStatus}");
    
    if (attemptStatus == "Succeeded")
        Console.WriteLine($"Liveness detection decision: {latestAttempt.GetProperty("result").GetProperty("livenessDecision").GetString()}");
    else
    {
        var error = latestAttempt.GetProperty("error");
        Console.WriteLine($"Error: {error.GetProperty("code").GetString()} - {error.GetProperty("message").GetString()}");
    }
    

    Um exemplo da estrutura de resposta:

    {
        "sessionId": "b12e033e-bda7-4b83-a211-e721c661f30e",
        "authToken": "eyJhbGciOiJFUzI1NiIsIm",
        "status": "NotStarted",
        "modelVersion": "2024-11-15",
        "results": {
            "attempts": [
                {
                    "attemptId": 2,
                    "attemptStatus": "Succeeded",
                    "result": {
                    "livenessDecision": "realface",
                    "targets": {
                        "color": {
                        "faceRectangle": {
                                "top": 669,
                                "left": 203,
                                "width": 646,
                                "height": 724
                            }
                        }
                    },
                    "digest": "B0A803BB7B26F3C8F29CD36030F8E63ED3FAF955FEEF8E01C88AB8FD89CCF761",
                    "sessionImageId": "Ae3PVWlXAmVAnXgkAFt1QSjGUWONKzWiSr2iPh9p9G4I"
                    }
                },
                {
                    "attemptId": 1,
                    "attemptStatus": "Failed",
                    "error": {
                    "code": "FaceWithMaskDetected",
                    "message": "Mask detected on face image.",
                    "targets": {
                            "color": {
                            "faceRectangle": {
                                "top": 669,
                                "left": 203,
                                "width": 646,
                                "height": 724
                            }
                            }
                        }
                    }
                }
            ]
        }
    }
    
  9. O servidor de aplicações apaga a sessão depois de consultar todos os resultados da sessão.

    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
    
    await client.DeleteAsync($"{endpoint}/face/v1.2/livenessSessions/{sessionId}");
    Console.WriteLine($"Session deleted: {sessionId}");
    

Realizar a deteção de vivacidade com verificação facial

A combinação da verificação facial com a deteção de vivacidade permite a verificação biométrica de uma determinada pessoa de interesse com uma garantia adicional de que a pessoa está fisicamente presente no sistema.

Diagrama do fluxo de trabalho de verificação de vivacidade com rosto do Azure AI Face.

Integrar a deteção de vivacidade com a verificação envolve duas partes:

Etapa 1 - Selecione uma imagem de referência

Para obter resultados de reconhecimento mais precisos, siga as dicas listadas nos requisitos de composição para cenários de verificação de identidade.

Passo 2 - Configurar a orquestração da vivacidade com verificação

Os seguintes passos gerais mostram como orquestrar a vivacidade com verificação:

  1. Forneça a imagem de referência de verificação utilizando um dos seguintes dois métodos:

    • O servidor do aplicativo fornece a imagem de referência ao criar a sessão de liveness. Para mais informações sobre cada parâmetro de pedido envolvido na criação de uma sessão de liveness com verificação, consulte Operação de Criação de Sessão com Verificação de Liveness.

      var endpoint = new Uri(System.Environment.GetEnvironmentVariable("FACE_ENDPOINT"));
      var key      = System.Environment.GetEnvironmentVariable("FACE_APIKEY");
      
      // Create the JSON part
      var jsonPart = new StringContent(
          JsonSerializer.Serialize(new
          {
              livenessOperationMode = "PassiveActive",
              deviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bcc",
              enableSessionImage = true
          }),
          Encoding.UTF8,
          "application/json"
      );
      jsonPart.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
      {
          Name = "CreateLivenessWithVerifySessionRequest"
      };
      
      // Create the file part
      using var fileStream = File.OpenRead("test.png");
      var filePart = new StreamContent(fileStream);
      filePart.Headers.ContentType = new MediaTypeHeaderValue("image/png");
      filePart.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
      {
          Name = "VerifyImage",
          FileName = "test.png"
      };
      
      // Build multipart form data
      using var formData = new MultipartFormDataContent();
      formData.Add(jsonPart);
      formData.Add(filePart);
      
      using var client = new HttpClient();
      client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
      
      var response = await client.PostAsync($"{endpoint}/face/v1.2/createLivenessWithVerifySession", formData);
      response.EnsureSuccessStatusCode();
      
      using var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
      var root = doc.RootElement;
      
      Console.WriteLine("Session created.");
      Console.WriteLine($"Session id: {root.GetProperty("sessionId").GetString()}");
      Console.WriteLine($"Auth token: {root.GetProperty("authToken").GetString()}");
      

      Um exemplo da estrutura de resposta:

      {
          "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"
              }
              ]
          }
      }
      
    • O aplicativo frontend fornece a imagem de referência ao inicializar os SDKs móveis. Este cenário não é suportado na solução web.

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. O servidor da aplicação agora pode consultar o resultado da verificação, além do resultado de vivacidade.

    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
    
    var response = await client.GetAsync($"{endpoint}/face/v1.2/livenessSessions/{sessionId}/result");
    response.EnsureSuccessStatusCode();
    
    using var doc = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
    var root = doc.RootElement;
    
    var attempts = root.GetProperty("results").GetProperty("attempts");
    var latestAttempt = attempts[attempts.GetArrayLength() - 1];
    var attemptStatus = latestAttempt.GetProperty("attemptStatus").GetString();
    
    Console.WriteLine($"Session id: {root.GetProperty("sessionId").GetString()}");
    Console.WriteLine($"Session status: {root.GetProperty("status").GetString()}");
    Console.WriteLine($"Latest attempt status: {attemptStatus}");
    
    if (attemptStatus == "Succeeded")
    {
        var decision = latestAttempt.GetProperty("result").GetProperty("livenessDecision").GetString();
        var verify   = latestAttempt.GetProperty("verifyResult");
        Console.WriteLine($"Liveness detection decision: {decision}");
        Console.WriteLine($"Verify isIdentical: {verify.GetProperty("isIdentical").GetBoolean()}");
        Console.WriteLine($"Verify matchConfidence: {verify.GetProperty("matchConfidence").GetDouble()}");
    }
    else
    {
        var err = latestAttempt.GetProperty("error");
        Console.WriteLine($"Error: {err.GetProperty("code").GetString()} - {err.GetProperty("message").GetString()}");
    }
    

    Um exemplo da estrutura de resposta:

    {
        "sessionId": "b12e033e-bda7-4b83-a211-e721c661f30e",
        "authToken": "eyJhbGciOiJFUzI1NiIsIm",
        "status": "NotStarted",
        "modelVersion": "2024-11-15",
        "results": {
            "attempts": [
            {
                "attemptId": 2,
                "attemptStatus": "Succeeded",
                "result": {
                "livenessDecision": "realface",
                "targets": {
                    "color": {
                    "faceRectangle": {
                        "top": 669,
                        "left": 203,
                        "width": 646,
                        "height": 724
                    }
                    }
                },
                "verifyResult": {
                    "matchConfidence": 0.08871888,
                    "isIdentical": false
                },
                "digest": "B0A803BB7B26F3C8F29CD36030F8E63ED3FAF955FEEF8E01C88AB8FD89CCF761",
                "sessionImageId": "Ae3PVWlXAmVAnXgkAFt1QSjGUWONKzWiSr2iPh9p9G4I",
                "verifyImageHash": "43B7D8E8769533C3290DBD37A84D821B2C28CB4381DF9C6784DBC4AAF7E45018"
                }
            },
            {
                "attemptId": 1,
                "attemptStatus": "Failed",
                "error": {
                    "code": "FaceWithMaskDetected",
                    "message": "Mask detected on face image.",
                    "targets": {
                        "color": {
                        "faceRectangle": {
                                "top": 669,
                                "left": 203,
                                "width": 646,
                                "height": 724
                            }
                        }
                    }
                }
            }
            ],
            "verifyReferences": [
                {
                    "referenceType": "image",
                    "faceRectangle": {
                    "top": 316,
                    "left": 131,
                    "width": 498,
                    "height": 677
                    },
                    "qualityForRecognition": "high"
                }
            ]
            }
        }
    
  3. O servidor de aplicativos pode excluir a sessão se você não precisar mais do resultado.

    using var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key);
    
    await client.DeleteAsync($"{endpoint}/face/v1.2/livenessWithVerifySessions/{sessionId}");
    Console.WriteLine($"Liveness-with-Verify session deleted: {sessionId}");
    

Execute outras operações faciais após a deteção de vivacidade

Opcionalmente, pode realizar operações adicionais de rosto após a verificação de vivacidade, como análise facial (para obter atributos faciais) e operações de identidade facial.

  1. Defina o parâmetro enableSessionImage para true durante a etapa de criação de sessão .
  2. Extraia o sessionImageId do passo Session-Get-Result.
  3. Descarregue a imagem de sessão (referenciada na API de Operação de Imagem de Sessão do Liveness), ou forneça a sessionImageId operação na API Detectar do ID de Imagem de Sessão para continuar com outras análises faciais ou operações de identidade facial. Para obter mais informações sobre essas operações, consulte Conceitos de deteção facial e Conceitos de reconhecimento facial.

Opções de suporte

Além de usar as principais opções de suporte das Foundry Tools, pode também colocar as suas perguntas na secção de problemas do repositório SDK.

Para saber como integrar a solução liveness na sua aplicação existente, consulte a referência Azure Vision SDK.

Para saber mais sobre os recursos disponíveis para orquestrar a solução de liveness, consulte a referência da API REST de sessão.