Buka konsol

Mendeteksi Wajah dengan ML Kit di Android

Anda dapat menggunakan ML Kit untuk mendeteksi wajah dalam gambar dan video, baik menggunakan model di perangkat maupun model cloud. Lihat ringkasan untuk mempelajari tentang manfaat dari setiap pendekatan.

Sebelum memulai

  1. Siapkan project Firebase:
    1. Buat project Firebase di Firebase console jika Anda belum memilikinya. Jika Anda sudah memiliki project Google yang terhubung dengan aplikasi seluler, klik Impor Project Google. Jika belum, klik Tambahkan project.
    2. Klik Tambahkan Firebase ke aplikasi Android dan ikuti langkah-langkah penyiapannya. Jika Anda mengimpor project Google yang sudah ada, proses ini dapat terjadi secara otomatis dan Anda dapat langsung mendownload file konfigurasi.
    3. Saat diminta, masukkan nama paket aplikasi Anda. Anda harus memasukkan nama package yang digunakan oleh aplikasi. Hal ini hanya dapat dilakukan saat Anda menambahkan aplikasi tersebut ke project Firebase.
    4. Terakhir, download file google-services.json. Anda dapat mendownload file konfigurasi lagi kapan saja.
    5. Jika belum melakukannya, salin file ini ke dalam folder modul project Anda, biasanya app/.
  2. Ekstrak SDK yang Anda terima dari kontak EAP:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. Tambahkan direktori tempat Anda mengekstrak SDK dan plugin google-services ke build.gradle level project:
    buildscript {
      // ...
      dependencies {
          // ...
          classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
      }
    }
    
    allprojects {
      repositories {
        // Add this
        maven {
          url "$SDK_DIR"
        }
        // This should already be here
        jcenter()
    
        ...
      }
    }
    
  4. Lalu, sertakan dependensi untuk ML Kit dan tambahkan baris apply plugin ke file build.gradle level aplikasi:

    dependencies {
      // ...
      compile 'com.google.firebase:firebase-core:12.8.0-SNAPSHOT'
      compile 'com.google.firebase:firebase-ml-vision:12.8.0-SNAPSHOT'
    }
    
    // ADD THIS AT THE BOTTOM OF THE FILE
    apply plugin: 'com.google.gms.google-services'
    

Sekarang Anda siap untuk mendeteksi wajah menggunakan model di perangkat atau model berbasis cloud.

Deteksi wajah di perangkat

Mengonfigurasi detektor wajah

Sebelum Anda menerapkan deteksi wajah ke suatu gambar, jika Anda ingin mengubah salah satu setelan default dari detektor wajah, tentukan setelan tersebut dengan objek FirebaseVisionFaceDetectorOptions. Anda dapat mengubah setelan berikut:

Setelan
Mode deteksi FAST_MODE (default) | ACCURATE_MODE

Mendukung kecepatan atau akurasi saat mendeteksi wajah.

Deteksi landmark NO_LANDMARKS (default) | ALL_LANDMARKS

Mencoba mengidentifikasi "landmark" wajah atau tidak: mata, telinga, hidung, pipi, mulut.

Klasifikasikan wajah NO_CLASSIFICATIONS (default) | ALL_CLASSIFICATIONS

Mengklasifikasi wajah menjadi beberapa kategori atau tidak, seperti "tertawa" dan "mata terbuka".

Ukuran wajah minimum float (default: 0.1f)

Ukuran minimum wajah untuk dideteksi, yang bersifat relatif terhadap gambar.

Aktifkan pelacakan wajah false (default) | true

Menetapkan ID pada wajah atau tidak, yang dapat digunakan untuk melacak wajah di seluruh gambar.

Misalnya, untuk mengubah semua setelan default, buat object FirebaseVisionFaceDetectorOptions seperti pada contoh berikut:

FirebaseVisionFaceDetectorOptions options =
    new FirebaseVisionFaceDetectorOptions.Builder()
        .setModeType(FirebaseVisionFaceDetectorOptions.ACCURATE_MODE)
        .setLandmarkType(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
        .setClassificationType(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
        .setMinFaceSize(0.2f)
        .setTrackingEnabled(true)
        .build();

Menjalankan detektor wajah

Untuk mengenali wajah dalam gambar, teruskan gambar sebagai objek ByteBuffer ke metode FirebaseVisionFaceDetector detectInBuffer atau teruskan gambar sebagai objek android.graphics.Bitmap ke metode detectInImage.

  1. Dapatkan instance dari FirebaseVisionFaceDetector:

    FirebaseVisionFaceDetector detector = FirebaseVision.getInstance()
        .getVisionFaceDetector(options);
    
  2. Buat objek FirebaseVisionImageMetadata yang berisi metadata gambar.

    Jika meneruskan gambar sebagai ByteBuffer, Anda harus menentukan tinggi, lebar, format encoding warna, dan orientasi gambar:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    Jika meneruskan gambar sebagai Bitmap, Anda hanya perlu menentukan orientasi gambar:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Terakhir, teruskan gambar ke metode detectInBuffer atau detectInImage:

    Task<SparseArray<FirebaseVisionFace>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionFace>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionFace> faces) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

Mendapatkan informasi tentang wajah yang terdeteksi

Jika operasi pengenalan wajah berhasil, array objek FirebaseVisionFace akan diteruskan ke listener yang berhasil. Setiap objek FirebaseVisionFace mewakili wajah yang terdeteksi di dalam gambar. Untuk setiap wajah, Anda bisa mendapatkan koordinat pembatasnya di gambar input, serta informasi lain yang dapat ditemukan oleh detektor wajah sesuai dengan yang Anda konfigurasikan. Misalnya:

for(int i = 0; i < faces.size(); i++) {
  FirebaseVisionFace face = faces.valueAt(i);

  Rect bounds = face.getBoundingBox();
  if (face.hasHeadEulerAngleY()) {
    float rotY = face.getHeadEulerAngleY();  // Head is rotated to the right rotY degrees
  }
  if (face.hasHeadEulerAngleZ()) {
    float rotZ = face.getHeadEulerAngleZ();  // Head is rotated upward rotZ degrees
  }

  // If landmark detection was enabled (mouth, ears, eyes, cheeks, and
  // nose available):
  if (face.hasLeftEarPosition()) {
    PointF leftEarPos = face.getLeftEarPosition();
  }
  if (face.hasNoseBasePosition()) {
    PointF nosePos = face.getNoseBasePosition();
  }

  // If classification was enabled:
  if (face.hasSmilingProbability()) {
    float smileProb = face.getSmilingProbability();
  }
  if (face.hasRightEyeOpenProbability()) {
    float rightEyeOpenProb = face.getRightEyeOpenProbability();
  }

  // If face tracking was enabled:
  if (face.hasTrackingId()) {
    int id = face.getTrackingId();
  }
}

Deteksi wajah cloud

Mengonfigurasi detektor wajah

Secara default, detektor Cloud menggunakan versi STABLE dari model tersebut dan menampilkan hingga 10 hasil. Jika Anda ingin mengubah salah satu setelan ini, tentukan dengan objek FirebaseVisionCloudDetectorOptions.

Misalnya, untuk mengubah kedua setelan default, buat objek FirebaseVisionCloudDetectorOptions seperti pada contoh berikut:

FirebaseVisionCloudDetectorOptions options =
    new FirebaseVisionCloudDetectorOptions.Builder()
        .setModelType(FirebaseVisionCloudDetectorOptions.LATEST_MODEL)
        .setMaxResults(15)
        .build();

Untuk menggunakan setelan default, Anda dapat menggunakan FirebaseVisionCloudDetectorOptions.DEFAULT di langkah berikutnya.

Menjalankan detektor wajah

Untuk mengenali wajah dalam gambar, teruskan gambar sebagai objek ByteBuffer ke metode FirebaseVisionCloudFaceDetector detectInBuffer atau teruskan gambar sebagai objek android.graphics.Bitmap ke metode detectInImage.

  1. Dapatkan instance dari FirebaseVisionCloudFaceDetector:

    FirebaseVisionCloudFaceDetector detector = FirebaseMachineLearning.getInstance()
        .getVisionFaceDetector(options);
    
  2. Buat objek FirebaseVisionImageMetadata yang berisi metadata gambar.

    Jika meneruskan gambar sebagai ByteBuffer, Anda harus menentukan tinggi, lebar, format encoding warna, dan orientasi gambar:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    Jika meneruskan gambar sebagai Bitmap, Anda hanya perlu menentukan orientasi gambar:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. Terakhir, teruskan gambar ke metode detectInBuffer atau detectInImage:

    Task<SparseArray<FirebaseVisionCloudFace>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionCloudFace>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionCloudFace> faces) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

Mendapatkan informasi tentang wajah yang terdeteksi

Jika operasi pengenalan wajah berhasil, array objek FirebaseVisionCloudFace akan diteruskan ke listener yang berhasil. Setiap objek FirebaseVisionCloudFace mewakili wajah yang terdeteksi di dalam gambar. Untuk setiap wajah, Anda bisa mendapatkan koordinat pembatasnya di gambar input, rotasinya yang bersifat relatif terhadap kamera, dan lokasi fitur wajah yang dikenali. Misalnya:

for(int i = 0; i < faces.size(); i++) {
  FirebaseVisionFace face = faces.valueAt(i);

  // Face position and rotation
  Rect bounds = face.getBoundingBox();
  float rotY = face.getHeadEulerAngleY();  // Head is rotated to the right rotY degrees
  float rotZ = face.getHeadEulerAngleZ();  // Head is rotated upward rotZ degrees

  // Facial features
  PointF leftEarPos = face.getLeftEarPosition();
  PointF nosePos = face.getNoseBasePosition();

  // Face classification
  float sorrowProb = face.getSorrowProbability();
  float rightEyeOpenProb = face.getRightEyeOpenProbability();
}