Introduction à l'apprentissage automatique - TP6 exercice 1

Classification d'images à la fin du XXème siècle et au début du XXIème siècle


Le but de ce TP est de découvrir une application de la vision par ordinateur, la classification d'images.

On utilisera un sous-ensemble de la base de données Caltech101, constitué d'images appartenant à 6 catégories, disponible à cette URL (disponible aussi sur Arche). La base de donnée est volontairement réduite pour rester gérable pendant un TP, mais vous pouvez bien entendu tenter de traiter la base entière sur votre temps libre.


Commencez par charger et décompresser la base réduite dans votre répertoire de travail, et visualisez les images qu'elle contient.


Le but est de prédire la catégorie d'une image de la base de test, connaissant les catégories auxquelles appartiennent les images de la base d'apprentissage. Il s'agit donc d'un problème de classification supervisée.

Les images ont des tailles différentes, de l'ordre de 300x200 pixels. Ce sont des images en couleur, un pixel est donc décrit par un triplet de composantes Rouge, Vert, Bleu. Les composantes prennent des valeurs entre 0 et 255 (codage sur 8 bits), de manière à ce que (0,0,0) soit le noir, (255,255,255) le blanc, (0,255,0) le vert "pur", etc. Chaque image est donc décrite par approximativement 3x300x200=120000 valeurs variant entre 0 et 255.

Le défi est de réduire la dimension des observations, en extrayant de chaque image une information pertinente représentée dans un espace de dimension "raisonnable", commun à toutes les images. Nous allons utiliser une méthode inspirée de celle présentée dans cet article très célèbre de 1999: chaque image sera représentée par un vecteur de ${\mathbb R}^{8^3}={\mathbb R}^{512}$ obtenu en concaténant les histogrammes tridimensionnels des triplets (R,V,B) en chaque pixel, chaque composante étant discrétisée sur 8 "baquets" ( bins ).


On commence par importer des bibliothèques, et définir une fonction de visualisation de la base de test qui nous sera utile pour visualiser les performances des classifieurs.


La cellule suivante permet de lire les données et stocker l'information dans des tableaux. Notez le nombre d'observations dans chaque classe (80% pour la base d'apprentissage, 20 % pour la base test). Constatez que les classes ont des effectifs assez différents. Le jeu de données est assez limité mais permettra tout de même de bien illustrer le comportement des différents algorithmes.

Question 1: np.histogramdd renvoie le nombre de pixels de l'image img dont les composantes (R,G,B) tombent dans un cube de la forme $[32i,32(i+1)]\times[32j,32(j+1)]\times[32k,32(k+1)]$ ($i,j,k \in \{0,1,\dots,7\}$). Selon vous, pourquoi normalise-t-on les valeurs stockées dans les histogrammes, et quel est l'intérêt pour ces images de tailles différentes?

Réponse:

</font>