HMUL8R6B - Accès à l'Information Multimédia - PROJET - Réalisation d'un système de recherche d'images fixes

Note : les données associées à ce sujet sont accessibles en local sur le serveur de l'UFR par le système de fichier : /home/Public/quenotg/HMUL8R6B/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/HMUL8R6B/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

Le but de ce projet est de réaliser un système de recherche dans une base d'image à partir d'une image requête. Les images sont recherchées dans la base selon la similarité de leurs distributions de couleur ou de mots visuels avec celles de l'image. Le distribution de couleurs sera représentée par un histogramme tridimensionnel de couleurs. Le distribution de mots visuels représentée par un histogramme de descripteurs locaux de type SIFT.

Bien que ce ne soit pas obligatoire, le système pourra fonctionnera sur le web (par la CGI). Une alternative plus simple est de seulement générer une page web puis de l'afficher avec un navigateur. Dans tous les cas, il faut pouvoir afficher l'image requête et une liste des images les plus proches au sens de la couleur et/ou des descripteurs SIFT.

2. Données fournies

Les images 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).

Vous travaillerez sur la sous collection de test : (test, 9637 images). Le répertoire test contient:

  • Une liste d'images : list.txt ;
  • Une liste correspondante d'URLs permettant de les visualiser dans une page web : urls.txt .

3. Programmes fournis

Vous pourrez utiliser les éléments de code : cgiu.h/cgiu.c, utilitaire pour la CGI, et proc.h/proc.c qui contient d'autres fonctions utiles pour la réalisation du projet. Un programme testproc.c vous permet de tester quelques fonctions de ce module et vous montre comment les utiliser. Il se compile avec :

cc cgiu.c proc.c testproc.c -o testproc

(tout n'est pas utile pour ces TPs).

Si vous voulez faire une interface par CGI, vous pouvez partir du formulaire et du programme suivants : form_post4.html et post4.c. Pour plus d'informations à propos de CGI, voir html-cgi.pdf et langageC.pdf.

Vous pouvez regarder le TP2 de l'ancien cours RICM4-RIM pour des informations relatives au placement du formulaire HTML et du programme CGI, ainsi qu'au lien entre les deux avec le serveur HTTP de goedel.

Nous vous fournissons aussi 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 executable Linux djpeg est fourni pour le cas où il ne serait pas disponible sur votre système. S'il ne fonctionne pas, vous pouvez l'installer sur ubuntu avec la commande :

sudo apt-get install libjpeg-progs

Ça installe tout ce qui concerne le JPEG, y compris djpeg qui doit alors se retrouver dans /usr/bin .

4. Implémentation

4.1. Première partie: recherche par la distribution de couleurs.

Il y a deux programmes à écrire (ou un seul avec deux options).

  • Le premier s'exécute une seule fois (hors ligne). Il construit un index qui est un fichier contenant les histogrammes de toutes les images de la collection dans laquelle on effectue la recherche.
  • Le second s'exécute pour chaque requête (en ligne). Il calcule la distance Euclidienne entre l'histogramme de l'image requête et les histogrammes précalculés de toutes les images de la collections. Il trie enfin les images de la collection en fonction de ces distances et affiche les 10 plus proches par ordre de distance croissante.

Étapes :

  • Calculer un histogramme tridimensionnel de couleurs sur une image. Les composantes RGB seront chacune décomposées en 4 intervalles égaux. L'histogramme sera normalisé (somme des valeurs égale à 1).
  • Calculer les histogrammes de couleurs pour toutes les images de la collection. Stocker le résultat dans un fichier binaire.
  • Calculer les distances entre l'histogramme de l'image requête et les histogrammes de couleurs pour toutes les images.
  • Trier les images de la collection en fonction de leur distance à l'image requête et afficher les 10 plus proches.

Attention : pour le calcul des historammes sur l'ensemble des images, si vous faites une boucle sur les lignes du fichier urls.txt, la procédure read_cimage() alloue de la mémoire pour stocker les plans RGB à chaque appel. Il faut la libérer par un appel à free_cimage() à la fin du corps de la boucle.

Pour charger les listes urls.txt et list.txt en mémoire sour la forme d'un tableau de chaînes de caractères, vous pouvez utiliser la fonction readList() de proc.c / proc.h. Utiliser éventuellement freeList() pour libérer ces tableaux.

Tri :

  • Pour le tri, il faut conserver la relation entre la distance calculée et la référence de l'image correspondante. On utilise pour cela un tableau de structures contenant le numéro de l'image et la distance correspondante. Voir proc.h (structure KEY).
  • On peut utiliser la fonction C standard qsort() (voir le man) pour trier le tableau de structures. Utiliser la fonction keyCompare() de proc.c.

Affichage des résultats :

  • Sans passer pa un CGI, il est possible de visualiser les résultats de la recherche dans une page HTML. Il suffit pour cela d'encapsuler les URL des images avec des balises <IMG SRC=“…”> et de rediriger la sortie du programme vers un fichier out.html qu'il n'y a plus qu'à charger dans un navigateur.

4.2. Deuxième partie: recherche par mots visuels.

Cette partie est supprimée. Elle sera remplacée par une autre petit projet en apprentissage profond (deep learning).

5. Projet deep learning

6. Évaluation du projet

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

Le compte rendu doit comprendre une très courte introduction expliquant quel est le problème que votre système traite, l'organisation logicielle globale de votre système, comment vous avez implémenté les différents éléments (vous pouvez en choisir un en particulier que vous détaillez), et des exemples de résultats obtenus illustrant les capacités du système et en montrant des cas où il fonctionne de manière satisfaisante et d'autre où il fonctionne moins bien. Ne reproduisez pas le sujet et n'incluez pas le code et les scripts dans le compte rendu, à l'exception éventuelle d'extraits courts.

Pour la partie “deep learning”, vous devrez également fournir les scripts python correspondant à votre meilleur résultat sur le collection CIFAR-10 et expliquer les modification que vous avez effectuées et leurs effets sur la performance.

projet_image.txt · Last modified: 2019/01/15 09:20 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