miniprojet/learning/code/learning.m
2019-12-17 11:46:20 +01:00

85 lines
2.3 KiB
Matlab

close all
%acceptable threshold values: 15-30
threshold = 20;
cmax = 10;
cmin = -cmax;
n_classes = 16;
iterations = 50;
N = 200;
dataset = dir('../images/*/*.jpg');
dataset_size = length(dataset);
vecteurs=zeros(2*(cmax-cmin+1),dataset_size); %TODO: renommer en vectors
classes = []; %colonne [avance; arret; gauche; droite; rejet]
for k=1:dataset_size %instanciation des valeurs des classes pour le training
deb = dataset(k).name(1:2);
if deb == 'av'
classes = [classes , [1;0;0;0;0]];
elseif deb == 'ar'
classes = [classes , [0;1;0;0;0]];
elseif deb == 'ga'
classes = [classes , [0;0;1;0;0]];
elseif deb == 'dr'
classes = [classes , [0;0;0;1;0]];
elseif deb == 're'
classes = [classes , [0;0;0;0;1]];
end
end
% c'est lent
% s'assurer que l'on choisit toutes les images
%
for n=1:dataset_size
% choix d'une image aléatoire
choix = 1 + floor(dataset_size*rand(dataset_size, 1));
% extraction de l'image du dataset
image = dataset(choix(1));
% lecture de l'image
img = imread([image.folder '/' image.name]);
% filtrage de la couleur de la peau
binary = rgb_filter(img, threshold);
% détermination du contour
c = contourc(binary);
% Détermination du contour de taille max
cont = max_contour(c);
% transformation en signal complex
z = cont(:,1) + 1i*cont(:,2);
% calcul des descripteurs de Fourrier
[coeff,ncoeff]=descripteurfouriernorm(z,cmax);
% Extraction des composantes
vecteurs(:,n)=[real(coeff);imag(coeff)];
% affichage de l'avancement
disp(n/dataset_size);
end
% utilisation de l'algorithme des kmeans
kmeans = kmoyennes(vecteurs, n_classes, iterations);
% affichage des prototypes
figure
for n=1:n_classes
contfil=resconstrdesfour(kmeans(1:end/2,n)+1i*kmeans(end/2+1:end,n),N,cmax);
subplot(4,4,n)
h=plot(real(contfil),imag(contfil),'-',real(contfil(1)),imag(contfil(1)),'o');
title(['prototype ' int2str(n)])
set(h(1),'LineWidth',2)
set(h(2),'LineWidth',3)
grid on
axis equal
axis ij
drawnow
end
% utilisation de l'algorithme du perceptron multicouches
[net, resultats_test] = PMC_training(vecteurs, classes, 10, 800);
%faire une prediction : y = net(x)