Guida al rilevamento dei volti per iOS

L'attività Rilevamento dei volti ti consente di rilevare i volti in un'immagine o in un video. Puoi utilizzare questa attività per individuare volti e 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 le posizioni dei volti, insieme alla seguente chiave facciale punti: occhio sinistro, occhio destro, punta del naso, bocca, tragione dell'occhio sinistro e occhio destro tragion vissuta.

L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. Puoi vedere questa attività in azione visualizzando questo Web una demo. Per ulteriori informazioni informazioni su funzionalità, modelli e opzioni di configurazione consulta le Panoramica.

Esempio di codice

Il codice di esempio relativo alle attività di MediaPipe è una semplice implementazione di un rilevatore di volti per iOS. L'esempio utilizza la fotocamera di un dispositivo Android fisico per rilevare volti in uno stream video continuo. L'app può anche rilevare i volti nelle immagini e video dalla galleria del dispositivo.

Puoi utilizzare l'app come punto di partenza per la tua app per iOS o fare riferimento all'app 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 dell'esempio utilizzando lo strumento a riga di comando git.

Per scaricare il codice di esempio:

  1. Clona il repository git utilizzando il comando seguente:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura la tua istanza Git per l'utilizzo di un pagamento sparso, in modo da avere solo i file dell'app di esempio Rilevamento dei volti:

    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 nella libreria di attività MediaPipe, apri il progetto con Xcode ed esegui l'app. Per istruzioni, vedi la Guida alla configurazione per iOS.

Componenti chiave

I file che seguono contengono il codice fondamentale per l'esempio del rilevatore di volti applicazione:

  • 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 file di immagini e video e visualizza i risultati del rilevamento.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e per l'utilizzo di Face Detector. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'uso di attività MediaPipe, inclusa la versione della piattaforma consulta la Guida alla configurazione per iOS.

Dipendenze

Il rilevatore di volti utilizza la raccolta MediaPipeTasksVision, che deve essere installata utilizzando CocoaPods. La raccolta è 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 l'articolo CocoaPods Guida all'installazione. Per istruzioni su come creare un elemento Podfile con i pod necessari per il tuo consulta la sezione Utilizzo 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 dei test delle unità, consulta la Guida alla configurazione per iOS per ulteriori informazioni sulla configurazione il tuo Podfile.

Modello

L'attività di rilevamento dei volti di MediaPipe richiede un modello addestrato compatibile con questa attività. Per saperne di più sui modelli addestrati disponibili Rilevamento dei volti; consulta la panoramica dell'attività Modelli .

Seleziona e scarica un modello, quindi aggiungilo alla directory del progetto utilizzando Xcode. Per istruzioni su come aggiungere file al progetto Xcode, consulta Gestione i file e le cartelle in Xcode progetto.

Utilizza la proprietà BaseOptions.modelAssetPath per specificare il percorso del modello nel tuo app bundle. Per un esempio di codice, consulta la sezione successiva.

Crea l'attività

Puoi creare l'attività Face Detector chiamando uno dei suoi inizializzatori. La L'inizializzazione di FaceDetector(options:) accetta valori per la configurazione le opzioni di CPU e memoria disponibili.

Se non ti occorre un riconoscimento dei volti inizializzato con una configurazione personalizzata puoi usare l'inizializzatore FaceDetector(modelPath:) per creare Rilevamento facciale con le opzioni predefinite. Per ulteriori informazioni sulla configurazione vedi Panoramica della configurazione.

L'attività Rilevamento dei volti supporta tre tipi di dati di input: immagini fisse e file video e video stream in diretta. Per impostazione predefinita, FaceDetector(modelPath:) inizializza una per le immagini statiche. Se vuoi che l'attività venga inizializzata per elaborare il video file o stream video in diretta, usa FaceDetector(options:) per specificare il video modalità di corsa o live streaming. La modalità live streaming richiede anche di configurazione di faceDetectorLiveStreamDelegate, che attiva Rilevamento facciale per fornire i risultati del rilevamento facciale al delegato in modo asincrono.

Scegli la scheda corrispondente alla tua 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, Face Detector utilizza il tracciamento per evitare di attivare il modello di rilevamento su ogni frame, il che aiuta per ridurre la latenza.

Opzioni di configurazione

Questa attività include 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 tipi di modalità:

IMAGE: la modalità per gli input di immagini singole.

VIDEO: la modalità per i fotogrammi decodificati di un video.

LIVE_STREAM: la modalità per un live streaming di input dati, ad esempio quelli di una videocamera. In questa modalità, resultListener deve essere per impostare un listener in modo che riceva risultati in modo asincrono.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
minDetectionConfidence Il punteggio di confidenza minimo affinché il rilevamento dei volti abbia successo. Float [0,1] 0.5
minSuppressionThreshold La soglia minima non massima di soppressione affinché il rilevamento dei volti sia considerata sovrapposta. Float [0,1] 0.3

Configurazione del live streaming

