Leitfaden zur Gesichtserkennung für iOS

Mit der Aufgabe „Gesichtserkennung“ können Sie Gesichter in einem Bild oder Video erkennen. Sie können um Gesichter und Gesichtsmerkmale innerhalb eines Rahmens zu finden. Bei dieser Aufgabe wird ein ML-Modell, das mit einzelnen Bildern oder einem kontinuierlichen Stream arbeitet von Bildern. Die Aufgabe gibt die Gesichtsstandorte zusammen mit dem folgenden Gesichtsschlüssel aus Punkte: linkes Auge, rechtes Auge, Nasenspitze, Mund, Tragion linkes Auge und rechtes Auge Tragion.

Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub verfügbar. Sie können diese Aufgabe in Aktion sehen, indem Sie dieses Web- Weitere Informationen Informationen zu den Funktionen, Modellen und Konfigurationsoptionen finden Sie in der Übersicht:

Codebeispiel

Der Beispielcode für MediaPipe Tasks ist eine einfache Implementierung eines Gesichtsdetektors. App für iOS. In diesem Beispiel wird die Kamera eines physischen Android-Geräts verwendet, Gesichter in einem kontinuierlichen Videostream. Die App kann auch Gesichter in Bildern erkennen Videos aus der Gerätegalerie.

Du kannst die App als Ausgangspunkt für deine eigene iOS-App verwenden oder darauf verweisen wenn Sie eine vorhandene App ändern. Der Beispielcode für die Gesichtserkennung wird auf GitHub

Code herunterladen

In der folgenden Anleitung erfahren Sie, wie Sie eine lokale Kopie des Beispiels erstellen. mit dem Befehlszeilentool git erstellen.

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

So laden Sie den Beispielcode herunter:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Konfigurieren Sie optional Ihre Git-Instanz für den Sparse-Checkout, damit Sie nur die Dateien für die Beispiel-App zur Gesichtserkennung:

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

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie den MediaPipe-Aufgabenbibliothek, öffnen Sie das Projekt mit Xcode und führen Sie die App aus. Für finden Sie im Einrichtungsleitfaden für iOS.

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für das Beispiel zur Gesichtserkennung Anwendung:

  • FaceDetectorService.swift: Initialisiert den Detektor, übernimmt die Modellauswahl und führt eine Inferenz auf die Eingabedaten aus.
  • CameraViewController: Implementiert die Benutzeroberfläche für den Live-Kamerafeed-Eingabemodus und visualisiert die Erkennungsergebnisse.
  • MediaLibraryViewController.swift: Implementiert die Benutzeroberfläche für den Eingabemodus für Standbilder und Videodateien und visualisiert die Erkennungsergebnisse.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und programmieren Sie Projekte zur Verwendung der Gesichtserkennung. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversion finden Sie im Einrichtungsleitfaden für iOS.

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

Abhängigkeiten

Die Gesichtserkennung verwendet die Bibliothek „MediaPipeTasksVision“, die installiert werden muss mit CocoaPods. Die Bibliothek ist sowohl mit Swift- als auch mit Objective-C-Apps kompatibel. und erfordert keine zusätzliche sprachspezifische Einrichtung.

Eine Anleitung zur Installation von CocoaPods unter macOS findest du im Artikel zu CocoaPods Installationsanleitung. Eine Anleitung zum Erstellen eines Podfile mit den für Ihr Projekt erforderlichen Pods erhalten Sie unter Verwendung CocoaPods

Fügen Sie den MediaPipeTasksVision-Pod mit dem folgenden Code in Podfile ein:

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

Falls Ihre App Einheitentestziele enthält, lesen Sie den Einrichtungsleitfaden für iOS: Weitere Informationen zur Einrichtung Dein Podfile.

Modell

Für die Aufgabe „MediaPipe Face Detector“ ist ein trainiertes Modell erforderlich, bei dieser Aufgabe. Weitere Informationen zu den verfügbaren trainierten Modellen für Gesichtserkennung, siehe Aufgabenübersicht Modelle .

Wählen Sie ein Modell aus, laden Sie es herunter und fügen Sie es mit Xcode Ihrem Projektverzeichnis hinzu. Eine Anleitung zum Hinzufügen von Dateien zu Ihrem Xcode-Projekt finden Sie unter Verwalten von Dateien und Ordner in Ihrem Xcode Projekt.

Verwenden Sie das Attribut BaseOptions.modelAssetPath, um den Pfad zum Modell anzugeben in deinem App Bundle. Ein Codebeispiel finden Sie im nächsten Abschnitt.

Aufgabe erstellen

Sie können die Gesichtserkennungsaufgabe erstellen, indem Sie einen seiner Initialisierer aufrufen. Die Der FaceDetector(options:)-Initialisierer akzeptiert Werte für die Konfiguration Optionen.

Wenn Sie keine Gesichtserkennung benötigen, die mit der benutzerdefinierten Konfiguration initialisiert wurde können Sie mit dem FaceDetector(modelPath:)-Initialisierer ein Gesichtserkennung mit den Standardoptionen. Weitere Informationen zur Konfiguration finden Sie unter Konfigurationsübersicht.

Bei der Aufgabe „Gesichtserkennung“ werden drei Eingabedatentypen unterstützt: Standbilder und Videodateien. und Live-Videostreams. Standardmäßig initialisiert FaceDetector(modelPath:) einen für Standbilder angelangt. Wenn Sie möchten, dass Ihre Aufgabe für die Verarbeitung von Videos initialisiert wird Dateien oder Live-Videostreams verwenden, geben Sie das Video mit FaceDetector(options:) an oder den Livestream-Laufmodus. Der Livestream-Modus erfordert außerdem die zusätzlichen faceDetectorLiveStreamDelegate, mit der die Gesichtserkennung, um Ergebnisse der Gesichtserkennung asynchron an den Bevollmächtigten zu senden.

Wählen Sie den Tab für Ihren Ausführungsmodus aus, um zu sehen, wie die Aufgabe erstellt wird und eine Inferenz ausführen.

Swift

Bild

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

Bild

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

Hinweis:Im Video- oder Livestream-Modus verwendet die Gesichtserkennung um zu verhindern, dass das Erkennungsmodell bei jedem Frame ausgelöst wird. die Latenz zu reduzieren.

Konfigurationsoptionen

Diese Aufgabe bietet die folgenden Konfigurationsoptionen für iOS-Apps:

Option Beschreibung Wertebereich Standardwert
runningMode Legt den Ausführungsmodus für die Task fest. Es gibt drei Modi:

IMAGE: Der Modus für Einzelbildeingaben.

VIDEO: Der Modus für decodierte Frames eines Videos.

LIVE_STREAM: Der Modus für einen Livestream mit Eingabe zum Beispiel von einer Kamera. In diesem Modus muss der resultListener wird aufgerufen, um einen Listener für den Empfang von Ergebnissen einzurichten asynchron programmiert.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
minDetectionConfidence Der minimale Konfidenzwert, mit dem die Gesichtserkennung als erfolgreich gilt. Float [0,1] 0.5
minSuppressionThreshold Der minimale Grenzwert für die nicht-maximale Unterdrückung, damit die Gesichtserkennung als überlappend gilt. Float [0,1] 0.3

Livestreamkonfiguration

Wenn der Laufmodus auf „Livestream“ eingestellt ist, benötigt die Gesichtserkennung die zusätzliche faceDetectorLiveStreamDelegate-Konfigurationsoption, mit der Gesichtserkennung verwenden, um die Erkennungsergebnisse asynchron zu senden. Der Bevollmächtigte implementiert die Methode faceDetector(_:didFinishDetection:timestampInMilliseconds:error:), den der Gesichtserkennung aufruft, nachdem die Ergebnisse der Gesichtserkennung verarbeitet wurden. für jeden Frame.

Optionsname Beschreibung Wertebereich Standardwert
faceDetectorLiveStreamDelegate Aktiviert die Gesichtserkennung, um Ergebnisse der Gesichtserkennung asynchron zu empfangen im Livestream-Modus. Die Klasse, deren Instanz auf diese Eigenschaft gesetzt ist, muss Implementieren der faceDetector(_:didFinishDetection:timestampInMilliseconds:error:) . Nicht zutreffend Nicht festgelegt

Daten vorbereiten

Konvertieren Sie das Eingabebild oder den Eingabe-Frame zuerst in ein MPImage-Objekt, an die Gesichtserkennung weiter. MPImage unterstützt verschiedene Arten von iOS-Bildern Formate und können sie in jedem ausgeführten Modus für die Inferenz verwenden. Weitere Informationen Informationen zu MPImage finden Sie in der MPImage-API

Wählen Sie je nach Anwendungsfall und Laufmodus ein iOS-Bildformat aus. Anwendung erforderlich.MPImage akzeptiert die UIImage, CVPixelBuffer und CMSampleBuffer iOS-Bildformate.

UIImage

Das Format UIImage eignet sich gut für die folgenden Laufmodi:

  • Bilder: Bilder aus einem App Bundle, einer Nutzergalerie oder einem Dateisystem, die wie folgt formatiert sind: UIImage-Bilder können in ein MPImage-Objekt konvertiert werden.

  • Videos: Verwenden Sie AVAssetImageGenerator. zum Extrahieren von Videoframes CGImage Format und konvertieren Sie sie in UIImage Bilder.

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

In diesem Beispiel wird ein MPImage mit dem Standardwert UIImage.Orientation.Up Ausrichtung. Sie können MPImage mit einer der unterstützten UIImage.Orientation Werte. Die Gesichtserkennung unterstützt keine gespiegelten Ausrichtungen wie .upMirrored, .downMirrored, .leftMirrored, .rightMirrored.

