comparison data_generation/transformations/Occlusion.py @ 167:1f5937e9e530

More moves - transformations into data_generation, added "deep" folder
author Dumitru Erhan <dumitru.erhan@gmail.com>
date Fri, 26 Feb 2010 14:15:38 -0500
parents transformations/Occlusion.py@7640cb31cf1f
children
comparison
equal deleted inserted replaced
166:17ae5a1a4dd1 167:1f5937e9e530
1 #!/usr/bin/python
2 # coding: utf-8
3
4 '''
5 Ajout de bruit d'occlusion dans l'image originale.
6
7 Le bruit provient d'un echantillon pris dans la seconde image puis rajoutee a
8 gauche ou a droite de l'image originale. De plus, il se peut aussi que le
9 bruit soit rajoute sur l'image originale, mais en plus pâle.
10
11 Le fichier /data/lisa/data/ift6266h10/echantillon_occlusion.ft
12 (sur le reseau DIRO) est necessaire.
13
14 Il y a 30% de chance d'avoir une occlusion quelconque.
15
16 Sylvain Pannetier Lebeuf dans le cadre de IFT6266, hiver 2010
17
18 '''
19
20
21 import numpy
22
23 from pylearn.io import filetensor as ft
24
25 class Occlusion():
26
27 def __init__(self,seed=9854):
28 #Ces 4 variables representent la taille du "crop" sur l'image2
29 #Ce "crop" est pris a partie de image1[15,15], le milieu de l'image1
30 self.haut=2
31 self.bas=2
32 self.gauche=2
33 self.droite=2
34
35 #Ces deux variables representent le deplacement en x et y par rapport
36 #au milieu du bord gauche ou droit
37 self.x_arrivee=0
38 self.y_arrivee=0
39
40 #Cette variable =1 si l'image est mise a gauche et -1 si a droite
41 #et =0 si au centre, mais plus pale
42 self.endroit=-1
43
44 #Cette variable determine l'opacite de l'ajout dans le cas ou on est au milieu
45 self.opacite=0.5 #C'est completement arbitraire. Possible de le changer si voulu
46
47 #Sert a dire si on fait quelque chose. 0=faire rien, 1 on fait quelque chose
48 self.appliquer=1
49
50 self.seed=seed
51 #numpy.random.seed(self.seed)
52
53 f3 = open('/data/lisa/data/ift6266h10/echantillon_occlusion.ft') #Doit etre sur le reseau DIRO.
54 #f3 = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/echantillon_occlusion.ft')
55 #Il faut arranger le path sinon
56 w=ft.read(f3)
57 f3.close()
58
59 self.longueur=len(w)
60 self.d=(w.astype('float'))/255
61
62
63 def get_settings_names(self):
64 return ['haut','bas','gauche','droite','x_arrivee','y_arrivee','endroit','rajout','appliquer']
65
66 def get_seed(self):
67 return self.seed
68
69 def regenerate_parameters(self, complexity):
70 self.haut=min(15,int(numpy.abs(numpy.random.normal(int(8*complexity),2))))
71 self.bas=min(15,int(numpy.abs(numpy.random.normal(int(8*complexity),2))))
72 self.gauche=min(15,int(numpy.abs(numpy.random.normal(int(8*complexity),2))))
73 self.droite=min(15,int(numpy.abs(numpy.random.normal(int(8*complexity),2))))
74 if self.haut+self.bas+self.gauche+self.droite==0: #Tres improbable
75 self.haut=1
76 self.bas=1
77 self.gauche=1
78 self.droite=1
79
80 #Ces deux valeurs seront controlees afin d'etre certain de ne pas depasser
81 self.x_arrivee=int(numpy.abs(numpy.random.normal(0,2))) #Complexity n'entre pas en jeu, pas besoin
82 self.y_arrivee=int(numpy.random.normal(0,3))
83
84 self.rajout=numpy.random.randint(0,self.longueur-1) #les bouts de quelle lettre
85 self.appliquer=numpy.random.binomial(1,0.4) ##### 40 % du temps, on met une occlusion #####
86
87 if complexity == 0: #On ne fait rien dans ce cas
88 self.applique=0
89
90 self.endroit=numpy.random.randint(-1,2)
91
92 return self._get_current_parameters()
93
94 def _get_current_parameters(self):
95 return [self.haut,self.bas,self.gauche,self.droite,self.x_arrivee,self.y_arrivee,self.endroit,self.rajout,self.appliquer]
96
97
98 def transform_image(self, image):
99 if self.appliquer == 0: #Si on fait rien, on retourne tout de suite l'image
100 return image
101
102 #Attrapper le bruit d'occlusion
103 bruit=self.d[self.rajout].reshape((32,32))[15-self.haut:15+self.bas+1,15-self.gauche:15+self.droite+1]
104
105 if self.x_arrivee+self.gauche+self.droite>32:
106 self.endroit*=-1 #On change de bord et on colle sur le cote
107 self.x_arrivee=0
108 if self.y_arrivee-self.haut <-16:
109 self.y_arrivee=self.haut-16#On colle le morceau en haut
110 if self.y_arrivee+self.bas > 15:
111 self.y_arrivee=15-self.bas #On colle le morceau en bas
112
113 if self.endroit==-1: #a gauche
114 for i in xrange(-self.haut,self.bas+1):
115 for j in xrange(0,self.gauche+self.droite+1):
116 image[16+self.y_arrivee+i,self.x_arrivee+j]=\
117 max(image[16+self.y_arrivee+i,self.x_arrivee+j],bruit[i+self.haut,j])
118
119 elif self.endroit==1: #a droite
120 for i in xrange(-self.haut,self.bas+1):
121 for j in xrange(-self.gauche-self.droite,1):
122 image[16+self.y_arrivee+i,31-self.x_arrivee+j]=\
123 max(image[16+self.y_arrivee+i,31-self.x_arrivee+j],bruit[i+self.haut,j+self.gauche+self.droite])
124
125 elif self.endroit==0: #au milieu
126 for i in xrange(-self.haut,self.bas+1):
127 for j in xrange(-self.gauche,self.droite+1):
128 image[16+i,16+j]=max(image[16+i,16+j],bruit[i+self.haut,j+self.gauche]*self.opacite)
129
130
131 return image
132
133 #---TESTS---
134
135 def _load_image():
136 f = open('/home/sylvain/Dropbox/Msc/IFT6266/donnees/lower_test_data.ft') #Le jeu de donnees est en local.
137 d = ft.read(f)
138 w=numpy.asarray(d[numpy.random.randint(0,50)])
139 return (w/255.0).astype('float')
140
141 def _test(complexite):
142
143 transfo = Occlusion()
144 for i in xrange(0,20):
145 img = _load_image()
146 pylab.imshow(img.reshape((32,32)))
147 pylab.show()
148 print transfo.get_settings_names()
149 print transfo.regenerate_parameters(complexite)
150
151 img_trans=transfo.transform_image(img.reshape((32,32)))
152
153 print transfo.get_seed()
154 pylab.imshow(img_trans.reshape((32,32)))
155 pylab.show()
156
157
158 if __name__ == '__main__':
159 import pylab
160 import scipy
161 _test(0.5)