Delen via


Zelfstudie: Liveness in gezichten detecteren

Gezichts livenessdetectie kan worden gebruikt om te bepalen of een gezicht in een invoervideostream echt (live) of nep (spoof) is. Het is een cruciale bouwsteen in een biometrisch verificatiesysteem om te voorkomen dat spoofingaanvallen van imposters toegang proberen te krijgen tot het systeem met behulp van een foto, video, masker of andere middelen om een andere persoon te imiteren.

Het doel van livenessdetectie is ervoor te zorgen dat het systeem communiceert met een fysiek aanwezige live persoon op het moment van verificatie. Dergelijke systemen zijn steeds belangrijker geworden met de opkomst van digitale financiën, rastoegangsbeheer en online identiteitsverificatieprocessen.

De oplossing voor livenessdetectie verdedigt zich tegen verschillende soorten adresvervalsing, variërend van papierafdrukken, 2d/3d-maskers en spoofpresentaties op telefoons en laptops. Detectie van liveness is een actief onderzoeksgebied, waarbij doorlopende verbeteringen worden aangebracht om steeds geavanceerdere spoofingaanvallen in de loop van de tijd tegen te gaan. Doorlopende verbeteringen worden in de loop van de tijd geïmplementeerd voor de client en de serviceonderdelen, omdat de algehele oplossing robuuster wordt voor nieuwe typen aanvallen.

Belangrijk

De Face-client-SDK's voor liveness zijn een gated-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.

Inleiding

De integratie van de liveness-oplossing omvat twee verschillende onderdelen: een front-end mobiele/webtoepassing en een app-server/orchestrator.

Diagram van de werkstroom voor liveness in Azure AI Face.

  • Front-endtoepassing: De front-endtoepassing ontvangt autorisatie van de app-server om livenessdetectie te initiëren. Het primaire doel is om de camera te activeren en eindgebruikers nauwkeurig te begeleiden via het detectieproces van de liveness.
  • App-server: de app-server fungeert als een back-endserver voor het maken van livenessdetectiesessies en het verkrijgen van een autorisatietoken van de Face-service voor een bepaalde sessie. Met dit token wordt de front-endtoepassing gemachtigd om livenessdetectie uit te voeren. De doelstellingen van de app-server zijn het beheren van de sessies, het verlenen van autorisatie voor een front-endtoepassing en het weergeven van de resultaten van het detectieproces voor liveness.

Daarnaast combineren we gezichtsverificatie met livenessdetectie om te controleren of de persoon de specifieke persoon is die u hebt aangewezen. In de volgende tabel worden details van de functies voor detectie van liveness beschreven:

Functie Beschrijving
Detectie van liveness Bepaal of een invoer echt of nep is en alleen de app-server de bevoegdheid heeft om de livenesscontrole te starten en een query uit te voeren op het resultaat.
Livenessdetectie met gezichtsverificatie Bepaal of een invoer echt of nep is en controleer de identiteit van de persoon op basis van een referentieafbeelding die u hebt opgegeven. De app-server of de front-endtoepassing kan een referentieafbeelding bieden. Alleen de app-server heeft de bevoegdheid om de livenesscontrole te initialiseren en het resultaat op te vragen.

Aan de slag

Deze zelfstudie laat zien hoe u een front-endtoepassing en een app-server kunt gebruiken om livenessdetectie en livenessdetectie uit te voeren met gezichtsverificatie in verschillende taal-SDK's.

Vereisten

  • Azure-abonnement: Krijg een gratis abonnement
  • Aan uw Azure-account moet de rol Cognitive Services-inzender zijn toegewezen om akkoord te gaan met de verantwoordelijke AI-voorwaarden en een resource te 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.
    • U kunt de gratis prijscategorie (F0) gebruiken om de service uit te proberen, en later upgraden naar een betaalde laag voor productie.
  • Toegang tot de Azure AI Vision Face Client SDK voor mobiel (IOS en Android) en internet. Om aan de slag te gaan, moet u de functies voor beperkte toegang tot gezichtsherkenning toepassen om toegang te krijgen tot de SDK. Zie de pagina Face Limited Access voor meer informatie.

