Mercurial > ift6266
annotate data_generation/transformations/add_background_image.py @ 266:1e4e60ddadb1
Merge. Ah, et dans le dernier commit, j'avais oublié de mentionner que j'ai ajouté du code pour gérer l'isolation de différents clones pour rouler des expériences et modifier le code en même temps.
author | fsavard |
---|---|
date | Fri, 19 Mar 2010 10:56:16 -0400 |
parents | 1f5937e9e530 |
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') |