Dela via


Självstudie: Identifiera livskraft i ansikten

Identifiering av ansiktsuppspelning kan användas för att avgöra om ett ansikte i en indatavideoström är verklig (live) eller falsk (förfalskad). Det är en viktig byggsten i ett biometriskt autentiseringssystem för att förhindra att bedragare får åtkomst till systemet med hjälp av ett fotografi, en video, en mask eller något annat sätt att personifiera en annan person.

Målet med livenessidentifiering är att säkerställa att systemet interagerar med en fysiskt närvarande levande person vid tidpunkten för autentiseringen. Sådana system blir allt viktigare med ökad digital finansiering, fjärråtkomstkontroll och identitetsverifiering online.

Lösningen för identifiering av liveness i Azure AI Face försvarar sig framgångsrikt mot olika typer av förfalskningar, allt från pappersutskrifter, 2d/3d masker och falska presentationer på telefoner och bärbara datorer. Liveness detection är ett aktivt område för forskning, med kontinuerliga förbättringar som görs för att motverka alltmer sofistikerade förfalskningsattacker över tid. Kontinuerliga förbättringar kommer att distribueras till klienten och tjänstkomponenterna över tid när den övergripande lösningen blir mer robust för nya typer av attacker.

Viktigt!

Ansiktsklient-SDK:er för liveness är en gated-funktion. Du måste begära åtkomst till liveness-funktionen genom att fylla i intagsformuläret för ansiktsigenkänning. När din Azure-prenumeration beviljas åtkomst kan du ladda ned Face liveness SDK.

Introduktion

Integreringen av liveness-lösningen omfattar två distinkta komponenter: en klientdelsmobil/webbapp och en appserver/orchestrator.

Diagram över arbetsflödet för liveness i Azure AI Face.

  • Klientdelsprogram: Klientdelsprogrammet får auktorisering från appservern för att initiera livenessidentifiering. Dess främsta mål är att aktivera kameran och vägleda slutanvändare korrekt genom processen för livenessidentifiering.
  • Appserver: Appservern fungerar som en serverdelsserver för att skapa sessioner för livenessidentifiering och hämta en auktoriseringstoken från ansiktstjänsten för en viss session. Den här token ger klientdelsprogrammet behörighet att utföra livenessidentifiering. Appserverns mål är att hantera sessionerna, att bevilja auktorisering för klientdelsprogrammet och att visa resultatet av processen för livenessidentifiering.

Dessutom kombinerar vi ansiktsverifiering med livenessidentifiering för att verifiera om personen är den specifika person som du har utsett. I följande tabell beskrivs information om funktionerna för livenessidentifiering:

Funktion beskrivning
Identifiering av liveness Fastställ att indata är verkliga eller falska, och endast appservern har behörighet att starta liveness-kontrollen och köra frågor mot resultatet.
Identifiering av livskraft med ansiktsverifiering Fastställ att en indata är verklig eller falsk och verifiera identiteten för personen baserat på en referensbild som du angav. Antingen kan appservern eller klientdelsprogrammet tillhandahålla en referensbild. Endast appservern har behörighet att initiera liveness-kontrollen och köra frågor mot resultatet.

Den här självstudien visar hur du använder ett klientdelsprogram och en appserver för att utföra identifiering av liveness och liveness med ansiktsverifiering på olika språk-SDK:er.

Förutsättningar

  • Azure-prenumeration – Skapa en kostnadsfritt
  • Ditt Azure-konto måste ha tilldelats rollen Cognitive Services-deltagare för att du ska kunna godkänna de ansvarsfulla AI-villkoren och skapa en resurs. Om du vill tilldela den här rollen till ditt konto följer du stegen i dokumentationen Tilldela roller eller kontaktar administratören.
  • När du har din Azure-prenumeration skapar du en ansiktsresurs i Azure-portalen för att hämta din nyckel och slutpunkt. När den har distribuerats väljer du Gå till resurs.
    • Du behöver nyckeln och slutpunkten från den resurs som du skapar för att ansluta ditt program till ansiktstjänsten.
    • Du kan använda den kostnadsfria prisnivån (F0) för att prova tjänsten och uppgradera senare till en betald nivå för produktion.
  • Åtkomst till Azure AI Vision Face Client SDK för mobil (IOS och Android) och webben. För att komma igång måste du ansöka om funktionerna för begränsad åtkomst för ansiktsigenkänning för att få åtkomst till SDK:t. Mer information finns på sidan Ansiktsbegränsade åtkomst .

Konfigurera klientdelsprogram och appservrar för att utföra livenessidentifiering