Front-endtoepassingen en app-servers instellen om livenessdetectie uit te voeren

We bieden SDK's in verschillende talen voor front-endtoepassingen en app-servers. Zie de volgende instructies voor het instellen van uw front-endtoepassingen en app-servers.

Liveness integreren in front-endtoepassing

Zodra u toegang hebt tot de SDK, volgt u de instructies in de GitHub-opslagplaats azure-ai-vision-sdk om de gebruikersinterface en de code te integreren in uw systeemeigen mobiele toepassing. De liveness SDK ondersteunt Java/Kotlin voor mobiele Android-toepassingen, Swift voor mobiele iOS-toepassingen en JavaScript voor webtoepassingen:

Zodra u de code aan uw toepassing hebt toegevoegd, verwerkt de SDK het starten van de camera, zodat de eindgebruiker de positie kan aanpassen, de nettolading van de liveness kan opstellen en de Azure AI Face-cloudservice aanroept om de nettolading van de liveness te verwerken.

Azure AI Face-clientbibliotheek voor een app-server downloaden

De app-server/orchestrator is verantwoordelijk voor het beheren van de levenscyclus van een livenesssessie. De app-server moet een sessie maken voordat livenessdetectie wordt uitgevoerd. Vervolgens kan deze query uitvoeren op het resultaat en de sessie verwijderen wanneer de livenesscontrole is voltooid. We bieden een bibliotheek in verschillende talen voor het eenvoudig implementeren van uw app-server. Volg deze stappen om het gewenste pakket te installeren:

Omgevingsvariabelen maken

In dit voorbeeld schrijft u uw referenties naar omgevingsvariabelen op de lokale computer waarop de toepassing wordt uitgevoerd.

Ga naar de Azure Portal. Als de resource die u hebt gemaakt in de sectie Vereisten is geïmplementeerd, selecteert u Ga naar de resource onder Volgende stappen. U vindt uw sleutel en eindpunt onder Resourcebeheer op de pagina Sleutels en Eindpunt. Uw resourcesleutel is niet hetzelfde als uw Azure-abonnements-id.

Tip

Neem de sleutel niet rechtstreeks op in uw code en plaats deze nooit openbaar. Zie het beveiligingsartikel over Azure AI-services voor meer verificatieopties, zoals Azure Key Vault.

Als u de omgevingsvariabele voor uw sleutel en eindpunt wilt instellen, opent u een consolevenster en volgt u de instructies voor uw besturingssysteem en ontwikkelomgeving.

  1. Als u de VISION_KEY omgevingsvariabele wilt instellen, vervangt u deze door your-key een van de sleutels voor uw resource.
  2. Als u de VISION_ENDPOINT omgevingsvariabele wilt instellen, vervangt your-endpoint u het eindpunt voor uw resource.
setx VISION_KEY your-key
setx VISION_ENDPOINT your-endpoint

Nadat u de omgevingsvariabelen hebt toegevoegd, moet u mogelijk alle actieve programma's die de omgevingsvariabelen lezen, met inbegrip van het consolevenster, opnieuw opstarten.

Livenessdetectie uitvoeren

Hieronder ziet u de stappen op hoog niveau die betrekking hebben op de indeling van liveness:

