Récupérer des informations depuis Picasa n’est pas une chose facile, le logiciel est assez limité et ne propose quasiment rien comme fonction d’export de données réutilisables.
Ce que je souhaite faire : extraire les informations brutes de la reconnaissance des visages de la base de données de Picasa. Les noms des personnes, les fichiers sources d’origine et le rectangle associé à chaque visage.
Sur Windows 7, la base de données de Picasa se trouve dans C:\Users\USERNAME\AppData\Local\Google\Picasa2. Dans ce dossier, on trouve principalement des fichiers pmp et des fichiers db. Les fichiers pmp correspondent à des données tabulaires. Chaque fichier pmp contient les données d’une colonne d’une des tables de la base de données. Le nom du fichier pmp correspond à table_colonne.pmp. On va donc avoir 3 tables:
- albumdata, qui contient des informations relatifs aux albums (dossiers et album visages)
- catdata, relatif aux categories (quasiment vide chez moi)
- imagedata, relatif aux images (contient les rectangles et les références des albums)
Comment lire les fichiers PMP ?
Ce sont des fichiers binaires dans le format little-endian. Le header est décrit selon ce tableau :
Taille | Description |
---|---|
4 octets | constante magique : 0x3fcccccd |
2 octets | type de champ (unsigned short) |
2 octets | constante : 0x1332 |
4 octets | constante : 0x00000002 |
2 octets | type de champ (unsigned short) |
2 octets | constante: 0x1332 |
4 octets | nombre d’entrées (unsigned int) |
Les différents types des valeurs sont :
Valeur | Description |
---|---|
0x0 | Chaînes de caractères terminées par un caractère nul |
0x1 | Unsigned int, 4 octets |
0x2 | Dates selon le format Microsoft Variant Time, 8 octets |
0x3 | byte field, 1 octet |
0x4 | unsigned long, 8 octets |
0x5 | unsigned short, 2 octets |
0x6 | Chaînes de caractères terminées par un caractère nul |
0x7 | unsigned int, 4 octets |
Voir http://sbktech.blogspot.fr/2011/12/picasa-pmp-format.html pour plus d’information sur les fichiers pmp.
Les valeurs qui nous intéresse pour les visages sont facerect (coordonnées du rectangle) et personalbumid (reference de l’album) dans la table imagedata, et les valeurs token (reference de l’album) et name (nom de la personne) dans la table albumdata.
Exemple en retenant que 4 colonnes:
Le rectangle est décrit par une donnée de type rectangle64. Une chaîne de 16 caractères qui contient 4 nombres sur 16 bit. Les nombres, une fois divisés par 2^16-1 (la plus grande valeur possible), sont les coordonnées relatives du point en haut à gauche et du point en bas à droite. Les valeurs absolues sont obtenues en multipliant les abscisses par la largeur de l’image et les ordonnées par la hauteur de l’image.
Exemple :
nombre d’origine (64 bits) | 0x67873bec9e1e933d | |||
Découpage en 4 nombres sur 16 bits | 0x6787 | 0x5678 | 0x3b51 | 0x4a89 |
Conversion en décimal | 26503 | 15340 | 40478 | 37693 |
Division par 2^16-1 (65535) | 0,4044 | 0,2341 | 0,6176 | 0,5751 |
Multiplication par la largeur (3264) et la hauteur (2448) | x1=1319 | y1=573 | x2=2016 | y2=1407 |
Avec ces informations, on sait que l’image x a un rectangle de visage de tel taille et qu’il correspond a telle personne mais on ne connait pas le nom du fichier sur le disque dur.
Cette information se trouve dans le fichier thumbindex.db. Ce fichier contient l’ensemble des dossiers et des images indexés dans la base de données de Picasa et l’entrée à la ligne x du fichier thumbindex.db va correspondre à la même image que celle de la ligne x dans la table imagedata.
Comment lire le fichier thumbindex.db ?
Header :
Taille | Description |
---|---|
4 octets | constante magique : 0x40466666 |
4 octets | nombre d’entrées (unsigned int) |
puis chaque ligne est décrit selon le tableau suivant :
Taille | Description |
---|---|
jusqu’au caractère nul | Chaîne de caractères terminée par un caractère nul |
26 octets | contenu inutile |
4 octets | index de l’entrée |
Chaque ligne va être soit un dossier avec le chemin complet et une valeur d’index particulière (4294967295), soit une image avec juste le nom du fichier et un index qui va pointer vers le dossier correspondant et qui va permettre de reconstruire le nom complet de l’image.
Dans l’exemple, l’image 266 est dans le dossier 5.
Voir http://projects.mindtunnel.com/picasa3meta/docs/picasa3meta.thumbindex.ThumbIndex-class.html pour plus d’information sur le fichier thumbindex.db.
Si l’on fait la fusion de la table imagedata et des données contenu dans thumbindex.db on se rend compte que pour une image donnée, on va avoir le nom du fichier sur le disque dur, le rectangle du visage mais pas de référence d’album !
Picasa va en fait stocker une image virtuelle en plus pour stocker cette donnée. Dans l’exemple précédent, l’image virtuelle 268 (qui n’a pas de nom de fichier) va contenir les informations sur le visage d’une personne qui se trouve dans l’image 266. Le rectangle sur l’image 266 va contenir l’ensemble des rectangles (quand l’image a plus d’un visage identifié, sinon le rectangle va être le même que celui de la personne). Il suffit donc de lire la référence de l’album de l’image 268 et de l’associer au non de fichier de l’image 266.
J’ai créer un programme qui va lire toutes ces informations et les stocker dans des fichiers csv. Un fichier par table pmp et un fichier pour les visages. Le programme peut aussi créer des vignettes de visage si imagemagick est installé (et que l’application convert soit dans le path).
Comment utiliser le programme qui va lire la base de données de Picasa ?
Il y a en fait 2 programmes. Un, appelé PMPDB qui va convertir les table pmp en fichier csv et un, appelé PicasaFaces qui va créer un fichier csv lisible qui va contenir toutes les informations sur les visages et va créer les vignettes des visages.
Usage:
java -classpath ".:bin/:commons-cli-1.2.jar" PMPDB -folder "/path/to/PicasaDB/Picasa2/db3/" -output ./OutputFolder
java -classpath ".:bin/:commons-cli-1.2.jar:commons-io-2.4.jar" PicasaFaces -folder "/path/to/PicasaDB/Picasa2/db3/" -output ./OutputFolder -replaceRegex C: -replacement /media/HardDrive -convert /path/to/convert(.exe)
Si la ligne de commande contient l’argument -convert, alors imagemagick va créer toutes les vignettes (dans le dossier de destination avec un dossier pour chaque personne). Une modification du chemin des images peut être effectuée si les images ont changées de place par rapport aux informations contenu dans la base de données (dans l’exemple « C: » sera remplacé par « /media/HardDrive ».
Les sources sont disponible sur github : https://github.com/skisoo/PicasaDBReader
Fonctionne sous Windows et Linux.