TANGO / SMPLer-X /cover2eamge.py
H-Liu1997's picture
init
31f2f28
import smplx
import torch
import pickle
import numpy as np
# # Global: Load the SMPL-X model once
# smplx_model = smplx.create(
# "/content/drive/MyDrive/003_Codes/TANGO-JointEmbedding/beat2/smplx_models/",
# model_type='smplx',
# gender='NEUTRAL_2020',
# use_face_contour=False,
# num_betas=10,
# num_expression_coeffs=10,
# ext='npz',
# use_pca=False,
# ).to("cuda").eval()
# device = "cuda"
def extract_frame_number(file_name):
match = re.search(r'(\d{5})', file_name)
if match:
return int(match.group(1))
return None
def merge_npz_files(npz_files, output_file):
npz_files = sorted(npz_files, key=lambda x: extract_frame_number(os.path.basename(x)))
merged_data = {}
for file in npz_files:
data = np.load(file)
for key in data.files:
if key not in merged_data:
merged_data[key] = []
merged_data[key].append(data[key])
for key in merged_data:
merged_data[key] = np.stack(merged_data[key], axis=0)
np.savez(output_file, **merged_data)
# smplierx data
def npz_to_npz_v2(pkl_path, npz_path):
# Load the pickle file
pkl_example = np.load(pkl_path, allow_pickle=True)
bs = 1
n = pkl_example["expression"].shape[0] # Assuming this is the batch size
# Convert numpy arrays to torch tensors
def to_tensor(numpy_array):
return torch.tensor(numpy_array, dtype=torch.float32).to(device)
# Ensure that betas are loaded from the pickle data, converting them to torch tensors
betas = to_tensor(pkl_example["betas"]).reshape(n, -1)
transl = to_tensor(pkl_example["transl"]).reshape(n, -1)
expression = to_tensor(pkl_example["expression"]).reshape(n, -1)
jaw_pose = to_tensor(pkl_example["jaw_pose"]).reshape(n, -1)
global_orient = to_tensor(pkl_example["global_orient"]).reshape(n, -1)
body_pose_axis = to_tensor(pkl_example["body_pose"]).reshape(n, -1)
left_hand_pose = to_tensor(pkl_example['left_hand_pose']).reshape(n, -1)
right_hand_pose = to_tensor(pkl_example['right_hand_pose']).reshape(n, -1)
leye_pose = to_tensor(pkl_example['leye_pose']).reshape(n, -1)
reye_pose = to_tensor(pkl_example['reye_pose']).reshape(n, -1)
# print(left_hand_pose.shape, right_hand_pose.shape)
# Pass the loaded data into the SMPL-X model
gt_vertex = smplx_model(
betas=betas,
transl=transl, # Translation
expression=expression, # Expression
jaw_pose=jaw_pose, # Jaw pose
global_orient=global_orient, # Global orientation
body_pose=body_pose_axis, # Body pose
left_hand_pose=left_hand_pose, # Left hand pose
right_hand_pose=right_hand_pose, # Right hand pose
return_full_pose=True,
leye_pose=leye_pose, # Left eye pose
reye_pose=reye_pose, # Right eye pose
)
# Save the relevant data to an npz file
np.savez(npz_path,
betas=np.zeros((n, 300)),
poses=gt_vertex["full_pose"].cpu().numpy(),
expressions=np.zeros((n, 100)),
trans=pkl_example["transl"].reshape(n, -1),
model='smplx2020',
gender='neutral',
mocap_frame_rate=30,
)
# smplierx data
def npz_to_npz(pkl_path, npz_path):
# Load the pickle file
pkl_example = np.load(pkl_path, allow_pickle=True)
n = pkl_example["expression"].shape[0] # Assuming this is the batch size
full_pose = np.concatenate([pkl_example["global_orient"], pkl_example["body_pose"], pkl_example["jaw_pose"], pkl_example["leye_pose"], pkl_example["reye_pose"], pkl_example["left_hand_pose"], pkl_example["right_hand_pose"]], axis=1)
# print(full_pose.shape)
np.savez(npz_path,
betas=np.zeros(300),
poses=full_pose.reshape(n, -1),
expressions=np.zeros((n, 100)),
trans=np.zeros((n, 3)),
model='smplx2020',
gender='neutral',
mocap_frame_rate=30,
)
if __name__ == "__main__":
npz_to_npz("/content/drive/MyDrive/003_Codes/TANGO/SMPLer-X/demo/outputs/results_smplx.npz", "/content/drive/MyDrive/003_Codes/TANGO/SMPLer-X/demo/outputs/results_smplx_emage.npz")