Reconstruction d'image par Regression à base de noyaux
Contents
Objectif
Le but de ce TP est d'utiliser les SVM en regression (aussi appelés SVR pour Support Vector Regression) pour reconstituer les pixels manquants dans une image (ce qui revient à faire une forme d'interpolation sur des données en 2 dimensions).
Outils
- Le code sera en Matlab.
- Les SVM utilisés sont ceux de la boîte à outils libSVM (disponible gratuitement en ligne).
- Les données sont issues de la base de données USPS (fournie avec le TP). Cette base de donnée contient des images représentant des chiffres manuscrits isolés sur des codes postaux. Cette base est utilisée classiquement pour l'évaluation des méthodes d'apprentissage.
Etapes
- Préparer la base d'apprentissage et de test.
- Mettre en oeuvre le SVR.
- Tester différents réglages du SVR (noyau, relâchement des contraintes
, largeur du tube
) afin d'obtenir la meilleure reconstruction.
- Faire varier le taux de pixels manquants.
Préparation des données
- Ouvrir une des images fournies et afficher l'image d'origine.
load(['image4.mat']); figure, imagesc(B); colormap('gray'); title(['Image d''origine'],'fontsize',20);

- Construire les données utilisables en apprentissage (coordonnées des pixels et étiquettes associées)
[x1,x2] = meshgrid(1:size(B,1),1:size(B,2)); trainvecT = [reshape(x1,size(B,1)*size(B,2),1),reshape(x2,size(B,1)*size(B,2),1)]; trainlabT = double(reshape(B,size(B,1)*size(B,2),1));
- Sélectionner les pixels à supprimer (tirer au hasard P% des pixels de l'image).
P = 0.5; rn = randperm(length(trainvecT)); PS = rn(1:round(P*length(trainvecT)));
- Créer votre base d'apprentissage : celle-ci est constituée des coordonnées de tous les pixels non supprimés. Les étiquettes correspondantes sont les niveaux de gris de l'image d'origine à ces coordonnées.
trainvec = trainvecT; trainlab = trainlabT; trainvec(PS,:) = []; trainlab(PS) = [];
- Créer votre base de test : celle-ci est constituée des coordonnées de tous les pixels supprimés. Les étiquettes correspondantes sont les niveaux de gris de l'image d'origine à ces coordonnées.
testvec = trainvecT(PS,:); testlab = trainlabT(PS);
- Affichez l'image tronquée
C = reshape(B,size(B,1)*size(B,2),1); C(PS) = 1; C = reshape(C,size(B,1),size(B,2)); figure, imagesc(C); colormap('gray'); title(['Image tronquée à ',num2str(100*P), '%'],'fontsize',20);

Travail à réaliser
SVR et réglage
- Lire la documentation (en ligne ou en tapant svmtrain dans Matlab) de libSVM pour connaître les options disponibles et les sorties du SVM/SVR
- Lancer l'apprentissage en regression pour une image avec 50% de pixels manquants, un noyau de type rbf (gaussien) avec largeur de bande
, et des paramètres du SVR
,
- Tester le model appris sur vos données de test et afficher l'image complétée.
- Mettre en oeuvre une procédure qui évalue la qualité du résultat en fonction des différents paramètres (
et
, on gardera
) et retient l'ensemble de paramètres le plus performant (méthode de la validation croisée)
Variation des pixels manquants
- Réutiliser la procédure précédante et faire varier le taux de pixels manquants (de 10% à 90%). Observer la capacité de reconstruction d'une telle méthode.
Exemple de code (à titre indicatif)
Ajout de la toolbox dans le chemin
addpath('./Toolbox/libsvm-mat-2.88-1/');
Lancement du SVR
param = ['-s 3 -c 1 -g 0.1 -e 0.1'];
model = svmtrain(trainlab, trainvec, param);
[predict_label, accuracy, dec_values] = svmpredict(testlab, testvec, model);
Affichage de l'image reconstruite
figure; D = reshape(B,size(B,1)*size(B,2),1); D(PS) = predict_label; D = reshape(D,size(B,1),size(B,2)); imagesc(D); colormap('gray'); title('Image reconstruite','fontsize',20);
