Une introduction à la détection des visages sur Android

Introduite avec les bibliothèques Vision dans Play Services 8.1, la détection de visage vous permet en tant que développeur d’analyser facilement une vidéo ou une image pour localiser des visages humains. Une fois que vous avez une liste de visages détectés sur une image, vous pouvez collecter des informations sur chaque visage, telles que l’orientation, la probabilité de sourire, si quelqu’un a les yeux ouverts ou fermés et des points de repère spécifiques sur son visage.

Ces informations peuvent être utiles pour plusieurs applications, telles qu’une application de caméra qui prend automatiquement une photo lorsque tout le monde dans le cadre sourit les yeux ouverts, ou pour augmenter les images avec des effets idiots, tels que des cornes de licorne. Il est important de noter que la détection de visage est ne pas la reconnaissance faciale. Bien que des informations puissent être collectées sur un visage, ces informations ne sont pas utilisées par la bibliothèque Vision pour déterminer si deux visages proviennent de la même personne.

Ce didacticiel utilisera une image fixe pour exécuter l’API de détection de visage et collecter des informations sur les personnes sur la photo, tout en illustrant ces informations avec des graphiques superposés. Tout le code de ce tutoriel peut être trouvé sur GitHub.

Exemple d'effet idiot ajoutant une corne de licorne à un visage

1. Configuration du projet

Pour ajouter la bibliothèque Vision à votre projet, vous devez importer Play Services 8.1 ou version ultérieure dans votre projet. Ce didacticiel importe uniquement la bibliothèque Play Services Vision. Ouvert tes projets build.gradle fichier et ajoutez la ligne de compilation suivante au dependencies nœud.

Une fois que vous avez inclus les services Play dans votre projet, vous pouvez fermer build.gradle déposer et ouvrir AndroidManifest.xml. Vous devez ajouter un meta-data élément définissant la dépendance de face sous le application nœud de votre manifeste. Cela permet à la bibliothèque Vision de savoir que vous prévoyez de détecter les visages dans votre application.

Une fois la configuration terminée AndroidManifest.xml, vous pouvez continuer et le fermer. Ensuite, vous devez créer une nouvelle classe nommée FaceOverlayView.java. Cette classe s’étend View et contient la logique de détection des visages dans le projet, affichant le bitmap qui a été analysé et dessinant au-dessus de l’image afin d’illustrer les points.

Pour l’instant, commencez par ajouter les variables membres en haut de la classe et définissez les constructeurs. le Bitmap objet sera utilisé pour stocker le bitmap qui sera analysé et le SparseArray de Face les objets stockeront chaque face trouvée dans le bitmap.

Ensuite, ajoutez une nouvelle méthode à l’intérieur de FaceOverlayView appelé setBitmap(Bitmap bitmap). Pour l’instant, cela enregistrera simplement le bitmap qui lui a été transmis, mais plus tard, vous utiliserez cette méthode pour analyser l’image.

Ensuite, vous avez besoin d’un bitmap. J’en ai inclus un dans l’exemple de projet sur GitHub, mais vous pouvez utiliser n’importe quelle image de votre choix pour jouer avec la détection de visage et voir ce qui fonctionne et ce qui ne fonctionne pas. Lorsque vous avez sélectionné une image, placez-la dans le res / raw annuaire. Ce tutoriel supposera que l’image est appelée face.jpg.

Après avoir placé votre image dans le res / raw répertoire, ouvert res / layout / activity_main.xml. Cette mise en page contient une référence à FaceOverlayView pour qu’il soit affiché dans MainActivity.

Avec la mise en page définie, ouvrez MainActivity et configurez le FaceOverlayView de onCreate(). Pour ce faire, obtenez une référence à la vue, lisez le face.jpg fichier image du répertoire raw en tant que flux d’entrée, et le convertir en un bitmap. Une fois que vous avez le bitmap, vous pouvez appeler setBitmap sur le FaceOverlayView pour transmettre l’image à votre vue personnalisée.

2. Détecter les visages