Vi tillhandahåller SDK:er på olika språk för klientdelsprogram och appservrar. Se följande instruktioner för att konfigurera klientdelsprogram och appservrar.

Ladda ned SDK för klientdelsprogram

När du har åtkomst till SDK följer du anvisningarna på GitHub-lagringsplatsen azure-ai-vision-sdk för att integrera användargränssnittet och koden i ditt interna mobilprogram. Liveness SDK stöder Java/Kotlin för Mobila Android-program, Swift för iOS-mobilappar och JavaScript för webbprogram:

  • För Swift iOS följer du anvisningarna i iOS-exemplet
  • För Kotlin/Java Android följer du anvisningarna i Android-exemplet
  • För JavaScript Web följer du anvisningarna i webbexemplet

När du har lagt till koden i ditt program hanterar SDK:n start av kameran, vägleder slutanvändaren när de justerar sin position, skriver nyttolasten för liveness och anropar Azure AI Face-molntjänsten för att bearbeta nyttolasten för liveness.

Ladda ned Azure AI Face-klientbiblioteket för appservern

Appservern/orkestratorn ansvarar för att kontrollera livscykeln för en liveness-session. Appservern måste skapa en session innan du utför livenessidentifiering, och sedan kan den köra frågor mot resultatet och ta bort sessionen när liveness-kontrollen är klar. Vi erbjuder ett bibliotek på olika språk för att enkelt implementera din appserver. Följ de här stegen för att installera det paket du vill ha:

  • För C#följer du anvisningarna i dotnet readme
  • För Java följer du anvisningarna i Java readme
  • För Python följer du anvisningarna i Python-läsningen
  • För JavaScript följer du anvisningarna i JavaScript-readme

Skapa miljövariabler

I det här exemplet skriver du dina autentiseringsuppgifter till miljövariabler på den lokala dator som kör programmet.

Gå till Azure-portalen. Om resursen som du skapade i avsnittet Förutsättningar har distribuerats väljer du Gå till resurs under Nästa steg. Du hittar din nyckel och slutpunkt under Resurshanteringsidan Nycklar och slutpunkt . Resursnyckeln är inte samma som ditt Azure-prenumerations-ID.

Dricks

Inkludera inte nyckeln direkt i koden och publicera den aldrig offentligt. Mer autentiseringsalternativ som Azure Key Vault finns i säkerhetsartikeln för Azure AI-tjänster.

Om du vill ange miljövariabeln för din nyckel och slutpunkt öppnar du ett konsolfönster och följer anvisningarna för operativsystemet och utvecklingsmiljön.

  1. Om du vill ange VISION_KEY miljövariabeln ersätter du your-key med en av nycklarna för resursen.
  2. Om du vill ange VISION_ENDPOINT miljövariabeln ersätter du your-endpoint med slutpunkten för resursen.
setx VISION_KEY your-key
setx VISION_ENDPOINT your-endpoint

När du har lagt till miljövariablerna kan du behöva starta om alla program som körs som läser miljövariablerna, inklusive konsolfönstret.

Utföra livenessidentifiering

De övergripande stegen som ingår i orkestrering av liveness illustreras nedan:

Diagram över arbetsflödet för liveness i Azure AI Face.

  1. Klientdelsprogrammet startar live-kontrollen och meddelar appservern.

  2. Appservern skapar en ny liveness-session med Azure AI Face Service. Tjänsten skapar en liveness-session och svarar tillbaka med en sessionsauktoriseringstoken. Mer information om varje parameter för begäran som ingår i skapandet av en liveness-session finns i Liveness Create Session Operation (Skapa sessionsåtgärd för liveness).

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

    Ett exempel på svarstexten:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>"
    }
    
  3. Appservern tillhandahåller sessionsauktoriseringstoken tillbaka till klientdelsprogrammet.

  4. Klientdelsprogrammet tillhandahåller sessionsauktoriseringstoken under Azure AI Vision SDK:s initiering.

    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. SDK startar sedan kameran, vägleder användaren att placera korrekt och förbereder sedan nyttolasten för att anropa tjänstslutpunkten för livenessidentifiering.

  6. SDK:n anropar Tjänsten Azure AI Vision Face för att utföra livenessidentifieringen. När tjänsten svarar meddelar SDK klientdelsappen att live-kontrollen har slutförts.

  7. Klientdelsprogrammet vidarebefordrar live-kontrollens slutförande till appservern.

  8. Appservern kan nu fråga efter livenessidentifieringsresultatet från 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}");
    

    Ett exempel på svarstexten:

    {
        "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. Appservern kan ta bort sessionen om du inte kör frågor mot resultatet längre.

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

Utföra livenessidentifiering med ansiktsverifiering

Att kombinera ansiktsverifiering med livenessidentifiering möjliggör biometrisk verifiering av en viss person av intresse med en extra garanti för att personen är fysiskt närvarande i systemet. Det finns två delar för att integrera livskraft med verifiering:

  1. Välj en bra referensbild.
  2. Konfigurera orkestrering av liveness med verifiering.

Diagram över arbetsflödet liveness-with-face-verification i Azure AI Face.

Välj en bra referensbild

Använd följande tips för att se till att dina indatabilder ger de mest exakta igenkänningsresultaten.

Tekniska krav

  • De indatabildformat som stöds är JPEG, PNG, GIF (den första ramen), BMP.
  • Bildfilens storlek får inte vara större än 6 MB.
  • Du kan använda qualityForRecognition attributet i ansiktsidentifieringsåtgärden när du använder tillämpliga identifieringsmodeller som en allmän riktlinje för om bilden sannolikt har tillräcklig kvalitet för att försöka identifiera ansiktet. Endast "high" kvalitetsbilder rekommenderas för personregistrering och kvalitet på eller högre "medium" rekommenderas för identifieringsscenarier.

Krav på sammansättning

  • Fotot är tydligt och skarpt, inte suddigt, pixeliserat, förvrängt eller skadat.
  • Foto ändras inte för att ta bort ansiktsfläckar eller ansiktsutseende.
  • Fotot måste vara i ett RGB-format som stöds (JPEG, PNG, WEBP, BMP). Rekommenderad ansiktsstorlek är 200 bildpunkter x 200 bildpunkter. Ansiktsstorlekar som är större än 200 bildpunkter x 200 bildpunkter resulterar inte i bättre AI-kvalitet och inte större än 6 MB i storlek.
  • Användaren har inte glasögon, masker, hattar, hörlurar, huvudbeklädnader eller ansiktsbeklädnader. Ansiktet ska vara fritt från eventuella hinder.
  • Ansiktssmycken tillåts förutsatt att de inte döljer ditt ansikte.
  • Endast ett ansikte ska vara synligt på bilden.
  • Ansiktet ska vara i neutral framåtriktad pose med båda ögonen öppna, munnen stängd, utan extrema ansiktsuttryck eller huvudlutning.
  • Ansiktet ska vara fritt från skuggor eller röda ögon. Omtagningsfoto om något av dessa inträffar.
  • Bakgrunden ska vara enhetlig och oformaterad, utan skuggor.
  • Ansiktet ska centreras i bilden och fylla minst 50 % av bilden.

Konfigurera orkestrering av liveness med verifiering.

De övergripande stegen som ingår i livskraften med verifieringsorkestrering illustreras nedan:

  1. Tillhandahålla verifieringsreferensbilden med någon av följande två metoder:

    • Appservern tillhandahåller referensbilden när du skapar liveness-sessionen. Mer information om varje parameter för begäran som ingår i skapandet av en liveness-session med verifiering finns i Liveness with Verify Create Session Operation (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}");
      

      Ett exempel på svarstexten:

      {
          "verifyImage": {
              "faceRectangle": {
                  "top": 506,
                  "left": 51,
                  "width": 680,
                  "height": 475
              },
              "qualityForRecognition": "high"
          },
          "sessionId": "3847ffd3-4657-4e6c-870c-8e20de52f567",
          "authToken": "<session-authorization-token>"
      }
      
    • Klientdelsprogrammet tillhandahåller referensbilden när SDK initieras. Det här scenariot stöds inte i webblösningen.

      val singleFaceImageSource = VisionSource.fromFile("/path/to/image.jpg")
      mFaceAnalysisOptions?.setRecognitionMode(RecognitionMode.valueOfVerifyingMatchToFaceInSingleFaceImage(singleFaceImageSource))
      
  2. Appservern kan nu fråga efter verifieringsresultatet utöver liveness-resultatet.

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

    Ett exempel på svarstexten:

    {
        "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. Appservern kan ta bort sessionen om du inte kör frågor mot resultatet längre.

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

Rensa resurser

Om du vill rensa och ta bort en Azure AI-tjänstprenumeration kan du ta bort resursen eller resursgruppen. Om du tar bort resursgruppen tas även alla andra resurser som är associerade med den bort.

Nästa steg

Mer information om andra alternativ i API:erna för liveness finns i Azure AI Vision SDK-referensen.

Mer information om de funktioner som är tillgängliga för att orkestrera liveness-lösningen finns i referensen för SESSIONS-REST API.