from __future__ import print_function, division import argparse import torch import os,sys from os import walk, listdir from os.path import isfile, join import numpy as np import joblib import smplx import trimesh import h5py from tqdm import tqdm sys.path.append(os.path.join(os.path.dirname(__file__), "src")) from smplify import SMPLify3D import config # parsing argmument parser = argparse.ArgumentParser() parser.add_argument('--batchSize', type=int, default=1, help='input batch size') parser.add_argument('--num_smplify_iters', type=int, default=100, help='num of smplify iters') parser.add_argument('--cuda', type=bool, default=False, help='enables cuda') parser.add_argument('--gpu_ids', type=int, default=0, help='choose gpu ids') parser.add_argument('--num_joints', type=int, default=22, help='joint number') parser.add_argument('--joint_category', type=str, default="AMASS", help='use correspondence') parser.add_argument('--fix_foot', type=str, default="False", help='fix foot or not') parser.add_argument('--data_folder', type=str, default="./demo/demo_data/", help='data in the folder') parser.add_argument('--save_folder', type=str, default="./demo/demo_results/", help='results save folder') parser.add_argument('--files', type=str, default="test_motion.npy", help='files use') opt = parser.parse_args() print(opt) # ---load predefined something device = torch.device("cuda:" + str(opt.gpu_ids) if opt.cuda else "cpu") print(config.SMPL_MODEL_DIR) smplmodel = smplx.create(config.SMPL_MODEL_DIR, model_type="smpl", gender="neutral", ext="pkl", batch_size=opt.batchSize).to(device) # ## --- load the mean pose as original ---- smpl_mean_file = config.SMPL_MEAN_FILE file = h5py.File(smpl_mean_file, 'r') init_mean_pose = torch.from_numpy(file['pose'][:]).unsqueeze(0).float() init_mean_shape = torch.from_numpy(file['shape'][:]).unsqueeze(0).float() cam_trans_zero = torch.Tensor([0.0, 0.0, 0.0]).to(device) # pred_pose = torch.zeros(opt.batchSize, 72).to(device) pred_betas = torch.zeros(opt.batchSize, 10).to(device) pred_cam_t = torch.zeros(opt.batchSize, 3).to(device) keypoints_3d = torch.zeros(opt.batchSize, opt.num_joints, 3).to(device) # # #-------------initialize SMPLify smplify = SMPLify3D(smplxmodel=smplmodel, batch_size=opt.batchSize, joints_category=opt.joint_category, num_iters=opt.num_smplify_iters, device=device) #print("initialize SMPLify3D done!") purename = os.path.splitext(opt.files)[0] # --- load data --- data = np.load(opt.data_folder + "/" + purename + ".npy") # [nframes, njoints, 3] dir_save = os.path.join(opt.save_folder, purename) if not os.path.isdir(dir_save): os.makedirs(dir_save, exist_ok=True) # run the whole seqs num_seqs = data.shape[0] for idx in tqdm(range(num_seqs)): #print(idx) joints3d = data[idx] #*1.2 #scale problem [check first] keypoints_3d[0, :, :] = torch.Tensor(joints3d).to(device).float() if idx == 0: pred_betas[0, :] = init_mean_shape pred_pose[0, :] = init_mean_pose pred_cam_t[0, :] = cam_trans_zero else: data_param = joblib.load(dir_save + "/" + "%04d"%(idx-1) + ".pkl") pred_betas[0, :] = torch.from_numpy(data_param['beta']).unsqueeze(0).float() pred_pose[0, :] = torch.from_numpy(data_param['pose']).unsqueeze(0).float() pred_cam_t[0, :] = torch.from_numpy(data_param['cam']).unsqueeze(0).float() if opt.joint_category =="AMASS": confidence_input = torch.ones(opt.num_joints) # make sure the foot and ankle if opt.fix_foot == True: confidence_input[7] = 1.5 confidence_input[8] = 1.5 confidence_input[10] = 1.5 confidence_input[11] = 1.5 else: print("Such category not settle down!") # ----- from initial to fitting ------- new_opt_vertices, new_opt_joints, new_opt_pose, new_opt_betas, \ new_opt_cam_t, new_opt_joint_loss = smplify( pred_pose.detach(), pred_betas.detach(), pred_cam_t.detach(), keypoints_3d, conf_3d=confidence_input.to(device), seq_ind=idx ) # # -- save the results to ply--- outputp = smplmodel(betas=new_opt_betas, global_orient=new_opt_pose[:, :3], body_pose=new_opt_pose[:, 3:], transl=new_opt_cam_t, return_verts=True) mesh_p = trimesh.Trimesh(vertices=outputp.vertices.detach().cpu().numpy().squeeze(), faces=smplmodel.faces, process=False) mesh_p.export(dir_save + "/" + "%04d"%idx + ".ply") # save the pkl param = {} param['beta'] = new_opt_betas.detach().cpu().numpy() param['pose'] = new_opt_pose.detach().cpu().numpy() param['cam'] = new_opt_cam_t.detach().cpu().numpy() joblib.dump(param, dir_save + "/" + "%04d"%idx + ".pkl", compress=3)