Delen via


Handleiding: Levendigheid in gezichten detecteren

Meer informatie over hoe u gezichts-liveness-detectie kunt integreren in uw werkstroom met behulp van logica aan de serverzijde en bijbehorende front-end-clienttoepassingen.

Hint

Zie de conceptuele handleiding voor algemene informatie over gezichtslevendigheidsdetectie.

In deze zelfstudie leert u hoe u een frontendtoepassing uitvoert met een appserver om livenessdetectie uit te voeren. U kunt ook gezichtsverificatie toevoegen op verschillende platforms en talen.

Belangrijk

De Face-client-SDK's voor 'liveness' zijn een afgeschermde functie. U moet toegang tot de liveness-functie aanvragen door het intakeformulier voor gezichtsherkenning in te vullen. Wanneer uw Azure-abonnement toegang krijgt, kunt u de Face Liveness SDK downloaden.

Vereisten

  • Azure-abonnement: Krijg een gratis abonnement
  • Aan uw Azure-account moet de rol Cognitive Services-inzender zijn toegewezen, zodat u akkoord kunt gaan met de verantwoordelijke AI-termen en een resource kunt maken. Als u deze rol wilt toewijzen aan uw account, volgt u de stappen in de documentatie over rollen toewijzen of neemt u contact op met de beheerder.
  • Zodra u uw Azure-abonnement hebt, maakt u een Face-resource in Azure Portal om uw sleutel en eindpunt op te halen. Nadat de app is geïmplementeerd, selecteert u Ga naar resource.
    • U hebt de sleutel en het eindpunt nodig van de resource die u maakt om uw toepassing te verbinden met de Face-service.
  • Toegang tot de beveiligde artefacten die vereist zijn voor Azure Vision in Foundry Tools Face Client SDK voor Mobiele apparaten (iOS en Android) en Web.
  • Bekendheid met de functie Gezichtsauthenticatie. Zie de conceptuele handleiding.

Hint

Nadat u de vereisten hebt voltooid, kunt u de liveness-ervaring op de volgende platforms proberen:

  • iOS: iOS App Store: tik tien keer na de installatie op het app-scherm om de ontwikkelaarsmodus in te schakelen.
  • Android: Google Play Store : tik 10 keer na de installatie op het app-scherm om de ontwikkelaarsmodus in te schakelen.
  • Web: Probeer het rechtstreeks in Vision Studio.

U kunt ook een volledig front-endvoorbeeld (iOS, Android of Web) bouwen en uitvoeren vanuit de sectie Voorbeelden .

De front-endtoepassing voorbereiden

We bieden SDK's in meerdere talen om de integratie met uw front-endtoepassing te vereenvoudigen. Raadpleeg de README voor uw gekozen SDK in de volgende secties om zowel de gebruikersinterface als de vereiste code te integreren.

Belangrijk

Elke front-end-SDK vereist toegang tot een gated asset om te compileren. Zie de volgende instructies voor het instellen van deze toegang.

Voor Swift iOS:

Voor Kotlin/Java Android:

Voor JavaScript Web:

Zodra de SDK in uw frontend-toepassing is geïntegreerd, start hij de camera, begeleidt hij de gebruiker om hun positie aan te passen, stelt hij de liveness-gegevens samen en stuurt hij deze naar de Azure AI Face-service voor verwerking.

Bewaak de sectie Releases van de opslagplaats voor nieuwe SDK-versie-updates en schakel automatische waarschuwingen voor afhankelijkheidsupdates in, zoals GitHub Dependabot (voor GitHub-opslagplaatsen) of Gerenoveerd (GitHub, GitLab, Bitbucket, Azure-opslagplaatsen).

Levendetijdcontrole uitvoeren

In de volgende stappen wordt het orkestratieproces voor liveness beschreven:

Diagram van de werkstroom voor liveness in Azure AI Face.

  1. De frontend-applicatie start de livenesscontrole en geeft dit door aan de app-server.

  2. De app-server maakt een nieuwe livenesssessie met Azure AI Face Service. De service maakt een liveness-sessie en reageert met een sessie-autorisatietoken. Zie Liveness Create Session Operation voor meer informatie over elke aanvraagparameter die betrokken is bij het maken van een livenesssessie.

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

    Een voorbeeld van de hoofdtekst van het antwoord:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2025-05-20",
        "results": {
            "attempts": []
        }
    }
    
  3. De app-server biedt het sessieautorisatietoken terug naar de front-endtoepassing.

  4. De front-end toepassing maakt gebruik van het sessieautorisatietoken om de face liveness detector te starten, waarmee de liveness flow wordt begonnen.

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. Het SDK startt de camera, leidt de gebruiker naar de juiste positie en bereidt vervolgens de payload voor om het eindpunt van de service voor liveness-detectie aan te roepen.

  6. SDK roept de Azure Vision Face-service aan om liveness-detectie uit te voeren. Zodra de service reageert, meldt de SDK de front-endtoepassing dat de livenesscontrole is voltooid. Opmerking: het serviceantwoord bevat niet de beslissing over de levensduur. U moet deze gegevens opvragen vanaf de app-server.

  7. De front-end toepassing stuurt de voltooiing van de liveness-controle door naar de appserver.

  8. De app-server voert query's uit voor het livenessdetectieresultaat van de Azure Vision Face-service.

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

    Een voorbeeld van de hoofdtekst van het antwoord:

    {
        "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. De app-server verwijdert de sessie nadat deze alle sessieresultaten heeft opgevraagd.

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

Gezichtsverificatie met de liveness-detectie uitvoeren

Het combineren van gezichtsverificatie met livenessdetectie maakt biometrische verificatie van een bepaalde persoon mogelijk met een extra garantie dat de persoon fysiek aanwezig is in het systeem.

Diagram van de werkstroom voor liveness-with-face-verificatie van Azure AI Face.

Het integreren van livenessdetectie met verificatie omvat twee onderdelen:

Stap 1: Selecteer een verwijzingsafbeelding

Volg de tips in de samenstellingsvereisten voor id-verificatiescenario's om de meest nauwkeurige herkenningsresultaten te verkrijgen.

Stap 2: de indeling van liveness met verificatie instellen

In de volgende stappen op hoog niveau ziet u hoe u liveness kunt organiseren met verificatie:

  1. Geef de verificatiereferentieafbeelding op met behulp van een van de volgende twee methoden:

    • De app-server biedt de referentieafbeelding bij het maken van de liveness-sessie. Zie Liveness With Verify Create Session Operation voor meer informatie over elke aanvraagparameter die betrokken is bij het maken van een liveness sessie met verificatie.

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

      Een voorbeeld van de hoofdtekst van het antwoord:

      {
          "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"
              }
              ]
          }
      }
      
    • De front-endtoepassing biedt de referentieafbeelding bij het initialiseren van de mobiele SDK's. Dit scenario wordt niet ondersteund in de weboplossing.

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. De app-server kan nu een query uitvoeren op het verificatieresultaat naast het liveness-resultaat.

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

    Een voorbeeld van de hoofdtekst van het antwoord:

    {
        "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. De app-server kan de sessie verwijderen als u het resultaat niet meer nodig hebt.

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

Voer andere gezichtsbewerkingen uit na levendigheidsdetectie

U kunt eventueel extra gezichtsbewerkingen uitvoeren na de livenesscontrole, zoals gezichtsanalyse (om gezichtskenmerken op te halen) en gezichtsidentiteitsbewerkingen.

  1. Stel de enableSessionImage parameter true in op tijdens de Session-Creation stap.
  2. Pak het sessionImageId uit de Session-Get-Result stap.
  3. Download de sessie-afbeelding (waarnaar wordt verwezen in Liveness Get Session Image Operation API), of geef sessionImageId op in de Detect from Session Image ID API bewerking om door te gaan met andere gezichtsanalyses of gezichtsidentiteitsbewerkingen. Zie concepten voor gezichtsdetectie en gezichtsherkenning voor meer informatie over deze bewerkingen.

Ondersteuningsopties

Naast het gebruik van de belangrijkste ondersteuningsopties voor Foundry Tools, kunt u ook uw vragen posten in de sectie problemen van de SDK-opslagplaats.

Zie de Naslaginformatie over de Azure Vision SDK voor meer informatie over het integreren van de liveness-oplossing in uw bestaande toepassing.

Zie de REST API-referentie voor sessies voor meer informatie over de functies die beschikbaar zijn voor het coördineren van de liveness-oplossing.