Spaces:
Running
Running
''' | |
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 |