# HG changeset patch # User Xavier Glorot # Date 1265832564 18000 # Node ID c32a968851f5197f53fae645d85a146746e1b50c # Parent 95c491bb56620d9b5128b3b14e100a5d0eba72c2# Parent 9936c4886299a1471656ead78bff8395521a63dd merge diff -r 95c491bb5662 -r c32a968851f5 transformations/DistorsionGauss.py --- a/transformations/DistorsionGauss.py Wed Feb 10 15:09:02 2010 -0500 +++ b/transformations/DistorsionGauss.py Wed Feb 10 15:09:24 2010 -0500 @@ -18,6 +18,9 @@ self.ecart_type=0.1 #L'ecart type de la gaussienne def get_settings_names(self): + return [] + + def get_settings_name_determined_by_complexity(self): return ['ecart_type'] def regenerate_parameters(self, complexity): @@ -37,11 +40,16 @@ aleatoire[i]=float(random.gauss(0,self.ecart_type)) image=image+aleatoire - #Ramener tout entre 0 et 1 - if numpy.min(image) < 0: - image-=numpy.min(image) - if numpy.max(image) > 1: - image/=numpy.max(image) + + #Ramener tout entre 0 et 1. Ancienne facon de normaliser. + #Resultats moins interessant je trouve. +## if numpy.min(image) < 0: +## image-=numpy.min(image) +## if numpy.max(image) > 1: +## image/=numpy.max(image) + + for i in xrange(0,1024): + image[i]=min(1,max(0,image[i])) return image.reshape(32,32) @@ -72,6 +80,6 @@ from pylearn.io import filetensor as ft import pylab for i in xrange(0,5): - _test(1) + _test(0.5) diff -r 95c491bb5662 -r c32a968851f5 transformations/Occlusion.py --- a/transformations/Occlusion.py Wed Feb 10 15:09:02 2010 -0500 +++ b/transformations/Occlusion.py Wed Feb 10 15:09:24 2010 -0500 @@ -8,9 +8,10 @@ gauche ou a droite de l'image originale. De plus, il se peut aussi que le bruit soit rajoute sur l'image originale, mais en plus pâle. -Il faut s'assurer d'avoir le fichier echantillon_occlusion.ft (voir "files" sur assembla) -dans le repertoire ou est effectuee l'execution de Occlusion.py. Sinon, -simplement changer le "path" sur la ligne 46 +Le fichier /data/lisa/data/ift6266h10/echantillon_occlusion.ft +(sur le reseau DIRO) est necessaire. + +Il y a 20% de chance d'avoir une occlusion quelconque. Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010 @@ -18,8 +19,7 @@ import numpy -import scipy -import pylab + from pylearn.io import filetensor as ft class Occlusion(): @@ -44,7 +44,11 @@ #Cette variable determine l'opacite de l'ajout dans le cas ou on est au milieu self.opacite=0.5 #C'est completement arbitraire. Possible de le changer si voulu + #Sert a dire si on fait quelque chose. 0=faire rien, 1 on fait quelque chose + self.appliquer=1 + f3 = open('/data/lisa/data/ift6266h10/echantillon_occlusion.ft') #Doit etre sur le reseau DIRO. + #f3 = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/echantillon_occlusion.ft') #Il faut arranger le path sinon w=ft.read(f3) f3.close() @@ -54,7 +58,7 @@ def get_settings_names(self): - return ['haut','bas','gauche','droite','x_arrivee','y_arrivee','endroit','rajout'] + return ['haut','bas','gauche','droite','x_arrivee','y_arrivee','endroit','rajout','appliquer'] def regenerate_parameters(self, complexity): self.haut=min(15,int(numpy.abs(numpy.random.normal(int(7*complexity),2)))) @@ -72,16 +76,23 @@ self.y_arrivee=int(numpy.random.normal(0,3)) self.rajout=numpy.random.randint(0,self.longueur) #les bouts de quelle lettre + self.appliquer=numpy.random.binomial(1,0.2) ##### 20 % du temps, on met une occlusion ##### + + if complexity == 0: #On ne fait rien dans ce cas + self.applique=0 self.endroit=numpy.random.randint(-1,2) - #####Revoir si ces trois dernieres variables sont determinees ici ! + return self._get_current_parameters() def _get_current_parameters(self): - return [self.haut,self.bas,self.gauche,self.droite,self.x_arrivee,self.y_arrivee,self.endroit,self.rajout] + return [self.haut,self.bas,self.gauche,self.droite,self.x_arrivee,self.y_arrivee,self.endroit,self.rajout,self.appliquer] def transform_image(self, image): + if self.appliquer == 0: #Si on fait rien, on retourne tout de suite l'image + return image + #Attrapper le bruit d'occlusion bruit=self.d[self.rajout].reshape((32,32))[15-self.haut:15+self.bas+1,15-self.gauche:15+self.droite+1] @@ -94,18 +105,22 @@ self.y_arrivee=15-self.bas #On colle le morceau en bas if self.endroit==-1: #a gauche - image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(self.x_arrivee):(self.x_arrivee+self.gauche+self.droite+1)]=image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(self.x_arrivee):(self.x_arrivee+self.gauche+self.droite+1)]+bruit - + for i in xrange(-self.haut,self.bas+1): + for j in xrange(0,self.gauche+self.droite+1): + image[16+self.y_arrivee+i,self.x_arrivee+j]=\ + max(image[16+self.y_arrivee+i,self.x_arrivee+j],bruit[i+self.haut,j]) + elif self.endroit==1: #a droite - image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(31-self.x_arrivee-self.gauche-self.droite):(31-self.x_arrivee+1)]=image[(16+self.y_arrivee-self.haut):(16+self.y_arrivee+self.bas+1),(31-self.x_arrivee-self.gauche-self.droite):(31-self.x_arrivee+1)]+bruit - + for i in xrange(-self.haut,self.bas+1): + for j in xrange(-self.gauche-self.droite,1): + image[16+self.y_arrivee+i,31-self.x_arrivee+j]=\ + max(image[16+self.y_arrivee+i,31-self.x_arrivee+j],bruit[i+self.haut,j+self.gauche+self.droite]) + elif self.endroit==0: #au milieu - image[(16-self.haut):(16+self.bas+1),(16-self.gauche):(16+self.droite+1)]=image[(16-self.haut):(16+self.bas+1),(16-self.gauche):(16+self.droite+1)]+(bruit*self.opacite) - - #renormaliser le tout. Toutes les entrees doivent etre entre 0 et 1 - for ii in xrange(0,32): - for jj in xrange(0,32): - image[ii,jj]=min(1,image[ii,jj]) + for i in xrange(-self.haut,self.bas+1): + for j in xrange(-self.gauche,self.droite+1): + image[16+i,16+j]=max(image[16+i,16+j],bruit[i+self.haut,j+self.gauche]*self.opacite) + return image @@ -135,4 +150,5 @@ if __name__ == '__main__': import pylab + import scipy _test(0.5) \ No newline at end of file diff -r 95c491bb5662 -r c32a968851f5 transformations/PermutPixel.py --- a/transformations/PermutPixel.py Wed Feb 10 15:09:02 2010 -0500 +++ b/transformations/PermutPixel.py Wed Feb 10 15:09:24 2010 -0500 @@ -21,11 +21,15 @@ self.proportion=0.3 def get_settings_names(self): + return [] + + def get_settings_name_determined_by_complexity(self): return ['nombre'] def regenerate_parameters(self, complexity): - self.proportion=float(complexity) + self.proportion=float(complexity)/3 self.nombre=int(256*self.proportion)*4 #Par multiple de 4 (256=1024/4) + self.echantillon=random.sample(xrange(0,1024),self.nombre) #Les pixels qui seront permutes return self._get_current_parameters() def _get_current_parameters(self): @@ -37,29 +41,28 @@ def transform_image(self, image): image=image.reshape(1024,1) temp=0 #variable temporaire - #constitution de l'echantillon - echantillon=random.sample(xrange(0,1024),self.nombre) - for i in xrange(0,self.nombre,4): + + for i in xrange(0,self.nombre,4): #Par bonds de 4 #gauche - if echantillon[i] > 0: - temp=image[echantillon[i]-1] - image[echantillon[i]-1]=image[echantillon[i]] - image[echantillon[i]]=temp + if self.echantillon[i] > 0: + temp=image[self.echantillon[i]-1] + image[self.echantillon[i]-1]=image[self.echantillon[i]] + image[self.echantillon[i]]=temp #droite - if echantillon[i+1] < 1023: - temp=image[echantillon[i+1]+1] - image[echantillon[i+1]+1]=image[echantillon[i+1]] - image[echantillon[i+1]]=temp + if self.echantillon[i+1] < 1023: + temp=image[self.echantillon[i+1]+1] + image[self.echantillon[i+1]+1]=image[self.echantillon[i+1]] + image[self.echantillon[i+1]]=temp #haut - if echantillon[i+2] > 31: - temp=image[echantillon[i+2]-32] - image[echantillon[i+2]-32]=image[echantillon[i+2]] - image[echantillon[i+2]]=temp + if self.echantillon[i+2] > 31: + temp=image[self.echantillon[i+2]-32] + image[self.echantillon[i+2]-32]=image[self.echantillon[i+2]] + image[self.echantillon[i+2]]=temp #bas - if echantillon[i+3] < 992: - temp=image[echantillon[i+3]+32] - image[echantillon[i+3]+32]=image[echantillon[i+3]] - image[echantillon[i+3]]=temp + if self.echantillon[i+3] < 992: + temp=image[self.echantillon[i+3]+32] + image[self.echantillon[i+3]+32]=image[self.echantillon[i+3]] + image[self.echantillon[i+3]]=temp return image.reshape((32,32)) @@ -91,6 +94,6 @@ from pylearn.io import filetensor as ft import pylab for i in xrange(0,5): - _test(0.5) + _test(0) diff -r 95c491bb5662 -r c32a968851f5 transformations/PoivreSel.py --- a/transformations/PoivreSel.py Wed Feb 10 15:09:02 2010 -0500 +++ b/transformations/PoivreSel.py Wed Feb 10 15:09:24 2010 -0500 @@ -25,11 +25,15 @@ self.nb_chng=10 #Le nombre de pixels changes. Seulement pour fin de calcul def get_settings_names(self): + return [] + + def get_settings_name_determined_by_complexity(self): return ['proportion_bruit'] def regenerate_parameters(self, complexity): self.proportion_bruit = float(complexity)/5 self.nb_chng=int(1024*self.proportion_bruit) + self.changements=random.sample(xrange(1024),self.nb_chng) #Les pixels qui seront changes return self._get_current_parameters() def _get_current_parameters(self): @@ -40,9 +44,8 @@ def transform_image(self, image): image=image.reshape(1024,1) - changements=random.sample(xrange(numpy.size(image)),self.nb_chng) #Les pixels qui seront changes for j in xrange(0,self.nb_chng): - image[changements[j]]=numpy.random.random() #On determine les nouvelles valeurs des pixels changes + image[self.changements[j]]=numpy.random.random() #On determine les nouvelles valeurs des pixels changes return image.reshape(32,32) diff -r 95c491bb5662 -r c32a968851f5 transformations/Rature.py --- a/transformations/Rature.py Wed Feb 10 15:09:02 2010 -0500 +++ b/transformations/Rature.py Wed Feb 10 15:09:24 2010 -0500 @@ -10,6 +10,8 @@ et d'une composante aleatoire. clarte: 0=blanc et 1=noir +Il y a 15% d'effectuer une rature + Ce fichier prend pour acquis que les images sont donnees une a la fois sous forme de numpy.array de 1024 (32 x 32) valeurs entre 0 et 1. @@ -18,7 +20,7 @@ ''' import numpy -import random + class Rature(): @@ -45,10 +47,11 @@ self.orientation=1 else: self.orientation=2 + if float(complexity) > 0: self.largeur=min(32,max(1,int(numpy.ceil(complexity*5)*numpy.random.normal(1,float(complexity)/2)))) self.clarte=min(1,max(0,complexity*numpy.random.normal(1,float(complexity)/2))) - self.faire=numpy.random.binomial(1,float(complexity)) + self.faire=numpy.random.binomial(1,0.15) ##### 15% d'effectuer une rature ##### else: self.largeur=0 self.clarte=0