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:
Clone repositori git menggunakan perintah berikut:
git clone https://github.com/google-ai-edge/mediapipe-samples
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:
- FaceDetectorService.swift: Menginisialisasi detektor, menangani pemilihan model, dan menjalankan inferensi pada data input.
- CameraViewController: Menerapkan UI untuk mode input feed kamera live dan memvisualisasikan hasil deteksi.
- MediaLibraryViewController.swift: Menerapkan UI untuk mode input file video dan gambar diam serta memvisualisasikan hasil deteksi.
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 objekMPImage
.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 frameworkCoreImage
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. JikadetectAsync
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.