« Analyse
et segmentation d’images aériennes de haute-résolution
du
département de Haute Savoie »
Durée du stage : du 5 juin 2006 au 13 juillet 2006
Lieu : Laboratoire MAP ARIA, école d'architecture de Lyon
École
d'architecture de Lyon
3, rue Maurice-Audin, BP 170, 69512 Vaulx-en-Velin
Cedex
téléphone :
04 78 79 50 85, télécopieur : 04 78 80 40 68
mail :
xavier.marsault@aria.archi.fr
Auteur : Matthieu Aubry (matthieu.aubry@gmail.com)
Maître de stage : Xavier MARSAULT, docteur-ingénieur des TPE, enseignant-chercheur permanent à MAP-ARIA (xavier.marsault@aria.archi.fr )
Mon stage au laboratoire MAP ARIA de l'école d'architecture de Lyon s'est déroulé du 5 juin au 13 juillet 2006, soit une période de 6 semaines. Le stage intervient dans le cadre de la 3ème année de mes études à l'INSA de Lyon, dans le département informatique.
Il m'a été confié un travail précis sur un sujet délimité, mais ouvert à l'expérimentation et à la recherche de nouvelles solutions. Ce sujet avait été travaillé par un stagiaire (Jean Fortin) pendant 2 mois durant l'été 2005. Je devais donc continuer son travail et essayer d'arriver à des résultats probants et intéressants. Ce travail se déroule dans le cadre d'un projet de la région Rhone-Alpes intitulé DEREVE (Développement d’un Environnement de Réalité Virtuelle Elaboré) qui associe un certain nombre de laboratoires : le LIRIS, l’INRIA, MAP-ARIA, entre autres. Le sujet de mon stage est « Analyse d’images aériennes de haute-résolution du département de Haute Savoie »
Citation décrivant le projet global
« Des travaux de recherche en cours à MAP-ARIA concernent l’habillage procédural et le rendu en temps réel de grands terrains. La modélisation procédurale est probablement la seule approche permettant l’enrichissement de bases de données limitées, avec un nombre élevé de niveaux de détails à différentes échelles, exploitant au mieux la redondance des éléments d’un paysage. La stratégie que nous proposons est une approche dite d’« amplification », ajoutant à la volée, aux zones proches du point de vue, de la géométrie texturée plausible, réaliste et efficace en termes de temps de génération et de rendu.
Le champ d’expérimentation choisi est le département de Haute Savoie, pour lequel on dispose d’une couverture aérienne et d’un modèle numérique de terrain (MNT) de forte résolution (un point au sol tous les 5 mètres, et 1 pixel tous les 50 centimètres) sur ses 4388 km2 d’étendue.
Malgré leur forte résolution et leur qualité, ces photographies offrent un réalisme limité dès que l'observateur se rapproche du sol. Il devient alors nécessaire de les enrichir et d’ajouter des éléments habillant le terrain. Comme on a 100 fois plus de pixels que de points de terrain, c’est l’information de texture qui va guider l’amplification du sol, car elle donne accès à la connaissance précise de sa nature, en plus de la connaissance morphologique déduite de sa géométrie. »
Dans le cadre du projet d'amplification du sol, il est absolument nécessaire d’analyser les images aériennes, dans le but d’obtenir un classification zonale de la nature du terrain.
L’idée est de s’inspirer des méthodes utilisées par les travaux existants pour compléter la panoplie des paramètres utiles pouvant servir à une bonne classification des clusters de pixels de ces images.
Une remarque s’impose : le travail demandé n’est pas la reconnaissance automatique de motifs de textures dans une bibliothèque d’images aériennes, ce qui est très difficile, même à l’heure actuelle. Il s’agit de réaliser une classification semi-automatique (avec apprentissage) et de définir des classes dans une banque d’images très similaires, qui seront ensuite nommées par un opérateur (donc reconnues visuellement).
L'objectif global est donc le problème classique de segmentation de textures. Comment, pour une
photo donnée, associer automatiquement à chaque pixel le type de terrain auquel il correspond ?
Pour parvenir à cet objectif, nous avons à notre disposition un algorithme développé par l'INRIA permettant de faire l'apprentissage de patterns et la classification en utilisant la technique probabilistique des champs de markov cachés.
La littérature est très riche en ce qui concerne le problème de la reconnaissance de similarité entre différentes textures. Dans ce cas il est très intéressant d'utiliser des propriétés spatiales classiques car on s'intéresse à la globalité de l'image. La classification des pixels (segmentation) à partir de motifs connus est un problème moins traité et difficile. Du fait de l'utilisation de l'algorithme des champs de markov cachés, une grande partie du travail peut se résumer à la question : comment caractériser un motif connu (ce qui passe par la caractérisation de chacun de ses pixels) de la manière la plus pertinente et précise possible ?
L'objectif est de trouver les features (propriétés) de texture qui sont le plus significatives pour l'analyse et la classification. Ces features en chaque pixel de l'image sont la seule information dont dispose l'algorithme d'apprentissage et de classification ; ils doivent être savamment choisis.
L'utilisation de la technique des champs de Markov a une conséquence directe sur ces features : elles doivent être décorrélées. Nous en aurons donc un nombre limité, car il est difficile de trouver de nombreuses propriétés sur des pixels qui soient décorrélées et significatives. Par exemple on ne peut pas enregistrer dans le vecteur de features les 3 composantes R, G, B ainsi que la moyenne (niveau de gris) (R+G+B) / 3, car cette valeur est corrélé avec R, G, et B : cela fausserait la classification.
Les moyens à notre disposition (algorithme de l'INRIA) sont complexes et plusieurs configurations (jeu de paramètres) sont possibles. On peut notamment choisir entre différents algorithmes icm/gsf, choisir un nombre d'itérations maximum si la convergence n'est pas atteinte, il faut choisir les patterns (motifs utilisés pour l'apprentissage d'une texture donnée) qui seront utilisés pour la segmentation...
La problématique est de trouver l'association de paramètres la plus efficace (en terme de qualité et en temps de calcul) pour la segmentation des images de la base de données. Ces paramètres sont principalement les features en chaque pixel, les patterns utilisés pour la classification, l'algorithme et le nombre max d'itérations utilisé par le programme de l'INRIA.
Le principal problème est le choix des features. L'idée est de traduire avec des nombres
les propriétés locales (couleur, luminosité, ...)
les propriétés spatiales (rugosité, répétition de motifs, ...)
en chaque pixel de l'image.
Caractérisation locale
La
caractéristaion locale est limitée. Sur un pixel donné
nous avons seulement les informations relatives à la
« couleur », traduite par défaut dans
l'espace RGB classique.
Il existe alors différents espaces de couleurs : RGB, YUV, HSV, L1L2L3, niveau de gris.
Il faut que les paramètre obtenus traduisent le mieux et de manière décorrélées la couleur et la luminosité en un point. Il faut également pouvoir gérer le problème de l'ombre.
Après quelques tests, il s'avère que l'espace de couleur HSV est le plus efficace ; il traduit de manière pertinente avec 3 paramètres décorrélés la couleur, la luminosité, la saturation en un point.
Par contre, le problème de l'ombre n'est pas solvable avec cette technique de caractérisation d'un pixel (très peu voire aucun point commun entre une même texture éclairée ou à l'ombre) : il est donc nécessaire d'inclure des motifs à apprendre... à l'ombre.
Caractéristaion spatiale
La caractérisation spatiale est beaucoup plus vaste et permet de mettre en oeuvre des calculs plus complexes. Le problème qui vient alors rapidement à l'esprit est la véracité de ces calculs : peut on vraiment caractériser une certaine spatialité en un pixel donné de manière pertinente ? La spatialité n'est t'elle pas plutôt une caractéristique d'un motif (par exemple, 100*100 pixels) ? A quoi correspond le calcul en un point donné de telle ou telle transformée (est ce vraiment pertinent...) ?
Différents calculs sont envisageables :
Gradient sur différentes composantes (HSV, Niveau de gris, etc.)
Calcul de la dimension fractale
Filtres de gabor
Critères d'haralick
Passage dans l'espace KLT
Après quelques rapides tests qui se sont révélés peu probants sur la dimension fractale, sur l'espace KLT, sur les filtres de Gabor (je n'ai pas testé les critères d'haralick, mais je ne suis guère confiants sur leur intérêt à caractériser un pixel), j'ai expérimenté les gradients sur les composantes HSV.
Le gradient sur H caractérisant la différence de couleur en un point donnée, il était trop sensible au moindre changement de teinte. Le gradient sur la luminosité (très proche du gradient sur la saturation), s'avère lui beaucoup mieux représenter la notion de « granularité » ou « rugosité ».
A la fin du stage, j'ai regroupé mes interrogations restées sans réponses. Il est important de trouver une réponse à ces questions car elles peuvent influencer de manière positive les résultats obtenus.
Quel est l'intérêt de corréler les patterns d'une même famille au niveau de l'algorithme de classification (corrélation des fichiers .pair) ? Quelle est la différence entre les résutlats d'apprentissage de 3 textures de forêts par rapport au résultat que l'on aurait obtenu sans la corrélation de ces 3 textures ?
L'algorithme essaie t'il de privilégier le classement de tel ou tel motif dans une classe d'une même famille pour éviter qu'un même pixel ait une probabilité équivalente (par exemple 0.3) d'appartenir à 2 textures représentant une même famille ? Si ce n'est pas cela, quelle est l'utilité de corréler ?
En mettant un nombre de patterns moyennement élevé, comportant un nombre de sous classes total par exemple égal à 20, l'algorithme NEM nécessite beaucoup de mémoire et n'arrive pas à en allouer suffisamment (sur un ordinateur pourvu de 2Go de mémoire ram). Cela est problématique car il serait intéressant de pouvoir classifier des images en utilisant un grand nombre de patterns afin d'envisager une classification « à la chaîne » sans devoir choisir les patterns à prendre en compte pour chaque texture. Cela ammène a des questions
Quelle est la complexité de la mémoire en fonction de la taille des patterns (surface en pixels, et nombre de patterns) utilisés à l'apprentissage ?
Quelle est l'influence sur le temps de segmentation de la texture (surface en pixels, et nombre de patterns) ?
Quelle est la complexité du programme (temps de calcul et mémoire) en fonction de la taille de l'image à segmenter ?
L'algorithme d'apprentissage / segmentation par champs de Markov cachés propose des résultats intéressants. Néanmoins il a des limites :
il est difficile de traduire la spacialisation d'une texture avec la technique des champs de markov puisque chaque pixel doit être caractérisé. Or caractériser la spatialité d'un pixel donné semble une tâche difficile... (durant les tests, seuls le gradient sur V ou S donne des résultats intéressants)
Il est impossible de définir une classe vide, ce qui permettrait pourtant de donner une probabilité de non appartenance à aucune des autres classes. La somme des probabilités d'appartenance aux classe est égale à 1... Ce qui fait que pour un pixel qui ne correspond à aucune des textures apprises, le programme classifiera tout de même le pixel dans une des classes. Il convient alors d'étudier la pertinence des résultats. Un calcul simple donnant la pertinence du résultat consiste à faire la division de la plus grande probabilité d'appartenance sur la 2e plus grande probabilité. Plus ce nombre est grand, plus le résultat a des chances d'être juste.
Il est impossible de donner une priorité plus importante à certaines features. Ainsi toute feature du vecteur de propriétés a la même importance dans le calcul de probabilité. Cela peut poser problème lorsque l'on sait que certaines des features sont parfaitement pertinentes, d'autres un peu moins efficaces. Si de telles features sont présents en nombre, cela fausse la classification et fait perdre l'intérêt des features très pertinentes. Il est difficile de déteminer le set de features optimal : il faut faire beaucoup de tests des différentes combinaisons possibles parmi les features les plus pertinentes.
Les temps de calcul sont élevés : la segmentation d'une texture d'environ 600*600 ainsi que des patterns utilisés pour cette classification (de 3 à 7 patterns par exemple) prend de 2 à 4h de calcul.
Le choix des textures patterns à utiliser pour la classification influant fortement sur la classification, il faut les choisir méticuleusement. On peut imaginer un programme aidant au choix des patterns à utiliser pour une texture donnée. Mais globalement le fait de devoir choisir un set de patterns pour une texture donné n'est pas pratique et empêche a priori (à moins que ne soit résolu le probleme de mémoire lorsque plus de 15 patterns sont utilisés) d'automatiser complètement le processus de segmentation.
Durant les phases de test, je suis resté sur l'idée d'utiliser l'espace de couleur HSV, et de traduire la rugosité par le gradient sur S. Les résultats obtenus sont relativement probants. J'ai noté que la différence entre les algorithmes GSF et ICM étaient bien trop faibles pour mériter des tests approfondis.
Enfin, pour obtenir des résultats encore meilleurs, il faut lancer des batterie de tests (en utilisant l'outil de génération de scripts de tests) afin de regarder le comportement de la classification sur plusieurs types d'images, en changeant les patterns utilisés pour la classification, en changeant les features, etc.
Il faut également tester les différentes valeurs d'itérations max, et de trouver le nombre optimal qui minimise le temps de calcul et qui garde une bonne qualité de segmentation.
Voici la liste des documents que j'ai utilisés
Rapport de stage de Jean Fortin, juillet 2003
Aerial
colour image segmentation by Karhunen-Loeve Transform
(JC.Devaux,
P.Gouton, F.Truchetet)
Spatial
texture Analysis : a comparative study
(M.Singh et S.Singh)
Color
and texture Fusion : Application to Aerial Image Segmentation and
GIS updating
(MP.Dubuisson, Jolly, A.Gupta)
Measurement
of Dem roughness using the local fractal dimension
(H.Taud,
JF.Parrot)
Modeling
object classes in aerial images using hidden markov models
(S.Newsam, S.Bhagavathy, BS.Manjunath)
Markov
random fields for recognizing textures modeled by feature vectors
(J.Blanchet, F.Forbes, C.Schmid)
Tranform
features for texture classification and discrimination in large
image databases
(JR.Smith, SF.Chang)
Features
for image retrieval : a quantitative comparison
(T.Deselaers,
D.Keysers, H.Ney)
Une
architecture pour la reconnaissance d'objets en imagerie aerienne
(M.Sagdal, A.El Fazziki, A.Ait Ouahman)
Texture
analysis : chapter 2.1
(M.Tuceyran, AK.Jain)
Comment interpréter une image résultat ?
Chaque image résultat est composée de
Ainsi sur la première image résultat ci dessous nous avons en entrée : le premier pattern "foret" qui a un nombre de sous classes (rentrée à la main donc) de 2, le pattern "roche" qui a un nombre de sous classes de 3, et le pattern "prairie" qui a un nombre de sous classes de 2. On effectue ensuite le calcul de segmentation par champ de markov cachés basées sur les features H et S et V de l'espace de couleur HSV. On colorie sur l'image résultat, l'image "after classification", chaque pixel par la couleur de la sous classe qui a été détectée (cette couleur est légendée par le petit carré à droite de l'image du pattern).
Features = HSV
Features = HSV
Features = HSV + GRAD H
Features = HSV
Features = HSV
Features = HSV
Features = HSV
Features = HSV + GRAD V
Features = HSV + GRAD V
Features = HSV + GRAD V
Features = HSV + GRAD V
Features = HSV + GRAD V
Features = HSV + GRAD V
Features = HSV + GRAD V