Vous pouvez utiliser ML Kit pour détecter des visages dans des images et des vidéos.
Essayer
- Testez l'application exemple pour : consultez un exemple d'utilisation de cette API.
- Essayez vous-même le code avec le atelier de programmation.
Avant de commencer
- Incluez les pods ML Kit suivants dans votre Podfile:
pod 'GoogleMLKit/FaceDetection', '15.5.0'
- Après avoir installé ou mis à jour les pods de votre projet, ouvrez votre projet Xcode à l'aide de son
.xcworkspace
ML Kit est compatible avec Xcode 12.4 ou version ultérieure.
Consignes pour les images d'entrée
Pour la reconnaissance faciale, vous devez utiliser une image d'au moins 480 x 360 pixels. Pour que ML Kit détecte les visages avec précision, les images d'entrée doivent contenir des visages représentées par suffisamment de données de pixels. En général, chaque visage que vous souhaitez à détecter dans une image doivent être d'au moins 100 x 100 pixels. Si vous souhaitez détecter les contours des visages, ML Kit nécessite une résolution plus élevée: chaque visage elle doit faire au moins 200 x 200 pixels.
Si vous détectez des visages dans une application en temps réel, vous pouvez également pour prendre en compte les dimensions globales des images d'entrée. Les images plus petites peuvent être sont traitées plus rapidement, ce qui permet de réduire la latence, de capturer des images à des résolutions inférieures, gardez à l'esprit les exigences de précision ci-dessus et assurez-vous que le visage du sujet occupe le plus d'espace possible dans l'image. Voir aussi conseils pour améliorer les performances en temps réel.
Une mauvaise mise au point de l'image peut également nuire à sa précision. Si vous n'obtenez pas dans les résultats, demandez à l'utilisateur de capturer à nouveau l'image.
L'orientation d'un visage par rapport à l'appareil photo peut aussi avoir une incidence sur le comportement détecte les caractéristiques détectées par ML Kit. Voir Concepts de détection de visages.
1. Configurer le détecteur de visages
Avant d'appliquer la détection des visages à une image, vous pouvez modifier les paramètres paramètres par défaut du détecteur de visages, définissez ces paramètres à l'aide d'une objetFaceDetectorOptions
. Vous pouvez modifier
les paramètres suivants:
Paramètres | |
---|---|
performanceMode |
fast (par défaut) | accurate
Privilégiez la vitesse ou la précision lors de la détection des visages. |
landmarkMode |
none (par défaut) | all
Essayer de détecter ou non les "points de repère" du visage (yeux, les oreilles, le nez, les joues, la bouche... de tous les visages détectés. |
contourMode |
none (par défaut) | all
Indique s'il faut détecter les contours des traits du visage. Les contours sont détecté uniquement pour le visage le plus proéminent d'une image. |
classificationMode |
none (par défaut) | all
classer les visages en catégories telles que "souriant" ; et "yeux ouverts". |
minFaceSize |
CGFloat (par défaut: 0.1 )
Définit la plus petite taille de visage souhaitée, exprimée en tant que ratio des la largeur de la tête par rapport à celle de l'image. |
isTrackingEnabled |
false (par défaut) | true
Permet d'attribuer ou non aux visages un ID qui peut être utilisé pour suivre visages sur les images. Notez que lorsque la détection des contours est activée, un seul visage est détecté, le suivi des visages ne produit donc pas de résultats utiles. Pour cette et pour améliorer la vitesse de détection, n'activez pas les deux et le suivi des visages. |
Par exemple, créez un FaceDetectorOptions
comme dans l'un des exemples suivants:
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. Préparer l'image d'entrée
Pour détecter les visages sur une image, transmettez l'image en tant queUIImage
ou
CMSampleBufferRef
à FaceDetector
à l'aide de la méthode
Méthode process(_:completion:)
ou results(in:)
:
Créez un objet VisionImage
à l'aide d'un UIImage
ou d'un
CMSampleBuffer
Si vous utilisez un UIImage
, procédez comme suit:
- Créez un objet
VisionImage
avecUIImage
. Veillez à spécifier le bon.orientation
.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Si vous utilisez un CMSampleBuffer
, procédez comme suit:
-
Spécifiez l'orientation des données d'image contenues dans le
CMSampleBuffer
Pour obtenir l'orientation de l'image:
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; } }
- Créez un objet
VisionImage
à l'aide de la méthode ObjetCMSampleBuffer
et orientation: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. Obtenir une instance de FaceDetector
Obtenez une instance de FaceDetector
:
Swift
let faceDetector = FaceDetector.faceDetector(options: options)
Objective-C
MLKFaceDetector *faceDetector = [MLKFaceDetector faceDetectorWithOptions:options];
4. Traiter l'image
Transmettez ensuite l'image à la méthodeprocess()
:
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. Obtenir des informations sur les visages détectés
Si l'opération de détection de visages aboutit, le détecteur de visages transmet un réseau d'objetsFace
au gestionnaire d'achèvement. Chaque
L'objet Face
représente un visage détecté dans l'image. Pour
chaque face, vous pouvez obtenir ses coordonnées de délimitation dans l'image d'entrée, ainsi que
toute autre information que vous avez configuré le détecteur de visages. Exemple :
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; } }
Exemple de contours d'un visage
Lorsque la détection des contours du visage est activée, vous obtenez une liste de points pour chaque caractéristique du visage qui a été détectée. Ces points représentent la forme . Voir Visage Concepts de détection pour en savoir plus sur la façon dont les contours représentées.
L'image suivante montre comment ces points sont mappés à une face. Cliquez sur l'icône pour l'agrandir:
Détection des visages en temps réel
Si vous souhaitez utiliser la détection de visages dans une application en temps réel, suivez ces pour obtenir des fréquences d'images optimales:
Configurez le détecteur de visages pour utiliser la détection ou la classification du contour du visage et la détection de points de repère, mais pas les deux:
Détection de contours
Détection de points de repère
Classification
Détection et classification des points de repère
Détection de contours et de points de repère
Détection et classification de contours
Détection de contours, détection de points de repère et classificationActivez le mode
fast
(activé par défaut).Envisagez de capturer des images à une résolution plus faible. Cependant, gardez aussi à l'esprit aux exigences de cette API concernant les dimensions de l'image.
- Pour traiter les images vidéo, utilisez l'API synchrone
results(in:)
du détecteur. Appeler cette méthode à partir deAVCaptureVideoDataOutputSampleBufferDelegate
<ph type="x-smartling-placeholder"></ph>captureOutput(_, didOutput:from:)
pour obtenir les résultats d'une vidéo donnée de manière synchrone. cadre. Conserver <ph type="x-smartling-placeholder"></ph> deAVCaptureVideoDataOutput
alwaysDiscardsLateVideoFrames
en tant quetrue
afin de limiter les appels au détecteur. Si un nouveau l'image vidéo devient disponible pendant l'exécution du détecteur, elle est ignorée. - Si vous utilisez la sortie du détecteur pour superposer des graphiques sur l'image d'entrée, récupérez d'abord le résultat à partir de ML Kit, puis effectuez le rendu de l'image. et les superposer en une seule étape. Cela vous permet d'afficher sur la surface d'affichage une seule fois pour chaque trame d'entrée traitée. Affichez la vue updatePreviewOverlayViewWithLastFrame. dans l'exemple de démarrage rapide de ML Kit.