annotate data_generation/transformations/image_tiling.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
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