Extraction des contours d`une image

Transcription

Extraction des contours d`une image
340
Le perceptron multicouche
T RAVAUX P RATIQUES
Chapitre 7
Extraction des contours d’une
image
Un réseau à rétropropagation du signal d’erreur a été étudié comme une
généralisation du perceptron. Il est souvent d’ailleurs appelé le perceptron
multicouche. Il est composé d’une première couche de neurones d’entrée,
d’une ou plusieurs couches de neurones cachés, reliés à la couche précédente
par des connexions modifiables par apprentissage, et d’une couche de sortie,
qui est la seule en contact avec la couche de supervision.
Le but de ce laboratoire est de mettre au point un réseau de neurones qui
décide automatiquement si un pixel dans une image appartient ou non au
contour d’un objet. Autrement dit, il s’agit de construire un réseau de neurones
multicouche qui permettra de transformer une image de niveaux de gris en une
image binaire. Cette opération devrait pouvoir mettre en évidence la structure
de l’image et en extraire les primitives qui nous permettent d’en différencier le
contenu au moyen des contours et arêtes présents dans l’image. Nous
procéderons à un apprentissage supervisé par l’exemple dans lequel le réseau
sera entraîné pour déceler dans des imagettes de 3 × 3 la présence d’une arête
au centre de l’imagette.
PRÉSENTATION DU PROBLÈME
Concevoir un robot capable de se déplacer de façon autonome et de
localiser et reconnaître un objet dans la scène, analyser les images satellite
pour prévoir les secousses sismiques, identifier les ventricules gauche et droite
du coeur, ou détecter les fissures sur la chaussée d’une route ne sont que
quelques exemples impliquant l’extraction de l’information utile d’une image.
La Figure 7.a montre une image d’éclairement lumineux codée en niveaux
de gris (a) et l’information condensée qu’on peut extraire de cette image (b).
L’information condensée ne contient que les primitives de l’image, constituées
dans ce cas des contours des divers objets présents dans la scène. L’analyse des
primitives d’une image permet très souvent d’identifier et de localiser les
divers objets présents sur l’image.
Un ordinateur qui chercherait, par exemple, à localiser l’homme dans
l’image de la fig. 7.a (a) devrait analyser 256 × 256 = 65 536 pixels codés sur 8
Travaux Pratiques
Présentation du problème
341
(a)
Figure 7.a
(b)
L’extraction de l’information utile d’une image.
(a) Image de niveaux de gris,
(b) image binaire des arêtes détectées dans (a).
bits ou 256 niveaux de gris, ce qui représente une quantité prohibitive d’information à traiter. Pour accélérer le traitement, on doit obtenir une représentation
compacte de l’image qui contienne l’information la plus pertinente. Ainsi, on
reconnaît aisément les principaux éléments de la fig 7.a (b), où ne figurent que
les arêtes de l’image originale. On réussit donc à décrire le contenu de l’image
avec les 17 167 pixels noirs, soit 26,2% de l’information initiale. De plus, chaque pixel de l’image des arêtes est codé sur un seul bit (noir ou blanc), ce qui
représente une nette diminution par rapport aux 256 niveaux de gris codés sur 8
bits pour chacun des pixels de l’image d’éclairement.
Principe d’opération
En pratique, il serait peu utile de fournir l’image complète en une seule
passe au réseau : selon ce scénario, pour convertir par exemple une image de
256 × 256 pixels, il faudrait que la couche d’entrée du réseau comporte autant
de neurones. Il serait alors difficile de convertir une image de taille différente,
sans compter le temps d’apprentissage qui serait extrêmement long.
Pour pallier ces inconvénients, nous choisissons de déplacer progressivement une fenêtre de petite taille sur l’image d’éclairement; les valeurs des pixels
342
Le perceptron multicouche
Chapitre 7
dans cette fenêtre seront fournies à l’entrée du réseau, qui devra indiquer si le
pixel central appartient ou non à une arête.
Cette stratégie est illustrée à la fig. 7.b. La « rétine » du réseau est déplacée
successivement sur chaque pixel de l’image d’entrée, de gauche à droite et de
haut en bas. Pour chaque position de cette fenêtre, le réseau classifiera le pixel
au centre du masque; la classe d’appartenance indiquée par le réseau sera alors
attribuée au pixel correspondant de l’image de sortie. Par convention, la sortie
du réseau sera 0 pour un pixel appartenant à une arête, et 1 dans le cas contraire.
Image d’entrée
Figure 7.b
Image de sortie
Balayage de l’image par un réseau de neurones.
La partie grise de l’image de sortie correspond aux
endroits de l’image qui n’ont pas encore été analysés par
le réseau.
Architecture du réseau de neurones
On ne dispose pas encore de règles formelles pour définir l’architecture
exacte d’un réseau perceptron multicouche. C’est à l’utilisateur de trouver
l’architecture la plus adéquate. L’application projetée impose cependant
certaines contraintes :
•
La couche de sortie ne requiert qu’un seul neurone,
puisqu’on veut seulement classifier les pixels en deux
catégories, contour ou non-contour.
•
La couche d’entrée doit contenir n × n neurones,
avec n impair et n 3. Ceci garantit qu’il existe un
pixel au centre du champ récepteur, comme dans le
masque illustré à la fig. 7.b. C’est pour ce pixel
central que le réseau détermine s’il s’agit ou non d’un
Travaux Pratiques
Vue d’ensemble du système
343
pixel de contour à partir des pixels voisins délimités
par le champ récepteur formé par le masque.
Vous devrez choisir vous-même le nombre de couches cachées, et le nombre
de neurones sur chacune d’entre elles. Un exemple de réseau construit avec le
simulateur JavaNNS et comprenant une couche cachée de 6 neurones est illustré
à la fig. 7.c.
Figure 7.c
Réseau de neurones multicouche construit avec JavaNNS.
VUE D’ENSEMBLE DU SYSTÈME
Nous utiliserons JavaNNS pour construire et opérer le réseau neuronique;
cependant, quelques fonctions secondaires devront s’effectuer à l’extérieur de
cet environnement puisque JavaNNS est destiné strictement à la simulation neuronale. Toutes les fonctions MatLab nécessaires sont disponibles sur le site
Internet du livre et sont illustrées schématiquement à la fig. 7.d. Chaque étape
est brièvement commentée par la suite, selon l’ordre chronologique de l’expérimentation.
344
Le perceptron multicouche
Chapitre 7
ImageEntree.tif
ImageDesiree.tif
Choix des données
d’apprentissage
basevect.m
Construction
du réseau
JavaNNS
leopard.tif
campanile.tif
cam.tif
frog.tif
etc
croquis.net
vecteurs.pat
Apprentissage
JavaNNS
Conversion en
fichier JavaNNS
tif2pat
croquis_out.net
Généralisation
JavaNNS
leo.res
Conversion en
fichier image
res2tif
leo_bin.tif
Visualisation
de l’image
MatLab ou Aphelion
Figure 7.d
Structure d’appel des programmes ou fonctions requis.
Chaque bloc de ce diagramme est associé à un programme ou
une fonction, alors que les entrées/sorties correspondent aux
fichiers de données ou images échangés entre les blocs.
Travaux Pratiques
Vue d’ensemble du système
345
Choix des données d’apprentissage
Une fois le réseau construit, il reste à produire les données d’apprentissage
qui serviront plus tard à ajuster les poids du réseau. Les données d’apprentissage
proviennent de l’image de la figure 7.a (a) dans laquelle une sous-image a été
sélectionnée pour la richesse et la diversité de formes de contour présentes. La
sous-image pour l’apprentissage du réseau est montrée à la figure 7.e accompagnée de l’image de contours désirée. L’image désirée de contour a été générée
par un programme classique d’extraction des arêtes d’une image - l’opérateur
de Canny, fort utilisé dans les systèmes de vision par ordinateur.
ImageEntree.tif
Figure 7.e
ImageDesiree.tif
Image d’apprentissage.
Les vecteurs d’entrée sont sélectionnés dans ImageEntree.tif et les valeurs de sortie désirées sont prélevées à la
position correspondante de ImageDesiree.tif.
Les données d’apprentissage correspondent à certains groupes de n × n
pixels, appelés « imagettes », prélevés dans le fichier ImageEntree.tif. En effet,
il est inutile de faire apprendre l’image complète au réseau : le temps d’apprentissage serait très long, sans compter l’énorme redondance d’information. Par
exemple, si la partie unie de la pelouse dans ImageEntree.tif contient 6 000 fenêtres de n × n pixels1, inutile de répéter 6 000 fois au réseau que ces fenêtres ne
comportent aucune arête …
1. Le chiffre de 6000 est seulement une hypothèse. En pratique, le nombre de fenêtres
dépend de la taille de la rétine, donc de n.
346
Le perceptron multicouche
Chapitre 7
Ces groupes de pixels sont donc choisis par la fonction MatLab basevect.m
de telle sorte qu’ils soient suffisamment différents les uns des autres. Le critère
de sélection est celui de la distance euclidienne entre les vecteurs associés à la
rétine de n × n qui se déplace dans l’image selon l’algorithme suivant :
0. Initialisation :
n×n
n 3 Dimensions de la rétine.
K = 1 Taille initiale de la base d’apprentissage
D min Distance minimale entre 2 vecteurs
X k = 1 = [ x 1 ( k )…x 2 ( k ) ]
n
= [ x k1 …x k ( n
La rétine est positionnée en haut, à gauche
n) ]
Le vecteur résultant X 1 est placé dans B
D k = 1 Le centre de la rétine est choisi sur
ImageDesiree.tif (image 0/1 des contours)
B B 1 = { X 1, D 1 } La base d’apprentissage est initialisée.
1. tant que (ImageEntree.tif n’est pas balayée en entier) faire boucle 1.
X i = [ x i1 …x i ( n n ) ]
Sélection de l’imagette suivante du balayage
1.1 Pour k = 1 jusqu’à k = K faire boucle 1.1
dist = X k – X i =
Si dist
2
( x k1 – x i1 ) + … + ( x k ( n
n)
– xi( n
n) )
2
D min
Rejet de X i comme imagette d’apprentissage
Si dist > D min
B
{ X i, D i } Ajout de l’imagette et de sa valeur de contour
K = K + 1 Taille de la base augmentée de 1
Algorithme 7.a Construction de la base d’apprentissage.
Une imagette n × n est ajoutée à la base d’apprentissage B
si sa distance euclidienne à toutes les imagettes de la base
est supérieure à la distance minimale spécifiée D min .
Travaux Pratiques
347
Vue d’ensemble du système
Apprentissage
L’apprentissage est réalisé par JavaNNS qui applique l’algorithme de rétropropagation du signal d’erreur à partir des données présentes dans le fichier vecteurs.pat. Puisqu’il s’agit d’un apprentissage supervisé, ce fichier indique la
valeur de sortie désirée (arête ou non) pour chaque imagette (vecteur de dimension n × n ) faisant partie de la base d’apprentissage.
Conversion des images en format JavaNNS
Le site Internet met à votre disposition un ensemble d’images pour tester la
capacité de généralisation du réseau. Une partie de ces images est illustrée en
format réduit à la figure 7.f.
leopard
tools
Figure 7.f
gecko
cam
roo
campanile
albatross
frog
Images de généralisation.
Le simulateur JavaNNS n’a pas été conçu pour lire directement des images
emmagasinées dans des formats standards comme TIFF, JPEG ou autre. Il faut
donc convertir les images que l’on désire soumettre au réseau sous une forme
lisible par le simulateur. Le seul format de fichier reconnu par JavaNNS est le
format texte .pat, que vous avez manipulé dans le TP Le perceptron de Rosenblatt et qui est illustré à la figure 5.1. Le site Internet met à votre disposition les
images sous deux formats, le format image standard .tif et la même image dans
le format .pat propre à JavaNNS. Le programme tif2pat est également disponi-
348
Le perceptron multicouche
Chapitre 7
ble pour convertir n’importe quelle image de votre choix au format interne de
JavaNNS, le format .pat.
Généralisation
L’intérêt principal d’un réseau de neurones est de résoudre des problèmes
auxquels il n’a jamais été confronté. Dans ce cas-ci, il s’agit donc de trouver
l’image binaire des contours présents dans l’image d’entrée qui possède la
caractéristique importante de ne pas avoir participé à l’apprentissage. Le réseau,
une fois entraîné, analysera donc des images n’ayant pas participé à l’apprentissage et vous analyserez la sortie du réseau pour vérifier les capacités de généralisation du réseau entraîné à partir d’une image tout à fait différente.
Conversion des résultats JavaNNS en format image
Afin de pouvoir visualiser sur écran, imprimer ou poursuivre le traitement,
les fichiers de résultats générés par JavaNNS doivent être convertis dans un des
formats standards de fichiers d’images. L’utilitaire res2tif, que l’on retrouve sur
le site Internet, permet d’accomplir aisément cette tâche.
Visualisation
Étant donné que les données manipulées par le réseau de neurones sont des
images, la méthode la plus élémentaire, la plus directe et la plus sûre consiste à
visualiser les images binaires de contour qu’il produit. Plusieurs programmes de
visualisation sont disponibles, comme Aphelion ou MatLab. Le choix de l’outil
de visualisation est vaste lorsqu’on a pris la peine de convertir les résultats produits par le simulateur dans un des formats standards d’image.
MANIPULATIONS
Quelques recommandations
Vous allez produire de nombreux fichiers durant ce TP : réseaux aux architectures variées, réseau avant et après apprentissage, réseaux entraînés avec tel
ensemble de paramètres, données d’apprentissage plus ou moins étendues, images binaires provenant de tel ensemble d’apprentissage avec telle architecture,
Travaux Pratiques
349
Manipulations
copies d’écran en tout genre, etc. Vous risquez rapidement de ne plus vous y
retrouver dans tous ces fichiers, à moins de les garder en ordre.
Voici quelques suggestions pour vous permettre de vous y retrouver :
-
Créer un répertoire distinct chaque fois que vous
changez un paramètre et dans lequel vous sauvegarderez tous les fichiers produits avec cette valeur de paramètre.
-
Donner des noms significatifs à vos fichiers. Par
exemple, si vous produisez un ensemble d’apprentissage avec un seuil de 0,5, renommer le fichier résultant vecteurs.pat en vecteurs_0.5.pat.
-
Au besoin, garder dans chaque répertoire un fichier texte qui énumère l’ajustement des paramètres, qui explique les conditions d’opération, qui
résume le contenu des fichiers, etc.
Construction du réseau
1. Le réseau est construit de la même façon que pour la construction du
perceptron de Rosenblatt dans le TP du chapitre 5, soit par l’interface
Create Layers de JavaNNS (étapes 2. à 6. du TP).
Différentes architectures de réseau pourront être expérimentées pour résoudre le problème d’extraction de primitives d’une image. Pour débuter cependant, il vous est suggéré de construire un réseau de complexité minimale, ayant
les caractéristiques suivantes :
Couche d’entrée
Couche(s)
cachée(s)
Couche de sortie
Taille
3×3
?
1
Fonction
d’activation
Act_Identity
Act_Logistic
Act_Logistic
Fonction de sortie
Out_Identity
Out_Identity
Out_Identity
Tableau 7.4 Architecture de départ.
350
Le perceptron multicouche
Chapitre 7
Le tableau 5.a (du TP sur Le perceptron de Rosenblatt) résume les principales fonctions d’activation et de sortie offertes par JavaNNS. Les fonctions
_Identity correspondent bien sûr à la fonction linéaire alors que la fonction
Act_Logistic est la sigmoïde. L’ensemble du réseau est de type multicouche par
anticipation (FeedForward dans la documentation de SNNS).
Il est suggéré de commencer avec une seule couche cachée. La règle empirique suivante, extraite de la section 7.2.8.1, peut être utilisée à tout le moins en
première approximation :
J =
avec
N(M + 2) + 1
(7.a)
N : nombre de neurones de la couche d’entrée
M : nombre de neurones de la couche de sortie
J : nombre de neurones de la couche cachée
Cette équation est empirique et ne garantit pas que le nombre de neurones
cachés soit optimal ! Rappelons qu’elle a été établie par l’observation de plusieurs travaux antérieurs sur des classificateurs de type perceptron multicouche
à deux couches.
Apprentissage
2. Produire un premier ensemble d’apprentissage avec basevect.m dans
l’environnement MatLab. Le programme est disponible sur le site Internet
et la documentation y est aussi incluse. Le programme demande le seuil
minimum de distance à respecter en deçà duquel le vecteur d’apprentissage
Xi ne sera pas inclus dans la base d’apprentissage. Le paramètre Dmin est
compris dans l’intervalle 0 D min n , où n est la largeur (ou la hauteur ... )
de la rétine.
Il n’y a pas de règle rigoureuse pour déterminer le paramètre Dmin a priori :
plus on garde des vecteurs pour l’apprentissage, plus le réseau apprend « par
coeur » l’image d’apprentissage, ce qui diminue d’autant sa capacité de
généralisation sur d’autres images qui n’ont pas participé à l’apprentissage.
Il y a aussi un compromis avec le temps d’apprentissage qui augmente avec
le nombre de vecteurs présents dans la base d’apprentissage. En conclusion,
il vaut mieux commencer avec une valeur de Dmin assez élevée.
Travaux Pratiques!
Manipulations!
350-1
Pour atténuer les effets de l’apprentissage « par coeur », un jeu de données
supplémentaire est souvent ajouté pour valider l’apprentissage. Le jeu de
données de validation est ajouté périodiquement au travers des époques
d’apprentissage, mais contrairement à l’apprentissage, les valeurs de poids
de connexion ne sont pas modifiées, seulement l’erreur d’époque est
calculée et ajoutée en graphique. La génération d’une courbe de validation
permet de vérifier à partir de combien d’itération du processus
d’apprentissage le réseau entre en surapprentissage. Le surapprentissage
fait en sorte que le réseau répond de mieux en mieux aux données utilisées
pour l’apprentissage au détriment des autres données. Dans le cas
d’images, le réseau pourrait sans problème tracer les arêtes de l’image
ayant servi pour l’apprentissage, mais aurait peut-être de la difficulté avec
une image dont le contraste est très différent. La Figure 7.f-1 montre un
exemple de surapprentissage. La courbe d’erreur des données
d’apprentissage décroit au fur et à mesure de l’entrainement alors que la
courbe d’erreur en validation descend jusqu’à un certain point puis se
remet à croitre. Ce point de changement peut être utilisé pour stopper
l’entraînement afin de permettre une meilleure généralisation.
Figure 7.f-1 Courbes de validation et d’apprentissage.
La base de validation est utilisée à intervalle régulier
durant l’apprentissage. L’erreur totale est calculée, mais les
poids ne sont pas modifiés.
Travaux Pratiques!
Manipulations!
350-2
basevect.m accepte comme argument d’entrée une image de validation
(paramètre MAT_VAL) en plus de l’image utilisée pour l’apprentissage. Il
est recommandé de choisir une image de validation qui soit la plus
différente possible de l’image utilisée pour l’apprentissage afin que le
phénomène de surapprentissage soit manifeste. Vous pouvez expérimenter
avec plusieurs images de validation afin de comparer l’allure générale de
la courbe de validation.
Basevect (‘Images/ImageEntree’, ‘Images/??’, 3)
Dans JavaNNS :
ouvrir ImageEntree_app.pat
ouvrir ImageEntree_val.pat
Aller dans l’onglet Patterns du panneau de contrôle et mettre
ImageEntree_app comme série d’apprentissage et
ImageEntree_val comme série de validation.
Réaliser l’apprentissage
Figure 7.f-2 Courbes de validation et d’apprentissage sur JavaNNS.
Travaux Pratiques
Manipulations
351
3. Procéder à l’apprentissage dans JavaNNS au moyen des onglets
d’apprentissage et d’initialisation des poids :
règle d’apprentissage
Backpropagation
poids initiaux
valeurs aléatoires, entre -1 et 1
taux d’apprentissage
0,1
erreur dmax tolérable en sortie 0,001
Tableau 7.5 Paramètres pour l’entraînement du réseau
Ne pas oublier de faire afficher la courbe d’erreur SSE avant de lancer
l’apprentissage. Ne pas oublier non plus de prendre une saisie d’écran de la
courbe d’erreur à la fin. Tenter d’estimer le temps nécessaire pour
l’apprentissage. Sauvegarder finalement votre réseau entraîné.
Généralisation
Nous examinons maintenant comment se comporte le réseau avec de nouvelles images. Dans un premier temps, il vous faut d’abord vérifier si le réseau
est capable de classifier correctement l’image qui a servi à la phase d’apprentissage, ImageEntree.tif. Si le test est concluant, vous devriez obtenir une image
résultat quasiment identique à l’image désirée de contours.
4. Charger en mémoire ImageEntree.pat avec le menu déroulant File Open
de la fenêtre principale du simulateur.
5. Compte tenu de l’application en imagerie à l’étude, il faut préciser à
JavaNNS de parcourir les données par bloc de n × n en déplaçant la fenêtre
d’acquisition tel qu’il est illustré à la figure 7.b. Dans l’onglet Subpatterns
du panneau de commande, illustré à la figure 7.g ci-dessous, entrer la valeur
de n dans les cases Input Size : dim1 et dim2.
6. Sauvegarder vos données au moyen du menu déroulant File Save data du
simulateur. Dans la fenêtre Result file format, choisir l’option « No » aux
questions Include input patterns et Include output patterns. Ceci produira
un fichier de résultats de plus petite taille qu’avec les options par défaut.
352
Figure 7.g
Le perceptron multicouche
Chapitre 7
Définition d’un masque de données.
L’onglet « Subpatterns » permet de définir un masque pour
extraire des imagettes à partir d’une image. C’est ainsi
qu’un masque de 3x3 permettra de soumettre au réseau
toutes les imagettes de dimension 3x3 contenues dans
l’image.
7. Convertir le fichier .res avec res2tif pour ensuite visualiser l’image
correspondante avec MatLab ou un autre logiciel de votre choix.
L’image binaire obtenue contient-elle suffisamment d’information pour
reconnaître la scène ? Commenter cette image par rapport au bruit, aux
imperfections, à la qualité des arêtes, etc. Comparer aussi avec
ImageDesiree.tif : les deux images sont-elles identiques ?
8. Si l’image binaire est de qualité acceptable, tester votre réseau avec les
images de généralisation. Identifier les cas où le réseau performe bien ou
mal.
Sinon reprendre le processus à partir de la sélection des données
d’apprentissage. Choisir un Dmin plus approprié (devrait-il être plus grand
ou plus petit ?).
Travaux Pratiques
Manipulations
353
Expérimentation
Un objectif important de cette séance de TP est de vérifier la réponse du
réseau sous différentes conditions, et de déterminer la combinaison d’architecture et de paramètres qui donne les meilleurs résultats. Il reste donc à expérimenter les diverses alternatives possibles. Quelques commentaires avant
d’explorer quelques avenues possibles de travail :
-
Personne n’obtiendra exactement les mêmes résultats, puisque vous choisirez vous-même la
configuration de votre réseau.
-
Il ne faut pas essayer toutes les configurations
possibles et imaginables, il y en a trop. Examinez
quelques points dans l’espace des possibilités,
sans quadriller cet espace de façon systématique.
Pour les paramètres numériques par exemple, essayez une valeur basse, moyenne et haute. Autant
que possible, évitez de faire varier plusieurs paramètres en même temps.
-
La séquence d’expérimentation est à votre choix :
autrement dit, les avenues indiquées plus loin ne
doivent pas nécessairement être expérimentées
dans l’ordre où elles sont présentées. De façon
générale, vos résultats antérieurs et les hypothèses que vous faites sur le comportement du réseau
doivent vous guider sur la direction à prendre.
-
L’efficacité du réseau doit être mesurée au sens
large : obtenir une image binaire de qualité avec
un temps d’apprentissage très long n’est pas efficace! Dans votre appréciation du réseau, considérez autant les coûts que les bénéfices, et ceci sur
l’ensemble du procédé.
-
En prévision de votre rapport de TP, il sera utile
de noter vos observations au fur et à mesure; pensez aussi à sauvegarder vos résultats, que ce soit
sous forme graphique ou numérique.
354
Le perceptron multicouche
Chapitre 7
Avenues à expérimenter :
-
Nombre de vecteurs d’apprentissage
-
Sélection des données d’apprentissage
-
Erreur tolérable en sortie
-
Taux d’apprentissage
-
Nombre de couches cachées (limiter vos essais à deux couches)
-
Nombre de neurones sur chaque couche cachée
-
Largeur de la fenêtre d’acquisition. Une fenêtre plus large
réclame en principe plus de neurones cachés.
-
Règle d’apprentissage : outre Backpropagation, vous pouvez
aussi essayer les règles :
- BackpropBatch :
modification des poids à la fin de
l’époque seulement;
- BackpropMomentum : apprentissage avec facteur d’accélération. Pour ce cas, expérimenter
avec la valeur du momentum.
Pour votre meilleure configuration de réseau, essayez de déterminer ce que
fait chaque neurone caché, c’est-à-dire quel genre d’information ces neurones
extraient de l’image d’intensité.

Documents pareils