Visages et regards

Certains logiciels de stockage de photos comportent désormais une fonctionnalité de reconnaissance de visages (face recognition en anglais). À chaque visage détecté dans une photo peut être associée une personne (un nom, voire une fiche dans le carnet d'adresses), ce qui permet de rechercher des photos d'une personne donnée, etc.

fig. 1 : reconnaissance de visages (source ZDnet)

L'objectif de ce projet est de réaliser des utilitaires de manipulation des photos contenant des visages. La reconnaissance des visages n'est pas faite dans le projet, on peut récupérer les visages identifiés par le logiciel Picasa. Le projet comporte les principaux objectifs suivants :

  1. Récupération des visages
  2. Constitution d'un grand corpus de visages à partir du web
  3. Détection des yeux
  4. Utilitaires et jeux

Le dernier objectif est obligatoires. Pour les autres, vous choisirez les priorités que vous souhaitez leur donner.

L'objectif n'est pas de réaliser une interface graphique pour manipuler des images. L'interface graphique est une option possible tout à fait intéressante, mais n'est ni indispensable, ni prioritaire.

Récupération des visages

On utilisera Picasa pour détecter les visages, mais le principe est généralisable à d'autres outils (logiciels ou API). Picasa n'étant pas installé dans les salles de TP, son utilisation n'est pas obligatoire. Elle est cependant recommandé pour ceux qui ont la possibilité de l'installer sur un ordinateur personnel.

Les informations sur les visages (les métadonnées) sont stockées sur le disque dur (parfois dans le fichier de la photo) par le logiciel qui les a calculées et collectées. Le premier objectif du projet consiste à enregistrer dans un fichier image chaque visage identifié dans chaque photo d'un certain dossier du disque dur.

Picasa utilise deux méthodes alternatives pour enregistrer les visages d'une photo :

Extensions possibles

Constitution d'un gros corpus de visages à partir du web

Pour faire des tests en grandeur nature, et obtenir des résultats intéressants, les programmes réalisés devront être utilisés sur un gros corpus de visages. La constitution de ce corpus fera partie intégrante du projet.

Vous devrez écrire un script (dans le langage de votre choix : bash avec wget, php, python, R, etc.) pour extraire une grande quantité de visages depuis un ou plusieurs sites web de votre choix (wikimedia, facebook, un site d'université, etc.) Attention aux questions juridiques : l'utilisation de ce corpus devra possiblement être limitée à votre usage privé.

Détection des yeux

Étant donné une photo contenant uniquement un visage, vous devrez mettre au point une méthode de détection des yeux.

Le principe

Si on se focalise sur la moitié supérieure de la photo, localiser la position de chacun des deux yeux sur l'axe horizontal peut se faire en calculant la moyenne des intensités lumineuses de chaque colonne de pixels (voir figure Y1).

fig. Y1 : position horizontale

La position verticale de chaque oeil peut se calculer de la même manière (voir figure Y2).

fig. Y2 : position verticale

Validation

Le projet devra comporter une partie permettant d'évaluer partiellement la méthode de détection en utilisant le corpus.

Extensions possibles

Utilitaires et jeux

Une fois qu'une collection de visages a été constituée, il est possible d'imaginer de nombreuses applications, utilitaires ou ludiques. Vous en réaliserez au moins une. La liste ci-dessous n'est donnée qu'à titre d'exemple.

Infos utiles

Sur les métadonnées de Picasa

Il y a une grande quantité de blogs et forums sur lesquels on peut glaner des infos sur les métadonnées que Picasa utilise, et leur format, notamment le forum picasa.

Le .picasa.ini est à peu près intégralement décodé ici : fbuchinger/.picasa.ini.

Pour le format des métadonnées dans les photos, il faut fouiller un peu plus. Un début d'indications là : put face tags into photos, mais je n'ai pas trouvé une jolie référence bien propre et complète.

Sur la manipulation d'images en Java

Voir le tutoriel java Working with images. On utilise la classe BufferedImage, avec les méthodes ci-dessous.

ImageIO.read, ImageIO.write
(de la classe ImageIO) pour charger ou sauvegarder une image
getRGB, setRGB
pour connaître ou modifier la couleur d'un pixel