Imaginons que vous souhaitiez utiliser les capacités de l’Intelligence Artificielle mais que vous ne connaissiez rien aux réseaux neuronaux, régressions logiques, perceptrons et algorithmes bayésiens. C’est tentant ! Vous entendez parler d’IA et de Machine Learning dans tous les magazines et les promesses sont alléchantes : trouver des réponses dans des données disparates ou réaliser des programmes prenant des décisions sans avoir à coder, et donc sans avoir à comprendre dans le détail toutes les subtilités des causes et des conséquences métier. Or, comprendre tous ces modèles est affaire de spécialistes. Mais, comme pour le reste de la programmation, on aimerait que ces “couches basses” soient cachées et que nous puissions les utiliser sans trop nous poser de questions sur leur fonctionnement interne.
Il se trouve que le Microsoft Azure Machine Learning Studio réalise exactement ceci pour vous.
Prenons un exemple que j’ai déjà expliqué dans ce blog, à savoir la reconnaissance de lettres exprimées par les squelettes capturés par une Kinect. C’est un TP que je fais avec des étudiants depuis quelques années et qui fonctionne plutôt bien pour les amener à pratiquer le Test Driven Development, comme expliqué sur cette page.
L’algorithme que les étudiants doivent arriver à mettre en œuvre consiste à trouver les lettres représentées par le haut du corps lors de la chorégraphie “YMCA”. A partir de cinq points définis par une coordonnée X et une coordonnée Y (soit au total dix paramètres), la fonction étudiée doit renvoyer Y, M, C, A en fonction des positions des mains et coudes gauche et droit et du centre des épaules, ou bien un tiret si le squelette ne forme aucune lettre reconnue. Par exemple, ceci représente la lettre Y :
Certains étudiants créent des algorithmes basés sur les angles, d’autres sur les distances selon les deux coordonnées, d’autres enfin s’égarent quelque peu en pensant se baser directement sur des zones de coordonnées (ce qui supposerait que la personne soit toujours bien au centre de la vision du périphérique, bref limiterait fortement la pertinence de l’algorithme). Je me suis récemment demandé si des mécanismes simples d’IA pourraient leur être montrés à titre d’exemple. L’algorithme n’est en effet pas très complexe à trouver, mais il leur faut en général un peu d’aide du prof pour arriver à le réaliser en deux heures.
Serait-il plus rapide d’oublier toute notion d’algorithme et d’apprendre simplement à une intelligence artificielle à reconnaître les différentes postures ?
C’est la question à laquelle je vous propose de répondre en vous accompagnant sur cet exemple avec ML Studio. La première étape consiste à vous connecter à https://studio.azureml.net/. Si vous n’avez pas de compte Azure, le site vous propose de bénéficier des 150 € gratuits fournis par Microsoft.
Une fois connecté, ML Studio vous accueille avec le liste des “experiments” que vous avez déjà mises en place, et le bouton en bas à gauche vous permet d’en créer une nouvelle :
Le tutoriel est très bien fait (et je ne vais pas faire grand-chose de différent dans cet article) et les autres exemples sont d’excellentes façons de prendre en main les fonctionnalités, mais pour l’instant, nous allons simplement créer une “blank experiment” :
Comme vous le verrez sur l’interface qui apparaît, une “expérience” ML Studio est composé d’un graphe de modules qui sont liés les uns aux autres. Le tout premier, de type Import Data, a comme son nom l’indique pour but d’importer la donnée qui va servir à mettre en œuvre notre moteur d’IA :
Une fois le module posé dans le graphe, nous allons le paramétrer pour pointer sur le fichier d’apprentissage (exposé dans notre cas sur un simple serveur web pour y accéder par HTTP) :
Il est important de s’arrêter sur le contenu du fichier pour bien comprendre l’idée de cet article. Le fichier CSV contient des ensembles de points produits par la Kinect et qui ont systématiquement été créés pour produire des postures à reconnaître :
Pour créer ce fichier, des postures diverses ont été prises devant la Kinect pour “montrer” au système à venir ce qu’est une posture de type “Y” ainsi que toutes les autres postures et en particulier des postures neutres pour que l’algorithme apprenne aussi quand il doit renvoyer simplement un tiret, pour dire que le squelette ne forme pas une lettre reconnue. Le plus simple est alors de travailler avec deux personnes. Une pose avec des mouvements divers et la seconde enregistre les coordonnées avec la lettre (ou l’absence) qu’il considère correcte. Ce fichier montre ainsi de nombreuses positions, neutres ou “valides” – au total 249.
Sans rentrer dans le détail des algorithmes (c’est bien le but de montrer qu’on peut créer un moteur d’IA sans avoir à connaître le fonctionnement interne), il faut juste savoir qu’un “modèle” s’entraine à partir de ces données à les reconnaître, mais qu’il est important de se garder des données de côté pour pouvoir évaluer sa pertinence en le testant avec des situations qu’il rencontre pour la première fois. Pour cela, il est habituel de commencer par couper les données en deux, en ajoutant un module Split Data.
Dans notre cas, il est essentiel d’activer l’option “Randomized split”, sinon les situations correspondant aux différentes lettres ne seront pas mélangées et le modèle aurait alors très peu de chances de fonctionner car le fichier utilisé prend les lettres à apprendre dans l’ordre, avec des formats neutres entre les différents paquets d’échantillons équivalents. Le lien entre les modules se fait simplement par un glisser-déposer. Assez logiquement, le module d’import possède une sortie et celui de découpage en montre deux, que nous allons brancher pour la première sur le module d’apprentissage (Train Model) et la seconde sur celui d’évaluation (Score Model) :
L’interface utilise des codes de couleur verte ou rouge pour indiquer quelle entrée est compatible avec la sortie sélectionnée sur un autre module, ce qui facilite encore l’utilisation. Le premier paramètre attendu par le module Score Model est – logiquement – le modèle qui a été “entraîné”. Nous les relions donc comme suit, ce qui aboutit à la suppression de l’icône d’erreur sur Score Model :
Pour ne plus avoir d’erreur sur Train Model, il faut lui donner en paramètre un algorithme de Machine Learning, en l’occurrence un mécanisme de classification. C’est ce que nous allons faire dans notre cas : classer des ensembles de points dans des catégories différentes, auxquelles nous donnerons des noms (dans notre cas, de simples lettres). Des algorithmes d’IA sont spécialisés dans la classification à deux classes (déduire si une entrée va dans une entrée ou une autre), d’autres dans la classification multi-classes. Nous allons utiliser un d’entre eux, à savoir le Multiclass Decision Forest :
Le module Train Module est encore en erreur car nous n’avons pas spécifié quelle colonne le modèle devait s’entraîner à trouver. Pour cela, il faut sélectionner ce module pour afficher ses options (voire les dérouler si nécessaire) et cliquer sur Launch column selector :
Dans la fenêtre qui s’affiche, au lieu de sélectionner les colonnes par leur nom, nous allons les sélectionner par leur indice dans le fichier. En effet, le fichier CSV ne contenait pas d’entête ; mais nous aurions pu travailler autrement, et il aurait fallu dans ce cas indiquer au module Import Data que la première ligne contenait les noms de colonnes.
Ci-dessus, nous indiquons que la colonne contenant les lettres indiquées est la onzième du fichier (attention, l’index de début est à 1, contrairement aux habitudes des développeurs de commencer à 0, mais cela marque aussi le fait que ce type de “studio” est destiné à faciliter le travail à des personnes non techniques).
Arrivés à ce stade, nous allons simplement rajouter un dernier module – à savoir Evaluate Model – permettant l’analyse statistique du score du modèle. L’évaluation se fait en effet en obtenant un Score puis en l’évaluant, avec comme nous le verrons des sorties numériques et graphiques permettant de mieux comprendre ce score :
Le modèle est prêt à être lancé grâce au bouton Run. Après quelques minutes au maximum (notre modèle n’est pas très complexe), un clic droit sur le module d’évaluation du modèle fait apparaître le menu contextuel suivant, dans lequel nous allons choisir Evaluation results / Visualize :
Les métriques affichées montrent une bonne précision moyenne du modèle, de plus de 95% :
Comme nous sommes dans un algorithme de multiclassification, nous avons également la précision sous forme de matrice :
La lecture en est assez simple. Par exemple, lorsque la classe est effectivement un M, il y a 86,7% de chance que la prédiction soit un M et 13,3% de chance que la prédiction ne reconnaisse pas le signe M (symbole tiret renvoyé).
En ajoutant quelques lignes de données, il serait assez simple d’amener ce modèle vers des taux de prédiction encore meilleurs, et – comme promis – nous n’avons pas écrit une seule ligne de code pour obtenir cet algorithme, mais nous n’avons pas non plus eu à plonger dans des calculs mathématiques complexes.
Et cerise sur le gâteau, le modèle est extraordinairement facile à exploiter une fois créé. Il suffit de cliquer sur l’icône Set up web service pour que ML Studio crée un modèle de prédiction en ligne :
Le modèle créé peut alors être exposé en ligne grâce à l’icône Deploy web service (après l’avoir toutefois lancé avec Run, comme il s’agit d’une nouvelle “expérience”) :
Le résultat est une API qui va vous permettre de consommer cet algorithme de prédiction par IA depuis n’importe quelle application ou périphérique intelligent, avec en plus un mode batch, et une sécurisation par clé d’API :
En suivant le lien Request / Response, vous arrivez sur une page de documentation extrêmement complète, avec l’adresse à utiliser pour déclencher une prédiction, les headers HTTP supportés, des exemples de corps de requête, etc. :
Il y a même les squelettes de code C#, Python ou R nécessaires pour appeler l’API !
Bref, en une demi-heure maximum (c’est-à-dire moins que ce qu’il m’a fallu pour écrire ce post), vous avez un modèle de prédiction IA disponible en ligne, avec des machines derrière pour obtenir des performances intéressantes, et ce pour un investissement en connaissance de l’IA quasiment nul et un coût d’exposition très réduit. Je me demande quand je vais avoir mon premier étudiant qui réalise mon TP en remplaçant l’algorithme codé par une version basée sur une IA. Il y a quelque temps à peine, je pensais que ça prendrait plus de temps que de juste réfléchir au meilleur moyen d’implémenter un algorithme en code, mais quand je vois la vitesse à laquelle on peut réaliser un moteur de prédiction, le plus dur sera juste de capturer les postures d’apprentissage…