La vision par ordinateur, ou Computer Vision (CV) désigne un domaine du Machine Learning (ML) permettant à un ordinateur d’interpréter des données visuelles.
Dans mon introduction au Machine Learning, j’avais présenté une liste d’applications de la vision par ordinateur :
Dans cet article, je vais vous présenter les techniques utilisées pour parvenir à ces applications, que ça soit pour des problèmes de classification (déterminer dans quelle catégorie classer l’objet) ou de régression (prédiction d’une valeur réelle).
Je vais également vous proposer au fil de l’article de reproduire les résultats présentés et de “jouer” avec le code via des “notebooks” interactifs : n’hésitez pas à me signaler d’éventuels problèmes !
C’est un système composé de neurones artificiels, généralement répartis en plusieurs couches connectées entre elles.
Chaque entrée d’une couche est associée aux sorties des neurones de la couche précédente et à des poids, déterminés au fur et à mesure de l’entrainement du réseau.
Développé dans les années 1990 par le français Yann Le Cun, les réseaux de neurones convolutifs (ou “à convolution”), en anglais Convolutional Neural Networks (CNN ou ConvNet) sont des réseaux de neurones dans lesquels le motif de connexion entre les neurones est inspiré par le cortex visuel des animaux : les neurones de cette région du cerveau sont arrangés de sorte qu'ils correspondent à des régions qui se chevauchent lors du pavage du champ visuel.
Un CNN ****est comparable à une méthode traditionnelle d'apprentissage supervisé : il reçoit des images en entrée, détecte les **features de chacune d'entre elles, puis entraîne un modèle dessus.
Lors de la phase d'entraînement du CNN, les features sont extraites et apprises automatiquement, des plus simples aux plus sophistiquées, en minimisant l'erreur.
Pour illustrer l’évolution des performances des réseaux neuronaux et des CNNs en particulier, prenons l’exemple du jeu de données MNIST, disponible sur le site de Yann Le Cun. Il s’agit d’un ensemble d’images en noir & blanc, au format 28x28 pixels, représentant des chiffres (de 0 à 9) écrits à la main. Chaque image ne comporte qu’un seul chiffre, au centre de l’image.
La tâche associée à ce jeu de donnée consiste bien sûr à prédire le chiffre représenté par l’image. Les performances associées à différentes techniques sont présentées sur le site, et on constate que ce sont les CNNs, dès 1998, qui permettent d’obtenir les meilleurs résultats.
Le schéma ci-dessous présente l’architecture d’un CNN simple traitant une image du jeu de données MNIST : l’image faisant 28x28 pixels, ce sont donc 784 pixels dont les valeurs sont fournies en entrée de la première couche du réseau neuronal. Ces entrées sont connectées à une couche de convolution de 128 neurones, eux-mêmes connectés à une dernière couche de 10 neurones qui constitueront notre couche de sortie : chaque neurone correspondra à un chiffre de 0 à 9.
🛠 A vous de jouer ! Vous voulez tester l’entrainement d’un CNN sur le jeu de données MNIST par vous-même ? Pour cela, je vous propose de récupérer ce notebook sur Github et de cliquer sur le bouton “Open in Colab” si vous disposez d’un compte Google :
Sélectionnez ensuite “Exécution” / “Tout exécuter” pour lancer le téléchargement du jeu de données, la compilation puis l’entrainement d’un CNN correspondant au schéma ci-dessus.
Si vous ne disposez pas d’un compte Google, vous pouvez également installer Jupyter sur votre poste et télécharger le notebook depuis Github pour l’exécuter chez vous.
A ma dernière exécution du notebook, j’ai obtenu un score de précision de 97,13% sur le jeu de validation.
Le jeu de données MNIST est constitué de 60.000 images destinées à l’entraînement du modèle, et 10.000 images destinées aux tests du modèle.
Il est important de toujours conserver des images qui n’ont pas servi à l’entraînement pour détecter le sur-apprentissage(overfit) : le modèle pourrait ne plus savoir généraliser et traiter des données qu’il n’a jamais vu.
C’est vrai ! Le jeu de données MNIST permet d’obtenir rapidement de très bons résultats : un grand nombre d’images, de petite taille, en noir et blanc…
🛠 Je vous propose dans ce 2e notebook un challenge un peu plus compliqué : avec le même CNN, on s’attaque à un jeu de données comportant 3.000 images en couleurs au format 224x224 pixels. Heureusement pour compenser, il n’y a cette fois que 2 classes de sortie : votre mission consiste à distinguer les images qui contiennent un hotdog de celles qui n’en contiennt pas - “hotdog” ou “nothotdog” ! 🌭
Les premiers résultats de ce notebook devraient être de l’ordre des 60% de précision… Ce qui n’est vraiment pas top puisqu’une prédiction “au hasard” devrait avoir une chance sur deux (50%) de tomber juste !
Je vous présente donc ensuite 2 méthodes pour améliorer ces résultats :
Qu’est-ce qu’une fonction d’activation ? La sortie d’un neurone correspond à un produit des entrées de ce neurone et des poids calculés au fur et à mesure de l’entraînement du réseau. Mais ces sorties sont linéaireset pour obtenir un réseau qui prend des décisions nous devons y associer une fonction non-linéaire. Plus d’informations sur ce concept ici.
Ces deux méthodes vont nous permettre d’améliorer un peu les résultats, mais pas de façon spectaculaire… Mais alors, comment faire ?
Dans le domaine de la vision par ordinateur, il existe des compétitions comme la “ImageNet Large Scale Visual Recognition Challenge” (ILSVRC), une compétition annuelle où des équipes de recherche évaluent leurs algorithmes de traitement d'images sur le jeu de données ImageNet pour obtenir la meilleure précision sur plusieurs tâches de vision par ordinateur.
Historiquement, le début des années 2000 est considéré comme une époque de stagnation des CNNs et de nouvelles découvertes conduiront à la mise sur le devant de la scène de cette technologie avec AlexNet, gagnant de la compétition ImageNet ILSVRC-2012.
En 2013, c’est le modèle ZFNet qui sera vainqueur de la compétition, en 2014 VGG-16, puis GoogLeNet (aussi appelé Inception), ResNet et EfficientNet.
Ci-dessous, je vous présente l’architecture du modèle VGG-16, appelé ainsi à cause de ses 16 couches de convolution.
Mais alors, il nous suffit de copier cette architecture, de l’entrainer sur nos images pour obtenir de super scores ? Je vous en prie, rouvrez le notebook précédent et ajoutez des couches à votre modèle ! Attention spoiler : la réponse est non !
L'apprentissage par transfert (en version française) vise à transférer des connaissances d'une ou plusieurs tâches sources vers une ou plusieurs tâches cibles.
Il faut en effet prendre en considération le fait que les modèles vainqueurs des compétitions internationales ne sont pas à la portée de tout le monde : ce sont de grandes universités et aujourd’hui principalement des entreprises disposant d’énormes ressources, à la fois en terme de jeux de données et de puissance de calcul qui peuvent se permettre d’entrainer de tels modèles sur d’énormes quantités d’images en haute résolution.
Mais quand un modèle arrive à calculer des features sur des images pour classer ces images dans 1.000 catégories différentes, conserver les poids associés à ces features pour l’entrainer à une autre tâche de reconnaissance d’images permet de gagner énormément de temps et d’améliorer les performances de manière significative.
🛠 Dans ce 3e notebook, je vous propose donc de récupérer le modèle pré-entrainé VGG16 (celui dont l’architecture est un peu plus haut sur cette page), de supprimer sa dernière couche pour la remplacer par notre propre couche à 2 sorties (”hotdog” & “nothotdog”) et de l’entraîner sur notre propre jeu de données. Vous constaterez une nette amélioration de la précision de notre modèle ! Je vous laisserai essayer de refaire ce transfer-learning en utilisant d’autres modèles pré-entrainés comme “ResNet50”, “InceptionV3”, “Xception” ou l’un des plus récent “EfficientNet” (tous ces modèles sont directement disponibles dans la librairie Tensorflow). En fin de notebook, je vous proposerai également d’essayer d’améliorer encore les performances en optimisant les hyper-paramètres, de la même façon qu’avec notre premier modèle du notebook précédent !
Pour finir, nous abandonnerons les CNNs pour une autre approche de vision par ordinateur.
L’équipe Google Brain a introduit la notion de Transformers dans le NLP (Natural Language Processing – traitement du langage) en 2017 avec le papier « Attention Is All You Need ».
La notion d’« attention » dans une phrase consiste à calculer un poids pour chaque mot de la phrase en relation à chacun des autres mots.
C’est ce mécanisme qui a ensuite été adapté au traitement des images, en découpant les images en “patchs” qui constitueront les “mots” de la “phrase” qui correspond à l’image globale.
Le premier article de recherche ayant placé cette idée sur le devant de la scène était « An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale », publié en octobre 2020.
🛠 Dans ce 4e et dernier notebook, je vous propose de reprendre le même jeu de données, mais d’utiliser la technique du Transfer Learning avec un ViT entrainé par Google et mis à disposition sur le site Hugging Face : google/vit-base-patch16-224 Les librairies mise à disposition par Hugging Face facilitent grandement les traitements, et en quelques lignes de code, vous constaterez que vous pourrez obtenir les meilleures prédictions (de cet d’article !)
Les Vision Transformers ont actuellement le vent en poupe : Facebook s’attache à les adapter au traitement des vidéos avec la méthode des « Divided Space-Time Attention » et a introduit l’architecture « Multiscale Vision Transformers » en août 2021.
La technique des « Swin Transformer » améliore encore le principe de base des ViT, et cette notion se base sur une publication d’août dernier elle aussi.
C’est donc un domaine très actif, et j’espère bien pouvoir suivre ses avancées… pour vous en parler dans un futur article !
Réservez un moment avec notre équipe RH en quelques clics, pour voir ensemble le meilleur moyen de nous rejoindre. Vous avez des questions sur Delia Technologies ? C'est le moment de les poser !
Rencontrer notre équipe