def train(cls, X, frac, kmax): n_samples = X.shape[1] n_points = X.shape[0] // 2 # align shapes Y = procrustes(X) # compute rigid transform R = calc_rigid_basis(Y) # project out rigidity P = R.T.dot(Y) dY = Y - R.dot(P) # compute non-rigid transformation D = pca(dY, frac, min(kmax, n_samples - 1, n_points - 1)) k = D.shape[1] # combine subspaces V = np.concatenate((R, D), axis=1) # project raw data onto subspace Q = V.T.dot(X) # normalize coordinates w.r.t. scale for i in xrange(n_samples): Q[:, i] /= Q[0, i] # compute variance e = np.empty(4 + k, dtype=float) Q = pow(Q, 2) e[:4] = -1 # no clamping for rigid body coefficients e[4:] = Q[4:].sum(axis=1) / (n_samples - 1) # return model return cls(V, e)
def train(cls, lmks, imgs, ref, frac, kmax): smodel = ShapeModel.load('data/shape.npz') tmodel = TextureModel.load('data/texture.npz') # build diagonal matrix of weights that measures # the unit difference between shape and texture parameters r = tmodel.variance.sum() / smodel.variance.sum() Ws = r * np.eye(smodel.num_modes()) n_samples = lmks.shape[1] tm = TextureMapper(480, 640) # create empty matrix n_feats = smodel.num_modes() + tmodel.num_modes() A = np.empty((n_feats, n_samples)) # concatenate shape and texture parameters for each training example for i in xrange(n_samples): img = next(imgs) lmk = lmks[:,i] sparams = smodel.calc_params(lmk) tparams = tmodel.calc_params(img, lmk, ref, tm.warp_triangles) # ignore first 4 shape parameters A[:,i] = np.concatenate((Ws.dot(sparams[4:]), tparams)) D = pca(A, frac, kmax) # compute variance Q = pow(D.T.dot(A), 2) e = Q.sum(axis=1) / (n_samples-1) return cls(D, e, Ws)
def train(cls, lmks, imgs, ref, frac, kmax): smodel = ShapeModel.load('data/shape.npz') tmodel = TextureModel.load('data/texture.npz') # build diagonal matrix of weights that measures # the unit difference between shape and texture parameters r = tmodel.variance.sum() / smodel.variance.sum() Ws = r * np.eye(smodel.num_modes()) n_samples = lmks.shape[1] tm = TextureMapper(480, 640) # create empty matrix n_feats = smodel.num_modes() + tmodel.num_modes() A = np.empty((n_feats, n_samples)) # concatenate shape and texture parameters for each training example for i in xrange(n_samples): img = next(imgs) lmk = lmks[:, i] sparams = smodel.calc_params(lmk) tparams = tmodel.calc_params(img, lmk, ref, tm.warp_triangles) # ignore first 4 shape parameters A[:, i] = np.concatenate((Ws.dot(sparams[4:]), tparams)) D = pca(A, frac, kmax) # compute variance Q = pow(D.T.dot(A), 2) e = Q.sum(axis=1) / (n_samples - 1) return cls(D, e, Ws)
def train(cls, X, frac, kmax): n_samples = X.shape[1] n_points = X.shape[0] // 2 # align shapes Y = procrustes(X) # compute rigid transform R = calc_rigid_basis(Y) # project out rigidity P = R.T.dot(Y) dY = Y - R.dot(P) # compute non-rigid transformation D = pca(dY, frac, min(kmax, n_samples-1, n_points-1)) k = D.shape[1] # combine subspaces V = np.concatenate((R,D), axis=1) # project raw data onto subspace Q = V.T.dot(X) # normalize coordinates w.r.t. scale for i in xrange(n_samples): Q[:,i] /= Q[0,i] # compute variance e = np.empty(4+k, dtype=float) Q = pow(Q, 2) e[:4] = -1 # no clamping for rigid body coefficients e[4:] = Q[4:].sum(axis=1) / (n_samples-1) # return model return cls(V, e)
def train(cls, lmks, imgs, ref, frac, kmax): G = get_data_matrix(imgs, lmks, ref) Gm = G.mean(axis=1) G -= Gm[:,np.newaxis] N = lmks.shape[1] D = pca(G, frac, kmax) # normalize eigenvectors for i in range(D.shape[1]): D[:,i] /= np.linalg.norm(D[:,i]) # compute variance Q = D.T.dot(G) Q = pow(Q, 2) e = Q.sum(axis=1) / (N-1) return cls(D, Gm, e)
def train(cls, lmks, imgs, ref, frac, kmax): G = get_data_matrix(imgs, lmks, ref) Gm = G.mean(axis=1) G -= Gm[:,np.newaxis] N = lmks.shape[1] D = pca(G, frac, kmax) # normalize eigenvectors for i in xrange(D.shape[1]): D[:,i] /= np.linalg.norm(D[:,i]) # compute variance Q = D.T.dot(G) Q = pow(Q, 2) e = Q.sum(axis=1) / (N-1) return cls(D, Gm, e)