Mercurial > ift6266
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) |