Gesichter mit ML Kit für iOS erkennen

Sie können ML Kit verwenden, um Gesichter in Bildern und Videos zu erkennen.

Jetzt ausprobieren

  • Probieren Sie die Beispiel-App aus, um sehen Sie sich ein Anwendungsbeispiel für diese API an.
  • Probieren Sie den Code mit der Codelab erhalten.

Hinweis

  1. Fügen Sie die folgenden ML Kit-Pods in Ihre Podfile-Datei ein:
    pod 'GoogleMLKit/FaceDetection', '3.2.0'
    
  2. Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, öffnen Sie Ihr Xcode-Projekt mit dem .xcworkspace ML Kit wird ab Xcode-Version 12.4 unterstützt.

Richtlinien für Eingabebilder

Für die Gesichtserkennung sollten Sie ein Bild mit mindestens 480 x 360 Pixeln verwenden. Damit ML Kit Gesichter richtig erkennen kann, müssen die eingegebenen Bilder Gesichter enthalten die durch ausreichende Pixeldaten dargestellt werden. Jedes Gesicht, das Sie sehen möchten, die in einem Bild erkannt werden sollen, mindestens 100 × 100 Pixel groß sein. Wenn Sie herausfinden möchten, Konturen von Flächen erfordert ML Kit eine Eingabe mit höherer Auflösung: jede Fläche sollte mindestens 200 x 200 Pixel groß sein.

Wenn Sie Gesichter in einer Echtzeitanwendung erkennen, um die Gesamtabmessungen der eingegebenen Bilder zu berücksichtigen. Kleinere Bilder können werden schneller verarbeitet. Um die Latenz zu verringern, nehmen Sie Bilder mit geringerer Auflösung auf, behalten Sie berücksichtigen Sie die oben genannten Anforderungen an die Genauigkeit und stellen Sie sicher, dass das Gesicht der Person so weit wie möglich einnimmt. Siehe auch Tipps zum Verbessern der Leistung in Echtzeit

Ein schlechter Bildfokus kann auch die Genauigkeit beeinträchtigen. Wenn Sie keine akzeptablen erhalten, bitten Sie den Nutzer, das Bild erneut zu erfassen.

Auch die Ausrichtung eines Gesichts relativ zur Kamera kann sich darauf auswirken, welche Gesichtszüge Funktionen, die ML Kit erkennt. Weitere Informationen finden Sie unter Konzepte der Gesichtserkennung.

1. Gesichtserkennung konfigurieren

Bevor Sie die Gesichtserkennung auf ein Bild anwenden, wenn Sie eine der Gesichtserkennung verwenden, legen Sie diese Einstellungen mit einem FaceDetectorOptions-Objekt. Sie können die folgenden Einstellungen:

Einstellungen
performanceMode fast (Standard) | accurate

Bevorzugen Sie bei der Gesichtswiedererkennung Geschwindigkeit oder Genauigkeit.

landmarkMode none (Standard) | all

Ob es um die Erkennung von Gesichtsmerkmalen – Augen, Ohren, Nase, Wangen, Mund – aller erkannten Gesichter.

contourMode none (Standard) | all

Gibt an, ob die Konturen von Gesichtszügen erkannt werden sollen. Konturen sind nur für das auffälligste Gesicht im Bild erkannt wurde.

classificationMode none (Standard) | all

Ob Gesichter in Kategorien eingeteilt werden sollen, z. B. „Lächeln“ und „Augen geöffnet“.

minFaceSize CGFloat (Standardeinstellung: 0.1)

Legt die kleinste gewünschte Gesichtsgröße als Verhältnis des von der Kopfbreite zur Breite des Bilds.

isTrackingEnabled false (Standard) | true

Gibt an, ob Gesichtern eine ID zugewiesen werden soll, anhand derer die Gesichter in unterschiedlichen Bildern.

Beachten Sie, dass bei aktivierter Konturerkennung nur eine Fläche erkannt. Die Gesichtserkennung liefert daher keine hilfreichen Ergebnisse. In diesem Fall Um die Erkennungsgeschwindigkeit zu verbessern, sollten Sie nicht beide Gesichtserkennung und Gesichtserkennung.

Erstellen Sie beispielsweise einen FaceDetectorOptions. wie in den folgenden Beispielen angegeben:

Swift

// High-accuracy landmark detection and face classification
let options = FaceDetectorOptions()
options.performanceMode = .accurate
options.landmarkMode = .all
options.classificationMode = .all

// Real-time contour detection of multiple faces
// options.contourMode = .all

Objective-C

// High-accuracy landmark detection and face classification
MLKFaceDetectorOptions *options = [[MLKFaceDetectorOptions alloc] init];
options.performanceMode = MLKFaceDetectorPerformanceModeAccurate;
options.landmarkMode = MLKFaceDetectorLandmarkModeAll;
options.classificationMode = MLKFaceDetectorClassificationModeAll;

// Real-time contour detection of multiple faces
// options.contourMode = MLKFaceDetectorContourModeAll;

2. Eingabebild vorbereiten

Um Gesichter in einem Bild zu erkennen, übergeben Sie das Bild als UIImage- oder CMSampleBufferRef zu FaceDetector über die process(_:completion:)- oder results(in:)-Methode:

Erstellen Sie ein VisionImage-Objekt mithilfe von UIImage oder einem CMSampleBuffer

Wenn du ein UIImage verwendest, gehe so vor:

  • Erstellen Sie ein VisionImage-Objekt mit der UIImage. Geben Sie die richtige .orientation an.

    Swift

    let image = VisionImage(image: UIImage)
    visionImage.orientation = image.imageOrientation

    Objective-C

    MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];
    visionImage.orientation = image.imageOrientation;

Wenn du ein CMSampleBuffer verwendest, gehe so vor:

  • Geben Sie die Ausrichtung der Bilddaten an, die in der CMSampleBuffer

    So ermitteln Sie die Bildausrichtung:

    Swift

    func imageOrientation(
      deviceOrientation: UIDeviceOrientation,
      cameraPosition: AVCaptureDevice.Position
    ) -> UIImage.Orientation {
      switch deviceOrientation {
      case .portrait:
        return cameraPosition == .front ? .leftMirrored : .right
      case .landscapeLeft:
        return cameraPosition == .front ? .downMirrored : .up
      case .portraitUpsideDown:
        return cameraPosition == .front ? .rightMirrored : .left
      case .landscapeRight:
        return cameraPosition == .front ? .upMirrored : .down
      case .faceDown, .faceUp, .unknown:
        return .up
      }
    }
          

    Objective-C

    - (UIImageOrientation)
      imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                             cameraPosition:(AVCaptureDevicePosition)cameraPosition {
      switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored
                                                                : UIImageOrientationRight;
    
        case UIDeviceOrientationLandscapeLeft:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored
                                                                : UIImageOrientationUp;
        case UIDeviceOrientationPortraitUpsideDown:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored
                                                                : UIImageOrientationLeft;
        case UIDeviceOrientationLandscapeRight:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored
                                                                : UIImageOrientationDown;
        case UIDeviceOrientationUnknown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationFaceDown:
          return UIImageOrientationUp;
      }
    }
          
  • Erstellen Sie ein VisionImage-Objekt mithilfe der CMSampleBuffer-Objekt und Ausrichtung:

    Swift

    let image = VisionImage(buffer: sampleBuffer)
    image.orientation = imageOrientation(
      deviceOrientation: UIDevice.current.orientation,
      cameraPosition: cameraPosition)

    Objective-C

     MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer];
     image.orientation =
       [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                    cameraPosition:cameraPosition];

3. FaceDetector-Instanz abrufen

Rufen Sie eine FaceDetector-Instanz ab:

Swift

let faceDetector = FaceDetector.faceDetector(options: options)

Objective-C

MLKFaceDetector *faceDetector = [MLKFaceDetector faceDetectorWithOptions:options];
      

4. Bild verarbeiten

Übergeben Sie dann das Bild an die Methode process():

Swift

weak var weakSelf = self
faceDetector.process(visionImage) { faces, error in
  guard let strongSelf = weakSelf else {
    print("Self is nil!")
    return
  }
  guard error == nil, let faces = faces, !faces.isEmpty else {
    // ...
    return
  }

  // Faces detected
  // ...
}

Objective-C

[faceDetector processImage:image
                completion:^(NSArray<MLKFace *> *faces,
                             NSError *error) {
  if (error != nil) {
    return;
  }
  if (faces.count > 0) {
    // Recognized faces
  }
}];

5. Informationen zu erkannten Gesichtern erhalten

Wenn die Gesichtserkennung erfolgreich ist, übergibt der Gesichtserkennung ein Array von Face-Objekten an den Abschluss-Handler. Jedes Ein Face-Objekt repräsentiert ein Gesicht, das im Bild erkannt wurde. Für können Sie die Begrenzungskoordinaten im Eingabebild abrufen, alle anderen Daten, die Sie mit dem Gesichtserkennung gefunden haben. Beispiel:

Swift

for face in faces {
  let frame = face.frame
  if face.hasHeadEulerAngleX {
    let rotX = face.headEulerAngleX  // Head is rotated to the uptoward rotX degrees
  }
  if face.hasHeadEulerAngleY {
    let rotY = face.headEulerAngleY  // Head is rotated to the right rotY degrees
  }
  if face.hasHeadEulerAngleZ {
    let rotZ = face.headEulerAngleZ  // Head is tilted sideways rotZ degrees
  }

  // If landmark detection was enabled (mouth, ears, eyes, cheeks, and
  // nose available):
  if let leftEye = face.landmark(ofType: .leftEye) {
    let leftEyePosition = leftEye.position
  }

  // If contour detection was enabled:
  if let leftEyeContour = face.contour(ofType: .leftEye) {
    let leftEyePoints = leftEyeContour.points
  }
  if let upperLipBottomContour = face.contour(ofType: .upperLipBottom) {
    let upperLipBottomPoints = upperLipBottomContour.points
  }

  // If classification was enabled:
  if face.hasSmilingProbability {
    let smileProb = face.smilingProbability
  }
  if face.hasRightEyeOpenProbability {
    let rightEyeOpenProb = face.rightEyeOpenProbability
  }

  // If face tracking was enabled:
  if face.hasTrackingID {
    let trackingId = face.trackingID
  }
}

