Compartir a través de


Tutorial: Detección de vivacidad en caras

Obtenga información sobre cómo integrar la detección de caras reales en el flujo de trabajo mediante la lógica del lado servidor y las aplicaciones cliente de front-end complementarias.

Sugerencia

Para obtener información general sobre la detección de vitalidad facial, consulte la guía conceptual.

En este tutorial, aprenderá a ejecutar una aplicación de front-end con un servidor de aplicaciones para realizar la detección real. También puede agregar la comprobación facial en varias plataformas e idiomas.

Importante

Los SDK de cliente de Face para la vivacidad son una característica cerrada. Debe solicitar el acceso a la característica de vivacidad rellenando el formulario de acceso de reconocimiento facial. Cuando su suscripción a Azure tenga acceso, podrá descargar el SDK de vivacidad de Face.

Requisitos previos

  • Una suscripción a Azure: cree una cuenta gratuita
  • Para poder aceptar los términos de IA responsable y crear un recurso, su cuenta de Azure debe tener asignado un rol de Colaborador de Cognitive Services. Para asignar este rol a su cuenta, siga los pasos descritos en la documentación Asignación de roles o póngase en contacto con el administrador.
  • Una vez que tenga la suscripción de Azure, cree un recurso de Face en el portal de Azure para obtener su clave y punto de conexión. Tras su implementación, seleccione Ir al recurso.
    • Necesita la clave y el punto de conexión del recurso que cree para conectar la aplicación al servicio Face.
  • Acceso a los artefactos cerrados necesarios para Azure Vision en Foundry Tools Face Client SDK para dispositivos móviles (iOS y Android) y Web.
  • Familiaridad con la función de detección de vitalidad del rostro. Consulte la guía conceptual.

Sugerencia

Después de completar los prerrequisitos, puede probar la experiencia de actividad en vivo en las siguientes plataformas:

  • iOS: App Store de iOS : pulsa la pantalla de la aplicación 10 veces después de la instalación para habilitar el modo de desarrollador.
  • Android: Google Play Store : pulsa la pantalla de la aplicación 10 veces después de la instalación para habilitar el modo de desarrollador.
  • Web: pruébelo directamente en Vision Studio.

También puede compilar y ejecutar un ejemplo de front-end completo (iOS, Android o Web) desde la sección Ejemplos .

Preparación de la aplicación de front-end

Proporcionamos SDK en varios lenguajes para simplificar la integración con la aplicación de front-end. Consulte el archivo Léame del SDK elegido en las secciones siguientes para integrar la interfaz de usuario y el código necesario.

Importante

Cada SDK de front-end requiere acceso a un recurso cerrado para compilar correctamente. Consulte las instrucciones siguientes para configurar este acceso.

Para Swift iOS:

Para Kotlin/Java Android:

Para JavaScript Web:

Una vez integrado en su aplicación frontend, el SDK inicia la cámara, guía al usuario para ajustar su posición, compone los datos de liveness y los envía al servicio Azure AI Face para su procesamiento.

Supervise la sección Versiones del repositorio para ver las nuevas actualizaciones de la versión del SDK y habilite las alertas de actualización de dependencias automatizadas, como GitHub Dependabot (para repositorios de GitHub) o Renovado (GitHub, GitLab, Bitbucket, Azure Repos).

Realización de la detección de vivacidad

En los pasos siguientes se describe el proceso de orquestación de actividad:

