Spaces:
Sleeping
Sleeping
# Max-Planck-Gesellschaft zur Förderung der Wissenschaften e.V. (MPG) is | |
# holder of all proprietary rights on this computer program. | |
# You can only use this computer program if you have closed | |
# a license agreement with MPG or you get the right to use the computer | |
# program from someone who is authorized to grant you that right. | |
# Any use of the computer program without a valid license is prohibited and | |
# liable to prosecution. | |
# | |
# Copyright©2019 Max-Planck-Gesellschaft zur Förderung | |
# der Wissenschaften e.V. (MPG). acting on behalf of its Max Planck Institute | |
# for Intelligent Systems. All rights reserved. | |
# | |
# Contact: [email protected] | |
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) | |