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;