Mercurial > ift6266
view data_generation/transformations/add_background_image.py @ 239:42005ec87747
Mergé (manuellement) les changements de Sylvain pour utiliser le code de dataset d'Arnaud, à cette différence près que je n'utilse pas les givens. J'ai probablement une approche différente pour limiter la taille du dataset dans mon débuggage, aussi.
author | fsavard |
---|---|
date | Mon, 15 Mar 2010 18:30:21 -0400 |
parents | 1f5937e9e530 |
children |
line wrap: on
line source
#!/usr/bin/python # -*- coding: iso-8859-1 -*- ''' Implementation of random background adding to a specific image Author: Guillaume Sicard ''' import sys, os, random import cPickle import Image, numpy class AddBackground(): def __init__(self, threshold = 128, complexity = 1): self.h = 32 self.w = 32 self.threshold = 1; try: #in order to load locally if it is available self.bg_image_file = '/Tmp/image_net/' f=open(self.bg_image_file+'filelist.pkl') except: self.bg_image_file = '/data/lisa/data/ift6266h10/image_net/' f=open(self.bg_image_file+'filelist.pkl') self.image_files = cPickle.load(f) f.close() self.regenerate_parameters(complexity) def get_current_parameters(self): return [self.contrast] # get threshold value def get_settings_names(self): return ['contrast'] # no need, except for testmod.py def regenerate_parameters(self, complexity): self.contrast = 1-numpy.random.rand()*complexity return [self.contrast] # load an image def load_image(self,filename): image = Image.open(filename).convert('L') image = numpy.asarray(image) image = (image / 255.0).astype(numpy.float32) return image # save an image def save_image(self,array, filename): image = (array * 255.0).astype('int') image = Image.fromarray(image) if (filename != ''): image.save(filename) else: image.show() # make a random 32x32 crop of an image def rand_crop(self,image): i_w, i_h = image.shape x, y = random.randint(0, i_w - self.w), random.randint(0, i_h - self.h) return image[x:x + self.w, y:y + self.h] # select a random background image from "bg_image_file" and crops it def rand_bg_image(self,maximage): i = random.randint(0, len(self.image_files) - 1) image = self.load_image(self.bg_image_file + self.image_files[i]) self.bg_image = self.rand_crop(image) maxbg = self.bg_image.max() self.bg_image = self.bg_image / maxbg * ( max(maximage - self.contrast,0.0) ) # set "bg_image" as background to "image", based on a pixels threshold def set_bg(self,image): tensor = numpy.asarray([self.bg_image,image],dtype='float32') return tensor.max(0) # transform an image file and return an array def transform_image_from_file(self, filename): self.rand_bg_image() image = self.load_image(filename) image = self.set_bg(image) return image # standard array to array transform def transform_image(self, image): self.rand_bg_image(image.max()) image = self.set_bg(image) return image # test method def test(self,filename): import time sys.stdout.write('Starting addBackground test : loading image') sys.stdout.flush() image = self.load_image(filename) t = 0 n = 500 for i in range(n): t0 = time.time() image2 = self.transform_image(image) t = ( i * t + (time.time() - t0) ) / (i + 1) sys.stdout.write('.') sys.stdout.flush() print "Done!\nAverage time : " + str(1000 * t) + " ms" if __name__ == '__main__': myAddBackground = AddBackground() myAddBackground.test('./images/0-LiberationSans-Italic.ttf.jpg')