Freigeben über


Tutorial: Erkennen von Face Liveness

Erfahren Sie, wie Sie die Gesichts-Liveness-Erkennung in Ihren Workflow integrieren, indem Sie serverseitige Logik und begleitende Frontend-Client-Anwendungen verwenden.

Tipp

Allgemeine Informationen zur Gesichtslebenserkennung finden Sie in der konzeptionellen Anleitung.

In diesem Tutorial erfahren Sie, wie Sie eine Frontend-App mit einem Applikationsserver ausführen, um die Lebendigkeitserkennung zu ermöglichen. Sie können die Gesichtsüberprüfung auch auf verschiedenen Plattformen und Sprachen hinzufügen.

Wichtig

Die Face-Client-SDKs für die Liveness sind ein eingeschränktes Feature. Sie müssen den Zugriff auf das Liveness-Feature anfordern, indem Sie das Aufnahmeformular für die Gesichtserkennung ausfüllen. Wenn Ihrem Azure-Abonnement Zugriff gewährt wird, können Sie das Face Liveness-SDK herunterladen.

Voraussetzungen

  • Azure-Abonnement – Erstellen eines kostenlosen Kontos
  • Damit Sie den entsprechenden Bedingungen für verantwortungsvolle KI zustimmen und eine Ressource erstellen können, muss Ihrem Azure-Konto die Rolle Cognitive Services-Mitwirkender zugewiesen sein. Um diese Rolle Ihrem Konto zuzuweisen, führen Sie die Schritte in der Dokumentation Zuweisen von Rollen aus, oder wenden Sie sich an Ihren Administrator.
  • Sobald Sie über Ihr Azure-Abonnement verfügen, sollten Sie im Azure-Portal eine Gesichtserkennungsressource erstellen, um Ihren Schlüssel und Endpunkt zu erhalten. Wählen Sie nach Abschluss der Bereitstellung Zu Ressource wechseln aus.
    • Sie benötigen den Schlüssel und den Endpunkt der von Ihnen erstellten Ressource, um Ihre Anwendung mit dem Gesichtserkennungsdienst verbinden zu können.
  • Zugriff auf die für Azure Vision erforderlichen geschützten Artefakte im Foundry Tools Face Client SDK für Mobile (iOS und Android) und Web.
  • Vertrautheit mit der Liveness-Gesichtserkennungsfunktion. Sehen Sie sich den konzeptionellen Leitfaden an.

Tipp

Nach Abschluss der Voraussetzungen können Sie die Liveness-Erfahrung auf den folgenden Plattformen ausprobieren:

  • iOS: iOS App Store – tippen Sie 10 Mal nach der Installation auf den App-Bildschirm, um den Entwicklermodus zu aktivieren.
  • Android: Google Play Store – tippen Sie 10 Mal nach der Installation auf den App-Bildschirm, um den Entwicklermodus zu aktivieren.
  • Web: Probieren Sie es direkt in Vision Studio aus.

Sie können auch ein vollständiges Frontend-Beispiel (iOS, Android oder Web) aus dem Abschnitt "Beispiele " erstellen und ausführen.

Vorbereiten der Front-End-Anwendung

Wir stellen SDKs in mehreren Sprachen bereit, um die Integration in Ihre Frontend-Anwendung zu vereinfachen. Lesen Sie in den folgenden Abschnitten die README-Datei für das ausgewählte SDK, um sowohl die Benutzeroberfläche als auch den erforderlichen Code zu integrieren.

Wichtig

Jedes Frontend-SDK erfordert Zugriff auf eine gated-Ressource, um erfolgreich kompiliert zu werden. Lesen Sie die folgenden Anweisungen zum Einrichten dieses Zugriffs.

Für Swift iOS:

Für Kotlin/Java Android:

Für JavaScript-Web:

Sobald sie in Ihre Frontend-Anwendung integriert ist, startet das SDK die Kamera, leitet den Benutzer zum Anpassen seiner Position, verfasst die Liveness-Nutzlast und sendet sie zur Verarbeitung an den Azure AI Face-Dienst.

Überwachen Sie den Abschnitt "Releases" des Repositorys auf neue SDK-Versionsupdates, und aktivieren Sie automatisierte Benachrichtigungen für Abhängigkeitsupdates, z. B. GitHub Dependabot (für GitHub-Repositorys) oder Renovieren (GitHub, GitLab, Bitbucket, Azure Repos).

Durchführen der Liveness-Erkennung

Die folgenden Schritte beschreiben den Liveness-Orchestrierungsprozess:

Abbildung des Liveness-Workflows in Azure KI Gesichtserkennung.

  1. Die Front-End-Anwendung startet die Liveness-Überprüfung und benachrichtigt den App-Server.

  2. Der App-Server erstellt eine neue Liveness-Sitzung mit dem Azure KI-Gesichtserkennungsdienst. Der Dienst erstellt eine Liveness-Sitzung und antwortet mit einem Sitzungs-Autorisierungstoken. Weitere Informationen zu jedem Anforderungsparameter, der an der Erstellung einer Liveness-Sitzung beteiligt ist, finden Sie unter Liveness Create Session Operation.

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

    Ein Beispiel für den Antworttext:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2025-05-20",
        "results": {
            "attempts": []
        }
    }
    
  3. Der App-Server stellt das Sitzungsautorisierungstoken zurück zur Front-End-Anwendung bereit.

  4. Die Front-End-Anwendung verwendet das Sitzungsautorisierungstoken, um die Gesichtslebendigkeitserkennung zu starten, die den Lebendigkeitsflow startet.

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. Das SDK startet die Kamera, bringt die Person in die richtige Position und bereitet anschließend die Nutzdaten vor, um den Endpunkt für den Lebendigkeitserkennungsdienst aufzurufen.

  6. Das SDK ruft den Azure Vision Face-Dienst auf, um die Lebendigkeitserkennung durchzuführen. Sobald der Dienst antwortet, benachrichtigt das SDK die Frontend-Anwendung, dass die Liveness-Überprüfung abgeschlossen ist. Hinweis: Die Dienstantwort enthält nicht das Ergebnis der Liveness-Prüfung. Sie müssen diese Informationen vom App-Server abfragen.

  7. Die Front-End-Anwendung informiert den App-Server über den Abschluss der Liveness-Überprüfung.

  8. Der App-Server fragt das Ergebnis der Lebendigkeitserkennung vom Azure Vision-Gesichtserkennungsdienst ab.

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

    Ein Beispiel für den Antworttext:

    {
        "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. Der App-Server löscht die Sitzung, nachdem sie alle Sitzungsergebnisse abfragt.

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

Durchführen der Liveness-Erkennung mit Gesichtsüberprüfung

Die Kombination aus Gesichtsüberprüfung und Liveness-Erkennung ermöglicht die biometrische Überprüfung einer bestimmten Person von Interesse mit der zusätzlichen Garantie, dass die Person physisch im System vorhanden ist.

Diagramm: Workflow für Liveness mit Gesichtsüberprüfung in der Azure KI-Gesichtserkennung.

Die Integration der Lebendigkeitserkennung in die Überprüfung besteht aus zwei Teilen.

Schritt 1 : Auswählen eines Referenzbilds

Um die genauesten Erkennungsergebnisse zu erzielen, befolgen Sie die Tipps, die in den Kompositionsanforderungen für ID-Überprüfungsszenarien aufgeführt sind.

Schritt 2: Einrichtung der Orchestrierung von Lebendigkeit mit Überprüfung

Die folgenden allgemeinen Schritte zeigen, wie Sie die Lebendigkeit mit Überprüfung orchestrieren können:

  1. Stellen Sie das Überprüfungsreferenzbild mithilfe einer der folgenden beiden Methoden bereit:

    • Der App-Server stellt das Referenzbild beim Erstellen der Liveness-Sitzung bereit. Weitere Informationen zu jedem Anforderungsparameter, der an der Erstellung einer Liveness-Sitzung mit Überprüfung beteiligt ist, finden Sie unter 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()}");
      

      Ein Beispiel für den Antworttext:

      {
          "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"
              }
              ]
          }
      }
      
    • Die Frontend-Anwendung stellt beim Initialisieren der mobilen SDKs das Referenzimage bereit. Dieses Szenario wird in der Weblösung nicht unterstützt.

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. Der App-Server kann nun neben dem Liveness-Ergebnis auch das Überprüfungsergebnis abfragen.

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

    Ein Beispiel für den Antworttext:

    {
        "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. Der App-Server kann die Sitzung löschen, wenn Sie das Ergebnis nicht mehr benötigen.

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

Ausführen anderer Gesichtsvorgänge nach der Liveness-Erkennung

Optionalerweise können Sie nach der Überprüfung der Lebendigkeit zusätzliche Gesichtsvorgänge ausführen, z. B. eine Gesichtsanalyse (zum Abrufen von Gesichtsattributen) und Gesichtsidentitätsvorgänge.

  1. Legen Sie den enableSessionImage Parameter auf true während des Schritts zur Sitzungserstellung fest.
  2. Extrahieren Sie sessionImageId aus dem Schritt Session-Get-Result.
  3. Laden Sie das Sitzungsbild (referenziert in Lebendigkeitssitzungsvorgänge – Abrufen des Sitzungsbilds) herunter, oder verwenden Sie sessionImageId im Vorgang Über Sitzungsimage-ID-API erkennen, um mit anderen Gesichtsanalyse- oder Gesichtserkennungsvorgängen fortzufahren. Weitere Informationen zu diesen Vorgängen finden Sie unter Gesichtserkennungskonzepte und Gesichtserkennungskonzepte.

Supportoptionen

Zusätzlich zur Verwendung der wichtigsten Supportoptionen für Foundry Tools können Sie Ihre Fragen auch im Abschnitt "Probleme " des SDK-Repositorys posten.

Informationen zum Integrieren der Liveness-Lösung in Ihre vorhandene Anwendung finden Sie in der Azure Vision SDK-Referenz.

Weitere Informationen zu den verfügbaren Funktionen zur Orchestrierung der Liveness-Lösung finden Sie in der REST-API-Referenz für die Sitzung.