La reconnaissance faciale avec Microsoft Cognitive Service

Par :
thibault.dulon
lun, 20/02/2017 - 11:21
Niveau :
Avancé

La reconnaissance faciale c’est le fait, de détecter un visage sur une image, et ensuite, d’être capable de reconnaître quel visage correspond à tel autre visage. Cela peut paraître trivial énoncé de cette façon mais c’est une technologie qui, aujourd’hui, est en plein essor et qui cache des algorithmes très compliqués !

Comme vous pouvez le voir sur l’image ci-dessus, l’algorithme a reconnu que ces deux visages se ressemblent avec un indice de confiance de 0.707 ; ce qui peut se traduire par 70.7% de ressemblance.

Cet indice peut varier en fonction des algorithmes utilisés et de “l’apprentissage” qu’on leur fait faire. Oui l’apprentissage, car, bien souvent, les algorithmes de reconnaissance faciale sont des algorithmes qui apprennent à se perfectionner petit à petit. Grossièrement, au début ils ne sont pas très performants, c’est pour cette raison que l’on passe par une phase “d’apprentissage intensif” avant de s’en servir concrètement. Cela consiste à fournir des milliers de visages à l’algorithme pour qu’il apprenne correctement les différentes nuances d’un visage.

Possibilités

Les possibilités de la reconnaissance faciale ne s’arrêtent pas là. En effet, aujourd’hui, un algorithme bien “entraîné” est capable de détecter si un visage sourit ou non, s’il porte des lunettes, sa couleur de peau, son âge approximatif, la couleur de ses yeux ou de ses cheveux..., etc. Les possibilités sont nombreuses et la masse d’informations que nous pouvons apprendre d’une photo aujourd’hui est gigantesque.

Certains algorithmes sont aussi spécialisés dans la détermination du contexte d’une photo. C’est-à-dire qu’il sera capable de deviner qu’il se trouve sur une image bien précise, une personne sur une plage de sable derrière une forêt tropicale, etc. Il en déduira que c’est une photo de vacances. Cela vous parait fou ? Allez donc jeter un oeil ici : https://cloud.google.com/vision/

En vérité, un bon algorithme de reconnaissance d’image peut être “entraîné” à repérer tout ce que vous voulez. Les applications sont donc multiples.

Mise en pratique

L’API

Comme vous avez pu le deviner, plusieurs grands acteurs sont sur ce marché depuis longtemps comme Facebook, Microsoft ou Google. Certains d’entre eux comme Google et Microsoft mettent à disposition leurs API aux développeurs.

Nous allons voir ici comment créer une application qui utilise la “Face API“ des “Microsoft Cognitive Services” de Microsoft, qui est l’API que j’utilise pour mon site https://www.eruko.com.

Tout d’abord, comme pour toute API, vous devez créer votre clef directement sur le site. Rendez-vous ici, créez votre compte et demandez une clef d’API pour la Face API.

Pour la suite j’utilise le langage C# mais l’API est compatible avec tous les autres langages.

Un peu de code

Commençons par créer notre service. Pour utiliser l’API vous pouvez utiliser la librairie (le nuget) suivante : Microsoft.ProjectOxford.Face
C’est celle que j’utilise et elle est très pratique.

Ici on implémente tout d’abord un constructeur qui se contente d’instancier FaceServiceClient qui est une classe de la librairie ProjectOxford. Son constructeur nécessite une clef d’API publique. Nous la demandons donc dans le constructeur de notre service. C’est la clef que vous venez tout juste d’obtenir suite à votre inscription.

Rentrons maintenant dans le vif du sujet, implémentons la fonction de détection de visage.

Comme vous le voyez c’est très simple. On se contente d’appeler la fonction DetectAsync du client instancié dans le constructeur. Cette fonction prend en argument l’URL de l’image que vous souhaitez identifier, quelques booléens indiquant ce que vous souhaitez que l’API vous retourne et enfin, le plus important, une liste d’attributs à récupérer dans votre image. Actuellement, vous pouvez récupérer les attributs suivants :

  • L'âge approximatif ;
  • Le genre (homme ou femme) ;
  • S’il porte des lunettes ou non ;
  • S’il sourit ou non ;
  • S’il a une moustache, une barbe, des pattes.

