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.
- Testen Sie den Code mit dem Codelab erhalten.
Hinweis
- Fügen Sie die folgenden ML Kit-Pods in Ihre Podfile-Datei ein:
pod 'GoogleMLKit/FaceDetection', '15.5.0'
- 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, 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 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 einemFaceDetectorOptions
-Objekt. Sie können
die folgenden Einstellungen:
Einstellungen | |
---|---|
performanceMode |
fast (Standardeinstellung) | accurate
Bevorzugen Sie bei der Gesichtswiedererkennung Geschwindigkeit oder Genauigkeit. |
landmarkMode |
none (Standardeinstellung) | all
Ob es um die Erkennung von Gesichtsmerkmalen – Augen, Ohren, Nase, Wangen, Mund – aller erkannten Gesichter. |
contourMode |
none (Standardeinstellung) | 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 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 (Standardeinstellung) | 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 alsUIImage
- 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 derUIImage
. 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 derCMSampleBuffer
-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 Methodeprocess()
:
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 vonFace
-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 Informationen, 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 . Gesicht anzeigen Erkennungskonzepte mit Details zur Konturendarstellung repräsentiert werden.
In der folgenden Abbildung sehen Sie, wie diese Punkte einem Gesicht zugeordnet sind. Klicken Sie auf das Bild 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 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 Klassifizierungfast
-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 demAVCaptureVideoDataOutputSampleBufferDelegate
<ph type="x-smartling-placeholder"></ph>captureOutput(_, didOutput:from:)
-Funktion, um synchron Ergebnisse aus dem angegebenen Video zu erhalten Frame. beibehalten vonAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
alstrue
, 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.