changeset 82:c32a968851f5

merge
author Xavier Glorot <glorotxa@iro.umontreal.ca>
date Wed, 10 Feb 2010 15:09:24 -0500
parents 95c491bb5662 (current diff) 9936c4886299 (diff)
children f75f5acad4eb
files
diffstat 5 files changed, 82 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- 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)
 
 
--- 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
--- 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)
 
 
--- 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)
 
 
--- 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