| ''' |
| Copyright 2017 Javier Romero, Dimitrios Tzionas, Michael J Black and the Max Planck Gesellschaft. All rights reserved. |
| This software is provided for research purposes only. |
| By using this software you agree to the terms of the MANO/SMPL+H Model license here http://mano.is.tue.mpg.de/license |
| |
| More information about MANO/SMPL+H is available at http://mano.is.tue.mpg.de. |
| For comments or questions, please email us at: mano@tue.mpg.de |
| |
| |
| About this file: |
| ================ |
| This file defines a wrapper for the loading functions of the MANO model. |
| |
| Modules included: |
| - load_model: |
| loads the MANO model from a given file location (i.e. a .pkl file location), |
| or a dictionary object. |
| |
| ''' |
|
|
|
|
| import numpy as np |
| import mano.webuser.lbs as lbs |
| from mano.webuser.posemapper import posemap |
| import scipy.sparse as sp |
|
|
|
|
| def ischumpy(x): |
| return hasattr(x, 'dterms') |
|
|
|
|
| def verts_decorated(trans, |
| pose, |
| v_template, |
| J_regressor, |
| weights, |
| kintree_table, |
| bs_style, |
| f, |
| bs_type=None, |
| posedirs=None, |
| betas=None, |
| shapedirs=None, |
| want_Jtr=False): |
|
|
| for which in [ |
| trans, pose, v_template, weights, posedirs, betas, shapedirs |
| ]: |
| if which is not None: |
| assert ischumpy(which) |
|
|
| v = v_template |
|
|
| if shapedirs is not None: |
| if betas is None: |
| betas = np.zeros(shapedirs.shape[-1]) |
| v_shaped = v + shapedirs.dot(betas) |
| else: |
| v_shaped = v |
|
|
| if posedirs is not None: |
| v_posed = v_shaped + posedirs.dot(posemap(bs_type)(pose)) |
| else: |
| v_posed = v_shaped |
|
|
| v = v_posed |
|
|
| if sp.issparse(J_regressor): |
| J_tmpx = np.matmul(J_regressor, v_shaped[:, 0]) |
| J_tmpy = np.matmul(J_regressor, v_shaped[:, 1]) |
| J_tmpz = np.matmul(J_regressor, v_shaped[:, 2]) |
| J = np.vstack((J_tmpx, J_tmpy, J_tmpz)).T |
| else: |
| assert (ischumpy(J)) |
|
|
| assert (bs_style == 'lbs') |
| result, Jtr = lbs.verts_core( |
| pose, v, J, weights, kintree_table, want_Jtr=True, xp=np) |
|
|
| tr = trans.reshape((1, 3)) |
| result = result + tr |
| Jtr = Jtr + tr |
|
|
| result.trans = trans |
| result.f = f |
| result.pose = pose |
| result.v_template = v_template |
| result.J = J |
| result.J_regressor = J_regressor |
| result.weights = weights |
| result.kintree_table = kintree_table |
| result.bs_style = bs_style |
| result.bs_type = bs_type |
| if posedirs is not None: |
| result.posedirs = posedirs |
| result.v_posed = v_posed |
| if shapedirs is not None: |
| result.shapedirs = shapedirs |
| result.betas = betas |
| result.v_shaped = v_shaped |
| if want_Jtr: |
| result.J_transformed = Jtr |
| return result |
|
|
|
|
| def verts_core(pose, |
| v, |
| J, |
| weights, |
| kintree_table, |
| bs_style, |
| want_Jtr=False, |
| xp=np): |
| |
| assert (bs_style == 'lbs') |
| result = lbs.verts_core(pose, v, J, weights, kintree_table, want_Jtr, xp) |
| return result |