Ce que je vois, je le retiens
Introduction
La reconnaissance et le traitement d’images forment la base de ce que l’on appelle la vision par ordinateur. Dans notre quête de l’intelligence artificielle, la vision est une importante brique. Nos yeux traitent des millions d’informations par seconde, sans nous en apercevoir. Nous sommes capables de reconnaître un visage entre des milliers en une fraction de seconde. Nous pouvons interpréter un panneau de signalisation et y répondre de façon quasi inconsciente. Nous sommes même influencés par une vingt-cinquième image insérée au milieu des vingt-quatre nécessaires aux images animées.
Et pourtant, faire reconnaître une simple image à un ordinateur est un travail de titan ! Un travail qui nécessite, pour être précis, l’utilisation de réseaux de neurones, de fonctions mathématiques et de calculs matriciels. Comme nous allons le voir, une image n’est en effet ni plus ni moins qu’une matrice à plusieurs dimensions. Encore faut-il savoir l’analyser correctement et savoir ce qu’on y recherche. Ce chapitre est donc consacré aux images et à leur traitement, avec l’étude, en grande partie, du service Rekognition.
Nous reverrons la vision par ordinateur en apprentissage profond dans le prochain chapitre, afin de pouvoir appliquer l’ensemble...
Une image, c’est quoi ?
La question posée formant le titre de cette section semble évidente. Tout le monde sait ce qu’est une image, qu’elle soit imprimée sur papier, juste devant nos yeux, ou affichée sur un écran. Pourtant, quand il s’agit de technologie, la notion d’image devient plus floue, si j’ose dire. Il est ainsi impossible de faire traiter correctement une image par un ordinateur sans en comprendre les composants, en particulier quand elle doit être transformée en "numpy array" pour l’injecter dans un modèle d’apprentissage profond.
Tout d’abord, regardons rapidement ce qu’est une image fixe et une image vidéo pour être à l’aise quand il s’agira d’en effectuer un traitement.
Mon objectif n’est pas ici de décrire tous les cas possibles, mais ceux les plus fréquents. Ainsi, je me limite aux images et aux vidéos 2D. Les images 3D ou stéréoscopiques ne sont, généralement, que des extensions d’images 2D, et de ce fait ne sont que des matrices de dimensions supérieures. Par exemple, un pixel (picture element) en 2D devient un voxel (volume element) en 3D, c’est-à-dire une matrice décrivant le volume de chaque point.
1. Composantes d’une image fixe
Si vous vous approchez suffisamment près d’une image numérique, vous verrez qu’elle est composée de petits points que l’on appelle des pixels, contraction de l’anglais picture element (élément d’image). Chaque pixel possède deux composants principaux : des coordonnées dans le plan pour définir son emplacement (les fameux x et y) et une couleur. Si l’image est en noir et blanc, il pourra ne s’agir que d’une valeur donnant le niveau de gris (0 pour le noir, 255 pour le blanc par exemple, si l’on code le niveau de gris sur un octet). Si l’image est en couleur, chaque pixel est codé avec un triplet de valeurs : rouge, vert et bleu. Un codage de chaque couleur sur un octet permet de générer plus de 16 millions de couleurs (256 au cube)....
Analyser des images fixes
Rekognition est le service AWS dédié à l’analyse d’images fixes et vidéo. Il permet de reconnaître les éléments suivants :
-
des objets ;
-
des scènes ;
-
des visages et leurs caractéristiques (voir l’exemple du chapitre Mettre en œuvre des projets d’IA avec AWS) ;
-
des personnes célèbres ;
-
du texte.
Il permet aussi de comparer des visages à la recherche de similarités (par exemple, retrouver quelqu’un dans une foule) et de détecter des contenus pour adultes (nudité et contenu sexuellement suggestif). Chaque type d’élément fait appel à des fonctions différentes et fournit des résultats différents. Les pages suivantes vont vous permettre d’écrire votre code pour détecter l’ensemble de ces éléments dans les images soumises.
1. Cadre et orientation d’images
Avant de nous lancer dans la reconnaissance des différents éléments évoqués précédemment, il convient de bien comprendre deux points importants relatifs au traitement des images. Le premier a trait aux cadres qui permettent d’identifier visuellement les éléments détectés dans une image, le second à l’orientation de cette dernière.
Reprenons l’image que nous avons utilisée au chapitre Mettre en œuvre des projets d’IA avec AWS :
Figure 4 - Cadres entourant les éléments détectés
Dans cette image, on remarque deux cadres entourant chaque visage détecté. Leurs coordonnées sont renvoyées dans le fichier JSON, résultat de l’analyse avec l’étiquette BoundingBox. On retrouve quatre valeurs : la largeur (Width), la hauteur (Height), l’indice de la bordure gauche (Left) et l’ordonnée de la bordure supérieure (Top).
"BoundingBox": {
"Width": 0,15612533688545227,
"Height": 0,3225090503692627,
"Left": 0,30169007182121277,
"Top":...
Analyser des images vidéo
Tout ce que nous avons étudié précédemment sur l’analyse d’images fixes s’applique aux images vidéo : analyse de visages, comparaisons, détection de célébrités, reconnaissance d’objets et de scènes, détection de contenus pour adulte. On y ajoute la détection d’activités, par exemple, une personne en train de faire du vélo ou de la planche à voile.
Rappel : Rekognition ne fonctionne qu’avec des vidéos au format MPEG-4 et MOV, encodé en H.264. Toute autre vidéo devra être transcodée pour pouvoir être utilisée.
1. Les spécificités du traitement vidéo
Traiter une image fixe ou une image vidéo est conceptuellement identique avec certaines petites différences quand on travaille avec Rekognition :
-
La ou les vidéos à analyser doivent être stockées dans un compartiment S3. Si vos vidéos sont en local, il faudra donc les transférer.
-
La taille maximum d’une vidéo à analyser est de 8 Go.
-
L’analyse est toujours asynchrone et utilise SNS (Simple Notification Service) pour en indiquer le résultat. Il faudra donc être à l’écoute d’une file d’attente SQS (Simple Queue Service) dans laquelle la rubrique SNS reliée à la tâche d’analyse publiera le résultat au client (voir schéma suivant), ou utiliser une fonction Lambda si vous souhaitez lancer un traitement côté serveur avant de renvoyer le résultat au client.
Amazon déconseille d’interroger Rekognition avec une fonction Get à intervalle régulier. Rekognition va ralentir les opérations si trop de requêtes Get sont envoyées, il est donc préférable d’interroger une file d’attente SQS. Cela demande un peu plus de code, au prix d’une architecture plus optimisée. Vous trouverez des exemples ci-dessous :
Figure 16 - Processus d’analyse d’une vidéo
Voici donc pas à pas la création d’une rubrique SNS, d’un rôle utilisé par Rekognition pour publier un message SNS et d’une file d’attente SQS à laquelle sera abonnée la rubrique...
Analyse en temps différé
Parmi tous les exemples que nous avons étudiés, nombreux sont ceux qui font appel à des fonctions asynchrones. De plus, analyser plusieurs vidéos peut nécessiter plusieurs heures de calcul avant d’obtenir des résultats. Si vous procédez à l’étiquetage de nombreuses images ou vidéos, ou à la traduction de nombreux textes, il peut être intéressant de planifier ces tâches et de les laisser s’exécuter en arrière-plan, pour en récupérer les résultats plus tard.
On sort alors d’un environnement temps réel ou quasi temps réel que nous avons vu jusqu’à maintenant pour entrer dans celui des traitements par lot. Le service Batch est là pour ça : lancer un traitement de calculs et pouvoir en consulter le résultat ultérieurement. Même si le service mérite un chapitre, voire un livre entier, je vais ici me concentrer sur une utilisation simple dans le cadre de traitements d’images par Rekognition et de l’écriture du résultat sous la forme de fichier texte. Le fonctionnement de Batch est en effet relativement simple à comprendre et l’exemple choisi ici pourra être adapté à d’autres cas identiques.
Batch est souvent utilisé conjointement avec d’autres services comme Lambda ou ElasticSearch. Un exemple d’une telle interaction est donné par l’article suivant : https://aws.amazon.com/fr/blogs/machine-learning/classify-a-large-number-of-images-with-amazon-rekognition-and-aws-batch/. Il met en œuvre des fonctions lambda qui démarre plusieurs instances de Batch en parallèle pour étiqueter un grand volume d’images et mettre à jour un index ElasticSearch permettant l’interrogation de ces images par un client à partir de mots-clés.
Si vous souhaitez exécuter les scripts de l’article cité ci-dessus, il vous faudra télécharger les deux fichiers yaml (modèles de pile CloudFormation), changer toutes les références nodejs4.3 en nodejs8.10 dans le fichier lambda-functions.yaml et placer ces deux fichiers dans un dossier S3, puis utiliser l’URL du fichier master.yaml dans votre dossier S3 comme...
Conclusion
Nous voilà arrivés à la fin de ce chapitre consacré à la vision par ordinateur avec Amazon Rekognition. Ce service, comme tous les autres proposés par Amazon, permet de rapidement tirer parti des fonctionnalités de reconnaissances d’images fixes et vidéos sans avoir besoin de développer des modèles complexes.
Cependant, dès que l’on souhaite reconnaître des objets ou des situations particulières, nous devons nous rabattre sur les mécanismes d’apprentissage machine. Nous rentrons alors dans le domaine des réseaux de neurones, du « deep learning ». C’est le sujet de ce dernier chapitre du livre : SageMaker et Amazon Machine Learning.
Nous en avons eu un aperçu au chapitre Mettre en œuvre des projets d’IA avec AWS. Le chapitre suivant va en approfondir les concepts et vous donner les clés pour vous lancer dans prévisions et prédictions avec vos propres données.