Gesichter mit ML Kit unter iOS erkennen

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

Hinweis

  1. Wenn Sie Ihrer App noch nicht Firebase hinzugefügt haben, folgen Sie der im Startleitfaden.
  2. Fügen Sie die ML Kit-Bibliotheken in Ihre Podfile-Datei ein:
    pod 'Firebase/MLVision', '6.25.0'
    # If you want to detect face contours (landmark detection and classification
    # don't require this additional model):
    pod 'Firebase/MLVisionFaceModel', '6.25.0'
    
    Nachdem Sie die Pods Ihres Projekts installiert oder aktualisiert haben, öffnen Sie unbedingt Ihren Xcode mithilfe der .xcworkspace zu erstellen.
  3. Importieren Sie Firebase in Ihre App:

    Swift

    import Firebase

    Objective-C

    @import Firebase;

Richtlinien für Eingabebilder

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 daher mit geringerer Auflösung auf. (unter Berücksichtigung der 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 zu niedriger Bildfokus kann die Genauigkeit beeinträchtigen. Wenn Sie keine akzeptablen Ergebnisse erhalten, versuchen Sie, das Bild erneut aufzunehmen.

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 VisionFaceDetectorOptions-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 (Standardeinstellung) | all

ob Gesichter in Kategorien wie "Lächeln", und „Augen geöffnet“.

minFaceSize CGFloat (Standardeinstellung: 0.1)

Die Mindestgröße der zu erkennenden Gesichter im Verhältnis zum Bild.

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 ein VisionFaceDetectorOptions-Objekt wie in einem der folgenden Beispiele:

Swift

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

// Real-time contour detection of multiple faces
let options = VisionFaceDetectorOptions()
options.contourMode = .all

Objective-C

// High-accuracy landmark detection and face classification
FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init];
options.performanceMode = FIRVisionFaceDetectorPerformanceModeAccurate;
options.landmarkMode = FIRVisionFaceDetectorLandmarkModeAll;
options.classificationMode = FIRVisionFaceDetectorClassificationModeAll;

// Real-time contour detection of multiple faces
FIRVisionFaceDetectorOptions *options = [[FIRVisionFaceDetectorOptions alloc] init];
options.contourMode = FIRVisionFaceDetectorContourModeAll;

2. Gesichtserkennung ausführen

Um Gesichter in einem Bild zu erkennen, übergeben Sie das Bild als UIImage- oder CMSampleBufferRef zu detect(in:) der VisionFaceDetector :

  1. Rufen Sie eine VisionFaceDetector-Instanz ab:

    Swift

    lazy var vision = Vision.vision()
    
    let faceDetector = vision.faceDetector(options: options)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionFaceDetector *faceDetector = [vision faceDetector];
    // Or, to change the default settings:
    // FIRVisionFaceDetector *faceDetector =
    //     [vision faceDetectorWithOptions:options];
  2. Erstellen Sie ein VisionImage-Objekt mithilfe von UIImage oder einem CMSampleBufferRef

    So verwendest du UIImage:

    1. Drehen Sie das Bild gegebenenfalls so, dass es imageOrientation Property ist .up.
    2. Erstellen Sie ein VisionImage-Objekt mithilfe der korrekt gedrehten UIImage. Geben Sie keine Rotationsmetadaten an. Dies ist die Standardeinstellung. Wert .topLeft muss verwendet werden.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    So verwendest du CMSampleBufferRef:

    1. Erstellen Sie ein VisionImageMetadata-Objekt, das die Ausrichtung der Bilddaten im CMSampleBufferRef-Zwischenspeicher.

      So ermitteln Sie die Bildausrichtung:

      Swift

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Objective-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Erstellen Sie dann das Metadatenobjekt:

      Swift

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Objective-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Erstellen Sie ein VisionImage-Objekt mithilfe der CMSampleBufferRef-Objekt und die Rotationsmetadaten:

      Swift

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Übergeben Sie dann das Bild an die Methode detect(in:):

    Swift

    faceDetector.process(visionImage) { faces, error in
      guard error == nil, let faces = faces, !faces.isEmpty else {
        // ...
        return
      }
    
      // Faces detected
      // ...
    }

    Objective-C

    [faceDetector detectInImage:image
                     completion:^(NSArray<FIRVisionFace *> *faces,
                                  NSError *error) {
      if (error != nil) {
        return;
      } else if (faces != nil) {
        // Recognized faces
      }
    }];

3. Informationen zu erkannten Gesichtern erhalten

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

Swift

for face in faces {
  let frame = face.frame
  if face.hasHeadEulerAngleY {
    let rotY = face.headEulerAngleY  // Head is rotated to the right rotY degrees
  }
  if face.hasHeadEulerAngleZ {
    let rotZ = face.headEulerAngleZ  // Head is rotated upward 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 (FIRVisionFace *face in faces) {
  // Boundaries of face in image
  CGRect frame = face.frame;

  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):
  FIRVisionFaceLandmark *leftEar = [face landmarkOfType:FIRFaceLandmarkTypeLeftEar];
  if (leftEar != nil) {
    FIRVisionPoint *leftEarPosition = leftEar.position;
  }

  // If contour detection was enabled:
  FIRVisionFaceContour *upperLipBottomContour = [face contourOfType:FIRFaceContourTypeUpperLipBottom];
  if (upperLipBottomContour != nil) {
    NSArray<FIRVisionPoint *> *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 . Weitere Informationen zur Darstellung von Konturen finden Sie unter Konzepte der Gesichtserkennung.

In der folgenden Abbildung sehen Sie, wie diese Punkte einem Gesicht zugeordnet werden (klicken Sie auf das Bild zum Vergrößern):

Gesichtserkennung in Echtzeit

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

  • Konfigurieren Sie den Gesichtserkennungsalgorithmus so, dass entweder die Gesichtskonturerkennung oder die Klassifizierung und Sehenswürdigkeitenerkennung verwendet wird, aber nicht beide:

    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).

  • Sie können auch Bilder mit niedrigerer Auflösung aufnehmen. Beachten Sie jedoch auch, Anforderungen an die Bildabmessungen dieser API.

  • Drosselung von Aufrufen an den Detektor. Wenn ein neuer Videoframe wenn der Detektor ausgeführt wird, lassen Sie den Frame weg.
  • 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 für jeden Eingabe-Frame nur einmal. Weitere Informationen finden Sie unter previewOverlayView. und FIRDetectionOverlayView in der Showcase-Beispiel-App als Beispiel.