In [ ]:
import menpo.io as mio
image1 = mio.import_builtin_asset.takeo_ppm()
image1.crop_to_landmarks_proportion_inplace(0.3)
image1 = image1.as_greyscale()
image2 = mio.import_builtin_asset.breakingbad_jpg()
image2.crop_to_landmarks_proportion_inplace(0.3)
%matplotlib inline
image2.view_landmarks()
In [ ]:
import numpy as np
def extract_patches_joan(image, centres, patch_shape, normalize_patches=False):
# extract patches
patches = image.extract_patches(centres, patch_size=patch_shape,
as_single_array=False)
# normalize if asked to
if normalize_patches:
for p in range(len(patches)):
patches[p].normalize_norm_inplace()
return patches
def vectorize_patches_joan(patches):
# find lengths
patch_len = np.prod(patches[0].shape) * patches[0].n_channels
n_points = len(patches)
# initialize output matrix
patches_vectors = np.empty(patch_len * n_points)
# extract each vector
for p in range(n_points):
# find indices in target vector
i_from = p * patch_len
i_to = (p + 1) * patch_len
# store vector
patches_vectors[i_from:i_to] = patches[p].as_vector()
return patches_vectors
def vectorize1(patches_list):
r"""
Vectorization function A: It vectorizes a given list of patches.
Returns an ndarray of size (m*n) x 1
"""
return vectorize_patches_joan(patches_list)
def warp1(image, centres, patch_shape):
r"""
Warp function F: It extracts the patches around each shape point
returns a list with the patches
"""
return extract_patches_joan(image, centres, patch_shape,
normalize_patches=False)
def gradient1(patches):
r"""
Returns the gradients of the patches
n_dims x n_channels x n_points x (w x h)
"""
n_dims = patches[0].n_dims
n_channels = patches[0].n_channels
wh = np.prod(patches[0].shape)
n_points = len(patches)
gradients = np.empty((n_dims, n_channels, wh, n_points))
for k, i in enumerate(patches):
g = i.gradient().as_vector(keep_channels=True)
gradients[..., k] = np.reshape(g, (-1, n_channels, n_dims)).T
gradients = np.rollaxis(gradients, 3, 2)
return gradients
In [ ]:
from cvpr15.utils import build_patches_image, vectorize_patches_image
from menpo.image import Image
def warp2(image, centres, patch_shape):
r"""
Warp function F: It extracts the patches around each shape point
returns an image object of size:
n_points x patch_shape[0] x patch_shape[1] x n_channels
"""
return build_patches_image(image, centres, patch_shape)
def vectorize2(patches_image):
r"""
Vectorization function A: It vectorizes a given patches image.
Returns an ndarray of size (m*n) x 1
"""
return vectorize_patches_image(patches_image)
def gradient2(patches):
r"""
Returns the gradients of the patches
n_dims x n_channels x n_points x (w x h)
"""
n_points = patches.pixels.shape[0]
h = patches.pixels.shape[1]
w = patches.pixels.shape[2]
n_channels = patches.pixels.shape[3]
# initial patches: n_parts x height x width x n_channels
pixels = patches.pixels
# move parts axis to end: height x width x n_channels x n_parts
pixels = np.rollaxis(pixels, 0, pixels.ndim)
# merge channels and parts axes: height x width x (n_channels * n_parts)
pixels = np.reshape(pixels, (h, w, -1), order='F')
# compute and vectorize gradient: (height * width) x (n_channels * n_parts * n_dims)
g = Image(pixels).gradient().as_vector(keep_channels=True)
# reshape gradient: (height * width) x n_parts x n_channels x n_dims
# then trnspose it: n_dims x n_channels x n_parts x (height * width)
return np.reshape(g, (-1, n_points, n_channels, 2)).T
In [ ]:
image = image2
patch_shape = (17, 17)
n_channels = image.n_channels
In [ ]:
i1 = warp1(image, image.landmarks['PTS']['all'], patch_shape)
vec_i1 = vectorize1(i1)
#e1 = vec_i1 - self.appearance_model[0]
nabla_i1 = gradient1(i1)
In [ ]:
i2 = warp2(image, image.landmarks['PTS']['all'], patch_shape)
vec_i2 = vectorize2(i2)
#e1 = vec_i1 - self.appearance_model[0]
nabla_i2 = gradient2(i2)
In [ ]:
import numpy as np
print vec_i1.shape, vec_i2.shape, np.array_equal(vec_i1, vec_i2)
print nabla_i1.shape, nabla_i2.shape, np.array_equal(nabla_i1, nabla_i2)
In [ ]:
%matplotlib inline
k = 37
d = 1
c = 2
m1 = nabla_i1[d, c, k, :].reshape(patch_shape[0], patch_shape[1])
m2 = nabla_i2[d, c, k, :].reshape(patch_shape[0], patch_shape[1])
Image(m1).view()
Image(m2).view_new()
In [ ]:
%matplotlib inline
k = 37
l = np.prod(patch_shape) * n_channels
from_i = k * l
to_i = (k+1) * l
Image(vec_i1[from_i:to_i].reshape(patch_shape[0], patch_shape[1], n_channels)).view()
Image(vec_i2[from_i:to_i].reshape(patch_shape[0], patch_shape[1], n_channels)).view_new()
In [ ]: