Récemment, j’ai eu l’occasion de jouer avec les Cognitives Services de Microsoft. Ils sont assez nombreux et il y en a pour tous les goûts .
Mais sur cet article, je vais m’attarder en particulier sur un service : API Face. Ce service est à la fois amusant et pratique, il permet l’identification et l’analyse de visages (Age/Sexe/Lunettes/Barbe etc…) mais pas que !
Je vais vous montrer comment j’ai intégré cette solution lors de mon dernier Hackathon sur une application développée en Xamarin !
Cette API fait partie de toute la panoplie des services cognitifs de Microsoft, et il faudra vous munir d’une clé pour pouvoir l’utiliser.
Une version d’essai gratuite est disponible pour une durée de 30 jours. Vous pourrez faire, durant ce mois d’essai, 30 000 transactions (dont 20 par minutes), ce qui est largement suffisant pour découvrir ou s’amuser avec ce service.
Souscrivez à ces services depuis ce lien : https://azure.microsoft.com/fr-fr/try/cognitive-services/?api=face-api
Et cliquer sur “Obtenir la clé API” pour débuter l’essai.
Notez bien la clé qui vous sera communiquée, ainsi que le point de terminaison.
A ce stade vous avez tout le nécessaire pour appeler le service
Commençons donc à intégrer tout ceci dans une application Xamarin. Pour faire quelque chose de rigolo, on va mettre en place une authentification par reconnaissance faciale.
Les règles seront assez simples : si vous portez des lunettes, vous avez le droit d’utiliser l’application, sinon… l’accès vous sera refusé !
La théorie :
- Il nous faut une vue qui sera le point d’entrée de notre application avec un bouton de login
- L’accès à l’appareil photo pour envoyer notre plus beau sourire à l’API
- L’appel vers l’API Face pour qu’il analyse la photo
- L’analyse du retour de l’API
La pratique:
La vue xaml :
1
2
3
4
5
6
7
8
9
|
< label heightrequest = "60" text = "Click to begin the facial recognition" font = "Bold,20" horizontaloptions = "CenterAndExpand" margin = "20" > < img margin = "30" verticaloptions = "FillAndExpand" source = "login_icon.png" > < image.gesturerecognizers > < tapgesturerecognizer tapped = "OnTapGestureRecognizerTapped" > </ tapgesturerecognizer > < activityindicator x:name = "indicator" color = "Red" isrunning = "false" > < label text = "Oops , your face have not been recognized :( " font = "Bold,20" horizontaloptions = "CenterAndExpand" verticaloptions = "CenterAndExpand" x:name = "labelNot" textcolor = "Red" isvisible = "false" > </ label ></ activityindicator ></ image.gesturerecognizers ></ label > |
Ici on a la vue de login, elle contient une image qui, au clic, va lancer l’appareil photo du smartphone.
Le code c# :
1) Package Nuget
Récupérer le package “Microsoft.ProjectOxford.Face” qui encapsulera nos appels à l’API.
Url : https://www.nuget.org/packages/Microsoft.ProjectOxford.Face/
2) Instancier le service
Déclarez notre nouveau service à partir de la clé et du point de terminaison que vous avez récupéré lors de votre inscription au service.
1
2
|
private readonly IFaceServiceClient faceServiceClient = |
3) Capturez une photo et envoyez-là à l’API Face
Il suffit ici de faire appel à l’appareil photo du smartphone pour récupérer la photo de l’utilisateur. Cela se fait assez simplement grâce à la librairie “CrossMedia”.
1
2
3
4
5
6
|
photo = await CrossMedia.Current.TakePhotoAsync( new StoreCameraMediaOptions { Directory = "pictureDirectory" , Name = "photo.jpg" , DefaultCamera = CameraDevice.Front }); |
Ensuite grâce au service, on peut envoyer cette photo à l’API qui va nous retourner une liste de “FaceAttributeType” qu’on doit lui passer en paramètres:
Au retour, notre liste d’attributs sera remplie automatiquement. Il nous suffira simplement d’analyser tout ça et d’implémenter notre logique en récupérant les accessoires de la personne et vérifier qu’il porte bien des lunettes pour le laisser passer à la page suivante !
Comme vous pouvez le voir dans ma liste d’attributs, il existe énormément d’informations retournées par le service, l'âge estimé de la personne, sa pilosité, son émotion etc…
Ce n’est pas plus compliqué que ça au final !