Maintenant que votre projet est configuré, il est temps de commencer à détecter les visages. Dans setBitmap( Bitmap bitmap ) vous devez créer un FaceDetector. Cela peut être fait en utilisant un FaceDetector.Builder, vous permettant de définir plusieurs paramètres qui affectent la vitesse de détection des visages et quelles autres données le FaceDetector va générer.

En relation :  Les 7 meilleures unités de tête automatique Android

Les paramètres que vous choisissez dépendent de ce que vous essayez de faire dans votre application. Si vous activez la recherche de points de repère, les visages seront détectés plus lentement. Comme pour la plupart des choses en programmation, tout a ses compromis. Pour en savoir plus sur les options disponibles pour FaceDetector.Builder, vous pouvez trouver la documentation officielle sur Site Web des développeurs Android.

Vous devez également avoir un contrôle pour voir si le FaceDetector est opérationnel. Lorsqu’un utilisateur utilise la détection de visage pour la première fois sur son appareil, les services Play doivent sortir et obtenir un ensemble de petites bibliothèques natives pour traiter la demande de votre application. Bien que cela soit presque toujours fait avant la fin du lancement de votre application, il est important de gérer l’éventualité d’un échec.

Si la FaceDetector est opérationnel, alors vous pouvez convertir votre bitmap en un Frame objet et transmettez-le au détecteur pour collecter des données sur les visages de l’image. Lorsque vous avez terminé, vous devrez libérer le détecteur pour éviter une fuite de mémoire. Lorsque vous avez fini de détecter les visages, appelez invalidate() pour déclencher le rafraîchissement de la vue.

Maintenant que vous avez détecté les visages sur votre image, il est temps de les utiliser. Pour cet exemple, vous dessinerez simplement une boîte verte autour de chaque face. Depuis invalidate() a été appelé après la détection des visages, vous pouvez ajouter toute la logique nécessaire dans onDraw(Canvas canvas). Cette méthode garantit que le bitmap et les faces sont définis, puis dessinez le bitmap sur le canevas, puis tracez un cadre autour de chaque face.

Étant donné que différents appareils ont des tailles d’affichage différentes, vous garderez également une trace de la taille mise à l’échelle du bitmap afin que l’image entière soit toujours visible sur l’appareil et que toutes les superpositions soient dessinées de manière appropriée.

le drawBitmap(Canvas canvas) La méthode dessine votre bitmap sur le canevas et la dimensionne de manière appropriée tout en renvoyant un multiplicateur pour mettre à l’échelle correctement vos autres dimensions.

le drawFaceBox(Canvas canvas, double scale) La méthode devient un peu plus intéressante. Chaque visage qui a été détecté et enregistré a une valeur de position au-dessus et à gauche de chaque visage. Cette méthode prendra cette position et en dessinera un rectangle vert pour englober chaque face en fonction de sa largeur et de sa hauteur.

Vous devez définir votre Paint objet, puis parcourez chaque Face dans ton SparseArray pour trouver sa position, sa largeur et sa hauteur, et dessiner le rectangle sur le canevas en utilisant ces informations.

À ce stade, vous devriez pouvoir exécuter votre application et voir votre image avec des rectangles autour de chaque visage qui a été détecté. Il est important de noter que l’API de détection de visage est encore assez récente au moment de la rédaction de cet article et qu’elle peut ne pas détecter tous les visages. Vous pouvez jouer avec certains des paramètres du FaceDetector.Builder objet afin de recueillir, espérons-le, plus de données, bien que ce ne soit pas garanti.

Visages détectés et liés par un rectangle dessiné

3. Comprendre les points de repère

Les points de repère sont des points d’intérêt sur un visage. L’API de détection de visage n’utilise pas de points de repère pour détecter un visage, mais détecte plutôt un visage dans son intégralité avant de rechercher des points de repère. C’est pourquoi la découverte de points de repère est un paramètre facultatif qui peut être activé via le FaceDetector.Builder.