Diagram van de werkstroom voor liveness in Azure AI Face.

  1. De front-endtoepassing start de livenesscontrole en meldt de app-server.

  2. De app-server maakt een nieuwe livenesssessie met Azure AI Face Service. De service maakt een liveness-sessie en reageert terug met een sessieautorisatietoken. Meer informatie over elke aanvraagparameter die betrokken is bij het maken van een livenesssessie, wordt verwezen in de bewerking Liveness Create Session.

    var endpoint = new Uri(System.Environment.GetEnvironmentVariable("VISION_ENDPOINT"));
    var credential = new AzureKeyCredential(System.Environment.GetEnvironmentVariable("VISION_KEY"));
    
    var sessionClient = new FaceSessionClient(endpoint, credential);
    
    var createContent = new CreateLivenessSessionContent(LivenessOperationMode.Passive)
    {
        DeviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bccd",
        SendResultsToClient = false,
    };
    
    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}");
    

    Een voorbeeld van de hoofdtekst van het antwoord:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>"
    }
    
  3. De app-server biedt het sessieautorisatietoken terug naar de front-endtoepassing.

  4. De front-endtoepassing biedt het sessieautorisatietoken tijdens de initialisatie van de Azure AI Vision 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))
    })
    
  5. De SDK start vervolgens de camera, leidt de gebruiker naar de juiste positie en bereidt vervolgens de nettolading voor om het service-eindpunt voor livenessdetectie aan te roepen.

  6. De SDK roept de Azure AI Vision Face-service aan om de livenessdetectie uit te voeren. Zodra de service reageert, meldt de SDK de front-endtoepassing dat de livenesscontrole is voltooid.

  7. De front-endtoepassing stuurt de voltooiing van de livenesscontrole door naar de app-server.

  8. De app-server kan nu een query uitvoeren op het livenessdetectieresultaat van de Azure AI Vision Face-service.

    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 request id: {sessionResult.Result?.RequestId}");
    Console.WriteLine($"Liveness detection received datetime: {sessionResult.Result?.ReceivedDateTime}");
    Console.WriteLine($"Liveness detection decision: {sessionResult.Result?.Response.Body.LivenessDecision}");
    Console.WriteLine($"Session created datetime: {sessionResult.CreatedDateTime}");
    Console.WriteLine($"Auth token TTL (seconds): {sessionResult.AuthTokenTimeToLiveInSeconds}");
    Console.WriteLine($"Session expired: {sessionResult.SessionExpired}");
    Console.WriteLine($"Device correlation id: {sessionResult.DeviceCorrelationId}");
    

    Een voorbeeld van de hoofdtekst van het antwoord:

    {
        "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": "content.bin",
                        "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
    }
    
  9. De app-server kan de sessie verwijderen als u geen query meer uitvoert op het resultaat ervan.

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

Livenessdetectie uitvoeren met gezichtsverificatie

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. Er zijn twee onderdelen voor het integreren van liveness met verificatie:

  1. Selecteer een goede referentieafbeelding.
  2. De indeling van liveness met verificatie instellen.

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

Een goede referentieafbeelding selecteren

Gebruik de volgende tips om ervoor te zorgen dat uw invoerafbeeldingen de meest nauwkeurige herkenningsresultaten geven.

Technische vereisten:
  • De ondersteunde indelingen voor invoerafbeeldingen zijn JPEG, PNG, GIF (het eerste frame), BMP.
  • De grootte van het afbeeldingsbestand mag niet groter zijn dan 6 MB.
  • U kunt het qualityForRecognition kenmerk in de gezichtsdetectiebewerking gebruiken wanneer u toepasselijke detectiemodellen gebruikt als algemene richtlijn of de afbeelding waarschijnlijk voldoende kwaliteit heeft om gezichtsherkenning uit te voeren. Alleen "high" kwaliteitsafbeeldingen worden aanbevolen voor persoonsinschrijving en -kwaliteit op of hoger "medium" voor identificatiescenario's.