Quando la modalità di corsa è impostata su live streaming, il riconoscimento facciale richiede un'opzione di configurazione faceDetectorLiveStreamDelegate aggiuntiva, che consente rilevamento dei volti per restituire i risultati del rilevamento in modo asincrono. Il delegato implementa faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) metodo, che il Face Detector chiama dopo aver elaborato i risultati del riconoscimento facciale ogni frame.

Nome opzione Descrizione Intervallo di valori Valore predefinito
faceDetectorLiveStreamDelegate Consente al riconoscimento facciale 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 di implementare faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) . Non applicabile Non impostato

Preparazione dei dati

Devi convertire l'immagine o il frame di input in un oggetto MPImage prima e passarla al rilevatore di volti. MPImage supporta diversi tipi di immagini iOS e possono utilizzarli in qualsiasi modalità di esecuzione per l'inferenza. Per ulteriori informazioni informazioni su MPImage, consulta le API MPImage

Scegli un formato dell'immagine iOS in base al tuo caso d'uso e alla modalità di corsa richiede l'applicazione.MPImage accetta UIImage, CVPixelBuffer e CMSampleBuffer formati dell'immagine per iOS.

UIImage

Il formato UIImage è adatto alle seguenti modalità di corsa:

  • Immagini: immagini da un app bundle, una galleria utente o un file system formattato come UIImage immagini possono essere convertite in un oggetto MPImage.

  • Video: utilizza AVAssetImageGenerator per estrarre i fotogrammi video 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 MPImage con il valore predefinito UIImage.Orientation.Up orientamento. Puoi inizializzare MPImage con uno qualsiasi dei UIImage.Orientation e i relativi valori. Il rilevatore di volti non supporta gli orientamenti speculari come .upMirrored, .downMirrored, .leftMirrored e .rightMirrored.

Per ulteriori informazioni su UIImage, fai riferimento a UIImage Apple Developer Documentazione.

CVPixelBuffer

Il formato CVPixelBuffer è adatto per le applicazioni che generano frame e utilizza la classe CoreImage per iOS per l'elaborazione dei dati.

Il formato CVPixelBuffer è adatto alle seguenti modalità di corsa:

  • Immagini: app che generano CVPixelBuffer immagini dopo un'elaborazione utilizzando il framework CoreImage di iOS possono essere inviate al riconoscimento facciale modalità di esecuzione delle immagini.

  • Video: i fotogrammi possono essere convertiti nel formato CVPixelBuffer per e inviati al rilevatore di volti in modalità video.

  • live streaming: le app che utilizzano una fotocamera iOS per generare fotogrammi possono essere convertite nel formato CVPixelBuffer per l'elaborazione prima di essere inviati al Rilevamento dei 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 CVPixelBuffer Apple Sviluppatore Documentazione.

CMSampleBuffer

Il formato CMSampleBuffer archivia campioni multimediali di un tipo di supporto uniforme e Si adatta alla modalità di corsa in live streaming. I fotogrammi in diretta delle fotocamere iOS sono pubblicato 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 ulteriori informazioni su CMSampleBuffer, consulta l'articolo CMSampleBuffer Apple Sviluppatore Documentazione.

Esegui l'attività

Per eseguire il riconoscimento facciale, usa il metodo detect() specifico per il modalità di corsa:

  • Immagine statica: detect(image:)
  • Video: detect(videoFrame:timestampInMilliseconds:)
  • Live streaming: detectAsync(image:timestampInMilliseconds:)

Il riconoscimento facciale restituisce i volti rilevati all'interno dell'immagine o della cornice di input.

I seguenti esempi di codice mostrano semplici esempi di come eseguire Face Detector diverse modalità di corsa:

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 che potrebbe non essere necessaria per il tuo utilizzo per verificare se è così.

Tieni presente quanto segue:

  • Quando l'esecuzione avviene in modalità video o live streaming, devi fornire anche timestamp del frame di input all'attività riconoscimento facciale.

  • Durante l'esecuzione in modalità immagine o video, l'attività Rilevamento volti blocca il thread corrente finché non termina l'elaborazione dell'immagine o del frame di input. A evitare di bloccare il thread corrente, esegui l'elaborazione in background thread utilizzando iOS Dispatch o NSOperation i modelli di machine learning.

  • Quando l'attività è in modalità live streaming, l'attività di rilevamento dei volti ritorna immediatamente e non blocca il thread corrente. Richiamo faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) metodo con il risultato del rilevamento dei volti dopo l'elaborazione di ogni frame di input. La Il rilevatore di volti richiama questo metodo in modo asincrono su un numero seriale dedicato di tracciamento delle chiamate. Per visualizzare i risultati sull'interfaccia utente, invia il metodo i risultati alla coda principale dopo l'elaborazione dei risultati. Se detectAsync viene chiamata quando l'attività Rilevamento volti è impegnata a elaborare un'altra , il riconoscimento facciale ignora il nuovo frame di input.

Gestire e visualizzare i risultati

Dopo l'esecuzione dell'inferenza, l'attività di rilevamento dei volti restituisce un FaceDetectorResult che contiene i riquadri di delimitazione dei volti rilevati e un un punteggio 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. Consulta le esempio di codice per maggiori dettagli.