Bagikan melalui


Tutorial: Mendeteksi keaktivaan di wajah

Pelajari cara mengintegrasikan deteksi keaktivitas wajah ke dalam alur kerja Anda dengan menggunakan logika sisi server dan aplikasi klien frontend pendamping.

Petunjuk / Saran

Untuk informasi umum tentang deteksi keaslian wajah, lihat panduan konseptual.

Dalam tutorial ini, Anda mempelajari cara menjalankan aplikasi frontend dengan server aplikasi untuk melakukan deteksi kehadiran. Anda juga dapat menambahkan verifikasi wajah di berbagai platform dan bahasa.

Penting

SDK klien Face untuk liveness adalah fitur yang dibatasi. Anda harus meminta akses ke fitur liveness dengan mengisi formulir pendaftaran Pengenalan Wajah. Saat langganan Azure Anda diberikan akses, Anda dapat mengunduh Face liveness SDK.

Prasyarat

  • Langganan Azure - Buat langganan secara gratis
  • Akun Azure Anda harus memiliki peran Cognitive Services Contributor yang ditetapkan sehingga Anda dapat menyetujui persyaratan AI yang bertanggung jawab dan membuat sumber daya. Agar peran ini ditetapkan ke akun Anda, ikuti langkah-langkah dalam dokumentasi Menetapkan peran, atau hubungi administrator Anda.
  • Setelah Anda memiliki langganan Azure, buat sumber daya Face di portal Microsoft Azure untuk mendapatkan kunci dan titik akhir Anda. Setelah dideploy, pilih Buka halaman sumber daya.
    • Anda memerlukan kunci dan titik akhir dari sumber daya yang Anda buat untuk menghubungkan aplikasi Anda ke layanan Face.
  • Akses ke artefak yang dibatasi untuk Azure Vision pada Foundry Tools Face Client SDK untuk Mobile (iOS dan Android) dan Web.
    • Untuk memulai, Anda perlu mengajukan permohonan untuk "fitur Face Recognition Limited Access" untuk mendapatkan akses ke artefak yang terkunci. Untuk informasi selengkapnya, lihat halaman Face Limited Access.
  • Memahami fitur deteksi keaslian wajah. Lihat panduan konseptual.

Petunjuk / Saran

Setelah menyelesaikan prasyarat, Anda dapat mencoba pengalaman liveness pada platform berikut:

  • iOS: iOS App Store — ketuk layar aplikasi 10 kali setelah penginstalan untuk mengaktifkan mode pengembang.
  • Android: Google Play Store — ketuk layar aplikasi 10 kali setelah penginstalan untuk mengaktifkan mode pengembang.
  • Web: Coba langsung di Vision Studio.

Anda juga dapat membuat dan menjalankan sampel frontend lengkap (iOS, Android, atau Web) dari bagian Samples.

Menyiapkan aplikasi frontend

SDK tersedia dalam beberapa bahasa untuk menyederhanakan integrasi dengan aplikasi frontend Anda. Lihat README untuk SDK pilihan Anda di bagian berikut untuk mengintegrasikan UI dan kode yang diperlukan.

Penting

Setiap SDK frontend memerlukan akses ke aset terjaga agar berhasil dikompilasi. Lihat instruksi berikut untuk menyiapkan akses ini.

Untuk Swift iOS:

Untuk Kotlin/Java Android:

Untuk JavaScript Web:

Setelah diintegrasikan ke dalam aplikasi antarmuka depan Anda, SDK akan memulai kamera, memandu pengguna untuk menyesuaikan posisi mereka, menyusun muatan liveness, dan mengirimkannya ke layanan Azure Face untuk diproses.

Pantau bagian Rilis repositori untuk pembaruan versi SDK baru dan aktifkan pemberitahuan pembaruan dependensi otomatis—seperti Dependabot GitHub (untuk repositori GitHub) atau Renovasi (GitHub, GitLab, Bitbucket, Azure Repos).

Melakukan deteksi keberlangsungan hidup

Langkah-langkah berikut menjelaskan proses orkestrasi kehidupan:

Diagram alur kerja liveness di Azure Face.

  1. Aplikasi frontend memulai pemeriksaan keaktifan dan memberi tahu server aplikasi.

  2. Server aplikasi membuat sesi liveness baru menggunakan Azure Face Service. Layanan ini membuat sesi liveness dan merespons dengan token untuk otorisasi sesi. Untuk informasi selengkapnya tentang setiap parameter permintaan yang terlibat dalam membuat sesi liveness, lihat 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()}");
    

    Contoh isi respons:

    {
        "sessionId": "a6e7193e-b638-42e9-903f-eaf60d2b40a5",
        "authToken": "<session-authorization-token>",
        "status": "NotStarted",
        "modelVersion": "2025-05-20",
        "results": {
            "attempts": []
        }
    }
    
  3. Server aplikasi menyediakan token otorisasi sesi kembali ke aplikasi frontend.

  4. Aplikasi frontend menggunakan token otorisasi sesi untuk memulai detektor keaktifan wajah, yang memulai aliran keaktifan.

        FaceLivenessDetector(
            sessionAuthorizationToken = FaceSessionToken.sessionToken,
            verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
            deviceCorrelationId = "null",
            onSuccess = viewModel::onSuccess,
            onError = viewModel::onError
        )
    
  5. SDK mengaktifkan kamera, memandu pengguna untuk memposisikan dengan benar, kemudian menyiapkan payload untuk mengakses endpoint layanan deteksi keaktifan.

  6. SDK memanggil layanan Azure Vision Face untuk melakukan deteksi keaktivaan. Ketika layanan merespons, SDK memberi tahu aplikasi frontend bahwa pemeriksaan keaktivaan selesai. Respons layanan tidak berisi keputusan keberlangsungan. Kueri informasi ini dari server aplikasi.

  7. Aplikasi frontend menyampaikan penyelesaian pemeriksaan keaktivitas ke server aplikasi.

  8. Server aplikasi meminta hasil deteksi liveness dari layanan Azure Vision Face.

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

    Contoh isi respons:

    {
        "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. Server aplikasi menghapus sesi setelah meminta semua hasil sesi.

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

Melakukan deteksi liveness dengan verifikasi wajah

Menggabungkan verifikasi wajah dengan deteksi keaktifan memungkinkan verifikasi biometrik orang tertentu yang tertarik dengan jaminan tambahan bahwa orang tersebut secara fisik ada dalam sistem.

Diagram alur kerja verifikasi wajah dengan liveness dari Azure Face.

Mengintegrasikan deteksi keaktifan dengan verifikasi melibatkan dua bagian:

Langkah 1 - Pilih gambar referensi

Untuk mendapatkan hasil pengenalan yang paling akurat, ikuti tips yang tercantum dalam persyaratan komposisi untuk skenario verifikasi ID.

Langkah 2 - Siapkan orkestrasi kehidupan dengan verifikasi

Langkah-langkah tingkat tinggi berikut menunjukkan cara mengatur keakuratan dengan verifikasi:

  1. Berikan gambar referensi verifikasi dengan menggunakan salah satu dari dua metode berikut:

    • Server aplikasi menyediakan gambar referensi saat membuat sesi liveness. Untuk informasi selengkapnya tentang setiap parameter permintaan yang terlibat dalam membuat sesi liveness dengan verifikasi, lihat 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()}");
      

      Contoh isi respons:

      {
          "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"
              }
              ]
          }
      }
      
    • Aplikasi frontend menyediakan gambar referensi saat menginisialisasi SDK seluler. Skenario ini tidak didukung dalam solusi web.

          FaceLivenessDetector(
              sessionAuthorizationToken = FaceSessionToken.sessionToken,
              verifyImageFileContent = FaceSessionToken.sessionSetInClientVerifyImage,
              deviceCorrelationId = "null",
              onSuccess = viewModel::onSuccess,
              onError = viewModel::onError
          )
      
  2. Server aplikasi sekarang dapat mengkueri hasil verifikasi selain hasil keaktivaan.

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

    Contoh isi respons:

    {
        "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. Server aplikasi dapat menghapus sesi jika Anda tidak memerlukan hasilnya lagi.

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

Melakukan operasi wajah lainnya setelah deteksi keaktifan

Secara opsional, Anda dapat melakukan operasi wajah tambahan setelah pemeriksaan keaktifan, seperti analisis wajah (untuk mendapatkan atribut wajah) dan operasi identifikasi wajah.

  1. Atur parameter enableSessionImage menjadi true selama langkah Session-Creation.
  2. Ekstrak sessionImageId dari langkah Session-Get-Result.
  3. Unduh gambar sesi (dirujuk dalam Liveness Get Session Image Operation API), atau berikan sessionImageId dalam operasi Detect from Session Image ID API untuk melanjutkan analisis wajah atau operasi identitas wajah lainnya. Untuk informasi selengkapnya tentang operasi ini, lihat Konsep deteksi wajah dan konsep Pengenalan Wajah.

Opsi dukungan

Selain menggunakan opsi dukungan Foundry Tools utama, Anda juga dapat memposting pertanyaan Anda di bagian masalah repositori SDK.

Untuk mempelajari cara mengintegrasikan solusi liveness ke dalam aplikasi Anda yang sudah ada, lihat referensi Azure Vision SDK.

Untuk mempelajari selengkapnya tentang fitur yang tersedia untuk mengatur solusi keaktivaan, lihat referensi REST API Sesi.