Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Xamarin.Forms et les Cognitive Services Microsoft pour analyser une photo

Les Cognitive Services sont une fabuleuse boîte à outils de l’IA au service du développeur, accessibles en cross-plateforme ils peuvent révolutionner les Apps de demain, regardons concrètement comment avec de la reconnaissance d’image…

Les Cognitive Services

Je vous les ai présenté il y a peu de temps (voir Les Microsoft Cognitive Services), pour résumer c’est un ensemble de web services proposés par Microsoft couvrant de nombreux domaines où l’IA joue un rôle essentiel. Ils réalisent des tâches qu’un développeur même chevronné ne pourrait développer seul dans son coin comme la reconnaissance des visages, la détermination de l’âge des personnes sur une photo ou l’analyse sémantique d’un texte, la caractérisation d’une vidéo, l’émission de recommandations, etc..

Les CS ouvrent tout un monde nouveau au développeur, la possibilité d’accéder à des traitements impossibles à réaliser sur des appareils malgré tout limités en puissance. Le Cloud prend ici tout son sens dans la répartition de la tâche entre terminaux intelligents et gros centres de calculs, entre programmation sophistiquée orientée UX et programmation complexe comme peut l’être l’Intelligence Artificielle.

Les services proposés sont gratuits pour une utilisation modérée, ils deviennent payants pour une utilisation intensive. S’ils sont déjà nombreux (13 services actuellement) nul doute que l’offre de Microsoft s’étoffera avec le temps autant en nombre qu’en profondeur et en intelligence.

Utiliser les Cognitive Services avec les Xamarin.Forms

Voici un mariage idéal ! Sur un gros PC on pourrait espérer faire fonctionner de façon efficace des moteurs d’inférence puissants, du moulinage de grosses bases de données statistiques ou des algorithmes faisant chauffer 8 cœurs ou plus et des Go de RAM, le tout pour servir une petite application frontale…. Mais une telle débauche de développement et de puissance consommée ne peut se concevoir sur un smartphone ou une tablette. Or la programmation à papa est morte comme je l’indiquais dans mes vœux du nouvel an.

Les nouvelles applications, sur mobile ou PC – ou Mac avec Xamarin.Mac, vont devoir faire plus qu’animer une transition d’écran et proposer de gérer la liste des courses, la liste des contacts, la liste des photos, la liste de … Tout cela est de l’informatique à papa. Des listes, des fiches, des dossiers. Même présentés correctement avec force animations et couleurs clinquantes cela reste très kitch si on y réfléchit bien. Utile bien entendu mais kitch, tellement old-school…

Les utilisateurs veulent et voudront plus d’intelligence. Et pour cela il faut sortir de la programmation algorithmique classique. Il faut des réseaux de neurones, des intelligences artificielles basées sur du deep learning, des bases de connaissances et de données réparties sur 100.000 disques durs. Des choses à jamais inaccessibles (à l’échelle de nos vies) pour des machines tenant dans le creux de la main. Le smartphone quantique est loin d’être disponible !

Ces technologies ne sont définitivement plus à la portée non plus du développeur isolé ou de la petite entreprise d’informatique. On peut créer un jeu à succès dans sa cuisine, on ne peut pas créer une IA nourrie au deep learning sans les moyens gigantesques d’une entreprise de la taille de Microsoft.

Entre les Xamarin.Forms d’un côté et les centres de calculs des IA de Microsoft il y a internet, ce cordon ombilical vital.

Grâce à des innovations comme les Cognitives Services internet reprend tout son sens, relier des ordinateurs distants pour mutualiser une connaissance utile aux humains ce qui est tout de même plus intelligent que de réinventer sur les “réseaux sociaux” les mêmes discussions qu’on entendait dans les bistrots avec le côté jovial du verre de rouge en moins (mais avec la même bêtise tout en se croyant moderne).

Le terminal redevenant un vrai terminal dont le but est de créer un lien entre l’utilisateur et des centres de calcul lointains.

Les terminaux d’aujourd’hui s’appellent smartphones et tablettes, voire même PC. Ils sont multiples, de forme et de puissance différentes, mais tous aujourd’hui peuvent se programmer avec un seul code grâce aux Xamarin.Forms !

Associer les Xamarin.Forms aux IA de Microsoft, nous allons voir comment cela se passe tout de suite.

L’analyse des visages et des émotions avec les Xamarin.Forms

Vous me connaissez j’aime discuter mais j’aime aussi le code, alors voici comment en très peu de lignes il va être possible d’analyser un visage pour connaître les émotions de la personne photographiée ou son âge ainsi que la description de la scène. Des choses bien impossibles à réaliser soi-même et encore moins sur un smartphone. Et pourtant…

Je passerai sur la création d’une solution Xamarin.Forms avec Visual Studio, sur le nécessaire petit temps dédié à mettre à jour les packages pour préparer le terrain.

L’app sera fort simple côté présentation car ce n’est pas ce qui compte ici. Une seule page, un seul bouton, deux zones : l’image prise par l’appareil photo et l’analyse sous forme d’une liste juste en dessous.

“Mais avant de partir il faudra bien te couvrir…” dit la chanson de Noël qui n’est pas si loin derrière nous. Suivons ce conseil sauf qu’ici bien se couvrir c’est surtout s’enregistrer sur le portail des Cognitive Services pour obtenir des clés en autorisant l’accès. Pour se faire allez sur le site suivant https://www.microsoft.com/cognitive-services/en-US/subscriptions. Utilisez votre compte Microsoft pour vous connecter et réclamer des clés pour les services qui vous intéressent. Pour notre exemple il faudra au moins obtenir les clés pour les services “Computer Vision” et “Emotion”.

Une fois les précieux sésames en poche il faut ajouter quelques packages à la solution :

image

image

image

Les deux premiers concernent directement les Cognitive Services et donnent l’accès aux deux services exploités par la démonstration, l’analyse d’une photo et l’analyse des émotions d’un visage.

Le troisième est un plugin Xamarin.Forms qui permet facilement d’accéder notamment à l’appareil photo. Je ne détaillerai pas le fonctionnement de ce module ici mais il est particulièrement efficace et fait partie de toute une famille de plugins que je vous laisse découvrir (quand vous chercherez Xam.Plugin dans le gestionnaire de paquets vous trouverez toute la liste).

L’App

Il est bon je trouve de commencer par la fin pour mieux comprendre le début… Voici à quoi ressemble l’App en fonctionnement (ici sous UWP en mode machine locale) :

image

 

Je me suis prêté au jeu du selfie mais remarquera que pour tromper le système j’ai laissé la scène peu éclairée créant des ombres fortes généralement nuisibles à toute analyse de photo et que je me suis ébouriffé les cheveux pour faire peur à l’IA (tout en affichant une belle tête de gagnant !). Mais ces astuces n’ont pas fonctionné, et vous constaterez à la liste (partiellement) affichée sous la photo que quelque part un tas de neurones électroniques a déjoué mes plans diaboliques et a reconnu l’expression de mon visage et mon genre (bon ça c’était moins dur avec la barbe !). Toutefois dans la description de la scène que vous ne voyez pas sur la capture ci-dessus j’ai pu trouver parmi tous les mots retournés “hat” (chapeau) ce qui prouve que mon crêpage de cheveu a été repéré et classé comme la présence d’un chapeau Smile C’est une erreur mais pas si stupide que ça, on parle bien de “casque” pour certaines coiffures volumineuses !

