Browse Source

réorganisation et debuggage des descripteurs

dev
Guillaume Courrier 6 years ago
parent
commit
b3871fa415
  1. 176
      learning/code/algo.c
  2. 6
      learning/code/algo.h
  3. BIN
      learning/code/code
  4. 10
      learning/code/constant.h
  5. 4
      learning/code/data_set.m
  6. 28
      learning/code/descripteurfouriernorm.m
  7. BIN
      learning/code/dict
  8. 25
      learning/code/global.c
  9. 25
      learning/code/global.h
  10. 41
      learning/code/kmoyennes.m
  11. 58
      learning/code/learning.m
  12. 8
      learning/code/makefile
  13. 18
      learning/code/max_contour.m
  14. BIN
      learning/code/quantvec
  15. 63
      learning/code/quantvec.c
  16. 11
      learning/code/resconstrdesfour.m
  17. 23
      learning/code/rgb_filter.m
  18. 3
      learning/code/traitement.h
  19. BIN
      learning/code/vecteurs
  20. 0
      learning/images/arret/arret0001.jpg
  21. 0
      learning/images/arret/arret0002.jpg
  22. 0
      learning/images/arret/arret0003.jpg
  23. 0
      learning/images/arret/arret0004.jpg
  24. 0
      learning/images/arret/arret0005.jpg
  25. 0
      learning/images/arret/arret0006.jpg
  26. 0
      learning/images/arret/arret0007.jpg
  27. 0
      learning/images/arret/arret0008.jpg
  28. 0
      learning/images/arret/arret0009.jpg
  29. 0
      learning/images/arret/arret0010.jpg
  30. 0
      learning/images/arret/arret0011.jpg
  31. 0
      learning/images/arret/arret0012.jpg
  32. 0
      learning/images/arret/arret0013.jpg
  33. 0
      learning/images/arret/arret0014.jpg
  34. 0
      learning/images/arret/arret0015.jpg
  35. 0
      learning/images/arret/arret0016.jpg
  36. 0
      learning/images/arret/arret0017.jpg
  37. 0
      learning/images/arret/arret0018.jpg
  38. 0
      learning/images/arret/arret0019.jpg
  39. 0
      learning/images/arret/arret0020.jpg
  40. 0
      learning/images/arret/arret0021.jpg
  41. 0
      learning/images/arret/arret0022.jpg
  42. 0
      learning/images/arret/arret0023.jpg
  43. 0
      learning/images/arret/arret0024.jpg
  44. 0
      learning/images/arret/arret0025.jpg
  45. 0
      learning/images/arret/arret0026.jpg
  46. 0
      learning/images/arret/arret0027.jpg
  47. 0
      learning/images/arret/arret0028.jpg
  48. 0
      learning/images/arret/arret0029.jpg
  49. 0
      learning/images/arret/arret0030.jpg
  50. 0
      learning/images/arret/arret0031.jpg
  51. 0
      learning/images/arret/arret0032.jpg
  52. 0
      learning/images/arret/arret0033.jpg
  53. 0
      learning/images/arret/arret0034.jpg
  54. 0
      learning/images/arret/arret0035.jpg
  55. 0
      learning/images/arret/arret0036.jpg
  56. 0
      learning/images/arret/arret0037.jpg
  57. 0
      learning/images/arret/arret0038.jpg
  58. 0
      learning/images/arret/arret0039.jpg
  59. 0
      learning/images/arret/arret0040.jpg
  60. 0
      learning/images/arret/arret0041.jpg
  61. 0
      learning/images/arret/arret0042.jpg
  62. 0
      learning/images/arret/arret0043.jpg
  63. 0
      learning/images/arret/arret0044.jpg
  64. 0
      learning/images/arret/arret0045.jpg
  65. 0
      learning/images/arret/arret0046.jpg
  66. 0
      learning/images/arret/arret0047.jpg
  67. 0
      learning/images/arret/arret0048.jpg
  68. 0
      learning/images/arret/arret0049.jpg
  69. 0
      learning/images/arret/arret0050.jpg
  70. 0
      learning/images/arret/arret0051.jpg
  71. 0
      learning/images/arret/arret0052.jpg
  72. 0
      learning/images/arret/arret0053.jpg
  73. 0
      learning/images/arret/arret0054.jpg
  74. 0
      learning/images/arret/arret0055.jpg
  75. 0
      learning/images/arret/arret0056.jpg
  76. 0
      learning/images/arret/arret0057.jpg
  77. 0
      learning/images/arret/arret0058.jpg
  78. 0
      learning/images/arret/arret0059.jpg
  79. 0
      learning/images/arret/arret0060.jpg
  80. 0
      learning/images/arret/arret0061.jpg
  81. 0
      learning/images/arret/arret0062.jpg
  82. 0
      learning/images/arret/arret0063.jpg
  83. 0
      learning/images/arret/arret0064.jpg
  84. 0
      learning/images/arret/arret0065.jpg
  85. 0
      learning/images/arret/arret0066.jpg
  86. 0
      learning/images/arret/arret0067.jpg
  87. 0
      learning/images/arret/arret0068.jpg
  88. 0
      learning/images/arret/arret0069.jpg
  89. 0
      learning/images/arret/arret0070.jpg
  90. 0
      learning/images/arret/arret0071.jpg
  91. 0
      learning/images/arret/arret0072.jpg
  92. 0
      learning/images/arret/arret0073.jpg
  93. 0
      learning/images/arret/arret0074.jpg
  94. 0
      learning/images/arret/arret0075.jpg
  95. 0
      learning/images/arret/arret0076.jpg
  96. 0
      learning/images/arret/arret0077.jpg
  97. 0
      learning/images/arret/arret0078.jpg
  98. 0
      learning/images/arret/arret0079.jpg
  99. 0
      learning/images/arret/arret0080.jpg
  100. 0
      learning/images/arret/arret0081.jpg

176
learning/code/algo.c

@ -0,0 +1,176 @@
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
#include "constant.h"
#include "global.h"
#include "algo.h"
void Erreur(char * chaine,int numero)
{
fprintf(stderr,chaine);
fprintf(stderr,"\nerreur %d\n",numero);
exit(numero);
}
int LireVecteurs (void)
{
int k;
if((ent=fopen(noment,"rb"))==NULL)
return 1;
fread(&M,sizeof(int),1,ent);
fread(&dimvec,sizeof(int),1,ent);
fread(&dico,sizeof(int),1,ent);
fread(&numiter,sizeof(int),1,ent);
if((vecteurs=(float**)calloc(M,sizeof(float *)))==NULL)
return 3;
for(k=0;k<M;k++)
{
if((vecteurs[k]=(float*)calloc(dimvec,sizeof(float)))==NULL)
return 4;
}
for(k=0;k<M;k++)
fread(vecteurs[k],sizeof(float),dimvec,ent);
fclose(ent);
return 0;
}
int InitDictionnaire(void)
{
int k;
if((vecteurs_classes=(float**)calloc(dico,sizeof(float *)))==NULL)
return 1;
for(k=0;k<dico;k++)
{
if((vecteurs_classes[k]=(float*)calloc(dimvec,sizeof(float)))==NULL)
return 2;
}
if((vecteurs_final=(float**)calloc(dico,sizeof(float *)))==NULL)
return 3;
for(k=0;k<dico;k++)
{
if((vecteurs_final[k]=(float*)calloc(dimvec,sizeof(float)))==NULL)
return 4;
}
if((index_final=(int*)calloc(M,sizeof(int)))==NULL)
return 5;
if((popul_final=(int*)calloc(dico,sizeof(int)))==NULL)
return 6;
if((index_classes=(int*)calloc(M,sizeof(int)))==NULL)
return 7;
if((popul_classes=(int*)calloc(dico,sizeof(int)))==NULL)
return 8;
return 0;
}
int CalculDictionnaire(void)
{
int n,k,p,index;
double energie_prec,distance,distancemin;
char fini;
for(k=0;k<dico;k++)
{
index=(int)floor(((double)(M-1)*(double)(rand()))/(double)RAND_MAX);
for(n=0;n<dimvec;n++)
vecteurs_classes[k][n]=vecteurs[index][n];
}
energie=0.0;
etape=0;
fini=0;
while(!fini)
{
memset(popul_classes,0,dico*sizeof(int));
energie_prec=energie;
energie=0.0;
for(k=0;k<M;k++)
{
index=0;
distancemin=0.0;
for(n=0;n<dimvec;n++)
{
distancemin+=
(vecteurs[k][n]-vecteurs_classes[0][n])*
(vecteurs[k][n]-vecteurs_classes[0][n]);
}
for(p=1;p<dico;p++)
{
distance=0.0;
for(n=0;n<dimvec;n++)
{
distance+=
(vecteurs[k][n]-vecteurs_classes[p][n])*
(vecteurs[k][n]-vecteurs_classes[p][n]);
}
if(distance<distancemin)
{
distancemin=distance;
index=p;
}
}
index_classes[k]=index;
popul_classes[index]+=1;
energie+=distancemin;
}
for(p=0;p<dico;p++)
{
if(popul_classes[p])
{
memset(vecteurs_classes[p],0,dimvec*sizeof(float));
}
}
for(k=0;k<M;k++)
{
index=index_classes[k];
if(popul_classes[index])
{
for(n=0;n<dimvec;n++)
{
vecteurs_classes[index][n]+=vecteurs[k][n];
}
}
}
for(p=0;p<dico;p++)
{
if(popul_classes[p])
{
for(n=0;n<dimvec;n++)
{
vecteurs_classes[p][n]/=popul_classes[p];
}
}
}
if(etape!=0)
{
if(((energie_prec-energie)/energie)<SEUIL)
fini=1;
}
etape++;
}
return 0;
}
int SauveClasses(void)
{
int k;
if((sor=fopen(nomsor,"wb"))==NULL)
return 1;
fwrite(&dimvec,sizeof(int),1,sor);
fwrite(&dico,sizeof(int),1,sor);
for(k=0;k<dico;k++)
fwrite(vecteurs_final[k],sizeof(float),dimvec,sor);
fwrite(popul_final,sizeof(int),dico,sor);
fclose(sor);
return 0;
}
int SauveCode(void)
{
if((cod=fopen(nomcod,"wb"))==NULL)
return 1;
fwrite(index_final,sizeof(int),M,sor);
fclose(sor);
return 0;
}

6
learning/code/algo.h

@ -0,0 +1,6 @@
void Erreur(char *,int);
int LireVecteurs(void);
int InitDictionnaire(void);
int CalculDictionnaire(void);
int SauveClasses(void);
int SauveCode(void);

BIN
learning/code/code

Binary file not shown.

10
learning/code/constant.h

@ -0,0 +1,10 @@
#define NOM 50
#define SEUIL 1e-5
typedef struct
{
int index;
int popul;
float * vecteur;
}
TRI;

4
learning/code/data_set.m

@ -0,0 +1,4 @@
function [image]=data_set(i, n)
end

28
learning/code/descripteurfouriernorm.m

@ -0,0 +1,28 @@
function [coeff,num]=descripteurfouriernorm(z,cmax)
cmin=-cmax;
z_moy=mean(z);
longc=length(z);
% on calcule les coefficients de Fourier
TC=fft(z-z_moy)/longc;
num=cmin:cmax;
% on sélectionne les coefficients entre cmin et cmax
coeff=zeros(cmax-cmin+1,1);
coeff(end-cmax:end)=TC(1:cmax+1);
coeff(1:-cmin)=TC(end+cmin+1:end);
% on retourne la séquence si le parcours est dans le
% sens inverse du sens trigonométrique
if abs(coeff(num==-1))>abs(coeff(num==1))
coeff=coeff(end:-1:1);
end
% corrections de phase pour normaliser
% par rapport à la rotation et l'origine
% du signal z
Phi=angle(coeff(num==-1).*coeff(num==1))/2;
coeff=coeff*exp(-1i*Phi);
theta=angle(coeff(num==1));
coeff=coeff.*exp(-1i*num'*theta);
% correction pour normaliser la taille
coeff=coeff/abs(coeff(num==1));

BIN
learning/code/dict

Binary file not shown.

25
learning/code/global.c

@ -0,0 +1,25 @@
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include "constant.h"
char noment[NOM];
char nomsor[NOM];
char nomcod[NOM];
int dimvec,M,dico,numiter;
FILE * ent,* sor,* cod;
float ** vecteurs;
float ** vecteurs_classes;
int * index_classes;
int * popul_classes;
float ** vecteurs_final;
int * index_final;
int * popul_final;
int etape;
double energie;
double energieminimale;
TRI * buftri;

25
learning/code/global.h

@ -0,0 +1,25 @@
extern char noment[NOM];
extern char nomsor[NOM];
extern char nomcod[NOM];
extern int dimvec,M,dico,numiter;
extern FILE * ent,* sor,* cod;
extern float ** vecteurs;
extern float ** vecteurs_classes;
extern int * index_classes;
extern int * popul_classes;
extern float ** vecteurs_final;
extern int * index_final;
extern int * popul_final;
extern int etape;
extern double energie;
extern double energieminimale;
extern TRI * buftri;

41
learning/code/kmoyennes.m

@ -0,0 +1,41 @@
% kmoyennes.m
% [vecteursliste,code,occur]=kmoyennes(vecteurs,dico,numiter)
% vecteurs : vecteurs de la base (rangés en colonnes)
% dico : nombre de classes
% numiter : nombre d'essais pour trouver le dictionnaire
% vecteursliste : contient les vecteurs prototypes
% code : contient les index des classes
% occur : nombre d'éléments dans chaque classe
function [vecteursliste,code,occur]=kmoyennes(vecteurs,dico,numiter)
% nombre de lignes du tableau vecteurs : dimension des vecteurs
dimvec=size(vecteurs,1);
% nombre de colonnes du tableau vecteurs : nombre de vecteurs
M=size(vecteurs,2);
% ecriture des fichiers nécessaires au fonctionnment du programme quantvec
fid=fopen('vecteurs','w');
fwrite(fid,M,'int');
fwrite(fid,dimvec,'int');
fwrite(fid,dico,'int');
fwrite(fid,numiter,'int');
fwrite(fid,vecteurs,'float');
fclose(fid);
% lancement du programme quantvec
unix('./quantvec vecteurs dict code');
% lecture des fichiers résultat
fid=fopen('dict','r');
dimvec=fread(fid,1,'int');
dico=fread(fid,1,'int');
vecteursliste=fread(fid,[dimvec dico],'float');
occur=fread(fid,dico,'int');
fclose(fid);
disp('vecteurs dans la liste')
disp([dimvec dico])
fid=fopen('code','r');
code=fread(fid,M,'int');
fclose(fid);

58
learning/code/learning.m

@ -0,0 +1,58 @@
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
% 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

8
learning/code/makefile

@ -0,0 +1,8 @@
all : quantvec
quantvec : *.c *.h
g++ -O3 -Wall *.c -o quantvec
clean :
rm quantvec

18
learning/code/max_contour.m

@ -0,0 +1,18 @@
function [cont]=max_contour(contours)
i=1;
id=1;
max = 0;
while i+contours(2, id) < size(contours, 2)
contours(2,i);
if contours(2,i) > max
max = contours(2,i);
id = i;
end
i=i+1+contours(2,i);
end
cont = zeros(max, 2);
cont(1:end,1) = contours(1, id+1:id+max);
cont(1:end,2) = contours(2, id+1:id+max);
end

BIN
learning/code/quantvec

Binary file not shown.

63
learning/code/quantvec.c

@ -0,0 +1,63 @@
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
#include "constant.h"
#include "global.h"
#include "algo.h"
int main(int ac,char ** av)
{
int erreur,iter,p;
if(ac != 4)
Erreur((char*)"Il faut 3 parametres",1);
strncpy(noment,av[1],NOM-1);
strncpy(nomsor,av[2],NOM-1);
strncpy(nomcod,av[3],NOM-1);
srand( (unsigned)time( NULL ) );
if((erreur=LireVecteurs())!=0)
Erreur((char*)"Erreur de lecture des vecteurs",erreur);
fprintf(stderr,"nombre de vecteurs : %d\n",M);
fprintf(stderr,"dimension des vecteurs : %d\n",dimvec);
fprintf(stderr,"taille du dictionnaire : %d\n",dico);
fprintf(stderr,"nombre d'iterations : %d\n",numiter);
if((erreur=InitDictionnaire())!=0)
Erreur((char*)"Erreur d'initialisation du dictionnaire",erreur);
iter=0;
if((erreur=CalculDictionnaire())!=0)
Erreur((char*)"Erreur de calcul itératif du dictionnaire",erreur);
energieminimale=energie;
memcpy(index_final,index_classes,M*sizeof(int));
memcpy(popul_final,popul_classes,dico*sizeof(int));
for(p=0;p<dico;p++)
memcpy(vecteurs_final[p],vecteurs_classes[p],dimvec*sizeof(float));
fprintf(stderr,"iteration %d, distorsion %lf en %d etapes\n",iter,energie/((double)M*(double)dimvec),etape);
for(iter=1;iter<numiter;iter++)
{
if((erreur=CalculDictionnaire())!=0)
Erreur((char*)"Erreur de calcul itératif du dictionnaire",erreur);
if(energie<energieminimale)
{
energieminimale=energie;
memcpy(index_final,index_classes,M*sizeof(int));
memcpy(popul_final,popul_classes,dico*sizeof(int));
for(p=0;p<dico;p++)
memcpy(vecteurs_final[p],vecteurs_classes[p],dimvec*sizeof(float));
}
fprintf(stderr,"iteration %d, distorsion %lf en %d etapes\n",iter,energie/((double)M*(double)dimvec),etape);
}
fprintf(stderr,"distorsion finale %lf\n",energieminimale/((double)M*(double)dimvec));
if((erreur=SauveClasses())!=0)
Erreur((char*)"Erreur de sauvegarde des classes",erreur);
if((erreur=SauveCode())!=0)
Erreur((char*)"Erreur de sauvegarde du code",erreur);
}

11
learning/code/resconstrdesfour.m

@ -0,0 +1,11 @@
function z_fil=resconstrdesfour(coeff,N,cmax)
cmin=-cmax;
TC=zeros(N,1);
TC(1:cmax+1)=coeff(end-cmax:end);
TC(end+cmin+1:end)=coeff(1:-cmin);
z_fil=ifft(TC)*N;
z_fil=[z_fil;z_fil(1)];

23
learning/code/rgb_filter.m

@ -0,0 +1,23 @@
function [filtered_img]=rgb_filter(img, threshold)
height = size(img, 1);
width = size(img, 2);
depth = size(img, 3);
filtered_img = zeros(height, width, 1);
for i=1:height
for j=1:width
r = img(i, j, 1);
g = img(i, j, 2);
b = img(i, j, 3);
if (r > g && r > b)
if (r-b > threshold || r-g > threshold)
filtered_img(i, j, 1) = 1;
else
filtered_img(i, j, 1) = 0;
end
end
end
end
end

3
learning/code/traitement.h

@ -0,0 +1,3 @@
int InitInfo(void);
void TraiteErreur(int,char*);
DWORD WINAPI Traitement(LPVOID);

BIN
learning/code/vecteurs

Binary file not shown.

0
images/arret/arret0001.jpg → learning/images/arret/arret0001.jpg

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

0
images/arret/arret0002.jpg → learning/images/arret/arret0002.jpg

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

0
images/arret/arret0003.jpg → learning/images/arret/arret0003.jpg

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

0
images/arret/arret0004.jpg → learning/images/arret/arret0004.jpg

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

0
images/arret/arret0005.jpg → learning/images/arret/arret0005.jpg

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

0
images/arret/arret0006.jpg → learning/images/arret/arret0006.jpg

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

0
images/arret/arret0007.jpg → learning/images/arret/arret0007.jpg

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

0
images/arret/arret0008.jpg → learning/images/arret/arret0008.jpg

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

0
images/arret/arret0009.jpg → learning/images/arret/arret0009.jpg

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

0
images/arret/arret0010.jpg → learning/images/arret/arret0010.jpg

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

0
images/arret/arret0011.jpg → learning/images/arret/arret0011.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0012.jpg → learning/images/arret/arret0012.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0013.jpg → learning/images/arret/arret0013.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0014.jpg → learning/images/arret/arret0014.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0015.jpg → learning/images/arret/arret0015.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0016.jpg → learning/images/arret/arret0016.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0017.jpg → learning/images/arret/arret0017.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0018.jpg → learning/images/arret/arret0018.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0019.jpg → learning/images/arret/arret0019.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0020.jpg → learning/images/arret/arret0020.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0021.jpg → learning/images/arret/arret0021.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0022.jpg → learning/images/arret/arret0022.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0023.jpg → learning/images/arret/arret0023.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0024.jpg → learning/images/arret/arret0024.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0025.jpg → learning/images/arret/arret0025.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0026.jpg → learning/images/arret/arret0026.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0027.jpg → learning/images/arret/arret0027.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0028.jpg → learning/images/arret/arret0028.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0029.jpg → learning/images/arret/arret0029.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0030.jpg → learning/images/arret/arret0030.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0031.jpg → learning/images/arret/arret0031.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0032.jpg → learning/images/arret/arret0032.jpg

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

0
images/arret/arret0033.jpg → learning/images/arret/arret0033.jpg

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

0
images/arret/arret0034.jpg → learning/images/arret/arret0034.jpg

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

0
images/arret/arret0035.jpg → learning/images/arret/arret0035.jpg

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

0
images/arret/arret0036.jpg → learning/images/arret/arret0036.jpg

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

0
images/arret/arret0037.jpg → learning/images/arret/arret0037.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0038.jpg → learning/images/arret/arret0038.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0039.jpg → learning/images/arret/arret0039.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0040.jpg → learning/images/arret/arret0040.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0041.jpg → learning/images/arret/arret0041.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0042.jpg → learning/images/arret/arret0042.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0043.jpg → learning/images/arret/arret0043.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0044.jpg → learning/images/arret/arret0044.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0045.jpg → learning/images/arret/arret0045.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0046.jpg → learning/images/arret/arret0046.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0047.jpg → learning/images/arret/arret0047.jpg

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

0
images/arret/arret0048.jpg → learning/images/arret/arret0048.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0049.jpg → learning/images/arret/arret0049.jpg

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

0
images/arret/arret0050.jpg → learning/images/arret/arret0050.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0051.jpg → learning/images/arret/arret0051.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0052.jpg → learning/images/arret/arret0052.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0053.jpg → learning/images/arret/arret0053.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0054.jpg → learning/images/arret/arret0054.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0055.jpg → learning/images/arret/arret0055.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0056.jpg → learning/images/arret/arret0056.jpg

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

0
images/arret/arret0057.jpg → learning/images/arret/arret0057.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0058.jpg → learning/images/arret/arret0058.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0059.jpg → learning/images/arret/arret0059.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0060.jpg → learning/images/arret/arret0060.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0061.jpg → learning/images/arret/arret0061.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0062.jpg → learning/images/arret/arret0062.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0063.jpg → learning/images/arret/arret0063.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0064.jpg → learning/images/arret/arret0064.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0065.jpg → learning/images/arret/arret0065.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0066.jpg → learning/images/arret/arret0066.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0067.jpg → learning/images/arret/arret0067.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0068.jpg → learning/images/arret/arret0068.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0069.jpg → learning/images/arret/arret0069.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0070.jpg → learning/images/arret/arret0070.jpg

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

0
images/arret/arret0071.jpg → learning/images/arret/arret0071.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0072.jpg → learning/images/arret/arret0072.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0073.jpg → learning/images/arret/arret0073.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0074.jpg → learning/images/arret/arret0074.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0075.jpg → learning/images/arret/arret0075.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0076.jpg → learning/images/arret/arret0076.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0077.jpg → learning/images/arret/arret0077.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0078.jpg → learning/images/arret/arret0078.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0079.jpg → learning/images/arret/arret0079.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0080.jpg → learning/images/arret/arret0080.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

0
images/arret/arret0081.jpg → learning/images/arret/arret0081.jpg

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save