Vous pouvez utiliser ces points de repère comme source d’informations supplémentaire, comme l’emplacement des yeux du sujet, afin de pouvoir réagir de manière appropriée dans votre application. Il y a douze points de repère qu’il est possible de trouver:

  • œil gauche et droit
  • oreille gauche et droite
  • embout auriculaire gauche et droit
  • base du nez
  • joue gauche et droite
  • coin gauche et droit de la bouche
  • base de la bouche
En relation :  8 endroits pour obtenir des commentaires sur vos photos

Les repères disponibles dépendent de l’angle du visage détecté. Par exemple, une personne tournée vers le côté n’aura qu’un seul œil visible, ce qui signifie que l’autre œil ne sera pas détectable. Le tableau suivant décrit les points de repère qui doivent être détectables en fonction de l’angle Euler Y (direction gauche ou droite) du visage.

Euler Y Repères visibles
œil gauche, bouche gauche, oreille gauche, base du nez, joue gauche
-36 ° à -12 ° bouche gauche, base du nez, bouche inférieure, œil droit, œil gauche, joue gauche, bout d’oreille gauche
-12 ° à 12 ° œil droit, œil gauche, base du nez, joue gauche, joue droite, bouche gauche, bouche droite, bouche inférieure
12 ° à 36 ° bouche droite, base du nez, bouche inférieure, œil gauche, œil droit, joue droite, pointe d’oreille droite
> 36 ° œil droit, bouche droite, oreille droite, base du nez, joue droite

Les repères sont également incroyablement faciles à utiliser dans votre application, car vous les avez déjà inclus lors de la détection de visage. Il vous suffit d’appeler getLandmarks() sur un Face objet pour obtenir un List de Landmark objets avec lesquels vous pouvez travailler.

Dans ce tutoriel, vous allez peindre un petit cercle sur chaque repère détecté en appelant une nouvelle méthode, drawFaceLandmarks(Canvas canvas, double scale), de onDraw(canvas canvas) au lieu de drawFaceBox(Canvas canvas, double scale). Cette méthode prend la position de chaque repère, l’ajuste à l’échelle du bitmap, puis affiche le cercle indicateur de repère.

Après avoir appelé cette méthode, vous devriez voir de petits cercles verts couvrant les visages détectés, comme indiqué dans l’exemple ci-dessous.

Cercles placés sur les repères faciaux détectés

4. Données de visage supplémentaires

Bien que la position d’un visage et ses repères soient utiles, vous pouvez également obtenir plus d’informations sur chaque visage détecté dans votre application grâce à certaines méthodes intégrées du Face objet. le getIsSmilingProbability(), getIsLeftEyeOpenProbability() et getIsRightEyeOpenProbability() Les méthodes tentent de déterminer si les yeux sont ouverts ou si la personne détectée sourit en renvoyant un flotteur allant de 0,0 à 1.0. Plus la personne est proche de 1,0, plus la personne est susceptible de sourire ou d’avoir l’œil gauche ou droit ouvert.

Vous pouvez également trouver l’angle du visage sur les axes Y et Z d’une image en vérifiant ses valeurs Euler. La valeur Z Euler sera toujours signalée, cependant, vous devez utiliser le mode précis lors de la détection des visages afin de recevoir la valeur X. Vous pouvez voir un exemple de la façon d’obtenir ces valeurs dans l’extrait de code suivant.

Conclusion

Dans ce didacticiel, vous avez découvert l’un des principaux composants de la bibliothèque Play Services Vision, Détection facial. Vous savez maintenant comment détecter les visages sur une image fixe, comment collecter des informations et trouver des points de repère importants pour chaque visage.

En utilisant ce que vous avez appris, vous devriez être en mesure d’ajouter des fonctionnalités intéressantes à vos propres applications pour augmenter les images fixes, suivre les visages dans un flux vidéo ou tout ce que vous pouvez imaginer.

Moyens Staff
Moyens I/O Staff vous a motivé, donner des conseils sur la technologie, le développement personnel, le style de vie et des stratégies qui vous aider.