Diagrama del flujo de trabajo de ejecución en Azure AI Face.

  1. La aplicación frontend inicia la comprobación de liveness y lo notifica al servidor de aplicaciones.

  2. El servidor de aplicaciones crea una nueva sesión de ejecución con Azure AI Face Service. El servicio crea una sesión de ejecución y responde con un token de autorización de sesión. Para obtener más información sobre cada parámetro de solicitud implicado en la creación de una sesión de ejecución, consulte Operación de creación de sesión en vivo.

    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()}");
    

    Ejemplo del cuerpo de la respuesta:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2025-05-20",
        "results": {
            "attempts": []
        }
    }
    
  3. El servidor de aplicaciones devuelve el token de autorización de sesión a la aplicación de front-end.

  4. La aplicación front-end utiliza el token de autorización de sesión para iniciar el detector de caras reales, que pone en marcha el flujo de vivacidad.

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. El SDK inicia la cámara, guía al usuario para que se coloque correctamente y, a continuación, prepara la carga para llamar al punto de conexión de servicio de detección de vivacidad.

  6. El SDK llama al servicio Face de Visión de Azure para realizar la detección de la vivacidad. Una vez que el servicio responde, el SDK notifica a la aplicación de front-end que se ha completado la comprobación de ejecución. Nota: la respuesta del servicio no contiene la decisión de vivacidad. Debe consultar esta información desde el servidor de aplicaciones.

  7. La aplicación de front-end retransmite la finalización de la comprobación de vivacidad al servidor de aplicaciones.

  8. El servidor de aplicaciones consulta el resultado de la detección de vivacidad del servicio 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()}");
    }
    

    Ejemplo del cuerpo de la respuesta:

    {
        "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. El servidor de aplicaciones elimina la sesión después de consultar todos los resultados de la sesión.

    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}");
    

Realización de la detección de vivacidad con verificación facial

La combinación de la verificación facial con detección de vivacidad permite la verificación biométrica de una persona determinada de interés con una garantía agregada de que la persona está físicamente presente en el sistema.

Diagrama del flujo de trabajo de verificación de vivacidad facial de Azure AI Face.

La integración de la detección de vivacidad con verificación consta de dos partes:

Paso 1: Seleccionar una imagen de referencia

Para obtener los resultados de reconocimiento más precisos, siga las sugerencias enumeradas en los requisitos de composición para escenarios de comprobación de identificadores.

Paso 2: configuración de la orquestación de la verificación de vivacidad

Los siguientes pasos generales muestran cómo orquestar la disponibilidad con verificación:

  1. Proporcione la imagen de referencia de verificación mediante uno de los dos métodos siguientes:

    • El servidor de aplicaciones proporciona la imagen de referencia al crear la sesión de vivacidad. Para obtener más información sobre cada parámetro de solicitud implicado en la creación de una sesión de liveness con verificación, vea Liveness With Verify Create Session Operation.

      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()}");
      

      Ejemplo del cuerpo de la respuesta:

      {
          "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"
              }
              ]
          }
      }
      
    • La aplicación de front-end proporciona la imagen de referencia al inicializar los SDK móviles. Este escenario no se admite en la solución web.

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. El servidor de aplicaciones ahora puede consultar el resultado de la verificación además del resultado de vivacidad.

    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()}");
    }
    

    Ejemplo del cuerpo de la respuesta:

    {
        "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. El servidor de aplicaciones puede eliminar la sesión si ya no necesita su 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}");
    

Realizar otras operaciones faciales después de la detección de vivacidad

De forma opcional, puede realizar operaciones faciales adicionales después de la verificación de vivacidad, como el análisis facial (para obtener atributos faciales) y operaciones de identidad de cara.

  1. Establezca el enableSessionImage parámetro en true durante el paso de creación de sesión.
  2. Extraiga el sessionImageId del paso Session-Get-Result.
  3. Descargue la imagen de sesión (a la que se hace referencia en Liveness Get Session Image Operation API) o proporcione el sessionImageId en la operación Detect from Session Image ID API para realizar otros análisis faciales u operaciones de reconocimiento facial. Para obtener más información sobre estas operaciones, consulte Conceptos de detección de caras y Conceptos de reconocimiento facial.

Opciones de soporte técnico

Además de usar las principales opciones de soporte técnico de Foundry Tools, también puede publicar sus preguntas en la sección de problemas del repositorio del SDK.

Para aprender cómo integrar la solución de liveness en tu aplicación actual, consulte la referencia del SDK de Azure Vision.

Para más información sobre las características disponibles para orquestación de la solución de vivacidad, consulte la referencia de la API de REST de sesión.