annotate data_generation/transformations/add_background_image.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/add_background_image.py@8aadb0f59a64
children
rev   line source
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
1 #!/usr/bin/python
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
2 # -*- coding: iso-8859-1 -*-
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
3
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
4 '''
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
5 Implementation of random background adding to a specific image
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
6
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
7 Author: Guillaume Sicard
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
8 '''
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
9
68
ee6a788557b6 Change in add_background_image to load a pickled list of file, not to do a listdir
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 65
diff changeset
10 import sys, os, random
ee6a788557b6 Change in add_background_image to load a pickled list of file, not to do a listdir
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 65
diff changeset
11 import cPickle
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
12 import Image, numpy
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
13
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
14 class AddBackground():
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
15 def __init__(self, threshold = 128, complexity = 1):
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
16 self.h = 32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
17 self.w = 32
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
18 self.threshold = 1;
79
53ee1097c02c added a local data load if available (on maggie it will) for background images
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 70
diff changeset
19 try: #in order to load locally if it is available
53ee1097c02c added a local data load if available (on maggie it will) for background images
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 70
diff changeset
20 self.bg_image_file = '/Tmp/image_net/'
53ee1097c02c added a local data load if available (on maggie it will) for background images
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 70
diff changeset
21 f=open(self.bg_image_file+'filelist.pkl')
53ee1097c02c added a local data load if available (on maggie it will) for background images
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 70
diff changeset
22 except:
53ee1097c02c added a local data load if available (on maggie it will) for background images
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 70
diff changeset
23 self.bg_image_file = '/data/lisa/data/ift6266h10/image_net/'
53ee1097c02c added a local data load if available (on maggie it will) for background images
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 70
diff changeset
24 f=open(self.bg_image_file+'filelist.pkl')
68
ee6a788557b6 Change in add_background_image to load a pickled list of file, not to do a listdir
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 65
diff changeset
25 self.image_files = cPickle.load(f)
69
6d87c0df2b0e Forgot a close in add_background_image
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 68
diff changeset
26 f.close()
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
27 self.regenerate_parameters(complexity)
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
28
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
29 def get_current_parameters(self):
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
30 return [self.contrast]
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
31 # get threshold value
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
32 def get_settings_names(self):
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
33 return ['contrast']
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
34
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
35 # no need, except for testmod.py
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
36 def regenerate_parameters(self, complexity):
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
37 self.contrast = 1-numpy.random.rand()*complexity
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
38 return [self.contrast]
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
39
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
40 # load an image
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
41 def load_image(self,filename):
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
42 image = Image.open(filename).convert('L')
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
43 image = numpy.asarray(image)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
44 image = (image / 255.0).astype(numpy.float32)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
45 return image
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
46
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
47 # save an image
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
48 def save_image(self,array, filename):
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
49 image = (array * 255.0).astype('int')
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
50 image = Image.fromarray(image)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
51 if (filename != ''):
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
52 image.save(filename)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
53 else:
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
54 image.show()
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
55
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
56 # make a random 32x32 crop of an image
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
57 def rand_crop(self,image):
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
58 i_w, i_h = image.shape
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
59 x, y = random.randint(0, i_w - self.w), random.randint(0, i_h - self.h)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
60 return image[x:x + self.w, y:y + self.h]
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
61
70
be24db3a4d6e bug fix in reading pkl image list file
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 69
diff changeset
62 # select a random background image from "bg_image_file" and crops it
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
63 def rand_bg_image(self,maximage):
65
ab70fbca513c Change path to AddBackground and add a image_file attribute (not to do a listdir at each image)
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 32
diff changeset
64 i = random.randint(0, len(self.image_files) - 1)
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
65
70
be24db3a4d6e bug fix in reading pkl image list file
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 69
diff changeset
66 image = self.load_image(self.bg_image_file + self.image_files[i])
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
67 self.bg_image = self.rand_crop(image)
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
68 maxbg = self.bg_image.max()
85
8aadb0f59a64 changed contrast definition for add_background_image
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 83
diff changeset
69 self.bg_image = self.bg_image / maxbg * ( max(maximage - self.contrast,0.0) )
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
70
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
71 # set "bg_image" as background to "image", based on a pixels threshold
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
72 def set_bg(self,image):
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
73 tensor = numpy.asarray([self.bg_image,image],dtype='float32')
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
74 return tensor.max(0)
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
75
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
76 # transform an image file and return an array
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
77 def transform_image_from_file(self, filename):
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
78 self.rand_bg_image()
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
79 image = self.load_image(filename)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
80 image = self.set_bg(image)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
81 return image
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
82
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
83 # standard array to array transform
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
84 def transform_image(self, image):
83
f75f5acad4eb Changed behavior of add_background in order to have a contrast generation parameter and doing the max without using a treshold mask
Xavier Glorot <glorotxa@iro.umontreal.ca>
parents: 79
diff changeset
85 self.rand_bg_image(image.max())
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
86 image = self.set_bg(image)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
87 return image
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
88
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
89 # test method
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
90 def test(self,filename):
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
91 import time
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
92
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
93 sys.stdout.write('Starting addBackground test : loading image')
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
94 sys.stdout.flush()
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
95
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
96 image = self.load_image(filename)
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
97
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
98 t = 0
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
99 n = 500
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
100 for i in range(n):
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
101 t0 = time.time()
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
102 image2 = self.transform_image(image)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
103 t = ( i * t + (time.time() - t0) ) / (i + 1)
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
104 sys.stdout.write('.')
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
105 sys.stdout.flush()
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
106
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
107 print "Done!\nAverage time : " + str(1000 * t) + " ms"
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
108
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
109 if __name__ == '__main__':
8
bdaa5bd26dcf Added : script to merge a character image with a random background image
guitch
parents:
diff changeset
110
32
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
111 myAddBackground = AddBackground()
4d4248f7e2fb Modified background adding class for compliance with testmod.py
Guillaume Sicard <guitch21@gmail.com>
parents: 9
diff changeset
112 myAddBackground.test('./images/0-LiberationSans-Italic.ttf.jpg')