L’analyse des émotions en début de liste s’étale sur plusieurs critères, toujours les mêmes, auxquels sont donnés un pourcentage. Il y a donc ici 72.65% de chances que mon expression exprime le bonheur (celui d’écrire un nouvel article), 21.83% qu’elle soit neutre (faut pas trop en faire), 3.84% qu’elle traduise de la surprise (mais qui est ce bel homme ?) mais seulement 0% de probabilité qu’elle soit le visage de la peur. Ce qui est exact, je ne suis pas du genre à trembler devant une IA.

Voici une partie des mots retournés (sur l’analyse d’une autre photo prise encore plus dans le noir) pour la description de la scène, la pertinence n’est pas toujours parfaite (la photo était franchement sombre) mais la globalité de l’analyse l’est ce qui est impressionnant :

image

 

C’est une personne, un homme, dans la quarantaine, le cliché est pris à l’intérieur, de face dans la pénombre, l’homme rit peut-être, il porte un T-shirt … On pourrait commencer un roman de cette façon non ? l’IA a même repéré que j’étais assis.

Ce qui est fascinant c’est la pertinence globale et la rapidité de l’analyse.

Le Code

La Vue

Commençons par le plus simple, la Vue.

image

(cliquez pour une image 100%)

Une grille, 4 définitions de lignes, un label, un bouton lié à la commande IACommand, une Image dont la source est liée à PhotoSource et une ListView liée à Report.

Le ViewModel

C’est bien entendu ici que tout se joue et plus particulièrement dans le code appelé par la commande IACommand. Volontairement je ne détaillerai pas les mécanisme MVVM ou autres mis en place, c’est du grand classique pour ceux qui suivent mes articles ou qui possèdent mon livre sur les Xamarin.Forms. Du MVVM minimaliste sans toolbox externe juste en implémentant INPC. Le ViewModel est lié à la Vue directement dans le constructeur de cette dernière (BindingContext).

La commande IACommand appelle la méthode privée analysePhoto().

Prendre la Photo

la première étape consiste donc à prendre le selfie. On pourrait appeler l’album photo pour permettre un choix, mais pour tester les émotions un selfie est plus direct.

image

CrossMedia est le plugin Xamarin.Forms dont le package a été installé avec les Cognitive Services (voir plus haut). On s’en sert ici pour prendre une photo Jpeg haute qualité en taille maxi. Si le nom de fichier retourné est nul on termine. Sinon on charge l’image dans la propriété PhotoSource à laquelle la propriété Source de l’Image de la Vue est liée.

L’analyse des émotions

Ce sont les pourcentages qu’on peut voir sous la photo dans la capture plus haut.

image

On créée un client pour le service Emotion, on lui fournit un flux sur l’image et on appelle la reconnaissance. Toute l’API n’est pas exploitée ici, seules les pourcentages de la première émotion sont traduits en textes ajoutés à une liste de chaînes.

L’analyse de la scène

Le principe reste le même seul le client du service est différent. Ici non plus toute l’API n’est pas utilisée.

image

Et c’est tout !

Comme vous pouvez le constater Microsoft a rendu les choses très simples. On ajoute à son App des fonctions intelligentes de très haut niveau en quelques lignes de code…

Dans le code de création des clients (vision et émotion) on notera l’utilisation de VisionKey et EmotionKey qui sont juste des constantes string contenant les clés obtenues en s’enregistrant sur les Cognitive Services, bien entendu ces codes sont personnels et c’est pourquoi vous ne les voyez pas !

Conclusion

C’est assez bluffant car les fonctions sont aussi intelligentes qu’elles sont simples à utiliser. Le tout en cross-plateforme avec un seul code… Ca marche sur un iPhone, une Surface, ou une tablette Android, bref ça marche partout.

Les API sont en réalité bien plus fournies que ce que je vous montre ici et je ne peux que vous encourager à demander une clé pour tous pour les tester.

Dans ces Cognitive Services se cachent les fonctionnalités des Apps de demain, peut-être vos Apps…

Bon développement intelligent sous Xamarin.Forms

Et Stay Tuned !

blog comments powered by Disqus