Guide de détection de visages pour iOS

La tâche "Détecteur de visages" vous permet de détecter des visages dans une image ou une vidéo. Vous pouvez utiliser cette tâche pour localiser des visages et des traits du visage dans un cadre. Cette tâche utilise un modèle de machine learning (ML) qui fonctionne avec des images uniques ou un flux continu d'images. La tâche renvoie les emplacements des visages, ainsi que la touche faciale suivante : points: œil gauche, œil droit, extrémité du nez, bouche, tragion de l'œil gauche et œil droit tragique.

L'exemple de code décrit dans ces instructions est disponible sur GitHub. Pour voir une démonstration de cette tâche, consultez cette page Web une démonstration. Pour plus sur les fonctionnalités, les modèles et les options de configuration tâche, consultez la Aperçu.

Exemple de code

L'exemple de code MediaPipe Tasks est une implémentation simple d'un détecteur de visages pour iOS. L'exemple utilise l'appareil photo d'un appareil Android physique pour détecter visages dans un flux vidéo continu. L'application peut également détecter des visages sur des images et de la galerie de l'appareil.

Vous pouvez utiliser l'application comme point de départ pour votre propre application iOS ou vous y référer. lorsque vous modifiez une application existante. L'exemple de code du détecteur de visages est hébergé sur GitHub

Télécharger le code

Les instructions suivantes vous expliquent comment créer une copie locale de l'exemple à l'aide de l'outil de ligne de commande git.

<ph type="x-smartling-placeholder">

Pour télécharger l'exemple de code:

  1. Clonez le dépôt Git à l'aide de la commande suivante:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Si vous le souhaitez, vous pouvez configurer votre instance Git pour utiliser le paiement creuse. Seuls les fichiers de l'application exemple Détecteur de visage:

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

Après avoir créé une version locale de l'exemple de code, vous pouvez installer bibliothèque de tâches MediaPipe, ouvrez le projet avec Xcode et exécutez l'application. Pour instructions, consultez le Guide de configuration pour iOS.

Composants clés

Les fichiers suivants contiennent le code essentiel pour l'exemple du détecteur de visages application:

  • FaceDetectorService.swift: Initialise le détecteur, gère la sélection du modèle et exécute l'inférence sur les données d'entrée.
  • CameraViewController: Implémentation de l'interface utilisateur pour le mode de saisie du flux de caméra en direct et visualisation des résultats de détection
  • MediaLibraryViewController.swift: Implémente l'interface utilisateur pour le mode de saisie des images fixes et des fichiers vidéo, et visualise les résultats de la détection.

Configuration

Cette section décrit les étapes clés à suivre pour configurer votre environnement de développement pour utiliser Face Detector. Pour obtenir des informations générales sur la configuration environnement de développement permettant d'utiliser des tâches MediaPipe, y compris la version de la plate-forme consultez le Guide de configuration pour iOS.

<ph type="x-smartling-placeholder">

Dépendances

Le détecteur de visages utilise la bibliothèque MediaPipeTasksVision, qui doit être installée à l'aide de CocoaPods. La bibliothèque est compatible avec les applications Swift et Objective-C et ne nécessite aucune configuration de langue supplémentaire.

Pour obtenir des instructions sur l'installation de CocoaPods sous macOS, reportez-vous au document CocoaPods guide d'installation. Pour savoir comment créer un Podfile avec les pods nécessaires pour votre consultez la section Utilisation CocoaPods

Ajoutez le pod MediaPipeTasksVision dans le fichier Podfile à l'aide du code suivant:

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

Si votre application inclut des cibles de tests unitaires, reportez-vous au Guide de configuration iOS. votre Podfile.

Modèle

La tâche de détection de visages MediaPipe nécessite un modèle entraîné et compatible pour cette tâche. Pour en savoir plus sur les modèles entraînés disponibles pour de détection de visages, consultez la présentation des tâches Modèles .

Sélectionnez et téléchargez un modèle, puis ajoutez-le au répertoire de votre projet à l'aide de Xcode. Pour savoir comment ajouter des fichiers à votre projet Xcode, reportez-vous à la section Gestion fichiers et dossiers dans votre Xcode projet.

Utilisez la propriété BaseOptions.modelAssetPath pour spécifier le chemin d'accès au modèle. dans votre app bundle. Pour obtenir un exemple de code, consultez la section suivante.

Créer la tâche

Vous pouvez créer la tâche de détection de visages en appelant l'un de ses initialiseurs. La L'initialiseur FaceDetector(options:) accepte les valeurs pour la configuration options.

Si vous n'avez pas besoin d'un détecteur de visages initialisé avec une configuration personnalisée vous pouvez utiliser l'initialiseur FaceDetector(modelPath:) pour créer avec les options par défaut du détecteur de visages. Pour en savoir plus sur la configuration consultez la page Présentation de la configuration.

La tâche "Détecteur de visages" accepte trois types de données d'entrée: images fixes et fichiers vidéo et les flux vidéo en direct. Par défaut, FaceDetector(modelPath:) initialise un pour les images fixes. Si vous souhaitez que votre tâche soit initialisée pour traiter des vidéos ou de flux vidéo en direct, utilisez FaceDetector(options:) pour spécifier la vidéo ou diffusion en direct. Le mode "Diffusion en direct" nécessite également l'option de configuration faceDetectorLiveStreamDelegate, qui active Avec le détecteur de visages, il transmet les résultats de la détection de visages au délégué de manière asynchrone.

Choisissez l'onglet correspondant à votre mode d'exécution pour découvrir comment créer la tâche. et exécuter des inférences.

Swift

Image

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)
    

Vidéo

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)
    

Diffusion en direct

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

Image

@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];
    

Vidéo

@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];
    

Diffusion en direct

@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];
    

Remarque:Si vous utilisez le mode Vidéo ou Streaming, le détecteur de visages utilise pour éviter de déclencher le modèle de détection à chaque image, réduire la latence.

Options de configuration

Cette tâche comporte les options de configuration suivantes pour les applications iOS:

Nom de l'option Description Plage de valeurs Valeur par défaut
runningMode Définit le mode d'exécution de la tâche. Il y en a trois modes:

IMAGE: mode utilisé pour la saisie d'une seule image.

VIDEO: mode des images décodées d'une vidéo.

LIVE_STREAM: mode d'une diffusion en direct des entrées provenant d'un appareil photo, par exemple. Dans ce mode, resultListener doit être appelé pour configurer un écouteur afin de recevoir les résultats ; de manière asynchrone.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
minDetectionConfidence Score de confiance minimal pour que la détection de visages soit considérée comme réussie. Float [0,1] 0.5
minSuppressionThreshold Seuil minimal de suppression non maximale pour que la détection de visages soit considérée comme se chevauchant. Float [0,1] 0.3

Configuration de la diffusion en direct

Lorsque le mode de course est configuré pour une diffusion en direct, le détecteur de visage requiert l'option de configuration faceDetectorLiveStreamDelegate supplémentaire, qui permet le détecteur de visages pour fournir les résultats de détection de manière asynchrone. Le délégué met en œuvre faceDetector(_:didFinishDetection:timestampInMilliseconds:error:), que le détecteur de visages appelle après avoir traité les résultats de la détection de visages. chaque image.

Nom de l'option Description Plage de valeurs Valeur par défaut
faceDetectorLiveStreamDelegate Permet au détecteur de visages de recevoir les résultats de la détection de visages de manière asynchrone en mode diffusion en direct. La classe dont l'instance est définie sur cette propriété doit : implémenter faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) . Non applicable Non défini

Préparer les données

Vous devez convertir l'image ou le cadre d'entrée en objet MPImage avant en la transmettant au détecteur de visages. MPImage est compatible avec différents types d'images iOS et peuvent les utiliser dans n'importe quel mode d'exécution pour l'inférence. Pour plus plus d'informations sur MPImage, consultez API MPImage

Choisissez un format d'image iOS en fonction de votre cas d'utilisation et du mode de course que vous requise par l'application.MPImage accepte les règles de confidentialité UIImage, CVPixelBuffer et CMSampleBuffer formats d'image iOS.

UIImage

Le format UIImage convient bien aux modes d'exécution suivants:

  • Images : images d'un app bundle, d'une galerie d'utilisateur ou d'un système de fichiers au format suivant : Les images UIImage peuvent être converties en objet MPImage.

  • Vidéos: utilisez AVAssetImageGenerator. pour extraire des images vidéo CGImage le format d'image, puis les convertir en UIImage images.

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'exemple initialise un MPImage avec les valeurs par défaut UIImage.Orientation.Up l'orientation. Vous pouvez initialiser un MPImage avec n'importe laquelle des UIImage.Orientation valeurs. Le détecteur de visages ne prend pas en charge les orientations en miroir comme .upMirrored, .downMirrored, .leftMirrored et .rightMirrored.

Pour plus d'informations sur UIImage, reportez-vous à UIImage Apple Developer documentation.

CVPixelBuffer

Le format CVPixelBuffer convient bien aux applications qui génèrent des frames et utiliser la classe iOS CoreImage pour le traitement.

Le format CVPixelBuffer convient bien aux modes d'exécution suivants:

  • Images: applications qui génèrent CVPixelBuffer images après un traitement utilisant le framework CoreImage d'iOS peuvent être envoyés au détecteur de visages d'exécution de l'image.

  • Vidéos: les images vidéo peuvent être converties au format CVPixelBuffer pour puis envoyées au détecteur de visages en mode vidéo.

  • Diffusion en direct: les applications utilisant un appareil photo iOS pour générer des images peuvent être converties au format CVPixelBuffer pour être traité avant d'être envoyé au Détecteur de visages en mode diffusion en direct.

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];
    

Pour plus d'informations sur CVPixelBuffer, reportez-vous au fichier CVPixelBuffer Développeur documentation.

CMSampleBuffer

Le format CMSampleBuffer stocke des échantillons multimédias d'un type uniforme et est bien adapté au streaming en direct. Les images en direct des appareils photo iOS sont envoyé de manière asynchrone au format CMSampleBuffer par 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];
    

Pour plus d'informations sur CMSampleBuffer, reportez-vous au fichier CMSampleBuffer Développeur documentation.

Exécuter la tâche

Pour exécuter le détecteur de visages, utilisez la méthode detect() propre au en cours d'exécution:

  • Image fixe: detect(image:)
  • Vidéo : detect(videoFrame:timestampInMilliseconds:)
  • Diffusion en direct : detectAsync(image:timestampInMilliseconds:)

Le détecteur de visages renvoie les visages détectés dans l'image ou le cadre d'entrée.

Les exemples de code suivants illustrent des exemples simples d'exécution du détecteur de visages dans ces différents modes de fonctionnement:

Swift

Image

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

Vidéo

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

Diffusion en direct

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

Objective-C

Image

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

Vidéo

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

Diffusion en direct

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

L'exemple de code du détecteur de visages montre les implémentations de chacun de ces modes detect(image:), detect(videoFrame:timestampInMilliseconds:), et detectAsync(image:timestampInMilliseconds:). L'exemple de code autorise à l'utilisateur de passer d'un mode de traitement à un autre, ce qui n'est peut-être pas nécessaire .

Veuillez noter les points suivants :

  • Lorsque vous utilisez le mode vidéo ou le mode direct, vous devez également fournir le le code temporel de la trame d'entrée à la tâche de détection de visages.

  • En mode Image ou Vidéo, la tâche "Détecteur de visage" bloque thread actuel jusqu'à ce qu'il ait fini de traiter l'image ou le frame d'entrée. À éviter de bloquer le thread actuel, exécuter le traitement en arrière-plan thread utilisant iOS Dispatch ou NSOperation cadres réglementaires.

  • En mode diffusion en direct, la tâche "Détecteur de visage" est immédiatement renvoyée et ne bloque pas le thread actuel. Elle appelle faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) méthode avec le résultat de la détection de visages après le traitement de chaque image d'entrée. La Le détecteur de visages invoque cette méthode de manière asynchrone sur un réseau la file d'attente de distribution. Pour afficher les résultats dans l'interface utilisateur, envoyez la dans la file d'attente principale après leur traitement. Si le detectAsync est appelée lorsque la tâche de détection de visages est occupée à traiter une autre l'image, le détecteur de visages ignore la nouvelle image d'entrée.

Gérer et afficher les résultats

Lors de l'exécution de l'inférence, la tâche de détection de visages renvoie un FaceDetectorResult contenant les cadres de délimitation des visages détectés et le niveau de confiance pour chaque visage détecté.

Voici un exemple de données de sortie de cette tâche:

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'image suivante montre une visualisation du résultat de la tâche:

Pour voir l'image sans cadre de délimitation, reportez-vous à l'image d'origine.

L'exemple de code du détecteur de visages montre comment afficher les résultats. Consultez le exemple de code.