Piloter un robot par la voix sur le Cloud AWS

December 15, 2017
Slides : http://chilp.it/1887040 Dans cette session, nous étudions comment piloter un robot grâce à la voix, grâce à Amazon Echo et à un skill développé pour l’occasion. Nous étudions en détail le modèle d’interaction, la fonction Lambda associée et comment elle communique avec le robot via AWS IoT. Puis, nous nous intéressons au code exécuté sur le robot et comment il s’appuie sur MXNet, Polly et Rekognition pour découvrir son environnement et interagir avec l’utilisateur. ✚ Retrouvez tous nos événements : https://aws.amazon.com/fr/events/ ✚ Rendez-vous sur notre site internet : http://amzn.to/2ktrf5g ✚ Suivez-nous sur Twitter : https://twitter.com/aws_actus

Transcript

... sur YouTube, l'un des deux. Grande première, on va tester. N'hésitez pas à nous faire part de votre avis sur YouTube. Si c'est un format qui marche bien, on pourra peut-être le généraliser. Deuxième webinaire. Cette fois, on va quitter un peu le cloud et on va s'intéresser à la combinaison de l'IoT et du Deep Learning. On va faire deux grosses démos, deux grosses explications. Une première démo où je vais utiliser un robot basé sur un Raspberry Pi. Je vais l'interfacer avec différents services, comme la reconnaissance, Polly, etc. Mais je vais aussi lui faire exécuter un modèle de reconnaissance d'image MXNet localement sur le Pi. Et puis, pour rigoler, on a aussi un Amazon Echo, donc on va pouvoir piloter vocalement le robot. Je vais vous montrer tout ça. J'ai déjà montré ça rapidement pendant un des webinaires sur IoT, mais là on va l'expliquer un petit peu plus en détail. Deuxième démo, je ne sais pas si on la voit par l'écran. Sur YouTube, on les voit. Donc vous voyez le robot, l'EcoDevice et la DeepLens. Il ne doit pas y en avoir beaucoup en France. Seuls les gens qui étaient à re-invent et qui ont participé au workshop DeepLens ont dû en avoir. Donc à mon avis, je pense qu'on les compte sur les doigts de la main. J'ai dû faire des choses absolument inavouables pour en procurer une, parce que je voulais vraiment vous la montrer. Donc voilà, vous allez découvrir ce que c'est que ce machin et ce qu'on peut faire avec. Et puis on bricolera, on verra bien, on va s'occuper. En avant, alors on va commencer par... On va commencer par, peut-être, oui, juste regarder le schéma global de la première démo, puisqu'il y a beaucoup, beaucoup de composants. On va commencer par le robot. Donc ici, on a un robot Raspberry Pi qui va recevoir des commandes via AWS IoT. AWS IoT, service IoT lancé il y a maintenant presque deux ans par AWS, qui permet à des équipements de se connecter à une passerelle cloud et d'échanger des messages avec un protocole standard qui s'appelle MQTT. Donc ce robot, il est connecté, on va regarder tout à l'heure comment, il est connecté au gateway IoT en Irlande avec un certificat, une paire de clés, etc. Donc il peut envoyer et recevoir de manière sécurisée des commandes. Ces commandes, elles vont arriver dans ce qu'on appelle des topics, qui sont des fils de messages. Donc on a une file de messages pour les ordres de déplacement, une file de messages pour la parole, et une file de messages pour prendre des photos et reconnaître des objets. Scan, c'est pour le déplacement du capteur ultrason, je ne vais pas le montrer aujourd'hui. Donc en fonction des ordres qui sont reçus ici, j'ai sur le robot un serveur en Python qui va décortiquer le message et soit se déplacer en utilisant l'API du robot, soit parler en utilisant Amazon Polly pour le text-to-speech, soit prendre une photo et faire de la reconnaissance faciale en utilisant Recognition, soit prendre une photo et faire de la reconnaissance d'objet avec le modèle local MXNet en utilisant exactement ce qu'on a vu tout à l'heure, c'est-à-dire un modèle pré-entraîné qu'on charge et qu'on exécute. Et puis, dans les cas où on a utilisé la caméra, on va également envoyer un tweet, ce qui nous permet de voir la photo et le message qui a été envoyé. Donc, l'interface du robot, c'est MQTT et on pourrait envoyer des messages MQTT au robot pour tester. C'est comme ça que je les débogue une fois que tout ça fonctionne. Je me suis dit que ce n'était pas très rigolo, pas très visuel d'envoyer des messages MQTT, donc ça serait plus marrant de pouvoir le commander vocalement. Donc j'ai pris un Amazon Echo, j'ai développé un skill que je vais vous montrer également, et en fonction des commandes que je donne à ce skill, et qui sont donc passées à une fonction Lambda, tel ou tel type de message va être envoyé au robot dans le bon topic MQTT, et on va faire la bonne commande. On va faire une petite démo tout de suite. Je vais d'abord le brancher, parce qu'évidemment, on a beau faire de l'intelligence artificielle, il faut des piles. Voilà. Alors, on va... les piles. Comme ça, je pourrais débrancher le chargeur et avoir un petit peu plus de liberté de mouvement. Pendant que je fais ça, ce kit, c'est un kit que j'ai acheté à peu près complètement sur Internet. Le haut-parleur vient de chez Boulanger, si vous voulez tout savoir. Mais le robot lui-même, c'est un kit fabriqué par Dexter Industries, que vous trouverez sur internet, qui coûte un petit peu moins de 200 dollars, je crois, ou 200 euros, je ne me souviens plus, et auquel j'ai rajouté quoi ? J'ai rajouté la caméra du Raspberry Pi, qui est la caméra standard, qui vaut à peu près 20 dollars. Donc on doit pouvoir le débrancher maintenant. Voilà, un fil de moins. On va essayer de se faire un peu de place parce que sinon on ne va jamais rouler. Alors, je vous avais dit que c'était le bricolage ce webinaire. Je vais enlever ce truc là. Voilà, la caméra on va la laisser là. Je pense que là on a assez de place. Pourquoi j'ai un fil à la pâte ? Tu peux le remettre dans ma poche ? À la ceinture plutôt. À la ceinture, mais j'ai pas de ceinture. Si j'ai une ceinture. Alors, je remets ça à la ceinture. Voilà. Ok, ça prend un peu. Le fil, j'ai quand même le droit de le mettre dans ma poche. Merci Hugo. Alors, ok. Alexa, qu'est-ce que le temps à Paris ? OK, bon, donc on a l'air connecté. En avant. Alexa, open Johnny Pie. Johnny Pie est à votre commande. Qu'est-ce que vous voulez que lui faire ? Je suis trompé. Je savais que ça finirait mal. Stop. Ok, donc là, on voit le... le fonctionnement de base. Je vais vous montrer le code après, on a le temps de le détailler, rassurez-vous. Donc, j'ai un skill qui reconnaît des instructions qui sont passées à une fonction Lambda. Cette fonction Lambda, elle pousse un message MQTT dans un topic auquel le robot est abonné puisqu'il est connecté au Gateway. Et puis, en fonction de l'ordre qui est reçu, il fait la bonne action. Donc, ça, c'est les actions de mouvement qui sont commandées à la voix. Donc on va essayer les autres types de commandes. Alexa, open Johnny Pie. Johnny Pie is at your command. What would you like him to do? Do you see faces? OK. OK. Donc, normalement, on va vérifier ça tout de suite. Il a dû prendre une photo. On va le refaire. Ok, donc manifestement, il a vu... Stop. Il n'a pas vu ma tête. Alors, on va regarder ce qu'il y avait dans... Oui, je suis trop de travers. On va le refaire. Alexa, open Johnny Pie. Johnny Pie est à votre commande. Qu'est-ce que vous voulez faire ? Vous voyez les faces ? Ok. Donc là, il prend une photo, il l'envoie. Une seule face a été détectée. Donc ici, je disais, il prend une photo, il l'envoie à Recognition, voilà, il l'envoie à Recognition et il fait également un appel à Polly pour générer la voix que vous entendez. On va supprimer celui-là qui n'est pas bon. D'accord, donc là, on utilise, comme je l'ai montré tout à l'heure sur Econition, on fait un appel à un service cloud. C'est très bien, c'est simple, c'est peu de lignes de Python. Maintenant, on peut avoir envie d'un truc plus spécifique, on peut avoir envie de reconnaître des objets particuliers, etc. Alors, on va essayer autre chose. Ça doit être dans le champ. Alexa, open Johnny Pie. Johnny Pie est à votre commande. Qu'est-ce que vous voulez faire ? Vous voyez un objectif ? Ok. Donc cette fois, il va prendre une photo une fois de plus. Je ne l'avais pas testé avant pour ne rien me fâcher. Je suis content qu'il y en ait réussi. Il prend une photo, il fait une prédiction avec un modèle MXNet qui est stocké sur le Pi, qui est un modèle Inception. Pré-entraîné, auquel je n'ai absolument pas retouché. Je m'en sers comme tout à l'heure. Je le charge et je passe l'image à travers. Et puis, il regarde le top 1 des catégories. Et avec ça, il construit un message et il envoie un tweet. Et j'ai fait un placement produit pour Lipton. Incroyable. Si quelqu'un travaille chez Lipton, j'aime beaucoup ce que vous faites. Vous pouvez... Vous pouvez m'écrire... Ah non ? Non, je suis dissipé là. Donc voilà le fonctionnement global. Donc là on a fait des mouvements, on a utilisé Polly Recognition dans le cloud pour faire du text-to-speech et pour faire de la reconnaissance faciale en l'occurrence. Et puis on a aussi utilisé un modèle local sur le Raspberry Pi pour détecter des objets avec un modèle pré-entraîné. Ok, allez on va faire un deuxième essai. On va même essayer la forme plus compliquée. Alexa, ask JohnnyPi to look for objects. Voilà, donc là j'ai dû utiliser ce qu'on appelle une utterance, j'ai dû utiliser une forme qu'il n'a pas comprise. Alors on va essayer la forme simple, il faudra que je débogue ça. Alexa, open JohnnyPi. JohnnyPi est à votre commande, qu'est-ce que tu voudrais faire ? Qu'est-ce que l'objectif ? Ok. Là il est en train de faire. Il l'a compris. Je suis 86% sûr que c'est un baseball. Ok. Ça, c'est mon test habituel et il a bien marché. Donc, toujours pareil. On prend une photo, on la passe à travers le modèle et puis ça fonctionne plutôt bien. C'est toujours la même histoire. Si je lui montre des objets qu'il n'a jamais vus... Alexa, open JohnnyPie. Alors une souris, on va voir s'il reconnaît une souris. Ok, pas mal. Donc manifestement, il avait aussi des souris dans son dataset. C'est intéressant parce que vous voyez la photo ici, vous voyez mon écran. Vous voyez la photo qu'il a prise. Bon, c'est alors autant sur effectivement la tasse de thé et la balle de baseball n'y avait pas trop d'ambiguïté, sur la souris c'est moins évident franchement. Si vous montriez ça à un humain, bon alors ok on voit le fil à côté, je sais pas si bien le fil a bien une importance pour la reconnaissance, mais bon ça saute pas aux yeux que c'est une souris sincèrement. Donc le modèle est plutôt correct. Après, si je prends des objets plus exotiques, évidemment, ça ne va pas du tout marcher. Merci JohnnyPy, tu t'es bien comporté aujourd'hui. Alors comment ça fonctionne tout ça ? On va balayer un peu le code. Donc, bon ici, je vois le skill que j'ai développé dans ma page de configuration Alexa. Et donc, si je vais sur le portail développeur, je vais peut-être le mettre en plein écran. C'est un skill qui s'appelle JohnnyPie, je pense que tout le monde l'avait compris. Le modèle d'interaction, il est plutôt simple. J'ai différentes intentions dans ce skill. J'ai ce que j'appelle la direction intent, donc faire bouger le robot. J'ai une see intent, qui est de regarder ce qui se passe devant lui. Et effectivement, ce que j'ai utilisé tout à l'heure, ce n'était pas vraiment dans la liste. Donc il faudra que je le rajoute. Ah oui, j'ai un hello intent, mais je crois que je n'ai pas encore implémenté. Donc ici, j'ai soit se déplacer, soit regarder des objets. Donc se déplacer, ça peut prendre plein de formes, j'ai rajouté plein de phrases différentes. Et puis il y a un paramètre, mais ce qu'on l'engage à l'heure. Alexa, on va appeler un slot qui va être la direction. Donc il faut que je définisse ici, dans les slots, pour cet intent là, pour direction intent, je définis un slot qui s'appelle direction, qui est de type list of directions et qui va contenir la direction : left, right, forward, backward ou hold parce que je me suis rendu compte qu'effectivement je ne pouvais pas utiliser stop parce que stop est un mot réservé d'Alexa donc mon robot ne s'arrêtait pas, il continuait tout droit et par contre le skill lui s'arrêtait donc c'est pour ça que j'utilise hold à la place. Bonne information pour vous, vous ne pouvez pas utiliser stop dans un skill Alexa. Donc ça c'est pour les mouvements et puis ensuite pour la vision, c'est pareil. J'ai un certain nombre de façons de lui demander, et j'ai une target qui est du type list of targets, comme on voit ici, et dans list of targets, j'ai en gros faces ou objects, qui sont les deux choses que j'ai envie de détecter. Donc vous voyez, le modèle d'interaction n'est pas très compliqué, deux intents, chacun avec un slot correspondant, et puis le maximum de phrases pour qu'il comprenne ce que je veux obtenir de lui. Ensuite, la configuration de ce skill va invoquer une fonction Lambda, que je vais vous montrer, qui s'appelle Alexa JohnnyPi. Donc une fonction Lambda ici, c'est à peu près tout. Et voilà, donc le reste c'est juste de la configuration, ça n'a pas d'importance. Ok, donc vous voyez le skill n'est pas très compliqué. Et on va jeter un œil à la Lambda. Ok, c'est petit. Ok. La nouvelle console Lambda. Voilà un sondage qui mériterait d'être fait. Aimez-vous la nouvelle console Lambda ? Vous voyez qu'on a un vrai éditeur maintenant. C'est Cloud9, qui est une société qui a été rachetée par AWS il y a quelques temps et qui est maintenant un service. Si vous aimez les IDE hébergés dans le cloud, regardez Cloud9. Ça a été intégré dans la console Lambda. Il faut reconnaître ses qualités. Donc, alors là, il y a un peu plus de code parce que même une Lambda simple pour un skill, c'est un petit peu verbeux. Donc, il y a plein de fonctions un peu standards qu'on ne va pas regarder en détail. On va regarder l'initialisation parce que ça, c'est intéressant. Donc, ça, c'est le point d'entrée de la Lambda. Donc on voit que, comme dans tous les skills, il va y avoir une requête de lancement qui est générée automatiquement par Alexa. Et puis ensuite, on va envoyer des intents. Donc en fonction des intents, on va appeler on intent. Et donc si c'est direction intent qui a été détecté, on va appeler handler que j'ai développé. Si c'est C intent qui a été détecté, on va appeler un autre handler, etc. C'est un modèle de programmation relativement simple. On va regarder par exemple Handle direction. Il va vérifier qu'il est capable d'extraire du slot la direction. Il va vérifier que la direction qui est contenue dans le slot fait bien partie des valeurs qu'il connaît. Ici, j'allais même rajouter « faster and slower ». Et puis, il va... Ensuite, une fois qu'il a extrait la direction, il va se connecter à IoT. Je vais vous montrer comment après. Et puis, il va publier un message dans le topic move avec la valeur de la direction. C'est ça que va recevoir le robot. La connexion est là, tout simplement. Ça, c'est une connexion IoT traditionnelle. On va avec les credentials qu'on a associés au device, ici au robot, lorsqu'on l'a enregistré. On a récupéré un certificat, une paire de clés, etc. Et on se connecte. On se connecte, c'est trois lignes de code. Quatre. Quatre lignes de code. Et se déconnecter une. Alors j'ai fait le choix de me connecter et de me déconnecter à chaque fois. Initialement, je m'étais dit non, je devrais rester connecté pendant toute la durée de vie du skill. Et puis, comme parfois le skill se termine de manière bizarre parce que j'ai dit un truc qui ne comprend pas ou je l'ai mal prononcé, etc. J'étais parfois dans des états un peu incertains et mon application l'était. Moi aussi, ça arrive parfois, mais là, en l'occurrence, je parle plutôt de la Lambda. Donc, je trouvais que c'était plus déterministe de me connecter, de me déconnecter à chaque fois, ça pose pas de problème de latence comme vous avez vu. On sent pas qu'il y a un coup de mou à chaque fois qu'on a dû se connecter. Alors le handler pour la vision, c'est la même chose. Donc on va vérifier qu'on a bien la valeur de la target. On va valider que c'est soit faces, soit objects. On va se connecter. Si la target est un visage, on va utiliser Recognition. On va envoyer un ordre Rico pour lui dire d'utiliser Recognition. Si la target est object, on va lui dire d'utiliser MXNet. Et donc évidemment dans le code du robot, je vais reconnaître ce message et utiliser l'un ou l'autre des services pour faire la détection. Et après le reste est assez semblable. Donc vous voyez finalement, avec deux slots et un tout petit peu de code, on arrive à passer ces commandes de manière assez simple. Donc ensuite côté objectif, on va regarder rapidement le code du robot. Il y a plein de codes utilitaires mais on va regarder les morceaux intéressants. Donc l'initialisation, il va se connecter lui aussi à IoT avec ses propres credentials. Il va s'abonner au topic MQTT, donc Move, Speak, C, j'ai d'autres topiques que je ne vous ai pas montré aujourd'hui. Il va se connecter à Polly, il va se connecter à Recognition, il va charger son modèle pré-entraîné avec les catégories, exactement comme je vous ai montré tout à l'heure. Et puis ensuite il attend, il attend qu'on lui envoie des commandes. Et quand il reçoit une commande, on va appeler le callback qui correspond au topic en question. Donc voilà, on va juste en regarder un, on va regarder peut-être, c'est peut-être C qui est... Donc dans tous les cas il commence par prendre une photo puis ensuite si le message commence par MXNet, il sait qu'il va devoir faire une détection locale donc il va il va charger l'image qui vient de prendre enfin la photo qui vient de prendre, il la passe à travers le modèle MXNet, il récupère la top catégorie. Ok, alors il affiche le top 5 je crois par défaut, ça permet d'avoir un peu d'infos de debug et puis ensuite il construit un message texte avec la catégorie top 1. Et c'est ça qu'il envoie à Polly, c'est ça que vous avez entendu, et c'est ça qui est tweeté en même temps que l'image. Si la commande commençait par Rocco, il va copier la photo qu'il vient de prendre dans S3, il appelle Recognition pour détecter les labels, il appelle Recognition pour détecter les visages, il va tracer le petit... S'il y a des visages dans l'image, il va tracer le petit cadre orange que vous avez vu sur le tweet, qui est là. Voilà. Ça, c'est le serveur qui le... Enfin, c'est le robot qui le fait. OK. Ensuite, il va générer les messages pour Polly, un pour les visages, un pour les labels. Il va les prononcer et puis il va tweeter. Voilà. Vous voyez, ce n'est pas des centaines de lignes de Python non plus. Donc voilà ce qu'on peut faire avec un Echo et un robot Raspberry Pi. Et un peu d'IoT. Tout ça n'est pas très compliqué. Alors on va passer au deuxième sujet. Deuxième démo. On va parler un peu de DeepLens. Alors la question que tout le monde va me poser c'est, avant même de savoir ce que ça fait, c'est comment je peux en avoir une. Alors là c'est un peu compliqué. Donc ça a été annoncé à reInvent, elle a été distribuée aux heureux chanceux qui avaient pu s'inscrire à temps pour les workshops. Vous pouvez la précommander. Elle est en précommande sur Amazon. Par contre, à l'instant T, elle n'est pas livrable en France. Je ne sais pas si ça changera. Mais je n'ai pas vu de liste de pays. Mais si vous avez quelqu'un qui peut... Donc, c'est... C'est une caméra, 2 mégapixels. À l'intérieur, on a une plateforme Intel, avec un Intel Atom. Et on a un Linux qui tourne, c'est un Ubuntu, vous pouvez faire SSH dessus. Mais surtout, vous avez... Alors je vais... On va passer dans la console... Voilà le device. Il se connecte évidemment au wifi. Et sur ce device, vous allez pouvoir déployer des projets. Alors qu'est-ce que c'est qu'un projet ? On en fournit déjà quelques-uns. Un projet, ça va être une combinaison d'un modèle de deep learning, un modèle MXNet, et une fonction Lambda. Donc le fonctionnement global de cette caméra, c'est qu'évidemment elle capture des images, on peut peut-être basculer s'il te plaît Hugo, ça sera tout de suite très compliqué, Comme ça on va voir Hugo maintenant. Haha il rigole moins. Dis bonjour. Dis bonjour à la dame. Bon voilà donc ici je vois le flux vidéo. Ah oui c'est marrant. Je vois donc le flux vidéo traité par le modèle de Deep Learning. Je pourrais voir le flux vidéo brut également. Donc on va laisser Hugo tranquille. On va essayer de tourner la caméra. Et donc ici, qu'est-ce qui se passe ? Les images sont capturées par la caméra. Elles sont traitées par une fonction Lambda qui tourne sur le device au travers d'un framework qui s'appelle Greengrass, dont j'ai déjà parlé pendant les webinaires IoT. En gros, Greengrass, c'est la capacité à exécuter des fonctions Lambda sur des équipements de type IoT. On peut les déployer depuis le cloud vers les devices. On peut les mettre à jour, etc. Et ici, c'est bien ce qu'on fait. Je vous montrerai tout à l'heure ma Lambda. Elle est dans la région US East. Et ensuite, via Greengrass, elle est automatiquement déployée sur la caméra. Donc les images rentrent dans la caméra, elles passent à travers la Lambda qu'on a déployée sur la caméra. La fonction Lambda va utiliser un modèle de deep learning pour faire une prédiction, un peu comme je l'ai fait sur mon Raspberry Pi, sauf que bon c'était pas une fonction Lambda, c'était du code Python explicite. Mais ici, la Lambda va appeler le modèle qui a été déployé sur la caméra. Elle va récupérer les informations de prédiction qui sortent du modèle. Donc ici, on a un modèle de détection d'objets qui s'est détecté 20 types d'objets. C'est sans doute trop petit pour que vous puissiez lire, mais il détecte les chaises. Donc on voit bien les deux chaises ici à l'écran. Pardon ? C'est vrai, j'ai le droit de bouger. Enfin. On me voit. Je vais aller. Oui, mais si je m'assois sur la chaise, je vais... Non, je peux. On va me voir, moi. Donc, on voit ici les bounding box. On voit, si je ne me mets pas devant, on voit la chaise qui est correctement détectée. On voit... Où est la bouteille ? On a mis une bouteille. Normalement il est capable de détecter la bouteille voilà ok donc on voit la bouteille qui est détectée. Alors on voit moi, il détecte aussi, il sait détecter les personnes, il sait détecter les tables, alors il dit dining table on n'est pas en train de manger mais enfin effectivement on voit un cadre qui apparaît quand je gigote, il sait détecter les écrans de télé enfin voilà il y a une vingtaine d'objets. Après, il s'est détecté les avions, les vélos, les chats et les chiens, mais on n'a pas réussi à vous amener ça dans la salle de webinaire. C'est dommage, on essaie la prochaine fois, ça pourrait être marrant, d'avoir des animaux. Et donc, voilà, ces informations, elles proviennent de la prédiction faite par le modèle. Donc ensuite, la Lambda utilise OpenCV pour rajouter sur le frame vidéo pour ajouter ces informations que vous voyez à l'écran. Et puis ensuite, le flux est émis et c'est le flux que vous voyez là. Donc le modèle, c'est ça. C'est une Lambda qui est dans le cloud. Un modèle qui est dans le cloud, un modèle de MXNet tel que ce qu'on a vu jusqu'ici, qui pourrait être entraîné avec SageMaker ou entraîné sur une instance EC2. Ensuite, vous créez un projet dans lequel vous associez ce modèle à la Lambda. Ça va être déployé automatiquement sur SageMaker. Ça va être déployé automatiquement sur la caméra. Et puis, à partir du moment où vous allumez la caméra, la Lambda démarre, elle reçoit les frames vidéo, elle fait la prédiction, elle les annote avec la bounding box, etc. Et elle les réémet sur la sortie HDMI que vous voyez là à l'écran. Voilà le principe de base. Alors, donc ici, c'est ce modèle-là de détection d'objets. Il y en a d'autres, il y a un modèle de détection de visage. Alors on a été obligé de faire forcément l'application Hot Dog, Not Hot Dog. Si vous ne regardez pas les séries, ça ne vous dira rien, mais sinon vous savez de quoi je parle. On sait reconnaître les chats et les chiens, mais comme je disais tout à l'heure, on n'a pas réussi à en capturer aujourd'hui. Et on a un projet de reconnaissance d'action, donc on peut reconnaître une personne qui marche, une personne qui joue de la guitare, une personne qui se brosse les dents, etc. C'est tout à fait passionnant. Et puis bien sûr, vous pouvez créer votre propre projet où vous allez ajouter un modèle, ajouter une fonction, etc. Pour aujourd'hui, on va se contenter de faire des modèles préexistants. Voilà, donc vous choisissez ce modèle et puis vous cliquez sur « Deploy to device » et c'est parti. Voilà le principe général et donc tout ça s'appuie sur Greengrass qui est comme j'ai dit tout à l'heure cette technologie IoT qui permet d'avoir un environnement d'exécution Lambda sur des devices et de les synchroniser quand on peut avec le cloud. Qu'est-ce que je peux vous montrer ? On peut regarder peut-être un peu la Lambda. Ah oui, j'ai oublié quelque chose d'important. C'est pas grave, on va le voir en regardant la Lambda. Donc la Lambda ici, elle est en Python. Donc on récupère le dernier frame capturé par la caméra, on en fait une image JPEG avec OpenCV et puis on va on va la prédire où est-ce qu'elle est là ? Non pardon c'est là donc on capture l'image on capture l'image. On la redimensionne. On l'a vu tout à l'heure, un modèle pré-entraîné, il est rigide sur sa couche d'entrée. Donc il attend les images d'une certaine taille. Donc ici, quelque chose me dit que ça va être 224 par 224. On les a définis où ? Non, c'est 300, 300. Vous voyez, perdu. Dans tous les cas, on redimensionne. On fait l'inférence. Donc on... On fait comme tout à l'heure, on passe l'image à travers le modèle qui a été déployé. On récupère les résultats. Ici, c'est un single shot detector, un peu comme ceux que je vous ai montrés sur GitHub tout à l'heure. Et puis, pour chaque objet qu'on a détecté, l'output du SSD, ça va être « j'ai vu tel objet, et voici les coordonnées x, y de la bounding box ». Donc on récupère pour chaque objet les coordonnées. Avec OpenCV, on dessine un rectangle autour de ça. Et puis, on construit un message et on l'écrit sur IoT. C'est ce que j'ai oublié de vous dire tout à l'heure. C'est qu'en permanence, pour chaque frame, la Lambda va envoyer un message à IoT. Donc on va pouvoir... les voir, il faut qu'on récupère le nom du topic qui est là et dans la console IoT on a un outil de test on va recharger la page pour être sur le site connecté et donc je vais pouvoir m'abonner au topic. Donc m'abonner, le nom du topic, je vais lui demander de me capturer sans message. Ah oui, je ne suis pas dans la bonne région, donc forcément ça ne marchera pas. On recommence, le topic, voilà, s'abonner. Voilà. Et là je vois... Ah c'est marrant. Donc il y a la bouteille. Alors manifestement il prend Johnny Pie pour une moto. Donc c'est parce qu'il y a des roues. Voilà. C'est sûr. C'est sûr que dans les 20 objets... Ouais c'est ça. Alors là il voit peut-être Bicycle maintenant. Mais dans les 20 objets qu'il connaît, s'il y en a un qui ressemble à Johnny, c'est une bicyclette ou éventuellement une moto. Donc il se trompe un peu là-dessus, par contre sur la bouteille, il ne se trompe pas, sur la chaise, et si je vais... j'espère que ça ne fait pas déjà 100 messages, ça n'a plus l'air de défiler, on va recommencer. Si je me mets devant, il ne va dire personne certainement, je ne sais pas si on le voit déjà. Donc on a aussi le flux vidéo. On voit le dining table, on voit qu'il le reconnaît. Effectivement Johnny a l'impression que c'est bicycle mais pourquoi pas. C'est pas si bête. C'est pas absurde en tout cas. Donc on a à la fois le flux vidéo qu'on peut visualiser ici comme vous le voyez et puis on a des infos qui sortent en IoT et qu'on pourrait envoyer dans une application quelconque, on pourrait avoir une fonction Lambda qui va être déclenchée ensuite sur ces messages là et on peut imaginer tout type d'applications si effectivement vous voulez détecter quand un vélo passe devant chez vous, vous braquez la caméra et puis quand dans la Lambda vous détectez un bicycle avec une confiance élevée, vous pourriez envoyer un SMS ou faire ce que vous voulez via une Lambda. Donc une fois de plus la combinaison de ces différents services est assez simple et on se contente de finalement récupérer les résultats du modèle et puis d'agir dessus. Mais on n'est pas obligé de faire de l'IoT, on pourrait très bien se contenter d'utiliser la caméra comme ça en mode vidéo, mais ça me paraît plus amusant de le faire autrement. Qu'est-ce que je peux vous dire d'autre sur DeepLens ? Je pense qu'on a fait à peu près le tour pour l'instant. Dans le Models, on voit la liste des modèles qui correspondent au projet prédéfini. On voit Object Detection, c'est bien une architecture SSD, c'est un modèle ResNet 50, etc. Si vous voulez un peu plus de détails sur les modèles qui sont utilisés, vous les trouverez là. Tout ça, évidemment, est stocké dans S3 et déployé par Greengrass. L'étape d'après, c'est d'aller dans SageMaker, d'entraîner un notebook, d'entraîner un modèle ou de modifier un modèle de reconnaissance d'image et puis de l'utiliser, tout simplement. De le déployer après via Greengrass. Ça sera sûrement ma démo de janvier. Si j'arrive peut-être à me reposer à Noël, on verra. Si j'arrive à me reposer, je pourrais travailler. Voilà, donc c'est vraiment l'idée c'est d'utiliser SageMaker dont je parlerai demain en détail on regardera en détail ce qui se passe dans SageMaker et on verra qu'effectivement on peut entraîner des modèles on peut les héberger dans SageMaker et puis ensuite on pourra soit les déployer sur des instances traditionnelles pour faire de la prédiction soit les déployer vers des devices et pourquoi pas vers une DeepLens pour faire ce qu'on est en train de faire à l'instant T. Voilà, et ça marche plutôt bien. Hop, ouais, ah tiens on a vu mon micro. Oui, faut pas trop bouger, voilà. TV monitor, ouais c'est presque ça. C'est presque ça. Oh, ça marche. Ah, il voit la chaise dans le fond. Il sourit, quoi ! Bon, voilà ce que je pouvais vous raconter sur ces deux sujets. Donc, on l'a vu, c'est du Lego. Je parle toujours d'infrastructures Lego avec AWS. Mais alors là, aujourd'hui, c'est vraiment plus que jamais. On prend des devices, on les combine, on les connecte via IoT en écrivant trois fois rien de lignes de code, on rajoute des services de haut niveau comme Polly Recognition et on arrive à faire une démo qui est plutôt marrante. Et puis pour DeepLens c'est pareil, on combine un modèle qu'on a entraîné, qu'on a dans SageMaker par exemple, on combine Greengrass et Lambda pour avoir de l'exécution locale. J'adore ces architectures où on s'amuse à combiner les services de différentes façons pour réaliser assez vite des démos marrantes. Ça me plaît beaucoup. Quelques liens. Les liens généraux sur l'IA. Pour si vous voulez vous rafraîchir la mémoire sur Polly, Recognition, etc. La page des DeepLens avec les specs et un peu plus de détails. Le GitHub de MXNet et de l'API Gluon qui fait partie de MXNet, donc je parlerai sûrement en début d'année prochaine aussi. Et puis mon blog sur lequel vous trouverez toujours beaucoup de tutos et beaucoup d'infos et beaucoup de codes. En particulier, vous trouverez toute une série d'articles que j'ai écrits pendant que je réalisais cette démo avec Johnny Pie. Je crois qu'il y a au total 7 ou 8 articles qui de manière progressive vous permettent de construire tout ça. Donc voilà, ça c'est le premier article de la série, mais vous trouverez tous les autres et vous verrez très précisément comment fonctionne tout ça. Et bien sûr, vous trouverez les liens vers le code sur GitHub. L'intégralité du code que j'ai utilisé sur JohnnyPie aujourd'hui est sur GitHub. Il vous suffit, si vous voulez le faire, de racheter un petit robot et de jouer. Voilà. Merci beaucoup. Ouais, Hugo aussi, parce que c'est vraiment agaçant ces histoires de crash. J'ai appris ma leçon. Merci beaucoup. On va vous afficher le sondage et on a des questions et on va y répondre. Voilà, comme d'habitude, 5, vous êtes très satisfaits, 1, vous êtes insatisfaits. Attention YouTube aussi, ça peut être un énorme. Et oui, si vous pouvez... Donnez votre avis sur les gens qui ont participé à la diffusion sur YouTube. Si vous pouvez nous dire dans le chat de GoToMeeting si ça fonctionne bien. Si ça vous a plu, si vous avez des commentaires polis. Ils peuvent être négatifs mais polis. Hugo et Preneur. Merci beaucoup. Alors, les questions, les questions. Ah, j'ai oublié la démo GAN. Mais oui, je savais que j'ai oublié un truc. La démo GAN. Ah, mais non, on va faire la démo GAN. Non, mais elle est... Non, pas de souci. Elle est longue. Donc, je peux la lancer, répondre aux questions. Oui, merci. Qu'est-ce qu'il nous a dit ? Merci. Merci aux braves inconnus qui... J'en aurais pas dormi de la nuit. Yann. Alors, oui, là aussi, du coup, j'avais pas vraiment le temps de rentrer dans les détails. Ça mériterait une explication de deux heures. Mais j'ai un article de blog très très long et très très détaillé sur le sujet. Donc, c'est un des derniers que j'ai fait. Vous le trouverez sur medium.com slash adjubc sinon alors je vais juste la lancer on va la laisser tourner un petit peu run all ça me paraît pas mal on va la laisser tourner un petit peu et puis je vais vérifier que ça démarre correctement ça a l'air ouais bah bah bah bah bah bah Et puis on va la laisser avancer un peu et puis on va y revenir tout à l'heure. Alors, les questions. Alors, tu peux remonter un petit peu ? Alors, question d'Alexandre. Quelle est la différence entre utiliser DeepLens et un Raspberry Pi bien configuré ? Alors, c'est une question intéressante. Moi je pense qu'il y a deux choses. Déjà, j'ai pas eu le temps de faire beaucoup de benchmark encore pour l'instant, mais la plateforme matérielle qui est dans le DeepLens me paraît bien plus puissante que le Raspberry Pi. C'est un atome, c'est un intel atome. Donc en terme d'inférence, j'ai fait des petits tests rapides, j'ai l'impression qu'on allait quand même deux à trois fois plus vite sur la DeepCam. Donc déjà le hardware est plus puissant sur la DeepCam. Ensuite il y a le côté de déploiement qui est quand même intéressant sur la DeepCam. Dans le sens où, effectivement, on a le modèle lambda, on a le modèle Greengrass. Et donc, on est complètement libéré de la problématique de déploiement sur les équipements. Là, c'est facile, elle est sur mon bureau, mais elle pourrait être accrochée en haut d'un mur à 100 km d'ici et j'arriverai quand même à faire du déploiement sur un paille ou un autre équipement d'ailleurs il faudrait le faire soi-même. Donc je trouve que c'est une idée intéressante d'avoir... Ils auraient pu se contenter de faire une caméra juste deep learning et puis... Je ne sais pas pourquoi ce truc... Mais ils ont décidé de le combiner avec un déploiement automatique. Et je trouve que c'est une façon intéressante de faire. Pour de l'IoT, le déploiement des équipements, c'est quand même un gros sujet. C'est des équipements qui, a priori, ne sont pas sur votre bureau et ne sont pas accessibles en 5 secondes. Alors, question de Guise. Est-ce qu'on peut remplacer DeepLens par une autre caméra et bénéficier du reste de la chaîne de traitement ? Alors oui, si vous avez votre propre caméra et qu'elle est suffisamment puissante pour faire tourner Greengrass, il n'y a aucun problème. Greengrass justement, il est déployé sur cette caméra là, mais il est fait pour être déployé sur des équipements tiers. Donc vous pourriez toujours déployer Greengrass sur votre caméra Linux, etc. et puis faire exactement la même chose. C'est déjà possible aujourd'hui, sincèrement. Là, l'intérêt de DeepLens, c'est que c'est avant tout un outil de développement, c'est avant tout un outil pour les développeurs. Je pense qu'on n'a pas vocation à utiliser le DeepLens pour faire des trucs industriels, peut-être plus tard, mais dans l'immédiat, c'est plutôt un outil qu'on veut mettre dans les mains des développeurs pour qu'ils se forment au deep learning et qu'ils commencent à jouer. On a d'autres questions ? Je vérifie que mon truc tourne. Ça y est, il est parti. On va laisser tourner. Il faut attendre encore quelques minutes pour qu'on ait les résultats. C'est un peu bon. Alors, il y a encore une question. Oui, mais si l'image fait 4000 par 4000, si elle fait 4000 par 4000, on la redimensionne. J'ai déjà répondu à ça hier. La résolution de l'image n'a pas une grande importance, si on veut reconnaître des objets ou des gens. Justement, c'est bien le problème, c'est qu'une image 4000 par 4000 elle a beaucoup trop d'informations et que pour reconnaître une chaise ou pour reconnaître une bouteille ou pour reconnaître un chat, on n'a pas besoin d'avoir l'intégralité des pixels. Donc c'est vraiment inutile d'obliger un réseau de neurones ou un modèle de deep learning à traiter autant d'informations. Donc il va être Vous avez compris comment marche la convolution, on va chercher les features géométriques, on va chercher les features dans le dataset et on n'a pas besoin d'avoir des quantités de pixels phénoménales parce que 99% de l'information n'a aucune importance et elle va être de toute façon jetée au fur et à mesure par les filtres. Donc histoire d'accélérer le training, d'accélérer l'inférence, il vaut mieux avoir des images qui sont de taille raisonnable et la convolution marchera quand même bien. Alors, qu'est-ce qu'on a d'autre ? Est-ce que la base d'apprentissage doit être 100% fiable ? Alors, oui, enfin, c'est mieux. Il faut que le dataset soit le plus propre possible. Si il y a quelques erreurs de classification, d'étiquetage dans le dataset, il y en a. C'est toujours pareil, si le taux d'erreur est faible, je pense que ça ne perturbera pas trop l'entraînement. Mais dans la mesure du possible, oui, faites que votre dataset soit le plus clean possible. Ce n'est pas un conseil spécifique au deep learning. C'est un conseil général pour le machine learning. Il faut que les datas soient les plus vraies possibles. On a encore quelques questions ? On remonte un peu ? Non ? Plus trop ? Les autres, je crois qu'on a déjà répondu. Alors, le GAN, je vais y revenir au GAN. Je ferai peut-être une session dédiée GAN l'année prochaine. Donc, en revanche, en substance. Alors je vais quand même vous montrer l'article de blog, qu'est-ce que ça va vous donner envie de le lire, il est chouette. Et après je vous montrerai le résultat, là j'ai des dessins qui vont vous expliquer le truc. Donc en fait l'idée ici, l'idée du GAN, c'est de, non pas de classifier ou traiter des données existantes, c'est de générer des données. Donc on va apprendre, on va avoir, c'est une technique qui a quelques années maintenant et qui progresse très très vite, et qui a maintenant des effets vraiment spectaculaires, on arrive à générer des visages humains, on arrive à faire des trucs assez incroyables. Donc en fait, on va utiliser deux réseaux, deux modèles. On va utiliser un modèle qui va générer des images à partir de données aléatoires. Donc évidemment au début ça va être n'importe quoi. Donc on va lui apprendre, progressivement il va apprendre à générer des images, mais au début elles seront complètement aléatoires. Et on va avoir un deuxième réseau, qui est ce qu'on appelle le discriminateur ou le détecteur, qui lui va essayer de séparer les vraies images des fausses. Et le principe de base des GAN, alors je vais essayer de l'expliquer, On va identifier de manière la plus claire possible. Le seul réseau, le seul modèle qui voit le dataset de départ, donc ici on va utiliser Amnist, il y a un seul modèle qui voit les vrais échantillons, c'est le détecteur. Le détective, parce que c'est un peu son rôle. Il doit identifier le vrai du faux. Donc le détective, on va l'entraîner avec les vraies images d'un côté, en lui disant ça c'est les vrais, et les fausses de l'autre côté, c'est-à-dire celles qui sont générées par le générateur. Donc on va lui dire, voilà les vrais, voilà les fausses, apprends à reconnaître les vrais des fausses. Donc c'est un problème de classification assez classique. Mais quand on va mettre à jour, le réseau va mettre à jour ses poids, comme on dit, on l'a fait jusqu'à aujourd'hui. D'accord ? Et on va garder les poids, on va garder les mises à jour des poids qui ont été faites par le détecteur et on va les appliquer sur le générateur en lui disant si tu veux apprendre à générer des vraies images, voilà les poids qu'il faut utiliser. C'est ça l'intuition géniale du GAN, c'est qu'en fait le générateur il ne voit pas les images qu'il doit apprendre à imiter, il voit comment le détecteur apprend à distinguer le vrai du faux. C'est pour ça qu'on a un faussaire et un détective. Le faussaire ne voit pas ce qu'il doit copier. Seul le détective voit ce qui est vrai et ce qui est faux. Mais en voyant comment le détective apprend à reconnaître le vrai du faux, c'est comme ça que le générateur apprend à générer des images de plus en plus véridiques. Donc on ne lui montre pas les échantillons mais via les mises à jour des poids des neurones, il apprend progressivement à générer des images de plus en plus vraies, de plus en plus vraies, de plus en plus vraies. Plus elles sont vraies, plus elles sont ressemblantes aux échantillons, plus le détective va devoir travailler dur et va devoir affiner son apprentissage pour dire ça c'est un vrai, ça c'est un faux. Et c'est comme ça qu'on converge en fait. C'est qu'en observant comment le détective apprend, le générateur apprend lui aussi et donc il va générer des échantillons un petit peu meilleurs à chaque fois. Que le détecteur va observer et il va devoir lui aussi affiner ses poids pour dire les différences entre les vraies et les fausses deviennent de plus en plus fines. Et ces mises à jour de poids, hop, on les rebalance encore au générateur. C'est ça l'idée de départ. Donc je vous laisserai lire l'article en détail. J'ai vraiment fait en sorte d'expliquer le maximum de choses. L'article est très très long. Et vous verrez comment... comment on arrive à faire, il y a même des explications ligne à ligne sur ces morceaux là. Voilà le code en question, on entraîne le générateur, on entraîne le détective et on applique les poids du détective sur le générateur. Donc là, par rapport aux exemples qu'on a pu faire jusqu'à aujourd'hui, ici on utilise une API de plus bas niveau dans MXNet, on ne peut pas utiliser l'API traditionnelle, traditionnelle où on n'a qu'un modèle, on le crée, on l'associe aux données, on l'entraîne, etc. Là, on est obligé de faire des choses un petit peu plus bas niveau. Donc si vous voulez voir un peu plus finement quelles sont les opérations un peu unitaires qu'on fait pendant la backpropagation, etc., vous allez les voir ici. Là, je n'ai pas le temps d'expliquer, ça mériterait deux heures d'explication et je n'ai pas envie de raconter n'importe quoi. Alors qu'est-ce que ça donne ? Alors on va regarder ce que fait mon script. Donc paf, on a lancé là, je vais trouver un truc en bas. Voilà, donc je vais remonter. Donc on voit ici, pardon, hop, on se fait comme ça. Donc ici on voit les images qui sont fabriqués, c'est une petite matrice, donc au total il y en a un petit carré là, c'est un digitamiste, donc il y en a un, deux, trois, quatre, cinq, il y en a 25. Donc ici on voit au début c'est du bruit blanc, c'est n'importe quoi, parce qu'on part de données aléatoires et on construit des images à partir de données aléatoires. Au début c'est du bruit blanc, ça ne va pas du tout. Mes échantillons, mes vrais échantillons, ils ressemblent à ça, c'est ce qu'on a vu hier. Bon, et puis au fur et à mesure, je vais avancer un peu, on voit, voilà, on commence à voir apparaître dans le bruit blanc, on commence à voir apparaître des tâches, parce qu'au fur et à mesure que le détective apprend à détecter le vrai du faux, et au fur et à mesure qu'on applique ces mises à jour de poids sur le générateur, le générateur lui aussi apprend à le faire. Donc je vais avancer, avancer, avancer. Là, on voit, par exemple, au bout d'une époque et demie, on commence à voir apparaître des digits. Vous voyez, ça va assez vite. Je vais avancer encore un petit peu. Et puis progressivement, vous voyez, le faussaire devient de plus en plus efficace. Alors là, pour l'instant, c'est un peu des hiéroglyphes. Si on descend... On voit là, on est presque à trois époques. Au bout de trois époques, on commence à avoir des zéros qui ressemblent à des zéros. On commence à avoir des 1 qui ressemblent à des 1. On commence à avoir des trucs... Il y a toujours du charabia là, mais vous voyez, progressivement... Ici, on est à... On est à quatre époques à peu près. On commence à avoir des cinq, on commence à avoir des débuts de huit. Donc c'est complètement magique. Et donc, il faut vraiment comprendre ça dans le GAN, c'est que le générateur ne voit pas les échantillons. Il voit comment le détective apprend à détecter le vrai du faux. Et donc en suivant le même apprentissage que le détective, bien progressivement les images qu'ils génèrent deviennent de plus en plus fines et donc on voit, alors là vous voyez ça prend quand même beaucoup beaucoup de temps, au bout de 10 époques on a des choses qui apparaissent, au bout de 20 époques on commence à avoir des digits qui sont très corrects et au bout de 50 époques on a quasiment des digits parfaits, enfin bon certains Certains sont un peu moches, mais un humain les reconnaîtrait. Alors celui-là est assez bizarre. Mais les autres seraient reconnus normalement par l'humain. Et avec ce genre de choses, on arrive maintenant à générer des visages humains. Je vais essayer juste de retrouver cet article. J'ai vu un... Et on s'arrêtera là-dessus. Il y a eu un post il y a pas longtemps sur le blog de Nvidia. Ouais c'est peut-être celui là. Voilà c'est celui là, j'ai du pot. Alors ça, ces visages là, ils n'existent pas. Faut s'en convaincre. Ils ont été générés par un réseau de neurones. Donc il y a un dataset qui s'appelle CelebA, qui est un dataset de célébrité, donc c'est des photos comme ça en gros plan, de célébrité, de cinéma, etc. Et donc en utilisant une technique similaire à ce que je vous ai montré, avec des optimisations, parce que là les images sont évidemment de plus grande taille, donc il y a pas mal d'autres soucis à régler, mais ces images-là, ces images-là, visages-là n'existent pas. Il faut se convaincre. Ces personnes n'existent pas, elles ont été générées par un réseau de neurones. Donc je vous laisserai lire ça. C'est assez stupéfiant. C'est un article qui date d'octobre 2017 et il y a encore eu des avancées supplémentaires depuis ça. C'est sans doute le domaine du deep learning qui avance le plus vite en ce moment, c'est ça. Pour l'instant, on le fait sur des images fixes et puis assez vite, à mon avis, on va réussir à le faire sur la vidéo. Et puis là, je pense qu'on va commencer à rigoler pas mal. Voilà, je vous aurais quand même montré les GAN. Et on remettra dans l'ordre, hein, Hugo. Tu vas faire du montage, mais c'est bon. Mais non, ça vient se passer. Voilà, voilà, je pense qu'on est au bout. Au bout de la présentation, j'espère que vous avez vu, là on a fait des choses assez avancées aujourd'hui, mais j'espère que ça vous donne une idée de ce qu'on peut faire avec du deep learning et des images, et de ce qu'on peut faire avec Mixnet et des instances GPU et tout ça sur AWS. Ça n'est qu'un tout petit bout de ce qu'on peut faire. Comptez sur moi pour continuer à vous montrer des trucs rigolos. Une fois de plus, c'est un domaine qui avance très très vite. Et je pense qu'il y aura encore beaucoup de démos rigolotes à faire avec DeepLens et avec Degan et avec d'autres sujets comme ça. Voilà, merci beaucoup. Je vous donne rendez-vous demain pour la dernière journée. Donc demain après-midi, pendant le premier webinaire, on fera un panorama des nouveautés IA et machine learning qui sont sorties à re-invent, il y en a eu pas mal, on fera des démos de ces services là et puis dans le deuxième webinar on se concentrera sur SageMaker que j'ai utilisé un peu tout au long de la semaine, que vous voyez ici, qui va nous servir à utiliser nos notebooks, à entraîner nos modèles, à utiliser des algos sur étagère, à déployer des modèles derrière des API HTTP, etc. C'est vraiment un outil super intéressant et on passera un peu de temps à regarder cette fonctionnalité. Voilà, merci beaucoup, je vous souhaite une bonne soirée et rendez-vous.

Tags

IoTDeepLearningRaspberryPiAWSIoTDeepLens