Weitere Informationen zu UIImage finden Sie unter UIImage Apple Developer Dokumentation.

CVPixelBuffer

Das Format CVPixelBuffer eignet sich gut für Anwendungen, die Frames generieren. und verwenden Sie das iOS-CoreImage Framework für die Verarbeitung.

Das Format CVPixelBuffer eignet sich gut für die folgenden Laufmodi:

  • Bilder: Apps, die nach einer Verarbeitung CVPixelBuffer Bilder generieren mit dem CoreImage-Framework von iOS an den Gesichtserkennungstest Bildlaufmodus.

  • Videos: Videoframes können für folgendes Format in das CVPixelBuffer-Format konvertiert werden: verarbeitet und dann im Videomodus an die Gesichtserkennung gesendet.

  • Livestream: Apps, die mit einer iOS-Kamera Frames generieren, werden möglicherweise zur Verarbeitung in das CVPixelBuffer-Format konvertiert, bevor sie an den Gesichtserkennung im Livestream-Modus.

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

Weitere Informationen zu CVPixelBuffer finden Sie in der CVPixelBuffer Apple-Dokumentation Entwickler*in Dokumentation.

CMSampleBuffer

Das Format CMSampleBuffer speichert Medienbeispiele eines einheitlichen Medientyps und ist eignet sich gut für den Livestream-Laufmodus. Live-Frames von iOS-Kameras asynchron im CMSampleBuffer-Format von iOS bereitgestellt 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];
    

Weitere Informationen zu CMSampleBuffer finden Sie im Artikel CMSampleBuffer Apple“. Entwickler*in Dokumentation.

Aufgabe ausführen

Verwenden Sie zum Ausführen der Gesichtserkennung die Methode detect() des zugewiesenen Laufmodus:

  • Standbild: detect(image:)
  • Video: detect(videoFrame:timestampInMilliseconds:)
  • Livestream: detectAsync(image:timestampInMilliseconds:)

Die Gesichtserkennung gibt die erkannten Gesichter im Eingabebild oder Frame zurück.

Die folgenden Codebeispiele zeigen einfache Beispiele für die Ausführung von Gesichtserkennung in verschiedene Laufmodi zu testen:

Swift

Bild

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

Bild

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

Das Codebeispiel für die Gesichtserkennung zeigt die Implementierungen dieser Modi. detect(image:), detect(videoFrame:timestampInMilliseconds:), und detectAsync(image:timestampInMilliseconds:). Der Beispielcode ermöglicht es, zwischen Verarbeitungsmodi wechseln, was für Sie möglicherweise nicht erforderlich ist Fall.

Wichtige Hinweise:

  • Im Video- oder Livestream-Modus müssen Sie außerdem die Zeitstempel des Eingabe-Frames für die Gesichtserkennungsaufgabe.

  • Im Bild- oder Videomodus blockiert die Aufgabe zur Gesichtserkennung die aktuellen Thread zu schreiben, bis die Verarbeitung des Eingabebilds oder -frames abgeschlossen ist. Bis Blockieren des aktuellen Threads vermeiden, Verarbeitung im Hintergrund ausführen Threads unter iOS verwenden Versand oder NSOperation Frameworks.

  • Im Livestream-Modus wird die Gesichtserkennung sofort zurückgegeben. und blockiert den aktuellen Thread nicht. Es ruft die Methode faceDetector(_:didFinishDetection:timestampInMilliseconds:error:)-Methode mit dem Gesichtserkennungsergebnis nach der Verarbeitung jedes Eingabeframes. Die Face Detector ruft diese Methode asynchron auf einer dedizierten seriellen Weiterleitungswarteschlange. Erstellen Sie zum Anzeigen der Ergebnisse auf der Benutzeroberfläche den Befehl nach der Verarbeitung der Ergebnisse an die Hauptwarteschlange. Wenn die detectAsync wird aufgerufen, wenn die Aufgabe Gesichtserkennung gerade mit der Verarbeitung ignoriert, ignoriert die Gesichtserkennung den neuen Eingabeframe.

Ergebnisse verarbeiten und anzeigen

Beim Ausführen einer Inferenz gibt die Gesichtserkennungsaufgabe ein FaceDetectorResult zurück. -Objekt, das die Begrenzungsrahmen für die erkannten Gesichter und eine Konfidenz enthält Punktzahl für jedes erkannte Gesicht.

Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:

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)

Die folgende Abbildung zeigt eine Visualisierung der Aufgabenausgabe:

Informationen für das Bild ohne Begrenzungsrahmen finden Sie im Originalbild.

Der Beispielcode für die Gesichtserkennung zeigt, wie die Ergebnisse angezeigt werden. Weitere Informationen finden Sie in der Codebeispiel.