Cette fonction retourne une liste d’objet dont l’équivalent JSON est :


   { 
      "faceId":"c5c24a82-6845-4031-9d5d-978df9175426",
      "faceRectangle":{ 
         "width":78,
         "height":78,
         "left":394,
         "top":54
      },

      "faceLandmarks":{ 
         "pupilLeft":{ 
            "x":412.7,
            "y":78.4
         }         // etc...
      },

      "faceAttributes":{ 
         "age":71.0,
         "gender":"male",
         "smile":0.88,
         "facialHair":{ 
            "mustache":0.8,
            "beard":0.1,
            "sideburns":0.02
         }
      },

      "glasses":"sunglasses"
   }
]

Pour plus de détails sur l’API n’hésitez pas à visiter cette page. Elle explique chacun des attributs et expose les différentes erreurs susceptibles de survenir. faceRectangle, notamment, est un objet qui fournit les coordonnées du cadre délimitant le visage trouvé ; très pratique pour le montrer visuellement à l’utilisateur.

Comme vous pouvez le voir, l’objet de retour est assez clair et utilisable mais, dans l’idéal, créez un modèle et mappez l’objet de retour de l’API avant de retourner le résultat. Mais c’est un autre sujet.

La reconnaissance faciale

Une fois que nous avons effectué la détection de visage, nous obtenons un “faceId”. Ce faceId est l’identifiant unique de votre image chez Microsoft. Une fois que vous obtenez deux faceId, vous pouvez les comparer entre eux grâce à la reconnaissance faciale. Pour cela rien de plus simple :

On appelle simplement la fonction VerifyAsync de notre client ProjectOxford qui prend en paramètre deux faceId et nous renvoie un résultat équivalent à celui-ci :

"isIdentical":true,

"confidence":0.9,

}

Encore une fois très simple à exploiter. Ici j’applique le conseil écrit plus haut, en retournant un objet de type RecognitionModel que j’ai défini auparavant dans lequel je mappe les données reçues par l’API.

Et voilà, votre service est prêt et fonctionnel ; il ne vous reste plus qu’à l’utiliser à bon escient.

Évidemment, l’API de Microsoft permet bien d’autres choses. Vous pouvez par exemple analyser les visages en temps réel sur une vidéo, faire des groupements de visage selon certains critères, comparer des groupes...etc. Les possibilités sont nombreuses !

Sur mon site www.eruko.com, qui est un site permettant à tous de prendre conscience de l’importance de son e-réputation en fournissant les outils nécessaires pour la maîtriser, je me sers de la reconnaissance faciale pour deux raisons :

  • Faire prendre conscience à chacun du nombre d’informations qu’il est possible de récupérer via une simple photo ;
  • Trier plus efficacement en amont les photos concernant l’utilisateur et les mettre en avant par rapport aux autres dans les résultats d’une recherche.

Voici un exemple :

Cette image est tirée de la page de résultat d’une recherche Eruko. Comme vous pouvez le voir, sur certaines photos nous plaçons un cadre autour du visage détecté et nous proposons à l’utilisateur de voir ce que nous en avons tiré comme informations.

Conclusion

Comme vous pouvez le voir, la reconnaissance faciale est désormais devenue accessible à tous et personne ne s’en prive. Appareils photos, téléphones portables, webcams, applications Web et mobiles...etc. On la croise partout. Malheureusement, si vous souhaitez utiliser une des APIs mentionnées plus haut, il existe des quotas qui brideront votre utilisation. Au-delà de ces quotas, les abonnements sont assez chers et limitent donc pas mal l’usage que l’on peut en faire.

La solution est évidemment de créer sa propre solution de détection de visage, puis de reconnaissance faciale, mais pour cela il va falloir s’accrocher. Pour vous donner un avant-goût, voici l’explication de l’algorithme le plus utilisé aujourd’hui en matière de détection de visages. Quant à la reconnaissance faciale, plusieurs éléments de réponse se trouvent ici.

Thibault DULON

Fondateur de eruko.com et ancien étudiant à l’ESGI