Panduan deteksi wajah untuk iOS

Tugas Detektor Wajah memungkinkan Anda mendeteksi wajah dalam gambar atau video. Anda dapat menggunakan tugas ini untuk menemukan wajah dan fitur wajah dalam sebuah {i>frame<i}. Tugas ini menggunakan sebuah model machine learning (ML) yang berfungsi dengan gambar tunggal atau streaming berkelanjutan gambar. Tugas ini menghasilkan lokasi wajah, beserta kunci wajah berikut poin: mata kiri, mata kanan, ujung hidung, mulut, tragion mata kiri, dan mata kanan tragion.

Contoh kode yang dijelaskan dalam petunjuk ini tersedia di GitHub. Anda dapat melihat cara kerja tugas ini dengan membuka Web demo. Untuk selengkapnya informasi tentang kemampuan, model, dan opsi konfigurasi dari tugas, lihat Ringkasan.

Contoh kode

Kode contoh Tugas MediaPipe adalah implementasi sederhana dari Detektor Wajah untuk iOS. Contoh ini menggunakan kamera perangkat Android fisik untuk mendeteksi wajah dalam streaming video yang berkelanjutan. Aplikasi ini juga dapat mendeteksi wajah dalam gambar dan video dari galeri perangkat.

Anda dapat menggunakan aplikasi ini sebagai titik awal untuk aplikasi iOS Anda sendiri, atau merujuk ke sana saat memodifikasi aplikasi yang ada. Kode contoh Detektor Wajah dihosting di GitHub.

Mendownload kode

Petunjuk berikut menunjukkan cara membuat salinan lokal dari contoh kode menggunakan alat command line git.

Untuk mendownload kode contoh:

  1. Clone repositori git menggunakan perintah berikut:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Secara opsional, konfigurasikan instance git Anda untuk menggunakan checkout sparse, sehingga Anda memiliki hanya file untuk aplikasi contoh Detektor Wajah:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_detector/ios/
    

Setelah membuat versi lokal dari kode contoh, Anda dapat menginstal Library tugas MediaPipe, buka project menggunakan Xcode dan jalankan aplikasi. Sebagai lihat Panduan Penyiapan untuk iOS.

Komponen utama

File berikut berisi kode penting untuk contoh Detektor Wajah aplikasi:

Penyiapan

Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan membuat kode project untuk menggunakan Detektor Wajah. Untuk informasi umum tentang penyiapan lingkungan pengembangan untuk menggunakan tugas MediaPipe, termasuk versi platform persyaratan, lihat Panduan penyiapan untuk iOS.

Dependensi

Detektor Wajah menggunakan library MediaPipeTasksVision, yang harus diinstal menggunakan CocoaPods. Library ini kompatibel dengan aplikasi Swift dan Objective-C dan tidak memerlukan penyiapan tambahan khusus bahasa.

Untuk petunjuk menginstal CocoaPods di macOS, lihat CocoaPods panduan pemasangan kami. Untuk mendapatkan petunjuk cara membuat Podfile dengan pod yang diperlukan untuk aplikasi, lihat Menggunakan CocoaPods.

Tambahkan pod MediaPipeTasksVision di Podfile menggunakan kode berikut:

target 'MyFaceDetectorApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

Jika aplikasi Anda menyertakan target pengujian unit, lihat Panduan Penyiapan untuk iOS untuk informasi tambahan terkait penyiapan Podfile Anda.

Model

Tugas Detektor Wajah MediaPipe memerlukan model terlatih yang kompatibel dengan tugas ini. Untuk informasi lebih lanjut tentang model terlatih yang tersedia Detektor Wajah, lihat ringkasan tugas Model bagian.

Pilih dan download model, lalu tambahkan ke direktori project Anda menggunakan Xcode. Untuk instruksi tentang cara menambahkan file ke proyek Xcode Anda, lihat Mengelola dan folder di Xcode Anda project Anda.

Gunakan properti BaseOptions.modelAssetPath untuk menentukan jalur ke model dalam app bundle Anda. Untuk contoh kode, lihat bagian berikutnya.

Membuat tugas

Anda dapat membuat tugas Detektor Wajah dengan memanggil salah satu penginisialisasinya. Tujuan Penginisialisasi FaceDetector(options:) menerima nilai untuk konfigurasi lainnya.

Jika Anda tidak memerlukan Detektor Wajah yang diinisialisasi dengan konfigurasi yang disesuaikan Anda dapat menggunakan penginisialisasi FaceDetector(modelPath:) untuk membuat Detektor Wajah dengan opsi default. Untuk informasi selengkapnya tentang konfigurasi opsi, lihat Ringkasan Konfigurasi.

Tugas Detektor Wajah mendukung 3 jenis data input: gambar diam, file video dan streaming video live. Secara default, FaceDetector(modelPath:) menginisialisasi untuk gambar diam. Jika Anda ingin tugas Anda diinisialisasi untuk memproses video file atau streaming video live, gunakan FaceDetector(options:) untuk menentukan video atau livestream berjalan. Mode livestream juga memerlukan opsi konfigurasi faceDetectorLiveStreamDelegate, yang memungkinkan Pendeteksi Wajah untuk mengirimkan hasil deteksi wajah kepada delegasi secara asinkron.

Pilih tab yang sesuai dengan mode lari Anda untuk melihat cara membuat tugas dan menjalankan inferensi.

Swift

Gambar

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image

let faceDetector = try FaceDetector(options: options)
    

Video

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video

let faceDetector = try FaceDetector(options: options)
    

Livestream

import MediaPipeTasksVision

// Class that conforms to the `FaceDetectorLiveStreamDelegate` protocol and
// implements the method that the face detector calls once it finishes
// detecting faces in each input frame.
class FaceDetectorResultProcessor: NSObject, FaceDetectorLiveStreamDelegate {

  func faceDetector(
    _ faceDetector: FaceDetector,
    didFinishDetection result: FaceDetectorResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the face detection result or errors here.

  }
}

let modelPath = Bundle.main.path(
  forResource: "model",
  ofType: "tflite")

let options = FaceDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
let processor = FaceDetectorResultProcessor()
options.faceDetectorLiveStreamDelegate = processor

let faceDetector = try FaceDetector(options: options)
    

Objective-C

Gambar

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

Video

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

Livestream

@import MediaPipeTasksVision;

// Class that conforms to the `MPPFaceDetectorLiveStreamDelegate` protocol
// and implements the method that the face detector calls once it finishes
// detecting faces in each input frame.

@interface APPFaceDetectorResultProcessor : NSObject 

@end

@implementation APPFaceDetectorResultProcessor

-   (void)faceDetector:(MPPFaceDetector *)faceDetector
    didFinishDetectionWithResult:(MPPFaceDetectorResult *)faceDetectorResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the face detector result or errors here.

}

