SemanticBoost / SMPLX /read_from_npy.py
kleinhe
init
c3d0293
import numpy as np
import torch
def npy2info(motions, num_shapes=10):
if isinstance(motions, str):
motions = np.load(motions)
trans = None
gnum = 2
if isinstance(motions, np.ndarray):
betas = np.zeros([motions.shape[0], num_shapes]).astype(motions.dtype)
else:
betas = torch.zeros([motions.shape[0], num_shapes], dtype=motions.dtype)
if len(motions.shape) == 3:
motions = motions.reshape(motions.shape[0], -1)
if motions.shape[1] in [73, 157, 166]:
gnum = motions[:, -1:][0]
motions = motions[:, :-1]
elif motions.shape[1] in [75, 159, 168]:
gnum = 2
trans = motions[:, -3::]
motions = motions[:, :-3]
elif motions.shape[1] in [76, 160, 169]:
gnum = motions[:, -1:][0]
trans = motions[:, -4:-1:]
motions = motions[:, :-4]
elif motions.shape[1] in [72 + num_shapes, 156 + num_shapes, 165 + num_shapes]:
betas = motions[:, -num_shapes::]
gnum = 2
motions = motions[:, :-num_shapes]
elif motions.shape[1] in [73 + num_shapes, 157 + num_shapes, 166 + num_shapes]:
betas = motions[:, -num_shapes::]
gnum = motions[:, -num_shapes-1:-num_shapes:][0]
motions = motions[:, :-num_shapes-1]
elif motions.shape[1] in [75 + num_shapes, 159 + num_shapes, 168 + num_shapes]:
betas = motions[:, -num_shapes::]
gnum = 2
trans = motions[:, -num_shapes-3:-num_shapes:]
motions = motions[:, :-num_shapes-3]
elif motions.shape[1] in [76 + num_shapes, 160 + num_shapes, 169 + num_shapes]:
betas = motions[:, -num_shapes::]
gnum = motions[:, -num_shapes-1:-num_shapes:][0]
trans = motions[:, -num_shapes-4:-num_shapes-1:]
motions = motions[:, :-num_shapes-4]
if gnum == 0:
gender = "female"
elif gnum == 1:
gender = "male"
else:
gender = "neutral"
return motions, trans, gender, betas
def info2dict(pose, trans=None, betas=None, mode="smpl", device="cuda", index=-1):
if isinstance(pose, np.ndarray):
pose = torch.from_numpy(pose)
if trans is not None and isinstance(trans, np.ndarray):
trans = torch.from_numpy(trans)
if betas is not None and isinstance(betas, np.ndarray):
betas = torch.from_numpy(betas)
elif betas is None:
betas = torch.zeros([pose.shape[0], 10])
if index != -1:
pose = pose[index:index+1]
if trans is not None:
trans = trans[index:index+1]
betas = betas[index:index+1]
if mode == "smplx":
inputs = {
"global_orient": pose[:, :3].float().to(device),
"body_pose": pose[:, 3:66].float().to(device),
"jaw_pose": pose[:, 66:69].float().to(device),
"leye_pose": pose[:, 69:72].float().to(device),
"reye_pose": pose[:, 72:75].float().to(device),
"left_hand_pose":pose[:, 75:120].float().to(device),
"right_hand_pose":pose[:, 120:].float().to(device),
}
elif mode == "smplh":
inputs = {
"global_orient": pose[:, :3].float().to(device),
"body_pose": pose[:, 3:66].float().to(device),
"left_hand_pose":pose[:, 66:111].float().to(device),
"right_hand_pose":pose[:, 111:].float().to(device),
}
elif mode == "smpl":
inputs = {
"global_orient": pose[:, :3].float().to(device),
"body_pose": pose[:, 3:].float().to(device),
}
if trans is not None:
inputs["transl"] = trans[:, :].float().to(device)
else:
print("No Translation Information")
inputs["betas"] = betas[:, :].float().to(device)
return inputs