GBGI9U07 - Supports de cours

GBGI9U07 - Examens

GBGI9U07 - Projet "deep learning"

GBGI9U07 - Projet Indexation Multimédia Réalisation d'un système d'indexation d'images fixes

Note : les données associées à ce sujet (à l'exception des images) sont accessibles en local sur le serveur de l'UFR par le système de fichier : /home/Public/quenotg/GINF53C4/PROJET
Si vous travaillez sur les machines de l'UFR, il n'est donc pas nécessaire (et pas recommandé) de recopier les données dans votre répertoire. Vous pouvez ouvrir directement les fichiers à partir de /home/Public/quenotg/GINF53C4/PROJET/… (à l'exception des images que vous pouvez récupérer dynamiquement à partir de leur URL avec le programme fourni et qu'il n'est donc pas nécessaire de recopier non plus).

1. But

Réaliser un système qui permet d'attribuer des étiquettes sémantiques à des images en fonction de leur contenu à partir d'une collection d'entraînement contenant des images annotées. Évaluer ce système en utilisant une collection de validation contenant d'autres images annotées. Le système utilisera plusieurs descripteurs de contenu, un classificateur (SVM) et une méthode de fusion. Le système devra donner un score de probabilité de présence pour chaque concept dans chaque image. Pour chaque concept, il devra afficher la liste ordonnée des images de la collection de test ayant la plus grande probabilité de contenir le concept (top N avec mesure de la précision à N). La mesure de performance globale est la MAP. Plusieurs combinaisons seront comparées.

2. Données fournies

Les images et les annotations que que allez utiliser sont issues du projet VOC 2010 sur la classification automatique d'images (pour information, vous n'avez pas besoin d'étudier ce site).

Les données sont décomposées en deux parties : entraînement (train, 4998 images) et validation (val, 5105 images). Les répertoires train et val contiennent:

  • Une liste d'images : list.txt ;
  • Une liste correspondante d'URLs permettant de les visualiser dans une page web : urls.txt ;
  • Un sous-répertoire contenant des annotations : ann avec un fichier concept.ann par concept annoté ; une ligne dans ce fichier contient le nom de l'image et une valeur entière qui vaut +1 si le concept est présent, −1 si le concept est absent et 0 en a cas d'ambiguïté ou si le concept n'a pas été annoté ;

La liste des 20 concepts annotés se trouve dans le fichier concepts.txt.

3. Programmes fournis

Nous vous fournissons un module pour charger en mémoire des images au format JPEG : rdjpeg.h/rdjpeg.c et un programme exemple qui charge une image en mémoire et affiche les plans rouge, vert et bleu du premier bloc 8×8 ce cette image : read_image.c. Il se compile avec :

cc rdjpeg.c read_image.c -o read_image

Un exécutable Linux djpeg est fourni pour le cas où il ne serait pas disponible sur votre système.

4. Implémentation

Le développement suivra les étapes suivantes (environ une par séance).

4.1. Calcul d'un histogramme de couleur

Écrire une procédure pour calculer un histogramme tridimensionnel dans l'espace RGB sur une image. La procédure doit avoir un nombre de “bins” paramétrable (#define) pour chaque composante (R, G ou B). En pratique, on considèrera un histogramme 4×4×4.

Pour vérification, l'histogramme RGB 4×4×4 de l'image http://mrim.imag.fr/voc10/images/2008_000015.jpg est :

0.452789  0.045333  0.039810  0.000000
0.011272  0.014196  0.012398  0.000037
0.000000  0.000000  0.000031  0.000000
0.000000  0.000000  0.000000  0.000000

0.025755  0.004826  0.000917  0.000000
0.018153  0.118135  0.017584  0.003156
0.000000  0.001872  0.002043  0.000312
0.000000  0.000000  0.000000  0.000000

0.000049  0.000000  0.000000  0.000000
0.000018  0.007131  0.001205  0.000116
0.000000  0.005645  0.145388  0.001853
0.000000  0.000000  0.003835  0.000361

0.000000  0.000000  0.000000  0.000000
0.000000  0.000000  0.000000  0.000000
0.000000  0.000000  0.006612  0.000147
0.000000  0.000000  0.035187  0.023835

Ce affichage correspond à l'ordre h[r][g][b] :

h[0][0][0]  h[1][0][0]  h[2][0][0]  h[3][0][0]
h[0][1][0]  h[1][1][0]  h[2][1][0]  h[3][1][0]
h[0][2][0]  h[1][2][0]  h[2][2][0]  h[3][2][0]
h[0][3][0]  h[1][3][0]  h[2][3][0]  h[3][3][0]

h[0][0][1]  h[1][0][1]  h[2][0][1]  h[3][0][1]
h[0][1][1]  h[1][1][1]  h[2][1][1]  h[3][1][1]
h[0][2][1]  h[1][2][1]  h[2][2][1]  h[3][2][1]
h[0][3][1]  h[1][3][1]  h[2][3][1]  h[3][3][1]

h[0][0][2]  h[1][0][2]  h[2][0][2]  h[3][0][2]
h[0][1][2]  h[1][1][2]  h[2][1][2]  h[3][1][2]
h[0][2][2]  h[1][2][2]  h[2][2][2]  h[3][2][2]
h[0][3][2]  h[1][3][2]  h[2][3][2]  h[3][3][2]

h[0][0][3]  h[1][0][3]  h[2][0][3]  h[3][0][3]
h[0][1][3]  h[1][1][3]  h[2][1][3]  h[3][1][3]
h[0][2][3]  h[1][2][3]  h[2][2][3]  h[3][2][3]
h[0][3][3]  h[1][3][3]  h[2][3][3]  h[3][3][3]

Le résultat doit ensuite être stocké au format libsvm. C'est un format dans lequel une étiquette et un vecteur sont représenté sur une ligne avec un codage optimisé pour les vecteurs creux. La représentation est de la forme <étiquette> (<numéro de composante>:<valeur de la composante>)*. Seules les composantes non nulles sont mentionnées. La numérotation des composantes commence à 1. On met 0 dans le champ <étiquette>. Pour la même image que ci dessus, ça donne (une seule ligne) :

0 1:0.452789 2:0.045333 3:0.039810 5:0.011272 6:0.014196 7:0.012398 8:0.000037 11:0.000031 17:0.025755 18:0.004826 19:0.000917 21:0.018153 22:0.118135 23:0.017584 24:0.003156 26:0.001872 27:0.002043 28:0.000312 33:0.000049 37:0.000018 38:0.007131 39:0.001205 40:0.000116 42:0.005645 43:0.145388 44:0.001853 47:0.003835 48:0.000361 59:0.006612 60:0.000147 63:0.035187 64:0.023835

Quand la méthode est validée pour une image, il faut lancer le calcul sur toutes les images des collections d'entraînement et de validation. On produit un fichier par collection avec une ligne de vecteur par ligne dans le fichier urls.txt. La correspondance se fait par l'ordre qui doit être le même. Valider la procédure avec une cinquantaine d'images et ensuite lancer une fois le calcul sur chaque collection complète.

Attention : si vous traitez toutes les images dans un même programme, il faut libérer les tableaux alloués par read_cimage() à chaque lecture en utilisant la fonction free_cimage() sinon la taille de votre programme en mémoire va exploser et il pourrait échouer à cause de cela.

4.2. Classification à partir d'histogrammes de couleurs avec libsvm

Vous ferez la classification par machines à vecteurs de supports (SVM) avec le logiciel ''libsvm''. Le site contient une documentation et une distribution. Une version compilée pour linux 32-bits est installée dans /u/q/quenotg/local/linux/bin. Vous pouvez aussi installer la distribution sur votre propre machine. Vous utiliserez la version C-SVC avec noyau RBF gaussien.

La mise en œuvre devra suivre les étapes suivantes :

  • Fusion du fichier de vecteurs histogrammes et d'un fichier d'annotation pour la création d'un fichier d'entraînement (collection train). Les « 0 » en tête de chaque ligne du fichier color.svm doivent être remplacés par les classes (-1 ou +1) prises dans le fichier ann/<concept>.ann pour créer un fichier svm/color_<concept>.svm.
  • Création d'un modèle avec svm-train. Commande :<br> svm-train [options] train/svm/color_aeroplane.svm model/color_aeroplane.model
  • Exécution de la prédiction et de vérification avec svm-predict. Commande :
    svm-predict [options] val/svm/color.svm model/color_aeroplane.model out/color_aeroplane.out

Ceci est à faire pour chacun des 20 concepts cibles. On mettra la méthode au point avec une seul concept (aeroplane) et on l'appliquera aux autres ensuite.

Comme les concepts cibles sont peu fréquents, la meilleure prédiction pour libsvm est de toujours attribuer la classe négative. Pour éviter cela, il faut mettre des poids élevés (19) pour la classe positive (option -w+1 19). Attention: 19 n'est pas forcément la valeur optimale. En théorie, la valeur optimale est le rapport entre le nombre d'échantillons annotés comme négatifs et le nombre d'échantillons annotés comme positifs. En pratique, la valeur optimale peut être différente mais ce rapport est en général une bonne solution. Cette option doit être utilisée seulement dans svm-train.

Une mesure de performance différente doit aussi être choisie (cela sera fait dans la séance suivante), elle prendra en compte un ordre parmi les images retournées. Afin aussi de pouvoir trier les images de validation de la plus probable à la moins probable, il faudra utiliser la version « probabilisée » (option -b 1). Cette option doit être utilisée dans svm-train ET dans svm-predict.

Vous pouvez essayer différentes combinaisons de paramètres pour améliorer la performance de classification. En particulier, il vaut mieux mettre le paramètre gamma avec une valeur de 1 (option -g 1.0).

Séance 2:
programme pour générer un fichier de vecteurs .svm "neutre" :
- urls.txt -> color.svm (train et val)
programme pour générer un fichier de vecteurs .svm avec annotations :
- color.svm, aeroplane.ann (train seulement)
doivent être prêts pour la séance suivante :
- color.svm (train)
- color.svm (val)
- color_aeroplane.svm (train)
Séance 3 :
application de svm-train :
- color_aeroplane.svm -> color_aeroplane.model (train seulement)
application de svm-predict :
- color.svm(val), color_aeroplane.model (train) -> color_aeroplane.out (val)
application aux autres concepts (faire des scripts)
Séance 4 :
programme pour mise au format trec_eval :
- color_aeroplane.out -> color_aeroplane.top
évaluation avec trec_eval :
- aeroplane.rel, color_aeroplane.top -> AP(color_aeroplane) (performance sur color_aeroplane)
évaluation de tous :
- all.rel, color_all.top -> MAP (performance color globale)

4.3. Évaluation (MAP et P@N avec trec_eval)

Vous ferez l'évaluation selon la métrique MAP (Mean Average Precision) avec le logiciel ''trec_eval''. L'archive contient une distribution. Une version compilée pour linux 32-bits est installée dans /u/q/quenotg/local/linux/bin. Vous pouvez aussi installer la distribution sur votre propre machine.

Usage: trec_eval [-h] [-q] {-m measure}* trec_rel_file trec_top_file
   -h: Give full help information, including other options
   -q: In addition to summary evaluation, give evaluation for each query
   -m: calculate and print measures indicated by 'measure'
       ('-m all_qrels' prints all qrels measures, '-m official' is default)

trec_eval compare une référence (trec_rel_file, la bonne réponse) et une soumission (trec_top_file, la prédiction du système).

Le programme attend ses entrées sous une format spécifique malheureusement différent du format des annotations pour la référence et différent du format de sortie de libsvm pour les soumissions. La conversion est faite pour les annotations et se trouve dans val/rel avec un fichier par concept plus un fichier pour l'ensemble color_all.rel. Il faudra faire vous-même la conversion pour la prédiction du système.

Le format comprend une ligne par image et par concept (il peut y en avoir un seul). trec_top_file contient une liste ordonnée. L'ordre est défini par un score qui sert à trier les images (du plus grand au plus petit score). Le format de la ligne est :

<concept_id> Q0 <image_id> 0 <score> R

Les champs “Q0”, “0” et “R” ne servent à rien. Ils sont là pour des raisons “historiques”.

Le score peut être la probabilité produite par svm-predict avec l'option -b.

Pour construire le fichier .top, il est plus pratique d'utiliser le fichier histo.svm dans svm-predict et le fichier list.txt en utilisant la correspondance ligne à ligne.

Ceci est à faire pour chacun des 20 concepts cibles. On mettra la méthode au point avec une seul concept (aeroplane) et on l'appliquera aux autres ensuite. Attention, l'ordre des classes peut changer dans le fichier de sortie de libsvm, il faut vérifier la ligne labels (la première).

4.4. Classification d'une image quelconque

Vous pouvez faire un programme qui prend en entrée le chemin dans le système de fichier ou l'URL d'une image quelconque et qui fournit les scores de classification (probabilités) pour chacun des 20 concepts. Affichage du plus probable au moins probable avec la probabilité associée.

Ce programme peut tourner sur le serveur web goedel ou en ligne de commande. Il peut prendre en paramètre des options spécifiant une recherche seulement par la couleur, seulement par la texture ou une combinaison des deux. Si vous voulez faire une interface web, vous pouvez partir de l'exemple form_post.html appelant le code post.c avec le module cgiu.h / cgiu.c

4.5. Optionnel (non noté) : test de descripteurs "deep learning"

Les fichiers train/deep294.svm et train/val294.svm contiennent des descripteurs à 294 dimensions obtenus par apprentissage profond (deep learning). Ils sont proches de l'état de l'art actuel en matière de descripteurs visuels. Ils donnent normalement des résultats bien meilleurs que les histogrammes de couleur et de SIFT (mais ils sont beaucoup plus complexes à calculer). Vous pouvez aussi les tester.

5. Évaluation du projet

Vous devrez faire un compte rendu et nous fournir les codes sources de vos programmes et les différents scripts que vous utilisez pour les lancer. Vous nous enverrez le compte-rendu et les sources uniquement (pas les fichiers de données) dans une archive zip ou tgz pour le 10 avril au plus tard (mailto:Georges.Quenot@imag.fr. Vous montrerez ce qui tourne lors de la séance du 28 février.

Dans le rapport, vous pouvez mettre : un court résumé du contexte et du travail à faire, les choix d'implémentation que vous avez effectués, les résultats globaux et par concept, une analyse des performances de votre système, des exemples qui marchent ou qui ne marchent pas, une analyse de ces résultats (pourquoi les histogrammes de couleurs marchent ou non non dans ces cas). Si vous avez effectué des réglages des hyper-paramètres (-g, ou -w par exemple), quelles valeurs marchent le mieux.

Il y aura aussi une partie relative au deep learning à ajouter.

start.txt · Last modified: 2018/04/04 08:00 by quenot
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 4.0 International
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki