annotate data_generation/transformations/image_tiling.py @ 618:14ba0120baff

review response changes
author Yoshua Bengio <bengioy@iro.umontreal.ca>
date Sun, 09 Jan 2011 14:13:23 -0500
parents 1f5937e9e530
children
rev   line source
49
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
1 """
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
2 Illustrate filters (or data) in a grid of small image-shaped tiles.
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
3
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
4 Note: taken from the pylearn codebase on Feb 4, 2010 (fsavard)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
5 """
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
6
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
7 import numpy
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
8 from PIL import Image
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
9
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
10 def scale_to_unit_interval(ndar,eps=1e-8):
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
11 ndar = ndar.copy()
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
12 ndar -= ndar.min()
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
13 ndar *= 1.0 / (ndar.max()+eps)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
14 return ndar
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
15
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
16 def tile_raster_images(X, img_shape, tile_shape, tile_spacing=(0,0),
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
17 scale_rows_to_unit_interval=True,
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
18 output_pixel_vals=True
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
19 ):
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
20 """
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
21 Transform an array with one flattened image per row, into an array in which images are
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
22 reshaped and layed out like tiles on a floor.
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
23
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
24 This function is useful for visualizing datasets whose rows are images, and also columns of
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
25 matrices for transforming those rows (such as the first layer of a neural net).
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
26
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
27 :type X: a 2-D ndarray or a tuple of 4 channels, elements of which can be 2-D ndarrays or None
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
28 :param X: a 2-D array in which every row is a flattened image.
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
29 :type img_shape: tuple; (height, width)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
30 :param img_shape: the original shape of each image
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
31 :type tile_shape: tuple; (rows, cols)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
32 :param tile_shape: the number of images to tile (rows, cols)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
33
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
34 :returns: array suitable for viewing as an image. (See:`PIL.Image.fromarray`.)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
35 :rtype: a 2-d array with same dtype as X.
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
36
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
37 """
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
38 assert len(img_shape) == 2
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
39 assert len(tile_shape) == 2
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
40 assert len(tile_spacing) == 2
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
41
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
42 out_shape = [(ishp + tsp) * tshp - tsp for ishp, tshp, tsp
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
43 in zip(img_shape, tile_shape, tile_spacing)]
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
44
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
45 if isinstance(X, tuple):
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
46 assert len(X) == 4
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
47 if output_pixel_vals:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
48 out_array = numpy.zeros((out_shape[0], out_shape[1], 4), dtype='uint8')
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
49 else:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
50 out_array = numpy.zeros((out_shape[0], out_shape[1], 4), dtype=X.dtype)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
51
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
52 #colors default to 0, alpha defaults to 1 (opaque)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
53 if output_pixel_vals:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
54 channel_defaults = [0,0,0,255]
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
55 else:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
56 channel_defaults = [0.,0.,0.,1.]
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
57
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
58 for i in xrange(4):
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
59 if X[i] is None:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
60 out_array[:,:,i] = numpy.zeros(out_shape,
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
61 dtype='uint8' if output_pixel_vals else out_array.dtype
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
62 )+channel_defaults[i]
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
63 else:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
64 out_array[:,:,i] = tile_raster_images(X[i], img_shape, tile_shape, tile_spacing, scale_rows_to_unit_interval, output_pixel_vals)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
65 return out_array
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
66
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
67 else:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
68 H, W = img_shape
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
69 Hs, Ws = tile_spacing
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
70
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
71 out_array = numpy.zeros(out_shape, dtype='uint8' if output_pixel_vals else X.dtype)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
72 for tile_row in xrange(tile_shape[0]):
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
73 for tile_col in xrange(tile_shape[1]):
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
74 if tile_row * tile_shape[1] + tile_col < X.shape[0]:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
75 if scale_rows_to_unit_interval:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
76 this_img = scale_to_unit_interval(X[tile_row * tile_shape[1] + tile_col].reshape(img_shape))
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
77 else:
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
78 this_img = X[tile_row * tile_shape[1] + tile_col].reshape(img_shape)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
79 out_array[
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
80 tile_row * (H+Hs):tile_row*(H+Hs)+H,
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
81 tile_col * (W+Ws):tile_col*(W+Ws)+W
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
82 ] \
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
83 = this_img * (255 if output_pixel_vals else 1)
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
84 return out_array
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
85
8ce089f30463 Oublier d'add deux fichiers pour dernier commit.
fsavard
parents:
diff changeset
86