Aller au contenu

Traitement d’images pour la dĂ©tection de tag Aruco đŸŒ± avec OpenCV en Python : 1/4

Généralités

L’objectif de ce cours est de rĂ©soudre le problĂšme de dĂ©tection de tag Aruco embarquĂ© sur un Raspberry Pi. À travers ce cours nous verrons trois notions : le traitement d’image (classique et par IA) et la maniĂšre dont nous pouvons l’utiliser (OpenCV), les tag Aruco ainsi que le principe des API.

Diapositives du cours

Présentation du cours et prérequis

  1. Mardi 15 fĂ©vrier : PrĂ©sentation du cours, introduction au traitement d’image
  2. Mardi 15 mars : Introduction Ă  OpenCV đŸ’»
  3. Mardi 22 mars : DĂ©tection de tag Aruco đŸ’»
  4. Mardi 29 mars : Embarquement sur Raspberry Pi et API đŸ’»

Les cours 2, 3 et 4 nĂ©cessitent d’avoir un environnement Python 3.x installĂ©. Les cours 3 et 4 seront plus simple sous Linux.

Programme du cours

  1. Présentation du cours (30 minutes)
  2. Traitement d’images classique (45 minutes)
  3. Traitement d’images par intelligence artificielle (45 minutes)

AmĂ©liorer l’aspect visuel de vos images

Le traitement d’images dĂ©signe l’ensemble des techniques permettant de modifier une image, souvent dans le but de l’amĂ©liorer. Par exemple, il est possible de la rendre plus lumineuse ou plus nette. Cette discipline se situe Ă  la croisĂ©e des mathĂ©matiques appliquĂ©es et de l’informatique, c’est pourquoi nous nous intĂ©resserons dĂ©sormais Ă  la dĂ©finition d’une image dans ces deux domaines.

ReprĂ©sentation d’une image

Qu’est qu’une image ? Cette question simple admet en rĂ©alitĂ© plusieurs rĂ©ponses, plus ou moins techniques selon le domaine Ă©tudiĂ©. Commençons par donner la rĂ©ponse qui vient naturellement Ă  la majoritĂ© d’entre nous : une image est une reprĂ©sentation visuelle de quelque chose ou de quelqu’un.

Lena, l’exemple canonique du traitement d’images

L’image vue comme une fonction mathĂ©matique

En mathĂ©matiques, une image est une fonction. Cette fonction quantifie l’intensitĂ© lumineuse de n’importe quel point dans l’image. Dans une image en noir et blanc, l’intensitĂ© est le niveau de gris : plus un point est sombre, plus son niveau de gris est fiable.

Dans le cas d’une image en couleurs, l’intensitĂ© d’un point dĂ©signe sa couleur. Celle-ci peut ĂȘtre perçue comme un mĂ©lange de trois couleurs primaires (rouge, vert, bleu). Ainsi, une image ne correspond non plus Ă  une seule fonction, mais Ă  trois : nous associons Ă  chaque point son intensitĂ© de rouge, de vert et de bleu. Ces trois valeurs sont stockĂ©es dans un vecteur colonne de taille trois, de sorte que l’image puisse ĂȘtre reprĂ©sentĂ©e comme une fonction vectorielle.

En traitement d’image, il n’est pas possible de se contenter de dĂ©finir une image comme « quelque chose que l’on voit et qui reprĂ©sente une information ». En effet, comme nous allons le voir, la modification d’une image fait intervenir des opĂ©rations mathĂ©matiques. Celles-ci sont formulĂ©es de maniĂšre beaucoup plus intelligible et prĂ©cise si l’on considĂšre l’objet auquel elles s’appliquent.

L’image numĂ©rique

Le traitement d’images fait intervenir des outils non seulement issus des mathĂ©matiques appliquĂ©es, mais aussi de l’informatique. La dĂ©finition mathĂ©matique d’une image ne convient pas Ă  un ordinateur : des restrictions doivent ĂȘtre imposĂ©es sur les ensembles de dĂ©finition et d’arrivĂ©e de la fonction.

Dans notre dĂ©finition mathĂ©matique, l’abscisse, l’ordonnĂ©e et l’intensitĂ© d’un point donnĂ© de l’image peuvent prendre n’importe quelle valeur rĂ©elle. C’est pourquoi nous parlons de modĂšle continu ou d’image analogique.

Une image en informatique est ainsi une discrĂ©tisation (ou numĂ©risation) de notre modĂšle continu : nous l’appelons image numĂ©rique. Cette discrĂ©tisation se fait Ă  la fois sur l’ensemble de dĂ©finition de la fonction image (Ă©chantillonnage) et sur son ensemble d’arrivĂ©e (quantification)

Une image numĂ©rique est une image Ă©chantillonnĂ©e et quantifiĂ©e. La dĂ©finition formelle d’une image numĂ©rique en noir et blanc est donc la suivante

\(I : \{0,1,…,w-1\} \times \{0,1,…,h-1\} \rightarrow \{0,1,…,255\}\)

L’ordinateur traite une image comme une matrice d’entiers de taille \(h \times w\) contenant les niveaux de gris de ses pixels.

Notons que si cette reprĂ©sentation est la plus courante pour afficher une image, la lire ou l’Ă©crire dans un fichier, nous travaillerons gĂ©nĂ©ralement sur des images sans quantification et nous n’appliquerons la quantification qu’Ă  la fin.

Premiers traitements d’images

Nous abordons ici les techniques de traitement d’images basĂ©es sur la modification d’histogrammes. Ces mĂ©thodes font partie de la classe des traitements dits ponctuels : la valeur de chaque pixel est corrigĂ©e, et ce, indĂ©pendamment des autres pixels.

Manipulation d’histogrammes

L’histogramme d’une image numĂ©rique est une courbe statistique reprĂ©sentant la rĂ©partition de ses pixels selon leur intensitĂ©. Pour une image en noir et blanc, il indique en abscisse le niveau de gris (entier entre 0 et 255) et en ordonnĂ©e, le nombre de pixels ayant cette valeur.

Lorsque l’histogramme est normalisĂ©, il indique en ordonnĂ©e la probabilitĂ© \(p_i\) de trouver un pixel de niveau de gris \(i\) dans l’image. L’intensitĂ© d’un pixel est alors vue comme une variable alĂ©atoire discrĂšte. Un histogramme cumulĂ© normalisĂ© calcule le pourcentage de pixels ayant une valeur infĂ©rieure Ă  un niveau de gris donnĂ©.

