projet-calcul-scientifique/eigenfaces_part3.m
2023-06-10 21:16:28 +02:00

247 lines
7.7 KiB
Matlab

clear all;
close all;
%%%%%%%% CHOIX DES DONNEES
%%%%%%%%%%%%%%%%%%%%%%%%%%
% liste des differentes personnes
liste_personnes = {
'f01', 'f02', 'f03', 'f04', 'f05', 'f06', 'f07', 'f08', 'f09', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16'...
'm01', 'm02', 'm03', 'm04', 'm05', 'm06', 'm07', 'm08', 'm09', 'm10', 'm11', 'm12', 'm13', 'm14', 'm15', 'm16'
};
nb_personnes = length(liste_personnes);
% liste des differentes postures
liste_postures = {'v1e1','v3e1','v1e2','v3e2','v1e3','v3e3'};
nb_postures = length(liste_postures);
nb_lignes = 400;
nb_colonnes = 300;
% personnes constituant la base d'apprentissage (A FAIRE EVOLUER)
%liste_personnes_base = {'f01', 'f10', 'm01', 'm08'};
liste_personnes_base = {'f01', 'f10', 'm10', 'm08'}; % clusters mieux séparés
%liste_personnes_base = liste_personnes; % --> eigenfaces_all_4posture
nb_personnes_base = length(liste_personnes_base);
% postures de la base d'apprentissage (A FAIRE EVOLUER)
liste_postures_base = [1 2 3 4];
nb_postures_base = length(liste_postures_base);
%%%%%%%% LECTURE DES DONNES SANS MASQUE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X = [];
liste_base = [];
taille_ecran = get(0,'ScreenSize');
L = taille_ecran(3);
H = taille_ecran(4);
figure('Name','Personnes','Position',[0,0,0.67*L,0.67*H]);
colormap(gray(256));
% Affichage des images sous forme de planche-contact
% (une personne par ligne, une posture par colonne) :
for j = 1:nb_personnes_base,
no_posture = 0;
for k = liste_postures_base,
no_posture = no_posture + 1;
ficF = strcat('./Data/', liste_personnes_base{j}, liste_postures{k}, '-300x400.gif');
liste_base = [liste_base ; ficF];
img = imread(ficF);
% Remplissage de la matrice X :
X = [X ; double(transpose(img(:)))];
% Affichage
subplot(nb_personnes_base, nb_postures_base, (j-1)*nb_postures_base + no_posture);
imagesc(img);
hold on;
axis image;
title(['Personne ' liste_personnes_base{j} ', posture ' num2str(k)]);
end
end
%%%%%%%% CALCUL ET AFFICHAGE DES EIGENFACES SANS MASQUE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calcul de l'individu moyen :
n = size(X,1);
individu_moyen = ones(1,n)*X/n;
% Calcul de la matrice X_moyen de meme taille que X,
% telle que chaque ligne contienne l'individu moyen :
X_moyen = ones(n,1)*individu_moyen;
% Centrage de la matrice X :
X_centre = X - X_moyen;
% Calcul de la matrice de covariance (impossible a calculer ainsi a cause de sa taille) :
% Sigma = transpose(X_centre)*X_centre/n;
% Calcul de la matrice resultant du calcul inverse :
Sigma2 = X_centre*transpose(X_centre)/n;
% Calcul des vecteurs/valeurs propres de la matrice Sigma2 :
%%%%%%%%%%%%%%%
% VERSION EIG
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[V_2, D] = eig(Sigma2);
% Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 :
V = transpose(X_centre)*V_2;
% Tri par ordre decroissant des valeurs propres de Sigma_barre :
[lambda, ind] = sort(diag(D),'descend');
% Tri des eigenfaces dans le meme ordre
% (on enleve la derniere eigenface, qui appartient au noyau de Sigma) :
W = V(:, ind);
W = W(:, 1:size(W,2)-1);
% Normalisation des eigenfaces :
normes_eigenfaces = ones(size(W,1), 1)*sqrt(sum(W.*W));
W = W./normes_eigenfaces;
%%%%%%%%%%%%%%%
% version subspace
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [D, V] = subspace_iter_v2(Sigma2, 16, 1, 1, 0.001, 100000);
%
% % Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 :
% W = transpose(X_centre)*V;
% Affichage de l'individu moyen et des eigenfaces sous la forme de "pseudo-images"
% (leurs coordonnees sont interpretees comme des niveaux de gris) :
figure('Name','Individu moyen et eigenfaces', 'Position', [0,0,0.67*L,0.67*H]);
colormap(gray(256));
img = reshape(individu_moyen, nb_lignes, nb_colonnes);
subplot(nb_personnes_base, nb_postures_base, 1)
imagesc(img);
hold on;
axis image;
title(['Individu moyen']);
for k = 1:n-1,
img = reshape(W(:,k), nb_lignes, nb_colonnes);
subplot(nb_personnes_base, nb_postures_base,k+1);
imagesc(img);
hold on;
axis image;
title(['Eigenface ', num2str(k)]);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% AVEC MASQUE
%%%%%%%%%%%%%
% Dimensions du masque
ligne_min = 200;
ligne_max = 350;
colonne_min = 60;
colonne_max = 290;
%%%%%%%% LECTURE DES DONNES ET AJOUT DU MASQUE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
X_masque = [];
figure('Name','Personnes avec Masque','Position',[0,0,0.67*L,0.67*H]);
colormap(gray(256));
for j = 1:nb_personnes_base,
no_posture = 0;
for k = liste_postures_base,
no_posture = no_posture + 1;
ficF = strcat('./Data/', liste_personnes_base{j}, liste_postures{k}, '-300x400.gif');
img = imread(ficF);
% Degradation de l'image
img(ligne_min:ligne_max,colonne_min:colonne_max) = 0;
% Remplissage de la matrice X_masque :
X_masque = [X_masque; double(transpose(img(:)))];
% Affichage
subplot(nb_personnes_base, nb_postures_base, (j-1)*nb_postures_base + no_posture);
imagesc(img);
hold on;
axis image;
title(['Personne ' liste_personnes_base{j} ', posture ' num2str(k)]);
end
end
%%%%%%%% CALCUL ET AFFICHAGE DES EIGENFACES AVEC MASQUE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calcul de l'individu moyen :
n = size(X_masque,1);
individu_moyen_masque = ones(1,n)*X_masque/n;
% Calcul de la matrice X_moyen de meme taille que X,
% telle que chaque ligne contienne l'individu moyen :
X_moyen_masque = ones(n,1)*individu_moyen_masque;
% Centrage de la matrice X :
X_centre_masque = X_masque - X_moyen_masque;
% Calcul de la matrice de covariance (impossible a calculer ainsi a cause de sa taille) :
% Sigma = transpose(X_centre)*X_centre/n;
% Calcul de la matrice resultant du calcul inverse :
Sigma2_masque = X_centre_masque*transpose(X_centre_masque)/n;
% Calcul des vecteurs/valeurs propres de la matrice Sigma2 :
%%%%%%%%%%%%%%%
% version EIG
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[V_2_masque, D_masque] = eig(Sigma2_masque);
% Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 :
V_masque = transpose(X_centre_masque)*V_2_masque;
% Tri par ordre decroissant des valeurs propres de Sigma_barre :
[lambda_masque, ind_masque] = sort(diag(D_masque),'descend');
% Tri des eigenfaces dans le meme ordre
% (on enleve la derniere eigenface, qui appartient au noyau de Sigma) :
W_masque = V_masque(:, ind_masque);
W_masque = W_masque(:, 1:size(W_masque,2)-1);
% Normalisation des eigenfaces :
normes_eigenfaces_masque = ones(size(W_masque,1), 1)*sqrt(sum(W_masque.*W_masque));
W_masque = W_masque./normes_eigenfaces_masque;
%%%%%%%%%%%%%%%
% version subspace
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% [D, V] = subspace_iter_v2(Sigma2_masque, 16, 1, 1, 0.001, 100000);
%
% % Les vecteurs propres de Sigma (les eigenfaces) se deduisent de ceux de Sigma2 :
% W_masque = transpose(X_centre_masque)*V;
% Affichage de l'individu moyen et des eigenfaces sous la forme de "pseudo-images"
% (leurs coordonnees sont interpretees comme des niveaux de gris) :
figure('Name','Individu moyen masqué et eigenfaces', 'Position', [0,0,0.67*L,0.67*H]);
colormap(gray(256));
img = reshape(individu_moyen_masque, nb_lignes, nb_colonnes);
subplot(nb_personnes_base, nb_postures_base, 1)
imagesc(img);
hold on;
axis image;
title(['Individu moyen masqué']);
for k = 1:n-1,
img = reshape(W_masque(:,k), nb_lignes,nb_colonnes);
subplot(nb_personnes_base, nb_postures_base,k+1);
imagesc(img);
hold on;
axis image;
title(['Eigenface (masqué) ', num2str(k)]);
end
save eigenfaces;
%save eigenfaces_all_4posture;