Objective-C

for (MLKFace *face in faces) {
  // Boundaries of face in image
  CGRect frame = face.frame;
  if (face.hasHeadEulerAngleX) {
    CGFloat rotX = face.headEulerAngleX;  // Head is rotated to the upward rotX degrees
  }
  if (face.hasHeadEulerAngleY) {
    CGFloat rotY = face.headEulerAngleY;  // Head is rotated to the right rotY degrees
  }
  if (face.hasHeadEulerAngleZ) {
    CGFloat rotZ = face.headEulerAngleZ;  // Head is tilted sideways rotZ degrees
  }

  // If landmark detection was enabled (mouth, ears, eyes, cheeks, and
  // nose available):
  MLKFaceLandmark *leftEar = [face landmarkOfType:FIRFaceLandmarkTypeLeftEar];
  if (leftEar != nil) {
    MLKVisionPoint *leftEarPosition = leftEar.position;
  }

  // If contour detection was enabled:
  MLKFaceContour *upperLipBottomContour = [face contourOfType:FIRFaceContourTypeUpperLipBottom];
  if (upperLipBottomContour != nil) {
    NSArray<MLKVisionPoint *> *upperLipBottomPoints = upperLipBottomContour.points;
    if (upperLipBottomPoints.count > 0) {
      NSLog("Detected the bottom contour of the subject's upper lip.")
    }
  }

  // If classification was enabled:
  if (face.hasSmilingProbability) {
    CGFloat smileProb = face.smilingProbability;
  }
  if (face.hasRightEyeOpenProbability) {
    CGFloat rightEyeOpenProb = face.rightEyeOpenProbability;
  }

  // If face tracking was enabled:
  if (face.hasTrackingID) {
    NSInteger trackingID = face.trackingID;
  }
}

Beispiel für Gesichtskonturen

Wenn Sie die Gesichtskonturerkennung aktiviert haben, wird eine Liste mit Punkten jedes erkannte Gesichtsmerkmal. Diese Punkte stellen die Form des . Gesichtserkennung Erkennungskonzepte mit weiteren Informationen zu Konturen repräsentiert werden.

In der folgenden Abbildung sehen Sie, wie diese Punkte einem Gesicht zugeordnet sind. Klicken Sie auf das Bild vergrößern:

Beispiel für ein Mesh-Netzwerk mit Gesichtskonturenerkennung

Gesichtserkennung in Echtzeit

Wenn Sie die Gesichtserkennung in einer Echtzeitanwendung verwenden möchten, gehen Sie so vor: um optimale Framerates zu erzielen:

  • Konfigurieren Sie die Gesichtserkennung so, dass sie entweder Gesichtskonturerkennung oder -klassifizierung und Erkennung von Sehenswürdigkeiten, aber nicht beides:

    Konturerkennung
    Erkennung von Sehenswürdigkeiten
    Klassifizierung
    Erkennung und Klassifizierung von Sehenswürdigkeiten
    Konturerkennung und Erkennung von Sehenswürdigkeiten
    Konturerkennung und -klassifizierung
    Konturerkennung, Erkennung von Sehenswürdigkeiten und Klassifizierung

  • fast-Modus aktivieren (standardmäßig aktiviert).

  • Nehmen Sie Bilder mit einer niedrigeren Auflösung auf. Denken Sie jedoch auch daran, Anforderungen an die Bildabmessungen dieser API.

  • Verwende zum Verarbeiten von Videoframes die synchrone results(in:) API des Detektors. Anruf diese Methode aus dem AVCaptureVideoDataOutputSampleBufferDelegate <ph type="x-smartling-placeholder"></ph> captureOutput(_, didOutput:from:)-Funktion, um synchron Ergebnisse aus dem angegebenen Video abzurufen Frame. beibehalten von AVCaptureVideoDataOutput alwaysDiscardsLateVideoFrames als true, um Aufrufe an den Detektor zu drosseln. Wenn ein neuer verfügbar wird, während der Detektor läuft, wird er verworfen.
  • Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken Eingabebild, rufen Sie zuerst das Ergebnis aus ML Kit ab und rendern Sie das Bild in einem Schritt übereinanderlegen. Dadurch rendern Sie auf der Anzeigeoberfläche pro verarbeitetem Eingabeframe nur einmal. Weitere Informationen finden Sie im Abschnitt updatePreviewOverlayViewWithLastFrame. im Beispiel der ML Kit-Kurzanleitung finden Sie ein Beispiel.