1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
| def ready_arguments(fname_or_dict, posekey4vposed='pose'): import numpy as np import pickle import chumpy as ch from chumpy.ch import MatVecMult from mano.webuser.posemapper import posemap
if not isinstance(fname_or_dict, dict): dd = pickle.load(open(fname_or_dict)) else: dd = fname_or_dict
want_shapemodel = 'shapedirs' in dd nposeparms = dd['kintree_table'].shape[1]*3
if 'trans' not in dd: dd['trans'] = np.zeros(3) if 'pose' not in dd: dd['pose'] = np.zeros(nposeparms) if 'shapedirs' in dd and 'betas' not in dd: dd['betas'] = np.zeros(dd['shapedirs'].shape[-1])
for s in ['v_template', 'weights', 'posedirs', 'pose', 'trans', 'shapedirs', 'betas', 'J']: if (s in dd) and not hasattr(dd[s], 'dterms'): dd[s] = ch.array(dd[s])
assert(posekey4vposed in dd) if want_shapemodel: dd['v_shaped'] = dd['shapedirs'].dot(dd['betas'])+dd['v_template'] v_shaped = dd['v_shaped'] J_tmpx = MatVecMult(dd['J_regressor'], v_shaped[:, 0]) J_tmpy = MatVecMult(dd['J_regressor'], v_shaped[:, 1]) J_tmpz = MatVecMult(dd['J_regressor'], v_shaped[:, 2]) dd['J'] = ch.vstack((J_tmpx, J_tmpy, J_tmpz)).T dd['v_posed'] = v_shaped + dd['posedirs'].dot(posemap(dd['bs_type'])(dd[posekey4vposed])) else: dd['v_posed'] = dd['v_template'] + dd['posedirs'].dot(posemap(dd['bs_type'])(dd[posekey4vposed]))
return dd
def load_model(fname_or_dict, ncomps=6, flat_hand_mean=False, v_template=None, use_pca=True): ''' This model loads the fully articulable HAND SMPL model, and replaces the pose DOFS by ncomps from PCA'''
from mano.webuser.verts import verts_core import numpy as np import chumpy as ch import pickle import scipy.sparse as sp np.random.seed(1)
if not isinstance(fname_or_dict, dict): smpl_data = pickle.load(open(fname_or_dict,'rb'),encoding='latin1') else: smpl_data = fname_or_dict
rot = 3
if use_pca: hands_components = smpl_data['hands_components'] else: hands_components = np.eye(45) hands_mean = np.zeros(hands_components.shape[1]) if flat_hand_mean else smpl_data['hands_mean'] hands_coeffs = smpl_data['hands_coeffs'][:, :ncomps]
selected_components = np.vstack((hands_components[:ncomps])) hands_mean = hands_mean.copy()
pose_coeffs = ch.zeros(rot + selected_components.shape[0]) full_hand_pose = pose_coeffs[rot:(rot+ncomps)].dot(selected_components)
smpl_data['fullpose'] = ch.concatenate((pose_coeffs[:rot], hands_mean + full_hand_pose)) smpl_data['pose'] = pose_coeffs
Jreg = smpl_data['J_regressor'] if not sp.issparse(Jreg): smpl_data['J_regressor'] = (sp.csc_matrix((Jreg.data, (Jreg.row, Jreg.col)), shape=Jreg.shape))
dd = ready_arguments(smpl_data, posekey4vposed='fullpose')
args = { 'pose': dd['fullpose'], 'v': dd['v_posed'], 'J': dd['J'], 'weights': dd['weights'], 'kintree_table': dd['kintree_table'], 'xp': ch, 'want_Jtr': True, 'bs_style': dd['bs_style'], }
result_previous, meta = verts_core(**args) result = result_previous + dd['trans'].reshape((1, 3)) result.no_translation = result_previous
if meta is not None: for field in ['Jtr', 'A', 'A_global', 'A_weighted']: if(hasattr(meta, field)): setattr(result, field, getattr(meta, field))
if hasattr(result, 'Jtr'): result.J_transformed = result.Jtr + dd['trans'].reshape((1, 3))
for k, v in dd.items(): setattr(result, k, v)
if v_template is not None: result.v_template[:] = v_template result.dd = dd return result
if __name__ == '__main__': m = load_model() m.J_transformed
|