Ce TP s'inspire largement du TP de Rémi Megret
L'objectif de ce TP est de programmer la méthode d'identification de visages dite par "eigenfaces", proposée par Turk et Pentland en 1991. Cette méthode permet de reconnaître à la volée une personne sans s'intéresser à des caractéristiques particulières comme la couleur des yeux, la forme du visage, celle du nez... L'idée principale est de décrire chaque visage comme une combinaison de vecteurs. Ces vecteurs de base sont les eigenfaces. Ils sont calculés automatiquement comme étant ceux qui discriminent le mieux les visages dont on connait déjà les identifiants.
Dans l'exemple ci-dessous, l'image la plus à gauche (yaleB13) est la somme
Ce qui suit est une méthode pas à pas permettant de développer un système capable de reconnaître avec une certaine fiabilité un visage d'une base de données de visages de références. Ceci se fait en XXX étapes :
Le TP s'appuie sur un extrait de la base de visages de Yale. La première étape consiste à récupérer ce fichier, le décompresser et le parcourir.
Le dossier contient $m=38$ visages éclairés différemment, pris sous des angles légèrement différents. Les visages de base sont ceux dont le suffixe est "_P00A+000E+00.pgm". On note que tous les images ont une taille de 64 lignes et 56 colonnes soit $n=3584$ pixels.
Dans la suite par soucis de cohérence
de $m$ colonnes où chaque colonne est un vecteur représentant une image. Ainsi l'ensemble des visages de base est la matrice $I=\left[ I_1,\ldots,I_m\right]$ de taille $n\times m$
A l'origine, les eigenfaces sont les axes principaux obtenus en effectuant l'Analyse en Composantes Principales des vecteurs associés aux visages de référence.
Théoriquement, les eigenfaces sont les vecteurs propres de la matrice de $A.A^{T}$, de taille $n\times n$, où la matrice $A$ de même taille que $I$ représente l'ensemble des visages centrés : $A = \left[ I_1-I_{\textit{moy}}, \ldots, Im-I_{\textit{moy}} \right]$ Intuitivement, les eigenfaces sont les vecteurs qui permettent de séparer au mieux les colonnes de $A$ par projection.
$(u,s,v)$ où
Exploiter cette fonction pour retourner les 5 première eigenfaces.
On construit la base $W_K = \left[ U_1,\ldots,U_K \right]$ des $K$, $1\le K \lem$, premières eigenfaces. Ceci permet de construire un sous espace des visages.
La projection d'une image $I$ de test dans le sous-espace des eigenfaces se fait en soustrayant le visage moyen et en effectuant le produit scalaire de l'image obtenue avec chaque eigenface. Ceci donne les coordonnées de l'image test dans le sous-espace des visages, qui est de dimension $K$. Ainsi pour chaque $k$, $ 1 \le k \le K $, on a $ c_I(k) = U_k^T . (I – I_{\textit{moy}})$
Chaque visage possède donc deux représentations :
Ainsi, avec $m$ visages, nommés $I_1, \ldots, I_m$, avec la matrice $A=\left[I_1-I_{\textit{moy}},\ldots, I_m-I_{\textit{moy}}\right]$ qui représente les $m$ visages centrés, on obtient les coordonnées $C_{I1},\ldots, C_{Im}$ directement en effectuant le produit $\left[C_{I1}, \ldots, C_{Im}\right] = W^T.A$
A chaque visage de référence $I_k$ est associée une identité, sous la forme d'un numéro $\textit{id}(k)$.
Nous chercherons maintenant à identifier un visage test $J$ à partir des visages de référence, c'est à dire à trouver quel est l'identité $\textit{id}(k)$ de $J$. Pour cela, on calcule pour chaque image de référence $I_k$ la distance $d(J,I_k) = ||J^{\textit{proj}} - I_k^{\textit{proj}}||$ entre les projections $J^{\textit{proj}}$ et $I_k^{\textit{proj}}$. On trouve ensuite le $k$ qui minimise cette distance.
Si ce minimum est inférieure à un seuil $s$ , on peut estimer qu'il s'agit d'un visage reconnu d'identité $\textit{id}(k)$, sinon le visage est classifié comme inconnu.
Dans ce qui suit, on considère que $K=5$.