| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import os.path as osp |
| import argparse |
| import pickle |
|
|
| import numpy as np |
| import torch |
| import open3d as o3d |
|
|
| import smplx |
|
|
|
|
| def main(model_folder, corr_fname, ext='npz', |
| hand_color=(0.3, 0.3, 0.6), |
| gender='neutral', hand='right'): |
|
|
| with open(corr_fname, 'rb') as f: |
| idxs_data = pickle.load(f) |
| if hand == 'both': |
| hand_idxs = np.concatenate( |
| [idxs_data['left_hand'], idxs_data['right_hand']] |
| ) |
| else: |
| hand_idxs = idxs_data[f'{hand}_hand'] |
|
|
| model = smplx.create(model_folder, model_type='smplx', |
| gender=gender, |
| ext=ext) |
| betas = torch.zeros([1, 10], dtype=torch.float32) |
| expression = torch.zeros([1, 10], dtype=torch.float32) |
|
|
| output = model(betas=betas, expression=expression, |
| return_verts=True) |
| vertices = output.vertices.detach().cpu().numpy().squeeze() |
| joints = output.joints.detach().cpu().numpy().squeeze() |
|
|
| print('Vertices shape =', vertices.shape) |
| print('Joints shape =', joints.shape) |
|
|
| mesh = o3d.geometry.TriangleMesh() |
| mesh.vertices = o3d.utility.Vector3dVector(vertices) |
| mesh.triangles = o3d.utility.Vector3iVector(model.faces) |
| mesh.compute_vertex_normals() |
|
|
| colors = np.ones_like(vertices) * [0.3, 0.3, 0.3] |
| colors[hand_idxs] = hand_color |
|
|
| mesh.vertex_colors = o3d.utility.Vector3dVector(colors) |
|
|
| o3d.visualization.draw_geometries([mesh]) |
|
|
|
|
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser(description='SMPL-X Demo') |
|
|
| parser.add_argument('--model-folder', required=True, type=str, |
| help='The path to the model folder') |
| parser.add_argument('--corr-fname', required=True, type=str, |
| dest='corr_fname', |
| help='Filename with the hand correspondences') |
| parser.add_argument('--gender', type=str, default='neutral', |
| help='The gender of the model') |
| parser.add_argument('--ext', type=str, default='npz', |
| help='Which extension to use for loading') |
| parser.add_argument('--hand', default='right', |
| choices=['right', 'left', 'both'], |
| type=str, help='Which hand to plot') |
| parser.add_argument('--hand-color', type=float, nargs=3, dest='hand_color', |
| default=(0.3, 0.3, 0.6), |
| help='Color for the hand vertices') |
|
|
| args = parser.parse_args() |
|
|
| model_folder = osp.expanduser(osp.expandvars(args.model_folder)) |
| corr_fname = args.corr_fname |
| gender = args.gender |
| ext = args.ext |
| hand = args.hand |
| hand_color = args.hand_color |
|
|
| main(model_folder, corr_fname, ext=ext, |
| hand_color=hand_color, |
| gender=gender, hand=hand |
| ) |
|
|