Öğretici: Yüzlerdeki canlılığı algılama

Sunucu tarafı mantığı ve yardımcı ön uç istemci uygulamalarını kullanarak yüz canlılığı algılamayı iş akışınızla tümleştirmeyi öğrenin.

Tavsiye

Yüz canlılığı algılama hakkında genel bilgi için kavramsal kılavuza bakın.

Bu öğreticide, canlılık algılaması gerçekleştirmek için bir uygulama sunucusuyla frontend uygulamasını çalıştırmak öğreneceksiniz. Ayrıca çeşitli platformlarda ve dillerde yüz doğrulama ekleyebilirsiniz.

Önemli

Yüz Tanıma için Canlılık istemcisi SDK'ları erişimi kısıtlanmış bir özelliktir. Yüz Tanıma giriş formunu doldurarak canlılık özelliğine erişim istemeniz gerekir. Azure aboneliğinize erişim verildiğinde Yüz Tanıma canlılığı SDK'sını indirebilirsiniz.

Önkoşullar

  • Azure aboneliği - Ücretsiz olarak oluşturun
  • Sorumlu yapay zeka koşullarını kabul edebilmeniz ve kaynak oluşturabilmeniz için Azure hesabınızın atanmış bir Bilişsel Hizmetler Katkıda Bulunanı rolü olması gerekir. Bu rolün hesabınıza atanmasını sağlamak için Rol atama belgelerindeki adımları izleyin veya yöneticinize başvurun.
  • Azure aboneliğinizi aldıktan sonra , anahtarınızı ve uç noktanızı almak için Azure portalında bir Yüz Tanıma kaynağı oluşturun. Dağıtıldıktan sonra Kaynağa Git seçeneğini seçin.
    • Uygulamanızı Yüz Tanıma hizmetine bağlamak için oluşturduğunuz kaynaktan anahtara ve uç noktaya ihtiyacınız vardır.
  • Mobil (iOS ve Android) ve Web için Foundry Tools Face Client SDK'da Azure Vision için kısıtlı erişim gerektiren ürünlere erişim.
  • Yüz canlılığı algılama özelliği hakkında bilgi. Kavramsal kılavuza bakın.

Tavsiye

Önkoşulları tamamladıktan sonra canlılık deneyimini aşağıdaki platformlarda deneyebilirsiniz:

  • iOS: iOS App Store — Geliştirici modunu etkinleştirmek için yüklemeden sonra uygulama ekranına 10 kez dokunun.
  • Android: Google Play Store — Geliştirici modunu etkinleştirmek için yüklemeden sonra uygulama ekranına 10 kez dokunun.
  • Web: Doğrudan Vision Studio'da deneyin.

Ayrıca Örnekler bölümünden eksiksiz bir ön uç örneği (iOS, Android veya Web) derleyebilir ve çalıştırabilirsiniz.

Ön uç uygulamasını hazırlama

SDK'lar, ön uç uygulamanızla tümleştirmeyi basitleştirmek için birden çok dilde kullanılabilir. Kullanıcı arabirimini ve gerekli kodun entegrasyonunu sağlamak için aşağıdaki bölümlerde seçtiğiniz SDK'nın README dosyasına bakın.

Önemli

Her ön yüz SDK'sının başarıyla derlenmesi için kısıtlı bir varlığa erişimi gerekmektedir. Bu erişimi ayarlamak için aşağıdaki yönergelere bakın.

Swift iOS için:

Kotlin/Java Android için:

JavaScript Web için:

Sdk, ön uç uygulamanızla tümleştirildikten sonra kamerayı başlatır, kullanıcıya konumunu ayarlaması için yol gösterir, canlılık yükünü oluşturur ve işlenmek üzere Azure Yüz Tanıma hizmetine gönderir.

Yeni SDK sürüm güncelleştirmeleri için deponun Sürümler bölümünü izleyin ve GitHub Dependabot (GitHub depoları için) veya Renovate (GitHub, GitLab, Bitbucket, Azure Repos) gibi otomatik bağımlılık güncelleştirme uyarılarını etkinleştirin.

Canlılık algılaması yap

Aşağıdaki adımlarda canlılık düzenleme işlemi açıklanmaktadır:

Azure Yüz Tanıma'teki liveness iş akışının diyagramı.

  1. Ön uç uygulaması canlılık denetimini başlatır ve uygulama sunucusuna bildirir.

  2. Uygulama sunucusu, Azure Yüz Tanıma Servisi ile yeni bir canlı oturum oluşturur. Servis bir etkinlik oturumu oluşturur ve bir oturum yetkilendirme jetonu ile yanıt verir. Canlılık oturumu oluştururken kullanılan her istek parametresi hakkında daha fazla bilgi için bkz. Canlılık Oluşturma Oturumu İşlemi.

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

    Yanıt gövdesi örneği:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2025-05-20",
        "results": {
            "attempts": []
        }
    }
    
  3. Uygulama sunucusu, oturum yetkilendirme belirtecini ön uç uygulamasına geri sağlar.

  4. Ön uç uygulaması, canlılık akışını başlatan yüz canlılığı algılayıcısını başlatmak için oturum yetkilendirme belirtecini kullanır.

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. SDK kamerayı başlatır, kullanıcıyı doğru konumlandırması için yönlendirir ve ardından yükü canlılık algılama hizmet uç noktasını çağırmak için hazırlar.

  6. SDK, canlılık algılamasını gerçekleştirmek için Azure Görüntü İşleme Yüz Tanıma hizmetini çağırır. Hizmet yanıt verdiği zaman SDK, ön uç uygulamasına canlılık denetiminin tamamlandığını bildirir. Hizmet yanıtı canlılık kararını içermez. Bu bilgileri uygulama sunucusundan sorgula.

  7. Ön uç uygulaması, canlılık denetimi tamamlama işlemini uygulama sunucusuna aktarır.

  8. Uygulama sunucusu, Azure Görüntü İşleme Yüz Tanıma hizmetinden gelen canlılık algılama sonucunu sorgular.

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

    Yanıt gövdesi örneği:

    {
        "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. Uygulama sunucusu, tüm oturum sonuçlarını sorguladıktan sonra oturumu siler.

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

Canlılık algılamasını yüz doğrulama ile gerçekleştir.

Yüz doğrulamayı canlılık algılama ile birleştirmek, ilgili kişinin sistemde fiziksel olarak bulunduğuna ilişkin ek bir garanti ile biyometrik doğrulamayı sağlar.

Azure Yüz Tanıma'nın canlılık ve yüz doğrulama iş akışının diyagramı.

Canlılık algılamayı doğrulama ile tümleştirmek iki bölümden oluşur:

1. Adım - Referans görüntüsü seçme

En doğru tanıma sonuçlarını almak için kimlik doğrulama senaryoları için oluşturma gereksinimlerinde listelenen ipuçlarını izleyin.

2. Adım - Doğrulama ile canlılık düzenlemesini ayarlama

Aşağıdaki üst düzey adımlar doğrulama ile canlılığı düzenlemeyi gösterir:

  1. Aşağıdaki iki yöntemden birini kullanarak doğrulama başvuru görüntüsünü sağlayın:

    • Uygulama sunucusu, canlılık oturumu oluştururken referans görüntüsünü sağlar. Her istek parametresi hakkında ayrıntılı bilgi için Doğrulama ile Canlılık Oturumu Oluşturma İşlemi bölümüne bakın.

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

      Yanıt gövdesi örneği:

      {
          "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"
              }
              ]
          }
      }
      
    • Ön uç uygulaması, mobil SDK'ları başlatırken başvuru görüntüsünü sağlar. Bu senaryo web çözümünde desteklenmez.

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. Uygulama sunucusu artık canlılık sonucuna ek olarak doğrulama sonucunu sorgulayabilir.

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

    Yanıt gövdesi örneği:

    {
        "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. Artık sonucuna ihtiyacınız yoksa uygulama sunucusu oturumu silebilir.

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

Canlılık algılamadan sonra diğer yüz işlemlerini gerçekleştir

İsteğe bağlı olarak, canlılık denetiminden sonra yüz analizi (yüz özniteliklerini almak için) ve yüz kimliği işlemleri gibi ek yüz işlemleri gerçekleştirebilirsiniz.

  1. parametresi enableSessionImagetrue "Oturum Oluşturma" adımı sırasında ayarlayın.
  2. sessionImageId öğesini çıkarın.
  3. Diğer yüz analizi veya yüz kimliği işlemlerine devam etmek için oturum görüntüsünü indirin (Liveness Get Session Image Operation API içinde referans verilmiştir), veya sessionImageId işleminde kimliğini sağlayın. Bu işlemler hakkında daha fazla bilgi için bkz . Yüz algılama kavramları ve Yüz Tanıma kavramları.

Destek seçenekleri

Main Foundry Tools destek seçeneklerini kullanmanın yanı sıra, sorularınızı SDK deposunun issues bölümüne de gönderebilirsiniz.

Mevcut uygulamanıza canlılık çözümünü entegre etmeyi öğrenmek için Azure Vision SDK Referansı'na bakınız.

Canlılık çözümünü düzenlemeye yönelik özellikler hakkında daha fazla bilgi edinmek için Oturum REST API referansına bakın.