Samenstellingsvereisten:
  • Foto is helder en scherp, niet wazig, pixelig, vervormd of beschadigd.
  • Foto wordt niet gewijzigd om gezichts-vlekken of gezichtsuitzicht te verwijderen.
  • Foto moet een ondersteunde RGB-kleur hebben (JPEG, PNG, WEBP, BMP). Aanbevolen gezichtsgrootte is 200 pixels x 200 pixels. Gezichtsgrootten groter dan 200 pixels x 200 pixels leiden niet tot een betere AI-kwaliteit en niet groter dan 6 MB.
  • De gebruiker draagt geen bril, maskers, hoeden, hoofdtelefoons, hoofdbedekkingen of gezichtsbekledingen. Gezicht moet vrij zijn van eventuele obstakels.
  • Gezichtsjuwelen is toegestaan op voorwaarde dat ze je gezicht niet verbergen.
  • Er mag slechts één gezicht zichtbaar zijn op de foto.
  • Het gezicht moet zich in neutrale frontgerichte houding bevinden met beide ogen open, mond gesloten, zonder extreme gezichtsuitdrukkingen of hoofdkantelen.
  • Het gezicht moet vrij zijn van schaduwen of rode ogen. Maak een foto opnieuw als een van deze zich voordoet.
  • De achtergrond moet uniform en duidelijk zijn, vrij van schaduwen.
  • Het gezicht moet worden gecentreerd binnen de afbeelding en ten minste 50% van de afbeelding vullen.

De indeling van liveness met verificatie instellen.

Hieronder ziet u de stappen op hoog niveau die betrekking hebben op de liveness met verificatieindeling:

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

    • De app-server biedt de referentieafbeelding bij het maken van de liveness-sessie. Meer informatie over elke aanvraagparameter die betrokken is bij het maken van een livenesssessie met verificatie wordt verwezen in Liveness With Verify Create Session Operation.

      var endpoint = new Uri(System.Environment.GetEnvironmentVariable("VISION_ENDPOINT"));
      var credential = new AzureKeyCredential(System.Environment.GetEnvironmentVariable("VISION_KEY"));
      
      var sessionClient = new FaceSessionClient(endpoint, credential);
      
      var createContent = new CreateLivenessSessionContent(LivenessOperationMode.Passive)
      {
          DeviceCorrelationId = "723d6d03-ef33-40a8-9682-23a1feb7bccd"
      };
      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}");
      

      Een voorbeeld van de hoofdtekst van het antwoord:

      {
          "verifyImage": {
              "faceRectangle": {
                  "top": 506,
                  "left": 51,
                  "width": 680,
                  "height": 475
              },
              "qualityForRecognition": "high"
          },
          "sessionId": "3847ffd3-4657-4e6c-870c-8e20de52f567",
          "authToken": "<session-authorization-token>"
      }
      
    • De front-endtoepassing biedt de referentieafbeelding bij het initialiseren van de SDK. Dit scenario wordt niet ondersteund in de weboplossing.

      val singleFaceImageSource = VisionSource.fromFile("/path/to/image.jpg")
      mFaceAnalysisOptions?.setRecognitionMode(RecognitionMode.valueOfVerifyingMatchToFaceInSingleFaceImage(singleFaceImageSource))
      
  2. De app-server kan nu een query uitvoeren op het verificatieresultaat naast het liveness-resultaat.

    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 request id: {sessionResult.Result?.RequestId}");
    Console.WriteLine($"Liveness detection received datetime: {sessionResult.Result?.ReceivedDateTime}");
    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}");
    Console.WriteLine($"Session created datetime: {sessionResult.CreatedDateTime}");
    Console.WriteLine($"Auth token TTL (seconds): {sessionResult.AuthTokenTimeToLiveInSeconds}");
    Console.WriteLine($"Session expired: {sessionResult.SessionExpired}");
    Console.WriteLine($"Device correlation id: {sessionResult.DeviceCorrelationId}");
    

    Een voorbeeld van de hoofdtekst van het antwoord:

    {
        "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": "content.bin",
                        "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
    }
    
  3. De app-server kan de sessie verwijderen als u geen query meer uitvoert op het resultaat ervan.

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

Resources opschonen

Als u een Azure AI-servicesabonnement wilt opschonen en verwijderen, kunt u de resource of resourcegroep verwijderen. Als u de resourcegroep verwijdert, worden ook alle bijbehorende resources verwijderd.

Volgende stappen

Zie de naslaginformatie over de Azure AI Vision SDK voor meer informatie over andere opties in de liveness-API's.

Zie de naslaginformatie over de sessie-REST API voor meer informatie over de functies die beschikbaar zijn voor het organiseren van de liveness-oplossing.