@end

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPFaceDetectorOptions *options = [[MPPFaceDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;

// Assign an object of the class to the `faceDetectorLiveStreamDelegate`
// property.
APPFaceDetectorResultProcessor *processor = [APPFaceDetectorResultProcessor new];
options.faceDetectorLiveStreamDelegate = processor;

MPPFaceDetector *faceDetector =
      [[MPPFaceDetector alloc] initWithOptions:options error:nil];
    

Catatan: Jika Anda menggunakan mode video atau mode livestream, Detektor Wajah akan menggunakan pelacakan untuk menghindari pemicuan model deteksi di setiap frame, yang membantu mengurangi latensi.

Opsi konfigurasi

Tugas ini memiliki opsi konfigurasi berikut untuk aplikasi iOS:

Nama Opsi Deskripsi Rentang Nilai Nilai Default
runningMode Menetapkan mode berjalan untuk tugas. Ada tiga moda:

IMAGE: Mode untuk input gambar tunggal.

VIDEO: Mode untuk frame video yang didekode.

LIVE_STREAM: Mode untuk live stream input besar, seperti dari kamera. Dalam mode ini, resultListener harus dipanggil untuk menyiapkan pemroses yang akan menerima hasil secara asinkron.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
minDetectionConfidence Skor keyakinan minimum untuk deteksi wajah agar dianggap berhasil. Float [0,1] 0.5
minSuppressionThreshold Ambang batas penyembunyian non-maksimum minimum untuk deteksi wajah agar dianggap tumpang-tindih. Float [0,1] 0.3

Konfigurasi livestream

Jika mode lari disetel ke livestream, Detektor Wajah memerlukan opsi konfigurasi faceDetectorLiveStreamDelegate tambahan, yang memungkinkan detektor wajah untuk mengirimkan hasil deteksi secara asinkron. Delegasi mengimplementasikan Metode faceDetector(_:didFinishDetection:timestampInMilliseconds:error:), yang dipanggil oleh Detektor Wajah setelah memproses hasil deteksi wajah untuk setiap {i>frame<i}.

Nama opsi Deskripsi Rentang Nilai Nilai Default
faceDetectorLiveStreamDelegate Mengaktifkan Detektor Wajah untuk menerima hasil deteksi wajah secara asinkron dalam mode livestream. Kelas yang instance-nya disetel ke properti ini harus menerapkan faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) . Tidak berlaku Tidak ditetapkan

Menyiapkan data

Anda harus mengonversi gambar atau bingkai input menjadi objek MPImage sebelum meneruskannya ke Detektor Wajah. MPImage mendukung berbagai jenis image iOS format, dan dapat menggunakannya dalam mode berjalan apa pun untuk inferensi. Untuk selengkapnya informasi tentang MPImage, lihat MPImage API

Pilih format gambar iOS berdasarkan kasus penggunaan dan mode lari yang aplikasi diperlukan.MPImage menerima UIImage, CVPixelBuffer, dan CMSampleBuffer Format gambar iOS.

UIImage

Format UIImage sangat cocok untuk mode berjalan berikut:

  • Gambar: gambar dari app bundle, galeri pengguna, atau sistem file yang diformat sebagai Gambar UIImage dapat dikonversi menjadi objek MPImage.

  • Video: menggunakan AVAssetImageGenerator untuk mengekstrak frame video ke CGImage baru, lalu konversikan menjadi gambar UIImage.

Swift

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(uiImage: image)
    

Objective-C

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

Contoh ini menginisialisasi MPImage dengan UIImage.Orientation.Up orientasi. Anda dapat menginisialisasi MPImage dengan metode UIImage.Orientation masing-masing. Detektor Wajah tidak mendukung orientasi yang dicerminkan seperti .upMirrored, .downMirrored, .leftMirrored, .rightMirrored.

Untuk informasi selengkapnya tentang UIImage, lihat UIImage Apple Developer Dokumentasi.

CVPixelBuffer

Format CVPixelBuffer sangat cocok untuk aplikasi yang membuat frame dan menggunakan CoreImage iOS untuk pemrosesan.

Format CVPixelBuffer sangat cocok untuk mode berjalan berikut:

  • Gambar: aplikasi yang membuat gambar CVPixelBuffer setelah beberapa pemrosesan menggunakan framework CoreImage iOS dapat dikirim ke Detektor Wajah di mode image running.

  • Video: frame video dapat dikonversi ke format CVPixelBuffer untuk diproses, lalu dikirim ke Detektor Wajah dalam mode video.

  • livestream: aplikasi yang menggunakan kamera iOS untuk membuat frame dapat dikonversi ke dalam format CVPixelBuffer untuk diproses sebelum dikirim ke Detektor Wajah dalam mode livestream.

Swift

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(pixelBuffer: pixelBuffer)
    

Objective-C

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

Untuk informasi selengkapnya tentang CVPixelBuffer, lihat CVPixelBuffer Apple Pengembang Dokumentasi.

CMSampleBuffer

Format CMSampleBuffer menyimpan sampel media dari jenis media yang seragam, dan sangat cocok untuk mode livestream yang sedang berjalan. {i>Live frame<i} dari kamera iOS dikirim secara asinkron dalam format CMSampleBuffer oleh iOS AVCaptureVideoDataOutput.

Swift

// Obtain a CMSampleBuffer.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(sampleBuffer: sampleBuffer)
    

Objective-C

// Obtain a `CMSampleBuffer`.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
    

Untuk informasi selengkapnya tentang CMSampleBuffer, lihat CMSampleBuffer Apple Pengembang Dokumentasi.

Menjalankan tugas

Untuk menjalankan Detektor Wajah, gunakan metode detect() khusus untuk wajah yang ditetapkan mode lari:

  • Gambar diam: detect(image:)
  • Video: detect(videoFrame:timestampInMilliseconds:)
  • Livestream: detectAsync(image:timestampInMilliseconds:)

Detektor Wajah menampilkan wajah yang terdeteksi dalam gambar atau bingkai input.

Contoh kode berikut menunjukkan contoh sederhana tentang cara menjalankan Detektor Wajah di mode lari yang berbeda:

Swift

Gambar

let result = try faceDetector.detect(image: image)
    

Video

let result = try faceDetector.detect(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

Livestream

try faceDetector.detectAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

Gambar

MPPFaceDetectorResult *result = [faceDetector detectInImage:image
                                                      error:nil];
    

Video

MPPFaceDetectorResult *result = [faceDetector detectInVideoFrame:image
                                         timestampInMilliseconds:timestamp
                                                           error:nil];
    

Livestream

BOOL success = [faceDetector detectAsyncInImage:image
                        timestampInMilliseconds:timestamp
                                          error:nil];
    

Contoh kode Detektor Wajah menunjukkan implementasi setiap mode ini secara lebih detail detect(image:), detect(videoFrame:timestampInMilliseconds:), dan detectAsync(image:timestampInMilliseconds:). Kode contoh memungkinkan pengguna untuk beralih di antara mode pemrosesan yang mungkin tidak diperlukan untuk penggunaan Anda ini masalahnya atau bukan.

Perhatikan hal berikut:

  • Saat berjalan dalam mode video atau mode livestream, Anda juga harus menyediakan stempel waktu frame input ke tugas Detektor Wajah.

  • Saat berjalan dalam mode gambar atau video, tugas Detektor Wajah memblokir thread saat ini hingga selesai memproses gambar atau bingkai input. Kepada menghindari pemblokiran thread saat ini, jalankan pemrosesan di latar belakang thread menggunakan iOS Dispatch atau NSOperation framework.

  • Saat berjalan dalam mode livestream, tugas Detektor Wajah langsung ditampilkan dan tidak memblokir thread saat ini. Fungsi ini memanggil faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) metode dengan hasil deteksi wajah setelah memproses setiap frame input. Tujuan Detektor Wajah memanggil metode ini secara asinkron pada rangkaian khusus antrean pengiriman. Untuk menampilkan hasil pada antarmuka pengguna, kirim hasil ke antrean utama setelah memproses hasilnya. Jika detectAsync dipanggil saat tugas Detektor Wajah sedang sibuk memproses {i>frame<i}, Detektor Wajah mengabaikan {i>frame<i} input baru.

Menangani dan menampilkan hasil

Setelah menjalankan inferensi, tugas Detektor Wajah akan menampilkan FaceDetectorResult yang berisi kotak pembatas untuk wajah yang terdeteksi dan tingkat kepercayaan skor untuk setiap wajah yang terdeteksi.

Berikut ini contoh data output dari tugas ini:

FaceDetectionResult:
  Detections:
    Detection #0:
      BoundingBox:
        origin_x: 126
        origin_y: 100
        width: 463
        height: 463
      Categories:
        Category #0:
          index: 0
          score: 0.9729152917861938
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.18298381567001343
          y: 0.2961040139198303
        NormalizedKeypoint #1:
          x: 0.3302789330482483
          y: 0.29289937019348145
        ... (6 keypoints for each face)
    Detection #1:
      BoundingBox:
        origin_x: 616
        origin_y: 193
        width: 430
        height: 430
      Categories:
        Category #0:
          index: 0
          score: 0.9251380562782288
      NormalizedKeypoints:
        NormalizedKeypoint #0:
          x: 0.6151331663131714
          y: 0.3713381886482239
        NormalizedKeypoint #1:
          x: 0.7460576295852661
          y: 0.38825345039367676
        ... (6 keypoints for each face)

Gambar berikut menunjukkan visualisasi output tugas:

Untuk gambar tanpa kotak pembatas, lihat gambar asli.

Kode contoh Detektor Wajah menunjukkan cara menampilkan hasilnya. Lihat contoh kode untuk mengetahui detailnya.