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).
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.
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:
list.txt
;urls.txt
;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.
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.
Le développement suivra les étapes suivantes (environ une par séance).
É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.
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 :
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
.svm-train
. Commande :<br> svm-train [options] train/svm/color_aeroplane.svm model/color_aeroplane.model
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)
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).
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
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.
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.