import cv2
import matplotlib.pyplot as plt
# load simba image
simba = cv2.imread('data/simba.png', cv2.IMREAD_GRAYSCALE)
# compute hist of simba.png
hist = cv2.calcHist([simba], [0], None, [256], [0, 256])
f, plot = plt.subplots(1, 2)
plot[0].imshow(simba, cmap='gray')
plot[1].plot(hist)
plt.show()
L’image et son histogramme

Il s’agit d’un outil trĂšs important en traitement d’images, car sa modification permet d’ajuster la dynamique des niveaux de gris ou des couleurs dans une image afin de la rendre plus agrĂ©able visuellement. GrossiĂšrement, Ă  gauche se situent les pixels noirs et Ă  droite les pixels blancs.

Une premiĂšre application consiste Ă  corriger la luminositĂ© ou exposition, de l’image. Analysons la forme des histogrammes pour des images dont l’exposition est mauvaise

Vous pouvez constater que pour l’image trop sombre, ou sous-exposĂ©e, la majoritĂ© des pixels se situent dans la partie gauche de l’histogramme, vers les valeurs de niveaux de gris faibles.

En revanche, l’histogramme associĂ© Ă  l’image dont l’exposition est relativement bonne prĂ©sente une rĂ©partition des pixels sur tout l’intervalle. Ainsi pour corriger les dĂ©fauts liĂ©s Ă  l’exposition d’une image, il suffit d’Ă©tirer son histogramme.

Cette transformation se fait simplement Ă  l’aide de la rĂšgle de trois : la valeur de chaque pixel est remplacĂ©e par le rĂ©sultat de la formule ci-dessous.

\(I'(x,y) = \frac{255 \times (I(x,y) – I_{min})}{I_{max}-I_{min}}\)

La deuxiĂšme application courante concerne l’amĂ©lioration du contraste de l’image.

Le contraste caractĂ©rise la rĂ©partition de lumiĂšre dans une image : plus une image est contrastĂ©e, plus la diffĂ©rence de luminositĂ© entre ses zones claires et sombres est importante. En gĂ©nĂ©ral, une image peu contrastĂ©e est terne, tandis qu’une image trop contrastĂ©e est visuellement « agressive ». Dans les deux cas, l’image manque de clartĂ© car certains de ses dĂ©tails seront peu, voir pas du tout, visibles.

L’Ă©galisation d’histogrammes est une technique simple permettant de rĂ©ajuster le contraste d’une image et ainsi de lui redonner du peps ou de l’adoucir. Pour comprendre de maniĂšre intuitive le fonctionnement de ce traitement, Ă©tudions l’allure de l’histogramme pour des images peu ou trop contrastĂ©es.

Notre image avec peu de contraste et son histogramme
Notre image avec trop de contraste et son histogramme

Comme nous pouvons le constater, les pixels des images dont le contraste est mauvais se rĂ©partissent dans tout l’intervalle disponible, donc un Ă©tirement d’histogramme n’amĂ©liora rien, mais pas de maniĂšre Ă©quitable.

L’objectif est donc d’harmoniser la distribution des niveaux de gris de l’image, de sorte que chaque niveau de l’histogramme contienne idĂ©alement le mĂȘme nombre de pixels. ConcrĂštement, nous essyons d’aplatir au maximum l’histogramme original.

Pour cela nous calculons d’abord l’histogramme cumulĂ© normalisĂ© de l’image, puis nous ajustons la valeurs de chaque pixel en utilisant la formule mathĂ©matique suivante :

\(I'(x,y) = 255 \times \sum \limits_{i=0}^{I(x,y)} p_i\)

oĂč \(p_i\) dĂ©signe la probabilitĂ© qu’un pixel de l’image initiale soit d’intensitĂ© \(i\).

L’Ă©galisation d’histogramme se fait avec la fonction cv2.equalizeHist du module OpenCV en python.

Élimination du bruit

La qualitĂ© d’une photo peut Ă©galement ĂȘtre dĂ©gradĂ©e par du bruit numĂ©rique, c’est-Ă -dire par l’apparition alĂ©atoire de grains superflus. Il s’agit d’un phĂ©nomĂšne courant en photographie numĂ©rique, dĂ» Ă  un mauvais rĂ©glage de la sensibilitĂ© des capteurs de l’appareil photo, ou Ă  une limitation de leurs capacitĂ©s.

Le bruit peut ĂȘtre vu comme une image constituĂ©e de pixels dont les intensitĂ©s ont Ă©tĂ© dĂ©terminĂ©es de maniĂšre alĂ©atoire.

Une image Ă©tant dĂ©finie soit comme une fonction, soit comme une matrice, nous pouvons appliquer des opĂ©rations mathĂ©matiques usuelles, comme l’addition. Ainsi, nous parlons de bruit additif lorsque l’image bruitĂ©e est la somme de l’image originale et du bruit.

Un exemple trÚs classique du bruit additif est le bruit gaussien, pour lequel les intensités sont choisies aléatoirement selon une loi normale.

Filtrer une image

Le filtrage constitue un volet important en traitement d’images, et un de ses objectifs principaux est de nettoyer l’image en Ă©liminant le plus de bruit possible. Dans ce chapitre, nous allons nous intĂ©resser davantage Ă  cette classe de mĂ©thodes, et en particulier Ă  la notion de filtre linĂ©aire

Les filtres linéaires

Il existe diffĂ©rentes techniques de filtrage selon le type de bruit Ă  attĂ©nuer. Le lissage par moyennage utilise un filtre linĂ©aire et fait partie, en ce sens, de la classe de filtrage la plus simple.

En traitement d’images, et mĂȘme plus gĂ©nĂ©ralement en traitement du signal, un filtre linĂ©aire est un systĂšme qui transforme une image en utilisant un opĂ©rateur linĂ©aire. Il s’agit gĂ©nĂ©ralement d’un traitement local.

Une propriĂ©tĂ© importante d’un filtre linĂ©aire est l’invariance par translation : la modification d’un pixel dĂ©pend de son voisinage, et non de sa position dans l’image.

Le lissage par moyennage utilise bien un filtre linĂ©aire, appelĂ© filtre moyenneur. En effet, l’opĂ©ration appliquĂ©e Ă  l’image initiale de reprĂ©sentation matricielle X pour obtenir l’image dĂ©bruitĂ©e Y est composĂ©e d’additions et d’une division.

L’opĂ©rateur de convolution

Un filtre linĂ©aire remplace la valeur de chaque pixel en entrĂ©e par une combinaison linĂ©aire des intensitĂ©s de ses pixels voisins. L’opĂ©rateur permettant d’effectuer cette transformation est appelĂ© produit de convolution. C’est pourquoi l’application d’un filtre linĂ©aire est Ă©galement connue sous le terme de filtrage par convolution

En notant \(\ast\) l’opĂ©rateur de convolution, la relation mathĂ©matique entre l’image initiale X et l’image filtrĂ©e Y pour tout type de filtre linĂ©aire s’Ă©crit \(Y=H\ast X \).  Cela revient Ă  modifier la valeur de chaque pixel de la maniĂšre suivante :

\(Y_{ij} = \sum \limits_{u=_k}^k \sum \limits_{v = -k}^k H_{u,v} X_{i-u, j-v}\)

\(H\) est le noyau de convolution : il s’agit d’une matrice carrĂ©e de taille impaire qui cractĂ©rise le filtre linĂ©aire appliquĂ©.

Pour les bords de l’image, nous appliquons une convolution partielle avec les pixels voisins disponibles. Dans tous les cas, il est prĂ©fĂ©rable de ne pas rĂ©duire la taille de l’image.

DĂ©tecter et dĂ©crire efficacement les zones d’intĂ©rĂȘts dans une image

Si vous tapez « Tour Eiffel » dans votre moteur de recherche d’images prĂ©fĂ©rĂ©, vous constaterez que les rĂ©sultats reprĂ©sentent la mĂȘme scĂšne, mais de maniĂšres diffĂ©rentes. Beaucoup d’Ă©lĂ©ments peuvent varier d’une photo Ă  une autre :

  • La prise de vue (rĂ©sultat d’une transformation affine ou d’une projection)
  • L’orientation (rĂ©sultat d’une rotation)
  • L’Ă©chelle (rĂ©sultat d’un zoom)
  • Les propriĂ©tĂ©s photomĂ©triques : la luminositĂ© et/ou le contraste (variations dues aux moments diffĂ©rents de la journĂ©e, mĂ©tĂ©o, flash…)
  • Occlusion : une partie de l’image est cachĂ©e
  • Background clutter : une partie de l’image se confond avec les Ă©lĂ©ments en arriĂšre-plan

Notion de point d’intĂ©rĂȘts

Dans la premiĂšre partie de ce cours, nous avions Ă©tudiĂ© diffĂ©rentes techniques permettant de transformer une image en une autre. Parmi elles, il y avait les transformations gĂ©omĂ©triques, qui modifient la position des pixels, et les manipulations d’histogrammes, qui corrigent la luminositĂ© et le contraste.

Deux images d’une mĂȘme classe, c’est-Ă -dire qui reprĂ©sentent la mĂȘme chose, sont donc liĂ©es par une transformation. Cependant, la caractĂ©risation prĂ©cise de cette transformation nous est inconnue.

Comment dĂ©terminer la transformation qui permet de passer d’une image Ă  une autre ? 

Il s’agit en fait d’un problĂšme classique en vision par ordinateur, appelĂ© image matching. Les applications sont nombreuses : parmi elles, la crĂ©ation de panoramas, la dĂ©tection d’images similaires Ă  une autre (visual search), ou encore la reconnaissance d’objets dans une image (object recognition).

Au lieu de chercher Ă  dĂ©terminer l’Ă©quation mathĂ©matique prĂ©cise de la transformation comme dans la partie prĂ©cĂ©dente, la stratĂ©gie consiste Ă  trouver les Ă©lĂ©ments communs aux deux images. La problĂ©matique est alors reformulĂ©e ainsi :

Quels sont les Ă©lĂ©ments caractĂ©ristiques de l’image 1 ? Les retrouve-t-on dans l’image 2 ?  

Cette tĂąche est plus ou moins triviale pour notre cerveau, mais difficile pour un ordinateur : celui-ci doit parvenir Ă  dĂ©crire la particularitĂ© d’une classe d’images, et ce, en dĂ©pit de toutes les variations possibles listĂ©es plus haut.

Le template matching avec les filtres

Dans la partie prĂ©cĂ©dente, nous avons dĂ©couvert les filtres comme des outils capables de rĂ©duire le bruit dans une image. En fait, les filtres sont Ă©galement souvent utilisĂ©s pour retrouver des motifs particuliers dans une image. Ces motifs sont reprĂ©sentĂ©s par de petites images, appelĂ©es templates. La tĂąche de template matching a pour but de retrouver des templates dans une image.

Le template matching rĂ©alisĂ© avec des filtres utilise l’opĂ©rateur de corrĂ©lation croisĂ©e (cross-correlation), notĂ© \(\otimes\) . Cet opĂ©rateur transforme l’image de reprĂ©sentation matricielle X en une nouvelle image Y de la façon suivante :

\(Y_{ij} = \sum \limits_{u = -k}^k \sum \limits_{v = -k}^k H_{u,v} X_{i+u, j+v}\)

Dans ce contexte, H est une petite image reprĂ©sentant le template Ă  retrouver. ConcrĂštement, cette opĂ©ration revient Ă  faire glisser H sur l’image X, Ă  multiplier les pixels qui se superposent et Ă  sommer ces produits.

Ainsi, le template matching consiste Ă  calculer la corrĂ©lation croisĂ©e entre une image  X et un filtre dont le noyau H reprĂ©sente un template que l’on souhaite retrouver dans X.

La nouvelle image Y, appelĂ©e carte de corrĂ©lation, nous indique oĂč le template a Ă©tĂ© dĂ©tectĂ© : plus une rĂ©gion est claire (d’intensitĂ©s Ă©levĂ©es), plus elle ressemble au template recherchĂ©.

Les features, ou zones d’intĂ©rĂȘt d’une image

En vision par ordinateur, le terme de (local) features dĂ©signe des zones intĂ©ressantes de l’image numĂ©rique. Ces zones peuvent correspondre Ă  des contours, des points ou des rĂ©gions d’intĂ©rĂȘt. A chaque feature dĂ©tectĂ©e est associĂ© un vecteur, appelĂ© descripteur (feature descriptor ou feature vector), qui, comme son nom l’indique, dĂ©crit la zone concernĂ©e.

La rĂ©solution du problĂšme d’image matching se fait alors en deux Ă©tapes :

  1. DĂ©tecter et dĂ©crire les features dans chaque image
  2. Trouver les paires de features qui se correspondent dans les deux images (features matching)
Exemple d’image matching. Les features sont repĂ©rĂ©es par les ronds.

L’algorithme d’image matching Ă©tudie des images caractĂ©risĂ©es par leurs features, donc la qualitĂ© des rĂ©sultats dĂ©pend (entre autres) de la pertinence des features dĂ©tectĂ©es. En ce sens, la premiĂšre Ă©tape est fondamentale et ne doit en aucun cas ĂȘtre nĂ©gligĂ©e. 

Un mauvais choix de features peut entraĂźner plusieurs difficultĂ©s dans l’Ă©tape de matching features :

  • ProblĂšme 1 : deux images n’ont pas les mĂȘmes features alors qu’elles reprĂ©sentent la mĂȘme chose de maniĂšres diffĂ©rentes
  • ProblĂšme 2 : ces deux images prĂ©sentent les mĂȘmes features, mais trouver les paires qui se correspondent est trĂšs difficile

Ces deux problĂšmes rendent le matching impossible et doivent donc ĂȘtre anticipĂ©s dĂšs la premiĂšre Ă©tape, lors de la dĂ©tection et la description de features. Cela nous amĂšne Ă  la question suivante : quelles features  faut-il sĂ©lectionner ?

  1. RĂ©pĂ©table : une feature doit se retrouver dans les images reprĂ©sentant la mĂȘme scĂšne malgrĂ© les diffĂ©rences gĂ©omĂ©triques et photomĂ©triques. Une feature doit donc prĂ©senter des propriĂ©tĂ©s d’invariance Ă  ces transformations.
  2. Distinctive : une feature  doit ĂȘtre suffisamment unique et non ambiguĂ« au sein d’une image pour faciliter le matching. Ce sont les informations contenues dans son descripteur qui doit mettre en valeur sa particularitĂ©.  
  3. Locale : une feature doit correspondre Ă  une zone suffisamment petite, et elle est dĂ©crite selon son voisinage uniquement. Cela permet d’Ă©viter les difficultĂ©s de matching dues aux phĂ©nomĂšnes d’occlusion et de background clutter.

En rĂ©sumĂ©, une bonne feature doit ĂȘtre suffisamment unique pour pouvoir diffĂ©rencier deux classes d’images diffĂ©rentes, et suffisamment gĂ©nĂ©rique pour pouvoir reconnaĂźtre facilement les images d’une mĂȘme classe malgrĂ© la diversitĂ© des reprĂ©sentations.

DĂ©tection des coins et des bords d’une images

Dans ce chapitre, nous expliquerons deux mĂ©thodes couramment utilisĂ©es pour dĂ©tecter des features classiques : le filtre de Canny pour les bords, puis le dĂ©tecteur de Harris-Stephens pour les coins. Pour cela, nous devons dans un premier temps Ă©tudier la notion de gradient d’une image.

La détection des bords avec le filtre Canny

Les bords ou contours (edges en anglais) fournissent beaucoup d’information Ă  propos d’une image : ils dĂ©limitent les objets prĂ©sents dans la scĂšne reprĂ©sentĂ©e, les ombres ou encore les diffĂ©rentes textures.

Un moyen pour dĂ©tecter les bords serait de segmenter l’image en objets, mais il s’agit d’un problĂšme difficile. Le filtre de Canny dĂ©veloppĂ© en 1986 est une solution plus simple, qui repose sur l’Ă©tude du gradient.

Les bords se situent dans les rĂ©gions de l’image qui prĂ©sentent de forts changements. En effet, les contours des objets correspondent Ă  des changements de profondeur (on passe d’un objet Ă  un autre situĂ© en arriĂšre-plan), et les ombres et diffĂ©rentes textures Ă  des changements d’illumination.

MathĂ©matiquement, la dĂ©tection des bords revient donc Ă  chercher les points de l’image oĂč la fonction d’intensitĂ© II varie brusquement. Or, nous savons qu’une amplitude du gradient Ă©levĂ©e indique un fort changement d’intensitĂ©. Le but est de chercher les maxima locaux de \(||\nabla I||\).

La méthode de détection des bords par le filtre de Canny comporte quatre étapes :

Etape 1. RĂ©duction du bruit

Le bruit de l’image peut nous induire en erreur : les pixels aux valeurs aberrantes provoquent des forts changements d’intensitĂ© alors qu’ils n’appartiennent Ă  aucun contour.

L’image doit donc ĂȘtre dĂ©bruitĂ©e au prĂ©alable avec un filtre adaptĂ©. Comme Ă©tudiĂ© dans la premiĂšre partie du cours, on utilisera un filtre gaussien pour Ă©liminer le bruit additif, et un filtre mĂ©dian pour le « poivre et sel » (trĂšs rare).

Etape 2. Calcul du gradient de l’image

Le gradient de l’image dĂ©bruitĂ©e est approximĂ© par filtrage de convolution, le plus souvent avec les masques de Sobel.

Nous calculons ensuite l’amplitude et la direction du gradient en tout point de l’image

Les bords sont repérés par les points de forte amplitude.

Etape 3. Suppression des non-maxima

Les bords trouvĂ©s Ă  l’Ă©tape prĂ©cĂ©dente sont trop Ă©pais. Pour les rendre plus prĂ©cis, nous ne sĂ©lectionnons que les points pour lesquels l’amplitude du gradient est localement maximale dans sa direction.

Pour cela, on quantifie Î˜ et on trouve les deux voisins de chaque pixel en suivant la direction de son gradient. 

Quantification de l'angle de la direction du gradient
Quantification de l’angle de la direction du gradient

Le pixel courant est retenu que si son amplitude est plus grande que celles de ses deux voisins.

Etape 4. Seuillage

Parmi les points sĂ©lectionnĂ©s dans l’Ă©tape prĂ©cĂ©dente, nous ne retenons finalement que ceux dont l’amplitude du gradient est supĂ©rieure Ă  un certain seuil.

Il est difficile de choisir la valeur d’un « bon » seuil. C’est pourquoi on privilĂ©gie le seuillage par hystĂ©rĂ©sis, qui utilise deux seuils, notĂ©s \(s_{bas}\) et \(s_{haut}\)

Ce dĂ©tecteur est facile Ă  mettre en oeuvre, mais prĂ©sente deux limitations majeures :

  • Le choix des paramĂštres (variance du filtre gaussien et les deux seuils). Ils ont un impact trĂšs important sur le temps de calcul et la qualitĂ© des rĂ©sultats, mais il n’existe pas de mĂ©thode automatique pour dĂ©terminer les meilleures valeurs pour chaque image…
  • Les bords dĂ©tectĂ©s sont des points et pas des courbes, et il est difficile de Â«Â chaĂźner » les points.

La localisation des coins avec le dĂ©tecteur de Harris-Stephens

Les coins (corners en anglais) sont d’autres features riches en informations. Ils se situent dans les rĂ©gions oĂč l’intensitĂ© varie fortement dans au moins deux directions :

Exemple de coin. On voit bien que l'intensité varie brutalement dans plusieurs directions (vers le haut et vers la gauche)
Exemple de coin. On voit bien que l’intensitĂ© varie brutalement dans plusieurs directions (vers le haut et vers la gauche)

Le dĂ©tecteur de Harris-Stephens, dĂ©veloppĂ© en 1988, est une technique trĂšs populaire permettant de repĂ©rer les coins dans une image. Il est basĂ© sur le dĂ©tecteur de Moravec, qui exploite le gradient. 

Le dĂ©tecteur de Moravec permet de dĂ©terminer les changements d’intensitĂ© autour d’un pixel donnĂ©.

L’idĂ©e est de considĂ©rer un voisinage centrĂ© en ce pixel de le dĂ©caler lĂ©gĂšrement dans plusieurs directions, puis de calculer pour chaque dĂ©placement la variation d’intensitĂ©. Cela se traduit mathĂ©matiquement par la fonction suivante :

\(E_{m,n}(u,v) = \sum\limits_{(x,y) \in W_{m,n}} [I(x+u, y+v) – I(x,y)]^2\)

Nous appliquons cette fonction dans les trois situations principales ci-dessous :

DĂ©tecteur de Moravec
DĂ©tecteur de Moravec

Situation 1 : la zone contient un coin, l’intensitĂ© change brusquement dans plusieurs directions, donc la fonction E prend de fortes valeurs dans ces directions

Situation 2 : la zone contient un contour, l’intensitĂ© change brusquement si on se dĂ©place horizontalement et trĂšs peu verticalement. Ainsi, E prend de fortes valeurs si on dĂ©place perpendiculairement au contour, et des faibles pour des dĂ©placements le long du contour. 

Situation 3 : pas de changement d’intensitĂ© : la rĂ©gion est uniforme. E prend alors de faibles valeurs dans toutes les directions 

Le pixel \((m,n)\) correspond Ă  un coin si la plus petite variation d’intensitĂ© autour de lui est maximale par rapport Ă  celle des autres pixels.

Le dĂ©tecteur de Harris-Stephens est une amĂ©lioration du dĂ©tecteur de Moravec. Il apporte trois modifications majeures : 

  1. La fenĂȘtre carrĂ©e \(W_{m,n}\) centrĂ©e en \((m,n)\) est remplacĂ©e par une fenĂȘtre gaussienne.
  2. \(I(x+u, y+v)\) est approximé par un développement de Taylor au voisinage de \((x,y)\)
  3. Les coins sont détectés selon un nouveau critÚre : les valeurs propres $\latex \lambda_1$ et $\latex \lambda_2$ de $M$
DĂ©tection des coins en fonction des valeurs propres
DĂ©tection des coins en fonction des valeurs propres

Trouver les valeurs propres de M peut ĂȘtre fastidieux. Une alternative consiste alors Ă  analyser les valeurs de l’opĂ©rateur R :  \(R = det(M) – k.trace(M)^2\) avec \(k\) une constante choisie entre 0.04 et 0.06

DĂ©tection des coins en fonction de la valeur de R
DĂ©tection des coins en fonction de la valeur de R

La dĂ©tection des coins avec le dĂ©tecteur de Harris-Stephens se fait donc en quatre Ă©tapes :

Etape 1. Calcul de la matrice pour chaque pixel. Les dĂ©rivĂ©es partielles sont approximĂ©es en filtrant l’image par convolution avec les masques de Sobel

Etape 2. Calcul de R pour chaque pixel

Etape 3. Seuillage de ROn sĂ©lectionne les pixels pour lesquels \(R>s\) , oĂč s est un seuil Ă  choisir

Etape 4. Suppression des non-maxima de R. Les coins correspondent aux maxima locaux de R : pour les trouver, on applique aux pixels sĂ©lectionnĂ©s la mĂ©thode dĂ©crite dans l’Ă©tape 3 du filtre de Canny

Utiliser les points d’intĂ©rĂȘts pour classifier une image

La classification d’images est un problĂšme fondamental en vision par ordinateur, qui a de nombreuses applications concrĂštes. Le but est de construire un systĂšme capable d’assigner correctement une catĂ©gorie Ă  n’importe quelle image en entrĂ©e. Un tel systĂšme exploite des algorithmes de Machine Learning issus de l’apprentissage supervisĂ©.  

La méthode de résolution

Le problĂšme de classification d’images est posĂ© formellement de la maniĂšre suivante :

  • Il y a K classes d’images possibles. L’ensemble \({0,1,…,K−1}\) dĂ©finit les labels des diffĂ©rentes classes (exemple : 0 = « oiseau » et 1 = « chien »)
  • Nous avons une collection de N images en entrĂ©e : \({X_i}_{i \in {1,…,N}}\)
  • Les classes des N images sont connues Ă  l’avance : chaque image Xi est Ă©tiquetĂ©e par \(y_i \in {0,1,…,K−1}\)
  • Le but est de classifier correctement une nouvelle image, dont on ne connaĂźt pas la classe : on veut trouver la bonne Ă©tiquette yâ€Č de Xâ€Č

Le schéma ci-dessous illustre la méthode utilisée pour résoudre ce problÚme :

Les trois Ă©tapes d'un algorithme de classification d'images
Les trois Ă©tapes d’un algorithme de classification d’images

CrĂ©ation des bag-of-features

Comme son nom l’indique, un bag-of-features reprĂ©sente une image par un « sac » dans lequel on a mis ses features en vrac. MathĂ©matiquement, c’est un vecteur crĂ©Ă© en deux temps : d’abord, on crĂ©e les Â«Â visual words », puis on construit un histogramme. 

CrĂ©ation des visual words

Le bag-of-words caractĂ©rise un document textuel par les mots qu’il a utilisĂ©s. Ici, les images sont caractĂ©risĂ©es par les features trouvĂ©es lors de l’Ă©tape 1. 

NĂ©anmoins, s’il est possible de retrouver plusieurs mots strictement identiques dans deux documents, ce n’est pas le cas pour les images et les features. En effet, le critĂšre de rĂ©pĂ©tabilitĂ© nous dit qu’une feature peut se retrouver dans plusieurs images, mais les features sont toutes diffĂ©rentes lorsqu’on les compare pixel par pixel. Cela s’explique par les variations gĂ©omĂ©triques, photomĂ©triques, ou mĂȘmes dues aux apparences diffĂ©rentes d’un objet d’une classe (exemple : il y a plusieurs types d’oiseaux).

Ainsi, on obtient beaucoup de features, mais certaines reprĂ©sentent un mĂȘme Ă©lĂ©ment de façons diffĂ©rentes. Ces Ă©lĂ©ments qui se dĂ©clinent en plusieurs versions sont appelĂ©es des visual words. par analogie avec les donnĂ©es textuelles : les textes sont caractĂ©risĂ©s par des mots, et les images par des mots visuels. 

Exemple de visual words. Chaque ligne représente plusieurs features représentatives d'un visual word (exemple : premiÚre ligne = aile d'avion)
Exemple de visual words. Chaque ligne reprĂ©sente plusieurs features reprĂ©sentatives d’un visual word (exemple : premiĂšre ligne = aile d’avion)

Pour crĂ©er le « dictionnaire » de visual words, il suffit d’appliquer un algorithme de clustering aux descripteurs de features construits Ă  l’Ă©tape 1, comme le k-means. Les visual words correspondent alors aux centres des clusters trouvĂ©s.

Création des visual words par clustering des descripteurs
Création des visual words par clustering des descripteurs
Construction de l’histogramme

Il reste Ă  dĂ©crire les images en fonction de ces visual words. Pour chaque image, on crĂ©e un histogramme qui indique la frĂ©quence d’apparition de chaque visual word dans l’image :

Une image et son histogramme indiquant la fréquence d'apparition de chaque visual word
Une image et son histogramme indiquant la frĂ©quence d’apparition de chaque visual word

Finalement, le bag-of-features d’une image est le vecteur dans lequel on a stockĂ© les valeurs de l’histogramme et qu’on a normalisĂ© (en divisant par la norme euclidienne). 

Classification supervisée

C’est la derniĂšre Ă©tape de notre mĂ©thode de rĂ©solution : l’objectif est d’apprendre les rĂšgles de dĂ©cision permettant d’assigner correctement une reprĂ©sentation bag-of-features Ă  une classe. Cela signifie qu’on va entraĂźner un algorithme d’apprentissage supervisĂ© sur les bag-of-features construits Ă  l’Ă©tape 2. 

  1. plus proches voisins (k-NN)
  2. RĂ©gression logistique
  3. SVM (2 classes)
  4. SVM (multi-classes)
  5. SVM Ă  noyau

Classifier des images Ă  l’aide de rĂ©seaux de neurones convolutifs

Dans la partie prĂ©cĂ©dente, nous avons Ă©tudiĂ© la notion de features en vision et les mĂ©thodes traditionnellement utilisĂ©es pour faire de la classification d’images. Celles-ci consistent Ă  extraire les features de chaque image du jeu de donnĂ©es, puis Ă  entraĂźner un classifieur sur ces features

Ces techniques d’apprentissage supervisĂ© peuvent fournir de trĂšs bons rĂ©sultats et leur performance dĂ©pend fortement de la qualitĂ© des features prĂ©alablement trouvĂ©e. Il existe plusieurs mĂ©thodes d’extraction et de description de features. L’algorithme SIFT est trĂšs populaire, puisqu’il parvient Ă  dĂ©tecter et Ă  dĂ©crire efficacement des features pertinentes.

En pratique, l’erreur de classification n’est jamais nulle. Les rĂ©sultats peuvent alors ĂȘtre amĂ©liorĂ©s en crĂ©ant de nouvelles mĂ©thodes d’extraction de features, plus adaptĂ©es aux images Ă©tudiĂ©es, ou en utilisant un « meilleur » classifieur. 

Mais en 2012, une rĂ©volution se produit : lors de la compĂ©tition annuelle de vision par ordinateur ILSVRC, un nouvel algorithme de Deep Learning explose les records ! Il s’agit d’un rĂ©seau de neurones convolutif appelĂ© AlexNet. 

DĂ©finition d’un rĂ©seau de neurones convolutif

Les rĂ©seaux de neurones convolutifs ont une mĂ©thodologie similaire Ă  celle des mĂ©thodes traditionnelles d’apprentissage supervisĂ© : ils reçoivent des images en entrĂ©e, dĂ©tectent les features de chacune d’entre elles, puis entraĂźnent un classifieur dessus.

Cependant, les features sont apprises automatiquement ! Les CNN rĂ©alisent eux-mĂȘmes tout le boulot fastidieux d’extraction et description de features : lors de la phase d’entraĂźnement, l’erreur de classification est minimisĂ©e afin d’optimiser les paramĂštres du classifieur ET les features ! De plus, l’architecture spĂ©cifique du rĂ©seau permet d’extraire des features de diffĂ©rentes complexitĂ©s, des plus simples au plus sophistiquĂ©es.  L’extraction et la hiĂ©rarchisation automatiques des features, qui s’adaptent au problĂšme donnĂ©, constituent une des forces des rĂ©seaux de neurones convolutifs : plus besoin d’implĂ©menter un algorithme d’extraction « à la main », comme SIFT ou Harris-Stephens. 

Contrairement aux techniques d’apprentissage supervisĂ©, les rĂ©seaux de neurones convolutifs apprennent les features de chaque image. C’est lĂ  que rĂ©side leur force : les rĂ©seaux font tout le boulot d’extraction de features automatiquement, contrairement aux techniques d’apprentissage  

Aujourd’hui, les rĂ©seaux de neurones convolutifs, aussi appelĂ©s CNN ou ConvNet pour Convolutional Neural Network, sont toujours les modĂšles les plus performants pour la classification d’images. Cette partie leur est donc naturellement consacrĂ©e.

Rappel sur les rĂ©seaux de neurones

Pour bien comprendre les rĂ©seaux de neurones convolutifs, il est important de connaĂźtre les bases des rĂ©seaux de neurones

Les principaux Ă©lĂ©ments Ă  retenir sont les suivants :

  • Un rĂ©seau de neurones est un systĂšme composĂ© de neurones, gĂ©nĂ©ralement rĂ©partis en plusieurs couches connectĂ©es entre elles
  • Un tel systĂšme s’utilise pour rĂ©soudre divers problĂšmes statistiques, mais nous nous intĂ©ressons ici qu’au problĂšme de classification (trĂšs courant). Dans ce cas, le rĂ©seau calcule Ă  partir de l’entrĂ©e un score (ou probabilitĂ©) pour chaque classe. La classe attribuĂ©e Ă  l’objet en entrĂ©e correspond Ă  celle de score le plus Ă©levĂ© 
  • Chaque couche reçoit en entrĂ©e des donnĂ©es et les renvoie transformĂ©es. Pour cela, elle calcule une combinaison linĂ©aire puis applique Ă©ventuellement une fonction non-linĂ©aire, appelĂ©e fonction d’activation. Les coefficients de la combinaison linĂ©aire dĂ©finissent les paramĂštres (ou poids) de la couche
  • Un rĂ©seau de neurones est construit en empilant les couches : la sortie d’une couche correspond Ă  l’entrĂ©e de la suivante.
  • Cet empilement de couches dĂ©finit la sortie finale du rĂ©seau comme le rĂ©sultat d’une fonction diffĂ©rentiable de l’entrĂ©e
  • La derniĂšre couche calcule les probabilitĂ©s finales en utilisant pour fonction d’activation la fonction logistique (classification binaire) ou la fonction softmax (classification multi-classes)
  • Une fonction de perte (loss function) est associĂ©e Ă  la couche finale pour calculer l’erreur de classification. Il s’agit en gĂ©nĂ©ral de l’entropie croisĂ©e
  • Les valeurs des poids des couches sont apprises par rĂ©tropropagation du gradient : on calcule progressivement (pour chaque couche, en partant de la fin du rĂ©seau) les paramĂštres qui minimisent la fonction de perte rĂ©gularisĂ©e. L’optimisation se fait avec une descente du gradient stochastique

Les réseaux de neurones convolutifs

Quelle est la différence entre un réseau de neurones et un réseau de neurones convolutif ?

Les rĂ©seaux de neurones convolutifs dĂ©signent une sous-catĂ©gorie de rĂ©seaux de neurones : ils prĂ©sentent donc toutes les caractĂ©ristiques listĂ©es ci-dessus. Cependant, les CNN sont spĂ©cialement conçus pour traiter des images en entrĂ©e. Leur architecture est alors plus spĂ©cifique : elle est composĂ©e de deux blocs principaux.

Le premier bloc fait la particularitĂ© de ce type de rĂ©seaux de neurones, puisqu’il fonctionne comme un extracteur de features. Pour cela, il effectue du template matching en appliquant des opĂ©rations de filtrage par convolution. La premiĂšre couche filtre l’image avec plusieurs noyaux de convolution, et renvoie des Â«Â feature maps », qui sont ensuite normalisĂ©es (avec une fonction d’activation) et/ou redimensionnĂ©es.

Ce procĂ©dĂ© peut ĂȘtre rĂ©itĂ©rĂ© plusieurs fois : on filtre les features maps obtenues avec de nouveaux noyaux, ce qui nous donne de nouvelles features maps Ă  normaliser et redimensionner, et qu’on peut filtrer Ă  nouveau, et ainsi de suite. Finalement, les valeurs des derniĂšres feature maps sont concatĂ©nĂ©es dans un vecteur. Ce vecteur dĂ©finit la sortie du premier bloc, et l’entrĂ©e du second.

Le second bloc n’est pas caractĂ©ristique d’un CNN : il se retrouve en fait Ă  la fin de tous les rĂ©seaux de neurones utilisĂ©s pour la classification. Les valeurs du vecteur en entrĂ©e sont transformĂ©es (avec plusieurs combinaisons linĂ©aires et fonctions d’activation) pour renvoyer un nouveau vecteur en sortie. Ce dernier vecteur contient autant d’Ă©lĂ©ments qu’il y a de classes : l’Ă©lĂ©ment ii reprĂ©sente la probabilitĂ© que l’image appartienne Ă  la classe ii. Chaque Ă©lĂ©ment est donc compris entre 0 et 1, et la somme de tous vaut 1. Ces probabilitĂ©s sont calculĂ©es par la derniĂšre couche de ce bloc (et donc du rĂ©seau), qui utilise une fonction logistique (classification binaire) ou une fonction softmax (classification multi-classe) comme fonction d’activation.

Comme pour les rĂ©seaux de neurones ordinaires, les paramĂštres des couches sont dĂ©terminĂ©s par rĂ©tropropagation du gradient : l’entropie croisĂ©e est minimisĂ©e lors de la phase d’entraĂźnement. Mais dans le cas des CNN, ces paramĂštres dĂ©signent en particulier les features des images.

Les diffĂ©rents types de couches d’un CNN sont expliquĂ©es dans le chapitre suivant.

DĂ©couvrir les diffĂ©rentes couches d’un CNN

Il existe quatre types de couches pour un rĂ©seau de neurones convolutif : la couche de convolution, la couche de pooling, la couche de correction ReLU et la couche fully-connected. Dans ce chapitre, je vais vous expliquer le fonctionnement de ces diffĂ©rentes couches.

La couche de convolution

La couche de convolution est la composante clĂ© des rĂ©seaux de neurones convolutifs, et constitue toujours au moins leur premiĂšre couche.

Son but est de repĂ©rer la prĂ©sence d’un ensemble de features dans les images reçues en entrĂ©e. Pour cela, on rĂ©alise un filtrage par convolution : le principe est de faire « glisser » une fenĂȘtre reprĂ©sentant la feature sur l’image, et de calculer le produit de convolution entre la feature et chaque portion de l’image balayĂ©e. Une feature est alors vue comme un filtre : les deux termes sont Ă©quivalents dans ce contexte. 

Cette technique est trĂšs proche de celle Ă©tudiĂ©e dans la partie prĂ©cĂ©dente pour faire du template matching : ici, c’est le produit convolution qui est calculĂ©, et non la corrĂ©lation croisĂ©e.

La couche de convolution reçoit donc en entrĂ©e plusieurs images, et calcule la convolution de chacune d’entre elles avec chaque filtre. Les filtres correspondent exactement aux features que l’on souhaite retrouver dans les images. 

On obtient pour chaque paire (image, filtre) une carte d’activation, ou feature map, qui nous indique oĂč se situent les features dans l’image : plus la valeur est Ă©levĂ©e, plus l’endroit correspondant dans l’image ressemble Ă  la feature

 Comment choisir les features ?

Contrairement aux mĂ©thodes traditionnelles, les features ne sont pas prĂ©-dĂ©finies selon un formalisme particulier (par exemple SIFT), mais apprises par le rĂ©seau lors la phase d’entraĂźnement ! Les noyaux des filtres dĂ©signent les poids de la couche de convolution. Ils sont initialisĂ©s puis mis Ă  jour par rĂ©tropropagation du gradient

C’est lĂ  toute la force des rĂ©seaux de neurones convolutifs : ceux-ci sont capables de dĂ©terminer tout seul les Ă©lĂ©ments discriminants d’une image, en s’adaptant au problĂšme posĂ©. Par exemple, si la question est de distinguer les chats des chiens, les features automatiquement dĂ©finies peuvent dĂ©crire la forme des oreilles ou des pattes.  

La couche de pooling

Ce type de couche est souvent placĂ© entre deux couches de convolution : elle reçoit en entrĂ©e plusieurs feature maps, et applique Ă  chacune d’entre elles l’opĂ©ration de pooling

L’opĂ©ration de pooling consiste Ă  rĂ©duire la taille des images, tout en prĂ©servant leurs caractĂ©ristiques importantes.

Pour cela, on dĂ©coupe l’image en cellules rĂ©guliĂšres, puis on garde au sein de chaque cellule la valeur maximale. En pratique, on utilise souvent des cellules carrĂ©es de petite taille pour ne pas perdre trop d’informations. Les choix les plus communs sont des cellules adjacentes de taille 2 Ă—Ă— 2 pixels qui ne se chevauchent pas, ou des cellules de taille 3 Ă—Ă— 3 pixels, distantes les unes des autres d’un pas de 2 pixels (qui se chevauchent donc).

On obtient en sortie le mĂȘme nombre de feature maps qu’en entrĂ©e, mais celles-ci sont bien plus petites.

La couche de pooling permet de rĂ©duire le nombre de paramĂštres et de calculs dans le rĂ©seau. On amĂ©liore ainsi l’efficacitĂ© du rĂ©seau et on Ă©vite le sur-apprentissage.

Les valeurs maximales sont repĂ©rĂ©es de maniĂšre moins exacte dans les feature maps obtenues aprĂšs pooling que dans celles reçues en entrĂ©e – c’est en fait un grand avantage ! En effet, lorsqu’on veut reconnaĂźtre un chien par exemple, ses oreilles n’ont pas besoin d’ĂȘtre localisĂ©es le plus prĂ©cisĂ©ment possible : savoir qu’elles se situent Ă  peu prĂšs Ă  cĂŽtĂ© de la tĂȘte suffit !

Ainsi, la couche de pooling rend le rĂ©seau moins sensible Ă  la position des features : le fait qu’une feature se situe un peu plus en haut ou en bas, ou mĂȘme qu’elle ait une orientation lĂ©gĂšrement diffĂ©rente ne devrait pas provoquer un changement radical dans la classification de l’image.

La couche de correction ReLU

ReLU (Rectified Linear Units) dĂ©signe la fonction rĂ©elle non-linĂ©aire dĂ©finie par ReLU(x)=max(0,x)ReLU(x)=max(0,x).

Allure de la fonction ReLU
Allure de la fonction ReLU

La couche de correction ReLU remplace donc toutes les valeurs nĂ©gatives reçues en entrĂ©es par des zĂ©ros. Elle joue le rĂŽle de fonction d’activation.

La couche fully-connected

La couche fully-connected constitue toujours la derniĂšre couche d’un rĂ©seau de neurones, convolutif ou non â€“ elle n’est donc pas caractĂ©ristique d’un CNN. 

Ce type de couche reçoit un vecteur en entrĂ©e et produit un nouveau vecteur en sortie. Pour cela, elle applique une combinaison linĂ©aire puis Ă©ventuellement une fonction d’activation aux valeurs reçues en entrĂ©e.

La derniĂšre couche fully-connected permet de classifier l’image en entrĂ©e du rĂ©seau : elle renvoie un vecteur de taille NN, oĂč NN est le nombre de classes dans notre problĂšme de classification d’images. Chaque Ă©lĂ©ment du vecteur indique la probabilitĂ© pour l’image en entrĂ©e d’appartenir Ă  une classe. 

Par exemple, si le problĂšme consiste Ă  distinguer les chats des chiens, le vecteur final sera de taille 2 : le premier Ă©lĂ©ment (respectivement, le deuxiĂšme) donne la probabilitĂ© d’appartenir Ă  la classe « chat » (respectivement « chien »). Ainsi, le vecteur [0.90.1][0.90.1] signifie que l’image a 90% de chances de reprĂ©senter un chat. 

Chaque valeur du tableau en entrĂ©e « vote » en faveur d’une classe. Les votes n’ont pas tous la mĂȘme importance : la couche leur accorde des poids qui dĂ©pendent de l’Ă©lĂ©ment du tableau et de la classe.

Pour calculer les probabilitĂ©s, la couche fully-connected multiplie donc chaque Ă©lĂ©ment en entrĂ©e par un poids, fait la somme, puis applique une fonction d’activation (logistique si N=2N=2, softmax si N>2N>2) :

Ce traitement revient Ă  multiplier le vecteur en entrĂ©e par la matrice contenant les poids. Le fait que chaque valeur en entrĂ©e soit connectĂ©e avec toutes les valeurs en sortie explique le terme fully-connected.

Comment connait-on la valeur de ces poids ?

Le rĂ©seau de neurones convolutif apprend les valeurs des poids de la mĂȘme maniĂšre qu’il apprend les filtres de la couche de convolution : lors de phase d’entraĂźnement, par rĂ©tropropagation du gradient.

La couche fully-connected dĂ©termine le lien entre la position des features dans l’image et une classe. En effet, le tableau en entrĂ©e Ă©tant le rĂ©sultat de la couche prĂ©cĂ©dente, il correspond Ă  une carte d’activation pour une feature donnĂ©e : les valeurs Ă©levĂ©es indiquent la localisation (plus ou moins prĂ©cise selon le pooling) de cette feature dans l’image. Si la localisation d’une feature Ă  un certain endroit de l’image est caractĂ©ristique d’une certaine classe, alors on accorde un poids important Ă  la valeur correspondante dans le tableau.

Construire son premier CNN