Les réseaux de neurones de convolution pour les néophytes

Paul Breton
BeTomorrow
Published in
12 min readFeb 27, 2019

--

ConvNets, Convolutional Networks, CNN, Réseaux de convolution, … autant de noms pour qualifier une même idée : des réseaux de neurones optimisés pour comprendre les images. Avec cet article vous devriez vous sentir un peu plus à l’aise avec tout ce qui concerne les réseaux de convolution.

Nous allons aborder les concepts de manière d’un point de vue théorique, puis appliqué et finirons sur leur rôle dans le réseau de convolutions. Nous verrons ainsi de la structure globale de ce type de réseaux à l’opération la plus basique sur laquelle il est construit, la convolution.

Rappels sur les réseaux de neurones

Un réseau de neurones peut s’apparenter à une “boite noire”. Nous lui fournissons des données en entrée, et il en sort une analyse. Nous entraînons notre réseau de neurones en lui indiquant ce qu’il doit répondre à chaque fois qu’on lui donne quelque chose en entrée. Ce qui lui permet de s’adapter et de “comprendre”, ce sont ses poids : des paramètres internes accomplissant l’analyse. Ils symbolisent la compréhension de l’information. Nous faisons ici de l’apprentissage supervisé.

En “x” les entrées, en “y” les sorties. “w” caractérise les paramètres du réseau.

Par exemple, nous pouvons utiliser un réseau de neurones pour détecter les chutes à vélo. Avec des capteurs dans le casque, nous lui donnons en entrée la vitesse, l’accélération et l’orientation du cycliste, et le réseau prédit si oui ou non il y a une chute. Plus la valeur de la sortie est proche de 1 plus la probabilité d’une chute avérée est forte.

Exemple d’analyse par réseau de neurones.

Comment analyser des images dans un réseau de neurones ?

Notre lapin de laboratoire (aucun animal n’a été maltraité je vous le promets)

Rappelons qu’une image est un ensemble de pixels. Chaque pixel étant un triplet de valeurs (R, G, B), il peut donc prendre 256³ valeurs différentes. Prenons maintenant une image de taille “raisonnable” de 500x500 pixels, c’est-à-dire 250 000 pixels. Nous avons donc (256³)²⁵⁰ ⁰⁰⁰ , soit 10¹ ⁸⁰⁶ ²²⁵ combinaisons différentes possibles dans l’image ! A titre de comparaison, l’univers visible se compose d’environ 10⁸⁰ atomes.

Le nombre de paramètres rend donc l’analyse pixel par pixel totalement inefficace du fait de la complexité de l’ensemble. Notre objectif va être de convertir l’image en un format condensé qui sera bien plus digeste. Nous passons par une étape de “preprocessing”.

Aperçu de la chaîne de traitement. L’image est préprocessée en données optimisées, qui sont envoyées dans le réseau de neurones afin qu’il réalise une prédiction.

L’idée est d’analyser l’image en caractéristiques (appelées également features). Si je vous demandais ce qui caractérise un lapin, vous me répondriez probablement :

Deux grandes oreilles, une petite truffe et deux yeux globuleux, quatre pattes, un corps rondelet et plein de fourrure, et un pompon en guise de queue !

C’est exactement notre but : détecter dans l’image ce qui fait le lapin (avec ses caractéristiques : les deux oreilles, la truffe, les deux yeux …).

Description de l’image en termes de caractéristiques par zones.
Description de l’image en termes de caractéristique associée à chaque pixel.

En associant à chaque pixel une caractéristique du lapin, nous pouvons raisonner sur un ensemble de caractéristiques plutôt qu’un ensemble de pixels.

L’opération de Pooling

Pour réaliser ses prédictions sur une image, le réseau de neurones n’a pas besoin de connaître tous les pixels qui concernent une information, mais plutôt le “ratio” d’importance et la localisation de celle-ci. Par exemple la grande quantité de pixels “patte” ou “fourrure” ne sont pas nécessaires. Pour réduire ceci, nous utilisons l’opération de Max Pooling. C’est un sous-échantillonnage. Elle consiste à réduire la dimension de l’image tout en conservant l’information la plus importante. Comme le montre l’exemple suivant, l’image est découpée en “tuiles” de 2x2 pixels dans lesquelles seul le pixel de plus grande valeur est conservé.

Résumé de l’opération Max Pooling, un type de pooling privilégiant les valeurs maximales. (source: O’Reilly Media)

En supposant que nous sachions quantifier l’importance des caractéristiques du lapin par rapport aux autres, prenons un exemple avec une fenêtre de taille 2x2 :

Deux étapes de pooling avec un rectangle de taille 2x2.

En enchaînant deux Max Pooling l’image 32x32 est transformée en 8x8, soit 16 fois moins d’informations.

Pour résumer, nous prenons une image que nous analysons en caractéristiques puis que nous simplifions. Nous la donnons ensuite sous forme numérique à notre réseau de neurones qui en déduit une analyse.

Résumé schématique du réseau de convolution.

Nous venons de décrire exactement un réseau de neurones de convolutions. Ce type de réseau n’est en fait qu’un réseau de neurones classique précédé d’une phase de mise en valeur des caractéristiques de l’image. Maintenant, comment passer de l’image aux caractéristiques ?

La décomposition en caractéristiques

A titre d’exemple, nous allons voir comment traduire les pixels de l’oreille du lapin en caractéristique “oreille”. Nous obtiendrons une carte de caractéristiques qui contiendra la caractéristique “oreille”.

Nous allons décrire comment nous souhaiterions que notre traitement se passe, et ce qu’il créerait. Commençons par une première analyse qui va faire ressortir les caractéristiques basiques. Ces caractéristiques sont les plus primaires et décrivent très simplement l’image. Par exemple : le fond, les bords, les couleurs unies.

Première passe d’analyse de caractéristiques avec des Bords Haut (BH), Gauche (BG), Droit (BD), et de la couleur Unie (U). Puis une phase de Pooling.

L’analyse met en corrélation des pixels proches pour obtenir des caractéristiques. Par exemple, des pixels adjacents à la frontière entre deux couleurs très différentes sont interprétables en tant que “bord”. En continuant, nous allons mettre en corrélation des caractéristiques proches pour en déterminer de nouvelles plus complexes. De fait, les ensembles de bords forment des contours, l’ensemble de couleur unie forme un intérieur, …Nous interposons des phases de Pooling qui nous permettent de simplifier le trop-plein d’informations.

Nouvelle phase d’analyse permettant de faire ressortir Contours (C) et Intérieurs (I).
Suite et fin de l’analyse avec la mise en évidence de la caractéristique Oreille (O).

À la fin de notre traitement, nous arrivons à une caractéristique complexe proche de notre conception humaine.

La caractéristique “Oreille” est en vérité l’assemblage de toutes les caractéristiques à des niveaux d’analyses différents. En effet elle est le résultat des caractéristiques “Contours” et “Intérieurs”, avec la caractéristique “Contours” étant elle aussi résultat des caractéristiques “Bords Droit, Gauche et Haut”, elles-mêmes venant de la première analyse des pixels. On part donc d’un ensemble de caractéristiques très simples relevant des pixels même pour arriver à une ou plusieurs caractéristiques bien plus complexe. Chaque caractéristique est issue d’un ensemble de sous-caractéristiques, dont la racine est le pixel.

Résumé de la hiérarchie d’établissement de la caractéristique Oreille

Le produit de convolution

Tout ce que nous venons de voir va être résumé ici grâce à une opération très simple qui est le support de l’ensemble de ces transformations.

Exemple de kernel de convolution (de taille 3x3)

L’opération de convolution consiste à appliquer un filtre sur une image. Le filtre est une petite matrice de taille variable (3x3, 5x5, 9x9, …) appelée “kernel” (ou “kernel de convolution”).

Nous appliquons ce kernel sur chaque portion de l’image comme si elle représentait une fenêtre que l’on déplaçait sur chacun des pixels. L’application fonctionne de la même manière que le Pooling (la seule différence est dans la quantité de pixels de décalage de la fenêtre au cours de son déplacement).

Exemple d’application d’un kernel de convolution (en bleu foncé sur l’ensemble bleu). (source: https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1)

Le kernel positionne son centre sur le pixel que l’on souhaite modifier, et applique un simple produit scalaire entre la fenêtre de l’image induite et le kernel lui-même. On obtient une image de taille légèrement réduite (pour une taille de kernel de 3x3, l’image est logiquement réduite de 1 sur chaque côté, donc de 2 sur chaque axe, voir animation précédente). Le produit scalaire entre ces deux parties a la propriété d’être maximal lorsque les deux sont identiques.

Exemple d’application d’un kernel de convolution sur une matrice.

Sur l’exemple de l’image ci-contre, notre produit scalaire sera donc :(-1*127)+(0*59)+(1*198)+(-1*97)+(0*150)+(1*230)+(-1*54)+(0*138)+(1*111) = 261

Comme ce sont des couleurs RGB, nos valeurs sont comprises entre 0 et 255 : le résultat 261 se transforme donc en 255. L’emplacement vert dans la nouvelle image n’aura donc plus la valeur 150 mais 255. Nous allons nommer ce kernel “front vers la droite”. Une fois appliqué à l’ensemble de l’image, il donne le résultat ci-dessous :

Examinons la zone de transition fourrure-fond blanc. Les pixels y passent du foncé au clair. Comme le foncé est nul (0) et le clair positif (1), cette transition maximise le produit scalaire avec notre kernel. Nous obtenons donc un résultat positif.

A l’inverse, lorsque nous prenons le passage du clair au foncé, le kernel va maximiser négativement le clair provoquant alors un résultat négatif. Ce dernier étant borné à 0, il donnera une couleur nulle donc noire.

Ce kernel permet de mettre en lumière une propriété de l’image : la présence de changement “brutaux” de couleurs passant du foncé vers le clair. Regardons d’autres kernels …

Résultat du kernel “front vers le haut”
Résultat du kernel “accentuation des détails”

Une infinité de kernels est possible, chacun jouant un rôle précis et différent dans la mise en valeur d’une caractéristique ou l’amélioration d’une image.

Nous venons donc de voir comment la convolution transforme l’image en mettant en valeur certaines de ses composantes : les caractéristiques. L’image résultante est nommée carte de caractéristiques (en anglais feature map).

Comment sont traitées les couleurs ?

Une image RGB peut être considérée en trois dimensions. Elle est composée de trois images en deux dimensions, une pour chaque canal. Chaque sous-image est une couche de profondeur (donnant donc une image globale de dimensions largeur*hauteur*profondeur : 3 dimensions, voir l’image ci-après). Comme l’image à laquelle nous appliquions le kernel était en deux dimensions, notre kernel l’était lui aussi.

Passage de l’application d’un kernel deux dimensions à un kernel trois dimensions.

Pour pouvoir appliquer un kernel sur une image RGB, nous avons besoin d’un kernel pour chaque canal pour les traiter indépendamment. Nous avons donc trois kernels pour une image en couleurs. Plutôt que de les voir comme trois kernels distincts, nous pouvons dire qu’ils ne forment qu’un seul kernel, mais en trois dimensions (comme l’image). Il reste toujours associé à une seule caractéristique.

Chaque couche de profondeur du kernel va faire son produit scalaire avec chaque canal de l’image, et l’opération va toujours se passer de la même manière en faisant la somme des produits terme à terme (y compris entre les sous-kernels). Il en ressort pour chaque application de l’opération une seule valeur, nous faisant donc obtenir en sortie une carte de caractéristique avec une seule couche en profondeur, donc en deux dimensions.

L’objectif est toujours le même : que le kernel (donc ses sous-kernels) ressemble le plus possible à la caractéristique que nous souhaitons mettre en valeur pour que le résultat du produit scalaire des deux soit maximal.

Des cartes de convolutions à une nouvelle caractéristique

Mettons que nous ayons deux cartes de convolutions issues d’une image composée de ronds : “arrondi supérieur à droite” et “arrondi supérieur à gauche”. Pour continuer à analyser, nous voulons mettre en évidence la caractéristique “arc-de-cercle supérieur”. Nous allons donc utiliser un kernel capable d’unifier ces deux caractéristiques.

Ce dernier va fonctionner de la même manière que pour une image RGB. Chaque carte de caractéristique va avoir d’associé un sous-kernel, donnant donc un kernel de profondeur 2. Le kernel produira une carte de caractéristique unifiant les deux précédentes.

L’entrée de notre kernel est une image constituée à partir de l’ensemble des cartes de caractéristiques empilées. Le kernel a alors pour profondeur le nombre de ces cartes. Il est possible de voir une image RGB comme 3 cartes de caractéristiques distinctes, une pour chaque couleur. Chaque sous-kernel a son propre ensemble de valeurs et est indépendant des autres.

Réseaux de neurones de convolutions

Vous l’aurez compris, le nom de ces réseaux vient de l’opération de convolution. Pour le moment nous n’avons vu qu’une seule application de convolution à l’image. Nous allons maintenant chaîner les convolutions pour faire gagner en complexité les caractéristiques.

Commençons avec une première couche “C1” qui prend en entrée l’image et lui applique trois kernels. Chacun produit en sortie une carte de convolutions, et nous nous retrouvons donc avec trois cartes de convolutions en sortie. Chacune met en évidence une caractéristique particulière de l’image.

Première et deuxième couche de convolutions d’un réseau.

Pour la couche suivante, le fonctionnement reste exactement le même que la précédente. Nous avons 3 cartes de caractéristiques formant une image de profondeur 3, que nous faisons passer dans 4 kernels différents. Il y aura donc 4 cartes de convolutions en sortie.

Nous allons continuer ainsi les couches de convolutions, augmentant la complexité des caractéristiques interprétées. Cependant il est possible et même fortement recommandé dans un réseau de convolutions d’ajouter une opération intermédiaire nommée Max Pooling que nous avons déjà entrevue, permettant de réduire la quantité d’information tout en conservant son sens.

Synthèse du réseau de neurones de convolutions

Lorsque nous avons atteint un certain nombre de convolutions et donc de complexité, nous utilisons une opération de Flatten (aplatir) chargée d’agréger les données dans un tableau linéaire. En effet, à force de chaîner les convolutions et les Poolings, nous finissons avec beaucoup de cartes de convolutions de petites tailles. Le Flatten a pour objectif de passer d’un ensemble de matrices à un vecteur, en mettant toutes les valeurs sur le même plan. Nos données optimisées peuvent maintenant être placées en entrée de notre réseau de neurones.

Ensemble formant le réseau de neurones de convolutions (la reconstruction de l’image sur le flatten n’est qu’à but illustratif).

Le réseau de neurones de convolutions est donc en vérité deux réseaux bien distincts. Le premier synthétise l’image, le deuxième se charge d’interpréter les caractéristiques et d’en déduire une analyse.

Qui détermine les valeurs des kernels ?

Il n’y a pas plus simple: le réseau fait tout pour vous. C’est d’ailleurs exactement pour cela qu’on l’appelle réseau de neurones de convolutions, parce que ses convolutions font partie intégrante du réseau de neurones. C’est le réseau qui détermine la valeur des kernels de convolutions.

Chaque valeur de chaque kernel (ainsi que de ses sous-kernels) est en réalité un paramètre du réseau ! Ainsi au début de l’entraînement du réseau les kernels ont tous des valeurs aléatoires.

Puis au fur et à mesure de l’apprentissage chacun des poids s’adapte pour apprendre à faire ressortir les caractéristiques qui permettent au réseau de neurones d’interpréter au mieux l’image. La tâche d’apprentissage est donc double : le réseau doit apprendre à convenablement pré-formater l’image puis à correctement analyser son propre pré-formatage.

Conclusion

Pour résumer, nous venons de voir qu’un réseau de neurones de convolutions se décompose en deux parties : une de mise en évidence des caractéristiques d’une image, l’autre d’analyse et d’interprétation de l’agencement de ces caractéristiques.

Tout ceci est rendu possible grâce à l’opération de convolution, qui permet d’analyser des images et d’en sortir des cartes de caractéristiques, mettant en valeur l’information importante de l’image.

Une fois le réseau de convolution construit, il restera à l’entraîner sur une grande quantité d’images pour qu’il soit capable de reconnaître par exemple des objets de la vie courante. Il pourra même en l’améliorant en reconnaître plusieurs en même temps ainsi que donner leurs emplacements dans une photo !

Détection d’objets par le réseau de convolutions YOLO (v3).

Vous avez aimé cet article ? Cliquez sur 👏 en bas de page pour que d’autres lecteurs puissent le trouver !

--

--