Rsultats obtenus avec la premire toolbox ( Anton Schwaighofer)
Transcription
Rsultats obtenus avec la premire toolbox ( Anton Schwaighofer)
1. Scripts Matlab. a) Toolbox 1 : entrainement, classification et « test » %Entraînement de la machine à vecteurs supports %================================== %Toolbox d'Anton Schwaighofer ( Graz) clear all; %Lecture de l'image d'entrainement et classification par la fonction « test » pour disposer d’un ensemble d’entrainement %Une réduction de taille est effectuée afin de ne pas trop gonfler les calculs test; %On peut aller changer dans la fonction test l'image d'entrainement fprintf('Test effectué\n'); %Dimensionnement des images d'entrainement et cible (Nx3 et Nx1) X=[]; Y=[]; [l,c]=size(r2); N=l*c; for i=1:N X(i,1)=r2(i); X(i,2)=g2(i); X(i,3)=b2(i); Z(i)=t(i); if(Z(i)==0); Z(i)=-1; end end Y=Z'; size(X) size(Y) fprintf('dimensionnement effectué\n'); %Fabrication de la structure 'net' qui portera les paramètres de la machine entraînée %C'est ici qu'on choisit la fonction kernel ainsi que ses paramètres éventuels size(X,2) net = svm(size(X,2), 'rbf', 1); fprintf('net construit'); %Entrainement proprement dit net = svmtrain(net, X, Y) fprintf('machine entrainée\n'); %Classification par la SVM entraînée %========================== %Toolbox d'Anton Schwaighofer ( Graz) %Lecture de l'image à classifier [r g b]=bmpread('calcaire'); % Mettre le nom de l'image à classifier réduction des matrices r1=haarsub(r); r2=haarsub(r1); g1=haarsub(g); g2=haarsub(g1); b1=haarsub(b); b2=haarsub(b1); %changement de format matrice trois dim-->matrice Nx3 X1=[]; [l,c]=size(r2); N=l*c; for i=1:N X1(i,1)=r2(i); X1(i,2)=g2(i); X1(i,3)=b2(i); end fprintf('dimensionnement effectué\n'); %Classification par SVM Y1=[]; Y1=svmfwd(net,X1); fprintf('classification effectuée\n'); % remise en forme pour affichage % A partir du vecteur, on fabrique l'image binaire image=[]; for i=0:(c-1) image(:,i+1)=Y1(i*l+1:(i+1)*l); end figure(2) imshow(image); %Calssification argile-calcaire %Fonction « test », effectue une classification pour l’ensemble d’entrainement [r,g,b]=bmpread('composite.bmp'); [y,u,v]=rgb2yuv(r,g,b); colormap(gray); colormap(gray); x=-u.*v; colormap(gray); %réduction de la taille de x z=haarsub(x); z2=haarsub(z); t=(z2>0.01); figure(1); imshow(t); %Réduction de la taille de [r g b] r1=haarsub(r); r2=haarsub(r1); g1=haarsub(g); g2=haarsub(g1); b1=haarsub(b); b2=haarsub(b1); X=[]; Y=[]; Z=[]; [l,c]=size(r2); N=l*c; for i=1:N X(i,1)=r2(i); X(i,2)=g2(i); X(i,3)=b2(i); Z(i)=t(i); if(Z(i)==0); Z(i)=-1; end end Y=Z'; b) Toolbox 2 : entrainement, classification %Entraînement de la machine à vecteurs supports %================================== function [AlphaY, SVs, Bias, Parameters, nSV, nLabel,X,Y]=entrainement(photo,methode,p1,p2,p3,p4); % Cette fonction entraîne la machine SVM %---------------------------------------%Toolbox SVM OSU % % %INPUTS: % %image : image d'entrainement de la machine (par ex 'argile.bmp') %methode : on a le choix entre : % 1 --> linear % 2 --> rbf % 3 --> poly %parametre: le nombre de parametres possibles varie selon la méthode choisie pour la classification % Si linear : % C(parametre1): Cout d'une violation de contrainte (default 1) % Si rbf : % Gamma(parametre2): paramètre du radial based kernel qui a la forme (exp(Gamma*|X(:,i)-X(:,j)|^2)). (default 1) % C(parametre1): Cout d'une violation de contrainte (default 1) % Si poly : % C(parametre1): Cout d'une violation de contrainte (default 1) % Paramètres du polynome (Gamma*<X(:,i),X(:,j)>+Coefficient)^Degree) % Degree(parametre2) ---(default: 3) % Gamma(parametre3) ---(default: 1) % Coeff(parametre4) ---(default: 1) clear all; %Fonction "test" pour la fabrication de l'ensemble d'entrainement [r,g,b]=bmpread(photo); [y,u,v]=rgb2yuv(r,g,b); colormap(gray); colormap(gray); x=-u.*v; colormap(gray); %réduction de la taille de x z=haarsub(x); z2=haarsub(z); t=(z2>0.01); figure(1); imshow(t); %Réduction de la taille de [r g b] r1=haarsub(r); r2=haarsub(r1); g1=haarsub(g); g2=haarsub(g1); b1=haarsub(b); b2=haarsub(b1); X=[]; Y=[]; Z=[]; [l,c]=size(r2); N=l*c; for i=1:N X(i,1)=r2(i); X(i,2)=g2(i); X(i,3)=b2(i); Z(i)=t(i); if(Z(i)==0); Z(i)=-1; end end Y=Z'; Samples=X'; Labels=Y'; %Entraînement SVM linéaire if(methode==1) if(nargin <3) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = LinearSVC(Samples, Labels); end elseif(nargin==3) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = LinearSVC(Samples, Labels,p1); end end %Entraînement SVM rbf if(methode==2) if(nargin==2) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = RbfSVC(Samples, Labels); end if(nargin==3) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = RbfSVC(Samples, Labels, 1, p1); end if(nargin==4) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = RbfSVC(Samples, Labels, p2,p1); end end %Entraînement SVM poly if(methode==3) if(nargin==2) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = PolySVC(Samples, Labels); end if(nargin==4) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = PolySVC(Samples, Labels, 3, p1); end if(nargin==6) [AlphaY, SVs, Bias, Parameters, nSV, nLabel] = PolySVC(Samples, Labels, p2,p1, p3, p4); end end %Classification par la SVM entraînée %========================== function [IMAGE,Y3]=classification(image,AlphaY, SVs, Bias, Parameters, nSV, nLabel,X,Y) %Classification %-------------%Cette fonction effectue la classification de l'image entrée %en paramètre. La classification se fait par la machine à %vecteurs supports qui a du être entraînée préalablement. % %INPUTS % %image : l'image à classifier (par ex : 'pierre_brute.bmp') %les autres entrées sont les sorties de la fonction entrainement.m %Lecture de l'image à classifier [r g b]=bmpread(image); %réduction des matrices r1=haarsub(r); r2=haarsub(r1); g1=haarsub(g); g2=haarsub(g1); b1=haarsub(b); b2=haarsub(b1); %changement de format matrice trois dim-->matrice Nx3 X1=[]; [l,c]=size(r2); N=l*c; for i=1:N X1(i,1)=r2(i); X1(i,2)=g2(i); X1(i,3)=b2(i); end X1=X1'; %Classification [Y1,Y2]= SVMClass(X1, AlphaY, SVs, Bias, Parameters, nSV,nLabel); %remise en forme de l'image classifiée Y1=Y1'; Y2=Y2'; IMAGE=zeros(l,c); Y3=zeros(l,c); for i=0:(c-1) IMAGE(:,i+1)=Y1(i*l+1:(i+1)*l); Y3(:,i+1)=Y2(i*l+1:(i+1)*l); end figure(2) imshow(IMAGE); %image tout ou rien figure(4); imshow(Y3); %valeurs de décision figure(5) mesh(IMAGE) %image en 3D Remarque générale : les fonctions d’entraînement sont utilisées une fois au départ sur l’image désirée ; ensuite, la classification s’effectue autant de fois que l’on veut sur l’image que l’on désire classifier. Une fois la machine entraînée, tous les paramètres restent en mémoire, il ne faut donc pas lancer l’entraînement à chaque classification, c’est d’ailleurs le but d’une méthode à réseaux de neurones. 2. Résultats obtenus Schwaighofer). avec la première toolbox ( Anton Une petite remarque avant de découvrir les autres résultats. Voici les photos « pierre_brute2 » et « pierre_brute » (cette dernière a déjà été traitée dans le rapport) : à première vue, les deux photos originales sont identiques mis à part le fait que la luminosité n’est pas la même. Vous allez alors observer que le résultat de la classification est tout à fait différent quelque soit le noyau utilisé (pour les résultats complets de « pierre_brute », se référer au rapport). image « pierre_brute » originale et classifiée avec noyau linéaire image « pierre_brute2 » originale et classifiée avec noyau linéaire image « pierre_brute2 » originale et classifiée avec noyau polynomial (degré 5) image « pierre_brute2 » originale et classifiée avec noyau rbf (rayon 1) Voici un test effectué sur une autre image : image « pierre+argile » originale et classifiée avec noyau rbf (rayon 1) 3. Résultats obtenus avec la deuxième toolbox ( université d’Ohio). image « pierre_brute2 » originale et classifiée avec noyau rbf (rayon 1) image « pierre_brute2 » classifiée avec noyau rbf (rayon 5) image « pierre_brute2 » classifiée avec noyau polynomial (degré 8) image « pierre_brute » originale et classifiée avec noyau polynomial (degré 8)