Réduire les appels à l’API Face de Cognitive Services avec FaceTracker de l'API UWP

Dans son dernier article, Thomas vous a expliqué comment effectuer de la reconnaissance faciale grâce aux Cognitive Services et la Face API.

Cette reconnaissance se base sur des images que l'on envoie aux API de Microsoft via des services REST ou via les SDK fournis.

L'exemple de Thomas consistait à utiliser le flux vidéo pour envoyer ces images et faire de la reconnaissance en quasi-temps réel en utilisant deux requêtes distinctes, l'une pour vérifier que des visages sont présents sur une image, c'est la "détection de visages" et la seconde pour reconnaitre les personnes via ces visages, c'est la "reconnaissance".

 

Malheureusement ce workflow a un coût important. En effet, le pricing des Cognitive Services se base sur le nombre de requêtes effectuées. Hors, dans un flux vidéo permanent, vous risquez rapidement de faire chauffer la carte bleue , voire de la faire brûler.

Une parade à ce problème consiste à limiter les requêtes à un nombre arbitraire par minute. Si votre application tourne en continu, il risque d'y avoir encore pas mal d'appels inutiles et de limiter articificiellement les appels quand vous en avez réellement besoin.

 Une autre solution consiste à faire une première analyse du flux vidéo et de filtrer les images contenant des visages pour ne requêter les Cognitive Services que si nous avons des visages devant l'écran pour essayer de les reconnaître.

 

Micosoft fournit dans son SDK UWP, une API très interessante : Windows.Media.FaceAnalysis. Ce namespace est disponible nativement dans les applications Windows et va nous permettre d'effectuer un premier filtre sur les images à traiter.

 

Comme son nom l'indique ce namespace va nous fournir des outils pour faire de l'analyse de visage. Dans ce namespace la classe qui va nous intéresser particulièrement est la classe "FaceTracker". Celle-ci utilise des VideoFrame pour détecter des visages. Pile ce qu'il nous faut.

 

La première étape consiste à instancier la classe FaceTracker. Rien de compliqué puisque celle-ci ne prend aucun paramêtre. 

using Windows.Media.FaceAnalysis;

this.faceTracker = await Windows.Media.FaceAnalysis.FaceTracker.CreateAsync();

 

Je ne vous fais pas de rappel sur comment récupérer les frames depuis un flux vidéo mais voici en substance le pré-traitement à effectuer dans la boucle d'analyse vidéo :

               // Récupération de la frame vidéo
               await this.mediaCapture.GetPreviewFrameAsync(previewFrame);

                //Détection des visages
                IList<DetectedFace> faces = null;
                faces = await this.faceTracker.ProcessNextFrameAsync(previewFrame);
                
                if (faces.Any())
                {
                    //TODO Appels à Cognitive Services pour faire de la reconnaissance de visages
                }

 

Si nous voulons aller plus loin, nous pourrions également filtrer les frames dans lesquels les visages sont trop petits, si les personnes sont loins par exemple, en utilisant les propriétés Facebox de la classe DetectedFace de la manière suivante :

if (faces.Where(f => f.FaceBox.Height > 150).Any())

 

Ainsi, nous pouvons trier les frames qui contiennent des visages pour faire nos appels aux API de Cognitives Services et sainsi réduire les coûts.

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus