L'attività Rilevamento dei volti consente di rilevare i volti in un'immagine o in un video. Puoi usare questa attività per individuare i volti e le caratteristiche del viso all'interno di un'inquadratura. Questa attività utilizza un modello di machine learning (ML) che funziona con immagini singole o un flusso continuo di immagini. L'attività restituisce la posizione del volto, oltre ai seguenti elementi chiave del volto: occhio sinistro, occhio destro, punta del naso, bocca, tragione dell'occhio sinistro e tragione dell'occhio destro.
L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. Puoi vedere questa attività in azione visualizzando questa demo web. Per ulteriori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio di MediaPipe Tasks è una semplice implementazione di un'app Face Detector per iOS. L'esempio utilizza la fotocamera di un dispositivo Android fisico per rilevare i volti in uno stream video continuo. L'app può anche rilevare i volti nelle immagini e nei video dalla galleria del dispositivo.
Puoi utilizzare l'app come punto di partenza per la tua app per iOS o farvi riferimento quando modifichi un'app esistente. Il codice di esempio del rilevatore di volti è ospitato su GitHub.
Scarica il codice
Le seguenti istruzioni mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando git.
Per scaricare il codice di esempio:
Clona il repository git utilizzando il seguente comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
Facoltativamente, configura l'istanza Git in modo da utilizzare il pagamento sparse, in modo da avere solo i file dell'app di esempio di Face Detector:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/face_detector/ios/
Dopo aver creato una versione locale del codice di esempio, puoi installare la libreria di attività MediaPipe, aprire il progetto utilizzando Xcode ed eseguire l'app. Per istruzioni, consulta la Guida alla configurazione per iOS.
Componenti chiave
I seguenti file contengono il codice fondamentale per l'applicazione di esempio di rilevatore di volti:
- FaceDetectorService.swift: inizializza il rilevatore, gestisce la selezione del modello ed esegue l'inferenza sui dati di input.
- CameraViewController: implementa l'UI per la modalità di immissione del feed della videocamera in diretta e visualizza i risultati del rilevamento.
- MediaLibraryViewController.swift: implementa l'interfaccia utente per la modalità di input di immagini fisse e file video e visualizza i risultati del rilevamento.
Configurazione
In questa sezione vengono descritti i passaggi chiave per configurare l'ambiente di sviluppo e codificare i progetti per l'utilizzo di Face Detector. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti di versione della piattaforma, consulta la Guida alla configurazione per iOS.
Dipendenze
La funzionalità di rilevamento dei volti utilizza la libreria MediaPipeTasksVision
, che deve essere installata
utilizzando CocoaPods. La libreria è compatibile con le app Swift e Objective-C e non richiede alcuna configurazione aggiuntiva specifica per la lingua.
Per istruzioni su come installare CocoaPods su macOS, consulta la guida all'installazione di CocoaPods.
Per istruzioni su come creare un Podfile
con i pod necessari per la tua
app, consulta la sezione Utilizzare
CocoaPods.
Aggiungi il pod MediaPipeTasksVision in Podfile
utilizzando il seguente codice:
target 'MyFaceDetectorApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
Se la tua app include target per il test delle unità, consulta la Guida alla configurazione per iOS per ulteriori informazioni sulla configurazione di Podfile
.
Modello
L'attività Rilevatore di volti MediaPipe richiede un modello addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per il rilevatore di volti, consulta la sezione Modelli della panoramica dell'attività.
Seleziona e scarica un modello, quindi aggiungilo alla directory del progetto utilizzando Xcode. Per istruzioni su come aggiungere file al progetto Xcode, consulta Gestione di file e cartelle nel progetto Xcode.
Utilizza la proprietà BaseOptions.modelAssetPath
per specificare il percorso del modello
nel tuo app bundle. Per un esempio di codice, consulta la sezione successiva.
Creare l'attività
Puoi creare l'attività Rilevamento dei volti chiamando uno dei suoi inizializzatori. L'inizializzazione FaceDetector(options:)
accetta valori per le opzioni di configurazione.
Se non hai bisogno di un rilevatore di volti inizializzato con opzioni di configurazione personalizzate, puoi usare l'inizializzazione FaceDetector(modelPath:)
per crearne uno con le opzioni predefinite. Per ulteriori informazioni sulle opzioni di configurazione, consulta Panoramica della configurazione.
L'attività Rilevamento dei volti supporta tre tipi di dati di input: immagini fisse, file video e stream video in diretta. Per impostazione predefinita, FaceDetector(modelPath:)
inizializza un'attività per le immagini statiche. Se vuoi che l'attività venga inizializzata allo scopo di elaborare file video o stream video in diretta, usa FaceDetector(options:)
per specificare la modalità di esecuzione del video o del live streaming. La modalità live streaming richiede anche l'opzione di configurazione faceDetectorLiveStreamDelegate
aggiuntiva, che consente al rilevatore di volti di inviare i risultati del rilevamento dei volti alla persona delegata in modo asincrono.
Scegli la scheda corrispondente alla modalità di corsa per vedere come creare l'attività ed eseguire l'inferenza.
Swift
Immagine
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)
Live streaming
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
Immagine
@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];
Live streaming
@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];
Nota: se usi la modalità video o live streaming, la funzionalità di rilevamento dei volti utilizza il monitoraggio per evitare di attivare il modello di rilevamento su ogni frame, il che aiuta a ridurre la latenza.
Opzioni di configurazione
Questa attività prevede le seguenti opzioni di configurazione per le app per iOS:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
runningMode |
Imposta la modalità di esecuzione per l'attività. Esistono tre
modalità: IMAGE: la modalità per gli input di singole immagini. VIDEO: la modalità per i fotogrammi decodificati di un video. LIVE_STREAM: la modalità per un live streaming di dati di input, ad esempio da una videocamera. In questa modalità, resultListener deve essere chiamato per configurare un listener per ricevere i risultati in modo asincrono. |
{RunningMode.image, RunningMode.video, RunningMode.liveStream } |
RunningMode.image |
minDetectionConfidence |
Il punteggio di confidenza minimo affinché il rilevamento dei volti venga considerato efficace. | Float [0,1] |
0.5 |
minSuppressionThreshold |
La soglia minima non massima di soppressione per il rilevamento dei volti affinché venga considerato sovrapposto. | Float [0,1] |
0.3 |
Configurazione del live streaming
Quando la modalità di esecuzione è impostata su Live streaming, il rilevatore di volti richiede l'opzione di configurazione faceDetectorLiveStreamDelegate
aggiuntiva, che consente al rilevatore di volti di fornire i risultati del rilevamento in modo asincrono. Il delegato implementa il metodo faceDetector(_:didFinishDetection:timestampInMilliseconds:error:)
, che il rilevatore di volti chiama dopo l'elaborazione dei risultati del rilevamento dei volti per ogni frame.
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
faceDetectorLiveStreamDelegate |
Consente al rilevatore dei volti di ricevere i risultati del rilevamento dei volti in modo asincrono in modalità live streaming. La classe la cui istanza è impostata su questa proprietà deve implementare il metodo faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) . |
Non applicabile | Non impostata |
Preparazione dei dati
Devi convertire l'immagine o il frame di input in un oggetto MPImage
prima di passarlo al rilevatore di volti. MPImage
supporta diversi tipi di formati delle immagini per iOS e può utilizzarli in qualsiasi modalità di esecuzione per l'inferenza. Per ulteriori informazioni su MPImage
, consulta la pagina relativa all'API MPImage
Scegli il formato dell'immagine per iOS in base al tuo caso d'uso e alla modalità di esecuzione richiesta dalla tua applicazione.MPImage
accetta i formati di immagine per iOS UIImage
, CVPixelBuffer
e CMSampleBuffer
.
UIImage
Il formato UIImage
è adatto per le seguenti modalità di corsa:
Immagini: le immagini di un app bundle, di una galleria utente o di un file system formattate come
UIImage
immagini possono essere convertite in un oggettoMPImage
.Video: utilizza AVAssetImageGenerator per estrarre fotogrammi video nel formato CGImage, quindi convertili in
UIImage
immagini.
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];
L'esempio inizializza un elemento MPImage
con l'orientamento predefinito UIImage.Orientation.Up. Puoi inizializzare un elemento MPImage
con uno qualsiasi dei valori supportati per
UIImage.Orientation. Il rilevatore di volti non supporta gli orientamenti speculari come .upMirrored
,
.downMirrored
, .leftMirrored
e .rightMirrored
.
Per ulteriori informazioni su UIImage
, consulta la documentazione per gli sviluppatori di Apple nell'interfaccia UI.
CVPixelBuffer
Il formato CVPixelBuffer
è ideale per le applicazioni che generano frame e utilizzano il framework CoreImage di iOS per l'elaborazione.
Il formato CVPixelBuffer
è adatto per le seguenti modalità di corsa:
Immagini: le app che generano immagini
CVPixelBuffer
dopo un'elaborazione utilizzando il frameworkCoreImage
di iOS possono essere inviate al rilevatore di volti in modalità di esecuzione delle immagini.Video: i fotogrammi video possono essere convertiti nel formato
CVPixelBuffer
per l'elaborazione e poi inviati al rilevatore di volti in modalità video.live streaming: le app che utilizzano una fotocamera iOS per generare frame possono essere convertite nel formato
CVPixelBuffer
per l'elaborazione prima di essere inviate al rilevatore di volti in modalità live streaming.
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];
Per ulteriori informazioni su CVPixelBuffer
, consulta la documentazione per gli sviluppatori di Apple CVPixelBuffer.
CMSampleBuffer
Il formato CMSampleBuffer
archivia esempi di contenuti multimediali di un tipo di media uniforme ed è
adatto per la modalità di esecuzione live streaming. I fotogrammi in tempo reale delle fotocamere iOS vengono
inviati in modo asincrono nel formato CMSampleBuffer
da 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];
Per maggiori informazioni su CMSampleBuffer
, consulta la documentazione per gli sviluppatori Apple CMSampleBuffer.
Esegui l'attività
Per eseguire il rilevatore di volti, usa il metodo detect()
specifico per la modalità di esecuzione assegnata:
- Immagine statica:
detect(image:)
- Video:
detect(videoFrame:timestampInMilliseconds:)
- Live streaming:
detectAsync(image:timestampInMilliseconds:)
Il rilevatore di volti restituisce i volti rilevati nell'immagine o nel frame di input.
I seguenti esempi di codice mostrano semplici esempi di come eseguire Face Detector in queste diverse modalità di esecuzione:
Swift
Immagine
let result = try faceDetector.detect(image: image)
Video
let result = try faceDetector.detect( videoFrame: image, timestampInMilliseconds: timestamp)
Live streaming
try faceDetector.detectAsync( image: image, timestampInMilliseconds: timestamp)
Objective-C
Immagine
MPPFaceDetectorResult *result = [faceDetector detectInImage:image error:nil];
Video
MPPFaceDetectorResult *result = [faceDetector detectInVideoFrame:image timestampInMilliseconds:timestamp error:nil];
Live streaming
BOOL success = [faceDetector detectAsyncInImage:image timestampInMilliseconds:timestamp error:nil];
L'esempio di codice del rilevatore di volti mostra le implementazioni di ciascuna di queste modalità in modo più dettagliato: detect(image:)
, detect(videoFrame:timestampInMilliseconds:)
e detectAsync(image:timestampInMilliseconds:)
. Il codice di esempio consente all'utente di passare da una modalità di elaborazione all'altra, il che potrebbe non essere necessario per il tuo caso d'uso.
Tieni presente quanto riportato di seguito:
Quando esegui in modalità video o live streaming, devi anche fornire il timestamp del frame di input all'attività di rilevamento dei volti.
Quando viene eseguita in modalità immagine o video, l'attività Face Detector blocca il thread corrente finché non completa l'elaborazione dell'immagine o del frame di input. Per evitare di bloccare il thread corrente, esegui l'elaborazione in un thread in background utilizzando i framework per iOS Dispatch o NSOperation.
Quando è in esecuzione in modalità live streaming, l'attività di rilevamento dei volti viene restituita immediatamente e non blocca il thread corrente. Richiama il metodo
faceDetector(_:didFinishDetection:timestampInMilliseconds:error:)
con il risultato del rilevamento dei volti dopo l'elaborazione di ogni frame di input. Il rilevatore di volti richiama questo metodo in modo asincrono su una coda di invio seriale dedicata. Per visualizzare i risultati nell'interfaccia utente, inviali alla coda principale dopo l'elaborazione dei risultati. Se la funzionedetectAsync
viene richiamata quando l'attività di rilevamento dei volti è impegnata a elaborare un altro frame, il rilevatore di volti ignora il nuovo frame di input.
Gestire e visualizzare i risultati
Dopo l'esecuzione dell'inferenza, l'attività di rilevamento dei volti restituisce un oggetto FaceDetectorResult
che contiene i riquadri di delimitazione per i volti rilevati e un punteggio di confidenza per ogni volto rilevato.
Di seguito è riportato un esempio dei dati di output di questa attività:
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)
L'immagine seguente mostra una visualizzazione dell'output dell'attività:
Per l'immagine senza riquadri di delimitazione, vedi l'immagine originale.
Il codice di esempio del rilevatore di volti mostra come visualizzare i risultati. Per maggiori dettagli, vedi l'esempio di codice.