Mit dem ML Kit können Sie Gesichter in Bildern und Videos erkennen.
Bevor Sie beginnen
- Wenn Sie Firebase noch nicht zu Ihrer App hinzugefügt haben, befolgen Sie dazu die Schritte im Leitfaden „Erste Schritte“ .
- Fügen Sie die ML-Kit-Bibliotheken in Ihre Pod-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, stellen Sie sicher, dass Sie Ihr Xcode-Projekt mit seinem.xcworkspace
öffnen. - Importieren Sie Firebase in Ihre App:
Schnell
import Firebase
Ziel c
@import Firebase;
Geben Sie Bildrichtlinien ein
Damit ML Kit Gesichter genau erkennen kann, müssen Eingabebilder Gesichter enthalten, die durch ausreichende Pixeldaten dargestellt werden. Im Allgemeinen sollte jedes Gesicht, das Sie in einem Bild erkennen möchten, mindestens 100 x 100 Pixel groß sein. Wenn Sie die Konturen von Gesichtern erkennen möchten, erfordert ML Kit eine Eingabe mit höherer Auflösung: Jedes Gesicht sollte mindestens 200 x 200 Pixel groß sein.
Wenn Sie Gesichter in einer Echtzeitanwendung erkennen, möchten Sie möglicherweise auch die Gesamtabmessungen der Eingabebilder berücksichtigen. Kleinere Bilder können schneller verarbeitet werden. Um die Latenz zu reduzieren, nehmen Sie Bilder daher mit niedrigeren Auflösungen auf (unter Berücksichtigung der oben genannten Genauigkeitsanforderungen) und stellen Sie sicher, dass das Gesicht des Motivs so viel Bild wie möglich einnimmt. Siehe auch Tipps zur Verbesserung der Echtzeitleistung .
Eine schlechte Bildschärfe kann die Genauigkeit beeinträchtigen. Wenn Sie keine akzeptablen Ergebnisse erhalten, bitten Sie den Benutzer, das Bild erneut aufzunehmen.
Die Ausrichtung eines Gesichts relativ zur Kamera kann sich auch darauf auswirken, welche Gesichtsmerkmale das ML Kit erkennt. Siehe Gesichtserkennungskonzepte .
1. Konfigurieren Sie den Gesichtsdetektor
Bevor Sie die Gesichtserkennung auf ein Bild anwenden und Standardeinstellungen des Gesichtsdetektors ändern möchten, geben Sie diese Einstellungen mit einemVisionFaceDetectorOptions
Objekt an. Sie können die folgenden Einstellungen ändern:Einstellungen | |
---|---|
performanceMode | fast (Standard) | accurate Bevorzugen Sie Geschwindigkeit oder Genauigkeit bei der Gesichtserkennung. |
landmarkMode | none (Standard) | all Ob versucht werden soll, die „Wahrzeichen“ im Gesicht – Augen, Ohren, Nase, Wangen, Mund – aller erkannten Gesichter zu erkennen. |
contourMode | none (Standard) | all Ob die Konturen von Gesichtszügen erkannt werden sollen. Konturen werden nur für das markanteste Gesicht in einem Bild erkannt. |
classificationMode | none (Standard) | all Ob Gesichter in Kategorien wie „lächelnd“ und „offene Augen“ eingeteilt werden sollen oder nicht. |
minFaceSize | CGFloat (Standard: 0.1 )Die Mindestgröße der zu erkennenden Gesichter im Verhältnis zum Bild. |
isTrackingEnabled | false (Standard) | true Ob Gesichtern eine ID zugewiesen werden soll oder nicht, mit der Gesichter über Bilder hinweg verfolgt werden können. Beachten Sie, dass bei aktivierter Konturerkennung nur ein Gesicht erkannt wird, sodass die Gesichtsverfolgung keine nützlichen Ergebnisse liefert. Aus diesem Grund und um die Erkennungsgeschwindigkeit zu verbessern, aktivieren Sie nicht sowohl die Konturerkennung als auch die Gesichtsverfolgung. |
Erstellen Sie beispielsweise ein VisionFaceDetectorOptions
Objekt wie in einem der folgenden Beispiele:
Schnell
// 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
Ziel 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. Führen Sie den Gesichtsdetektor aus
Um Gesichter in einem Bild zu erkennen, übergeben Sie das Bild alsUIImage
oder CMSampleBufferRef
an die Methode detect(in:)
von VisionFaceDetector
:- Holen Sie sich eine Instanz von
VisionFaceDetector
:Schnell
lazy var vision = Vision.vision() let faceDetector = vision.faceDetector(options: options)
Ziel c
FIRVision *vision = [FIRVision vision]; FIRVisionFaceDetector *faceDetector = [vision faceDetector]; // Or, to change the default settings: // FIRVisionFaceDetector *faceDetector = // [vision faceDetectorWithOptions:options];
Erstellen Sie ein
VisionImage
Objekt mit einemUIImage
oder einemCMSampleBufferRef
.So verwenden Sie ein
UIImage
:- Drehen Sie das Bild bei Bedarf so, dass seine
imageOrientation
Eigenschaft.up
hat. - Erstellen Sie ein
VisionImage
Objekt mit dem korrekt gedrehtenUIImage
. Geben Sie keine Rotationsmetadaten an – der Standardwert.topLeft
muss verwendet werden.Schnell
let image = VisionImage(image: uiImage)
Ziel c
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
So verwenden Sie ein
CMSampleBufferRef
:Erstellen Sie ein
VisionImageMetadata
Objekt, das die Ausrichtung der imCMSampleBufferRef
Puffer enthaltenen Bilddaten angibt.So erhalten Sie die Bildausrichtung:
Schnell
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 } }
Ziel 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:
Schnell
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Ziel 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];
- Erstellen Sie ein
VisionImage
Objekt mit demCMSampleBufferRef
-Objekt und den Rotationsmetadaten:Schnell
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Ziel c
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
- Drehen Sie das Bild bei Bedarf so, dass seine
- Übergeben Sie dann das Bild an die Methode
detect(in:)
:Schnell
faceDetector.process(visionImage) { faces, error in guard error == nil, let faces = faces, !faces.isEmpty else { // ... return } // Faces detected // ... }
Ziel c
[faceDetector detectInImage:image completion:^(NSArray<FIRVisionFace *> *faces, NSError *error) { if (error != nil) { return; } else if (faces != nil) { // Recognized faces } }];
3. Erhalten Sie Informationen über erkannte Gesichter
Wenn der Gesichtserkennungsvorgang erfolgreich ist, übergibt der Gesichtsdetektor ein Array vonVisionFace
Objekten an den Abschlusshandler. Jedes VisionFace
Objekt stellt ein Gesicht dar, das im Bild erkannt wurde. Für jedes Gesicht können Sie seine Grenzkoordinaten im Eingabebild sowie alle anderen Informationen abrufen, für deren Suche Sie den Gesichtsdetektor konfiguriert haben. Zum Beispiel: Schnell
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 } }
Ziel 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, erhalten Sie eine Liste mit Punkten für jedes erkannte Gesichtsmerkmal. Diese Punkte stellen die Form des Features dar. Einzelheiten zur Darstellung von Konturen finden Sie in der Übersicht über Gesichtserkennungskonzepte .
Das folgende Bild zeigt, wie diese Punkte einem Gesicht zugeordnet werden (zum Vergrößern auf das Bild klicken):
Gesichtserkennung in Echtzeit
Wenn Sie die Gesichtserkennung in einer Echtzeitanwendung verwenden möchten, befolgen Sie diese Richtlinien, um die besten Bildraten zu erzielen:
Konfigurieren Sie den Gesichtsdetektor so, dass er entweder die Gesichtskonturerkennung oder die Klassifizierung und Erkennung von Orientierungspunkten verwendet, jedoch nicht beides:
Konturerkennung
Erkennung von Wahrzeichen
Einstufung
Erkennung und Klassifizierung von Wahrzeichen
Konturerkennung und Landmarkenerkennung
Konturerkennung und -klassifizierung
Konturerkennung, Landmarkenerkennung und KlassifizierungAktivieren Sie
fast
(standardmäßig aktiviert).Erwägen Sie die Aufnahme von Bildern mit einer niedrigeren Auflösung. Beachten Sie jedoch auch die Bildabmessungsanforderungen dieser API.
- Gasrufe an den Detektor. Wenn ein neues Videobild verfügbar wird, während der Detektor läuft, löschen Sie das Bild.
- Wenn Sie die Ausgabe des Detektors verwenden, um Grafiken auf dem Eingabebild zu überlagern, rufen Sie zunächst das Ergebnis vom ML Kit ab und rendern Sie dann das Bild und überlagern Sie es in einem einzigen Schritt. Auf diese Weise rendern Sie für jeden Eingaberahmen nur einmal auf der Anzeigeoberfläche. Ein Beispiel finden Sie in den Klassen „previewOverlayView“ und „FIRDetectionOverlayView“ in der Showcase-Beispiel-App.