Condividi tramite


Esercitazione: Rilevare l’attività nei visi

Scopri come integrare il rilevamento della vivacità del viso nel tuo flusso di lavoro utilizzando la logica lato server e le applicazioni client front-end associate.

Suggerimento

Per informazioni generali sul rilevamento liveness del viso, vedere la guida concettuale.

In questa esercitazione imparerai come eseguire un'applicazione frontend con un server di applicazioni per eseguire il rilevamento della presenza. È anche possibile aggiungere la verifica del viso in diverse piattaforme e linguaggi.

Importante

Gli SDK del client Viso per il rilevamento liveness sono una funzionalità gestita. È necessario richiedere l'accesso alla funzionalità di attività compilando il modulo di acquisizione del riconoscimento del volto. Quando alla sottoscrizione Azure viene concesso l'accesso, è possibile scaricare Face Liveness SDK.

Prerequisiti

  • sottoscrizione Azure - Crearne una gratuitamente
  • L'account Azure deve avere un ruolo Cognitive Services Contributor in modo da poter accettare le condizioni di intelligenza artificiale responsabili e creare una risorsa. Per assegnare questo ruolo all'account, seguire la procedura descritta nella documentazione Assegnare ruoli oppure contattare l'amministratore.
  • Dopo aver creato la sottoscrizione di Azure, Creare una risorsa Viso nel portale di Azure per ottenere la chiave e l'endpoint. Al termine della distribuzione, fare clic su Vai alla risorsa.
    • La chiave e l'endpoint della risorsa creata saranno necessari per connettere l'applicazione al servizio Viso.
  • Accedere agli artefatti riservati necessari per Visione di Azure nel componente SDK client di Viso in Foundry Tools per dispositivi mobili (iOS e Android) e Web.
  • Familiarità con la funzionalità di rilevamento della vitalità del volto. Vedere la guida concettuale.

Suggerimento

Dopo aver completato i prerequisiti, è possibile provare l'esperienza liveness sulle piattaforme seguenti:

  • iOS: App Store per iOS: tocca la schermata dell'app 10 volte dopo l'installazione per abilitare la modalità sviluppatore.
  • Android: Google Play Store : tocca la schermata dell'app 10 volte dopo l'installazione per abilitare la modalità sviluppatore.
  • Web: provarlo direttamente in Vision Studio.

È anche possibile compilare ed eseguire un esempio front-end completo (iOS, Android o Web) dalla sezione Samples.

Preparare l'applicazione front-end

Gli SDK vengono forniti in più linguaggi per semplificare l'integrazione con l'applicazione front-end in uso. Per integrare sia l'interfaccia utente che il codice necessario, vedere README per l'SDK scelto nelle sezioni seguenti.

Importante

Ogni SDK front-end richiede l'accesso a una risorsa gestita per garantire una compilazione corretta. Per configurare questo accesso, vedere le istruzioni seguenti.

Per Swift iOS:

Per Kotlin/Java Android:

Per JavaScript Web:

Dopo l'integrazione nell'applicazione front-end, l'SDK avvia la fotocamera, assiste l'utente nella regolazione della posizione, compone il payload di attività e lo invia al servizio Viso di Azure per l'elaborazione.

Monitorare la sezione Versioni del repository per gli aggiornamenti delle nuove versione SDK e abilitare gli avvisi di aggiornamento delle dipendenze automatizzati, ad esempio GitHub Dependabot (per repository GitHub) o Renovate (GitHub, GitLab, Bitbucket, Azure Repos).

Eseguire il rilevamento dell'autenticità

I passaggi seguenti descrivono il processo di orchestrazione liveness:

Diagramma del flusso di lavoro del liveness in Azure Face.

  1. L'applicazione front-end avvia il controllo dell'attività e invia una notifica al server app.

  2. Il server app crea una nuova sessione di rilevamento liveness con il servizio Viso di Azure. Il servizio crea una sessione liveness e risponde con un token di autorizzazione sessione. Per altre informazioni su ogni parametro di richiesta coinvolto nella creazione di una sessione relativa al rilevamento liveness, vedere Operazione della sessione di creazione liveness.

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

    Un esempio del corpo della risposta:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2025-05-20",
        "results": {
            "attempts": []
        }
    }
    
  3. Il server app fornisce il token di autorizzazione della sessione all'applicazione front-end.

  4. L'applicazione front-end usa il token di autorizzazione sessione per avviare il rilevatore liveness del viso che avvia il flusso di liveness.

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. L'SDK avvia la fotocamera, guida l'utente a posizionarsi correttamente e quindi prepara il payload per chiamare l'endpoint del servizio di liveness detection.

  6. L'SDK chiama il servizio Azure Vision Face per eseguire il rilevamento di vivacità. Una volta che il servizio risponde, l'SDK avvisa l'applicazione front-end che il controllo di liveness è stato completato. Nota: la risposta del servizio non contiene la decisione liveness. È necessario eseguire query su queste informazioni dal server app.

  7. L'applicazione front-end inoltra il completamento del controllo dell'attività al server app.

  8. Il server app esegue una query per il risultato del rilevamento liveness dal servizio Viso di Visione di Azure.

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

    Un esempio del corpo della risposta:

    {
        "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. Il server app elimina la sessione dopo che esegue una query su tutti i risultati della sessione.

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

Eseguire il rilevamento liveness mediante la verifica del viso

La combinazione della verifica del viso con il rilevamento liveness consente la verifica biometrica di una particolare persona di interesse, con la garanzia aggiuntiva della presenza fisica della persona nel sistema.

Diagramma del flusso di lavoro di verifica della vivacità con riconoscimento facciale di Azure Face.

L'integrazione del rilevamento del liveness con la verifica prevede due parti:

Passaggio 1- Selezionare un'immagine di riferimento

Per ottenere i risultati di riconoscimento più accurati, seguire i suggerimenti elencati nei requisiti di composizione per gli scenari di verifica ID.

Passaggio 2: Configurare l'orchestrazione dell'autenticità liveness

I passaggi generali seguenti illustrano come orchestrare la liveness con la verifica:

  1. Fornire l'immagine di riferimento di verifica usando uno dei due metodi seguenti:

    • Il server app fornisce l'immagine di riferimento durante la creazione della sessione relativa al rilevamento dell’attività. Per ulteriori informazioni su ciascun parametro di richiesta coinvolto nella creazione di una sessione di liveness con verifica, vedere 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()}");
      

      Un esempio del corpo della risposta:

      {
          "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"
              }
              ]
          }
      }
      
    • L'applicazione front-end fornisce l'immagine di riferimento durante l'inizializzazione degli SDK per dispositivi mobili. Questo scenario non è supportato nella soluzione Web.

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. Il server app ora può eseguire una query per il risultato della verifica oltre al risultato del rilevamento liveness.

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

    Un esempio del corpo della risposta:

    {
        "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. Il server app può eliminare la sessione se il risultato non è più necessario.

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

Eseguire altre operazioni sul viso dopo il rilevamento liveness

Facoltativamente, è possibile eseguire operazioni aggiuntive sul viso dopo il test di vivacità, come l'analisi facciale (per ottenere attributi facciali) e le operazioni di identificazione facciale.

  1. Impostare il parametro enableSessionImage su true durante il passaggio Session-Creation.
  2. Estrarre il sessionImageId dal passaggio Session-Get-Result.
  3. Scaricare l'immagine della sessione (a cui si fa riferimento nell'API operazione dell'immagine sessione Ottieni liveness) oppure specificare l'operazione sessionImageIdnell'API Rileva dall'ID immagine della sessione per continuare con altre operazioni di analisi del viso o identità del viso. Per altre informazioni su queste operazioni, vedere Concetti relativi al rilevamento dei visi e Concetti relativi al riconoscimento dei volti.

Opzioni di supporto

Oltre a usare le opzioni di supporto principali Foundry Tools, puoi anche pubblicare le tue domande nella sezione issues del repository SDK.

Per informazioni su come integrare la soluzione di liveness nell'applicazione esistente, consulta la documentazione di riferimento per Azure Vision SDK.

Per altre informazioni sulle funzionalità disponibili per orchestrare la soluzione di liveness, vedere le informazioni di riferimento sull'API REST della sessione.