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é.